def player_multi_kill(player, gametype): def map_data(x, y): if not y: return 0 if ( x["killer"] == y["killer"] and x["killer"] != x["victim"] and y["killer"] != y["victim"] and x["round"] == y["round"] and x["killer"] == player and x["round"] != None ): return 1 return 0 def reduce_data(ret, data): # check if multikill is finished if data == 0: # check if kill counter is != 0 if ret["tmp"] != 0: # Check if it is the first multikill with "ret['tmp'] + 1" kills if not ret["tmp"] + 1 in ret: # if not init it ret[ret["tmp"] + 1] = 0 # Add 1 ret[ret["tmp"] + 1] += 1 # Reinit kill counter ret["tmp"] = 0 elif data == 1: # increment kill counter ret["tmp"] += 1 return ret data_iter = kill_table.find({"$or": [{"killer": player}, {"victim": player}]}).sort("when") data_iter1 = kill_table.find({"$or": [{"killer": player}, {"victim": player}]}).sort("when") ret = map(map_data, data_iter, data_iter1[1:]) ret = reduce(reduce_data, ret, {"tmp": 0}) if ret["tmp"] != 0: if not ret["tmp"] + 1 in ret: ret[ret["tmp"] + 1] = 0 ret[ret["tmp"] + 1] += 1 del (ret["tmp"]) ret_multikill = copy.copy(multikill_list) for mk, value in ret.items(): if mk in ret_multikill: ret_multikill[mk] = (ret_multikill[mk][0], value) # TODO RETURN THIS # max_multikill = max(ret.keys()) return {"multikill_list": ret_multikill}
def livestat_multi_kill(new_data): def reduce_data(ret, data): if data["killer"] != data["victim"] and ret[1] and data["killer"] == player: return (ret[0] + 1, True) return (ret[0], False) player = new_data["killer"] round_ = new_data["round"] data = kill_table.find({"$and": [{"$or": [{"killer": player}, {"victim": player}]}, {"round": round_}]}).sort( "when", DESCENDING ) multi_level = reduce(reduce_data, data, (0, True)) multikill_name = multikill_list.get(multi_level[0], None) if multikill_name: msg = "(%s) !!! %s !!! (%s kills)" % (player, multikill_name[0].upper(), multi_level[0]) econ_command_queue.put({"type": "broadcast", "data": {"message": msg}})