Пример #1
0
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}
Пример #2
0
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}})