speedweasel

[CLOSED] Proximity hint on the PvP killfeed

8 posts in this topic

Posted (edited)

****EDIT 3 July 2016****  *****As of Exile version 0.9.8 this script no longer works.  I might update it at some point but for now this code is NOT WORKING.*****

I've added a proximity hint to the killfeed that tells everyone in the server which town the kill was near and which weapon the killer used.  The weapon doesnt matter so much but the proximity hint should help players find PvP in low population servers.

Note, this doesn't give away the exact location, just the name of the nearest town.  It also doesn't announce AI kills, just PvP.

Just overwrite your ExileServer_object_player_event_onMpKilled function using the CustomCode class in the mission config.cpp file.

ExileServer_object_player_event_onMpKilled.sqf:

Spoiler

/**
 * ExileServer_object_player_event_onMpKilled
 *
 * Exile Mod
 * www.exilemod.com
 * © 2015 Exile Mod Team
 *
 * This work is licensed under the Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. 
 * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
 */
 
private["_weapon","_victimNear","_locationNames","_victim","_killer","_victimPosition","_addDeathStat","_addKillStat","_normalkill","_killerRespectPoints","_fragAttributes","_player","_grpvictim","_grpkiller","_log","_lastVictims","_victimUID","_vehicleRole","_vehicle","_lastKillAt","_killStack","_distance","_distanceBonus","_flagNextToKiller","_homieBonus","_flagNextToVictim","_raidBonus","_overallRespectChange","_newKillerScore","_killMessage","_newKillerFrags","_newVictimDeaths"];
if (!isServer || hasInterface) exitWith {};
_victim = _this select 0;
_killer = _this select 1;
if( isNull _victim ) exitWith {};
_victim setVariable ["ExileDiedAt", time];
if !(isPlayer _victim) exitWith {};
_victimPosition = getPos _victim;

_locationNames = nearestLocations [getPos _victim, ["NameVillage","NameCity","NameCityCapital"], 4000];   
sleep 1;  
_victimNear = text (_locationNames select 0);
_weapon = currentWeapon _killer;

format["insertPlayerHistory:%1:%2:%3:%4:%5", getPlayerUID _victim, name _victim, _victimPosition select 0, _victimPosition select 1, _victimPosition select 2] call ExileServer_system_database_query_fireAndForget;
format["deletePlayer:%1", _victim getVariable ["ExileDatabaseId", -1]] call ExileServer_system_database_query_fireAndForget;
_victim setVariable ["ExileIsDead", true];
_victim setVariable ["ExileName", name _victim, true]; 
_victim call ExileServer_object_flies_spawn;
_addDeathStat = true;
_addKillStat = true;
_normalkill = true;
_killerRespectPoints = [];
_fragAttributes = [];
if (_victim isEqualTo _killer) then
{
    ["systemChatRequest", [format["%1 commited suicide!?", (name _victim)]]] call ExileServer_object_player_event_killFeed;
}
else 
{
    if (vehicle _victim isEqualTo _killer) then
    {
        ["systemChatRequest", [format["%1 crashed!", (name _victim)]]] call ExileServer_object_player_event_killfeed;
    }
    else 
    {
        if (isNull _killer) then
        {
            ["systemChatRequest", [format["%1 died for an unknown reason! Maybe a zombie?", (name _victim)]]] call ExileServer_object_player_event_killfeed;
        }
        else 
        {
            _player = objNull;
            if (isPlayer _killer) then 
            {
                if ((typeOf _killer) isEqualTo "Exile_Unit_Player") then
                {
                    _player = _killer;    
                }
                else 
                {
                    _uid = getPlayerUID _killer;
                    {
                        if ((getPlayerUID _x) isEqualTo _uid) exitWith 
                        {
                            _player = _x;
                        };
                    }
                    forEach allPlayers;
                };
            }
            else 
            {
                if (isUAVConnected _killer) then 
                {
                    _player = (UAVControl _killer) select 0;
                };
            };
            if !(isNull _player) then
            {
                _killer = _player;
                if (_victim getVariable ["ExileIsBambi", false]) then
                {
                    _addKillStat = false;
                    _addDeathStat = false;
                    _fragAttributes pushBack "Bambi Slayer";
                    _killerRespectPoints pushBack ["BAMBI SLAYER", (getNumber (configFile >> "CfgSettings" >> "Respect" >> "Frags" >> "bambi"))];
                }
                else 
                {
                    _grpvictim = _victim getVariable ["ExileGroup",(group _victim)];
                    _grpkiller = _killer getVariable ["ExileGroup",(group _killer)];
                    if((_grpvictim isEqualTo _grpkiller)&&!(ExileGraveyardGroup isEqualTo _grpkiller))then
                    {
                        _log = format["%2 was team-killed by %1!", (name _killer), (name _victim)];
                        ["systemChatRequest", [_log]] call ExileServer_object_player_event_killfeed;
                        _fragAttributes pushBack "Teamkill";
                        _killerRespectPoints pushBack ["TEAMKILL", (getNumber (configFile >> "CfgSettings" >> "Respect" >> "Frags" >> "friendlyFire"))];
                        _normalkill = false;
                    }
                    else
                    {
                        _lastVictims = _killer getVariable ["ExileLastVictims", ["0", "1", "2"]];
                        _victimUID = _victim getVariable ["ExileOwnerUID", getPlayerUID _victim];
                        if (_victimUID in _lastVictims) then
                        {
                            _log = format["%1 keeps killing %2!", (name _killer), (name _victim)];
                            ["systemChatRequest", [_log]] call ExileServer_object_player_event_killfeed;
                            _fragAttributes pushBack "Domination";
                            _killerRespectPoints pushBack ["DOMINATION BONUS", (getNumber (configFile >> "CfgSettings" >> "Respect" >> "Frags" >> "domination"))];
                        }
                        else
                        {
                            _lastVictims deleteAt 0;
                            _lastVictims pushBack _victimUID;
                            _killer setVariable ["ExileLastVictims", _lastVictims];
                            if ((vehicle _killer) isEqualTo _killer) then 
                            {
                                if ((currentWeapon _killer) isEqualTo "Exile_Melee_Axe") then
                                {
                                    _fragAttributes pushBack "Humiliation";
                                    _killerRespectPoints pushBack ["HUMILIATION", (getNumber (configFile >> "CfgSettings" >> "Respect" >> "Frags" >> "humiliation"))];
                                }
                                else 
                                {
                                    _killerRespectPoints pushBack ["ENEMY FRAGGED", (getNumber (configFile >> "CfgSettings" >> "Respect" >> "Frags" >> "standard"))];
                                };
                            }
                            else 
                            {
                                _vehicleRole = assignedVehicleRole _killer;
                                switch (toLower (_vehicleRole select 0)) do 
                                {
                                    case "driver":
                                    {
                                        _vehicle = vehicle _killer;
                                        switch (true) do 
                                        {
                                            case (_vehicle isKindOf "ParachuteBase"):
                                            {
                                                _fragAttributes pushBack "Chute > Chopper";
                                                _killerRespectPoints pushBack ["CHUTE > CHOPPER", (getNumber (configFile >> "CfgSettings" >> "Respect" >> "Frags" >> "chuteGreaterChopper"))];
                                            };
                                            case (_vehicle isKindOf "Air"):
                                            {
                                                _fragAttributes pushBack "Big Bird";
                                                _killerRespectPoints pushBack ["BIG BIRD", (getNumber (configFile >> "CfgSettings" >> "Respect" >> "Frags" >> "bigBird"))];
                                            };
                                            default 
                                            {
                                                _fragAttributes pushBack "Road Kill";
                                                _killerRespectPoints pushBack ["ROAD KILL", (getNumber (configFile >> "CfgSettings" >> "Respect" >> "Frags" >> "roadKill"))];
                                            };
                                        };
                                    };
                                    case "turret":
                                    {
                                        if ((currentWeapon _killer) isKindOf "StaticWeapon") then 
                                        {
                                            _fragAttributes pushBack "Let it Rain";
                                            _killerRespectPoints pushBack ["LET IT RAIN", (getNumber (configFile >> "CfgSettings" >> "Respect" >> "Frags" >> "letItRain"))];
                                        }
                                        else 
                                        {
                                            _fragAttributes pushBack "Mad Passenger";
                                            _killerRespectPoints pushBack ["MAD PASSENGER", (getNumber (configFile >> "CfgSettings" >> "Respect" >> "Frags" >> "passenger"))];
                                        };
                                    };
                                    default
                                    {
                                        _fragAttributes pushBack "Mad Passenger";
                                        _killerRespectPoints pushBack ["MAD PASSENGER", (getNumber (configFile >> "CfgSettings" >> "Respect" >> "Frags" >> "passenger"))];
                                    };
                                };
                            };                        
                        };
                    };
                };
                if (_addKillStat) then
                {
                    if(_normalkill)then
                    {
                        _lastKillAt = _killer getVariable ["ExileLastKillAt", 0];
                        _killStack = _killer getVariable ["ExileKillStack", 0];
                        _killStack = _killStack + 1;
                        if (isNil "ExileServerHadFirstBlood") then
                        {
                            ExileServerHadFirstBlood = true;
                            _fragAttributes pushBack "First Blood";
                            _killerRespectPoints pushBack ["FIRST BLOOD", getNumber (configFile >> "CfgSettings" >> "Respect" >> "Bonus" >> "firstBlood")];
                        }
                        else 
                        {
                            if (time - _lastKillAt < (getNumber (configFile >> "CfgSettings" >> "Respect" >> "Bonus" >> "killStreakTimeout"))) then
                            {
                                _fragAttributes pushBack (format ["%1x Kill Streak", _killStack]);
                                _killerRespectPoints pushBack [(format ["%1x KILL STREAK", _killStack]), _killStack * (getNumber (configFile >> "CfgSettings" >> "Respect" >> "Bonus" >> "killStreak"))];
                            }
                            else 
                            {
                                _killStack = 1; 
                            };
                        };
                        _killer setVariable ["ExileKillStack", _killStack];
                        _killer setVariable ["ExileLastKillAt", time];
                    };
                    _distance = floor(_victim distance _killer);
                    _fragAttributes pushBack (format ["%1m Range", _distance]);
                    _distanceBonus = (floor ((_distance min 3000) / 100)) * getNumber (configFile >> "CfgSettings" >> "Respect" >> "Bonus" >> "per100mDistance");
                    if (_distanceBonus > 0) then
                    {
                        _killerRespectPoints pushBack [(format ["%1m RANGE BONUS", _distance]), _distanceBonus];
                    };
                    _flagNextToKiller = _killer call ExileClient_util_world_getTerritoryAtPosition;
                    if !(isNull _flagNextToKiller) then 
                    {
                        if ((getPlayerUID _killer) in (_flagNextToKiller getVariable ["ExileTerritoryBuildRights", []])) then
                        {
                            _homieBonus = getNumber (configFile >> "CfgSettings" >> "Respect" >> "Bonus" >> "homie");
                            if (_homieBonus > 0) then
                            {
                                _fragAttributes pushBack "Homie";
                                _killerRespectPoints pushBack ["HOMIE BONUS", _homieBonus];
                            };
                        };
                    };
                    _flagNextToVictim = _victim call ExileClient_util_world_getTerritoryAtPosition;
                    if !(isNull _flagNextToVictim) then 
                    {
                        if ((getPlayerUID _victim) in (_flagNextToVictim getVariable ["ExileTerritoryBuildRights", []])) then
                        {
                            _raidBonus = getNumber (configFile >> "CfgSettings" >> "Respect" >> "Bonus" >> "raid");
                            if (_raidBonus > 0) then
                            {
                                _fragAttributes pushBack "Raid";
                                _killerRespectPoints pushBack ["RAID BONUS", _raidBonus];
                            };
                        };
                    };
                };
                _overallRespectChange = 0;
                {
                    _overallRespectChange = _overallRespectChange + (_x select 1);
                }
                forEach _killerRespectPoints;
                _newKillerScore = _killer getVariable ["ExileScore", 0];
                _newKillerScore = _newKillerScore + _overallRespectChange;
                _killer setVariable ["ExileScore", _newKillerScore];
                format["setAccountScore:%1:%2", _newKillerScore,getPlayerUID _killer] call ExileServer_system_database_query_fireAndForget;
                if(_normalkill)then
                {
                    _killMessage = format ["%1 was killed by %2 with %3 near %4", (name _victim), (name _killer), (text _weapon), (text _victimNear)];
                    if !(count _fragAttributes isEqualTo 0) then
                    {
                        _killMessage = _killMessage + " (" + (_fragAttributes joinString ", ") + ")";
                    };
                    ["systemChatRequest", [_killMessage]] call ExileServer_object_player_event_killfeed;
                    if (_addKillStat isEqualTo true) then
                    {
                        _newKillerFrags = _killer getVariable ["ExileKills", 0];
                        _newKillerFrags = _newKillerFrags + 1;
                        _killer setVariable ["ExileKills", _newKillerFrags];
                        format["addAccountKill:%1", getPlayerUID _killer] call ExileServer_system_database_query_fireAndForget;
                    };
                };
                [_killer, "showFragRequest", [_killerRespectPoints]] call ExileServer_system_network_send_to;
                _killer call ExileServer_object_player_sendStatsUpdate;
            }
            else 
            {
                ["systemChatRequest", [format["%1 was killed by an NPC (%2m Range)", (name _victim), floor(_victim distance _killer)]]] call ExileServer_object_player_event_killfeed;
            };
        };
    };
};
if (_addDeathStat isEqualTo true) then
{
    _newVictimDeaths = _victim getVariable ["ExileDeaths", 0];
    _newVictimDeaths = _newVictimDeaths + 1;
    _victim setVariable ["ExileDeaths", _newVictimDeaths];
    format["addAccountDeath:%1", getPlayerUID _victim] call ExileServer_system_database_query_fireAndForget;
    _victim call ExileServer_object_player_sendStatsUpdate;
};
[_victim] joinSilent ExileGraveyardGroup;
true

Thanks to @second_coming for the code snippet that contributed to this...

Edited by speedweasel
2 people like this

Share this post


Link to post
Share on other sites

Thank you for this.

Out of interest, is it possible to add a kill/death message for a particular type of AI killing a player? I'm thinking Ryans Zombies as right now it comes up as commited suicide instead of killed by a zombie.

1 person likes this

Share this post


Link to post
Share on other sites
Advertisement

Posted (edited)

On 4/6/2016 at 4:16 PM, kuplion said:

Thank you for this.

Out of interest, is it possible to add a kill/death message for a particular type of AI killing a player? I'm thinking Ryans Zombies as right now it comes up as commited suicide instead of killed by a zombie.

Zombies don't deal traditional damage.  The RyanZombies mod just modifies the player's health downward when a zombie strikes them.  The Exile code that handles multiplayer kills is then fed the _victim and _killer variables but in the case of zombie a kill, the _victim *is* the _killer, so Exile thinks it's a suicide.

One thing to do would be: On player death, where the killer is the victim, scan  3 meters around the player and check for a ryanzombie object.  If found, assume a zombie kill.  The margin of error on this method would be much less than the current overlap between suicides and zombies.

I'm coding as we speak...

download.jpg

Edited by speedweasel
1 person likes this

Share this post


Link to post
Share on other sites
1 hour ago, speedweasel said:

Zombies don't deal traditional damage.  The RyanZombies mod just modifies the player's health downward when a zombie strikes them.  The Exile code that handles multiplayer kills is then fed the _victim and _killer variables but in the case of zombie a kill, the _victim *is* the _killer, so Exile thinks it's a suicide.

One thing to do would be: On player death, where the killer is the victim, scan  3 meters around the player and check for a ryanzombie object.  If found, assume a zombie kill.  The margin of error on this method would be much less than the current overlap between suicides and zombies.

I'm coding as we speak...

download.jpg

Ah dude, that's a fantastic little write up of why. I look forward to seeing what you can work out. :)

Share this post


Link to post
Share on other sites

I did, just now!

ExileServer_object_player_event_onMpKilled.sqf

Spoiler

/**
 * ExileServer_object_player_event_onMpKilled
 *
 * Exile Mod
 * www.exilemod.com
 * © 2015 Exile Mod Team
 *
 * This work is licensed under the Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. 
 * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
 */
 
private["_zombieKill","_zombie","_bystanders","_weapon","_victimNear","_locationNames","_victim","_killer","_victimPosition","_addDeathStat","_addKillStat","_normalkill","_killerRespectPoints","_fragAttributes","_player","_grpvictim","_grpkiller","_log","_lastVictims","_victimUID","_vehicleRole","_vehicle","_lastKillAt","_killStack","_distance","_distanceBonus","_flagNextToKiller","_homieBonus","_flagNextToVictim","_raidBonus","_overallRespectChange","_newKillerScore","_killMessage","_newKillerFrags","_newVictimDeaths"];
if (!isServer || hasInterface) exitWith {};
_victim = _this select 0;
_killer = _this select 1;

diag_log format ["%1 killed %2", _killer, _victim];

if( isNull _victim ) exitWith {};
_victim setVariable ["ExileDiedAt", time];
if !(isPlayer _victim) exitWith {};
_victimPosition = getPos _victim;

_distance = floor(_victim distance _killer);

_locationNames = nearestLocations [getPos _victim, ["NameVillage","NameCity","NameCityCapital"], 4000];   
_victimNear = text (_locationNames select 0);
_weapon = currentWeapon _killer;

format["insertPlayerHistory:%1:%2:%3:%4:%5", getPlayerUID _victim, name _victim, _victimPosition select 0, _victimPosition select 1, _victimPosition select 2] call ExileServer_system_database_query_fireAndForget;
format["deletePlayer:%1", _victim getVariable ["ExileDatabaseId", -1]] call ExileServer_system_database_query_fireAndForget;
_victim setVariable ["ExileIsDead", true];
_victim setVariable ["ExileName", name _victim, true]; 
_victim call ExileServer_object_flies_spawn;
_addDeathStat = true;
_addKillStat = true;
_normalkill = true;
_killerRespectPoints = [];
_fragAttributes = [];
_zombieKill = false;

if (_victim isEqualTo _killer) then
{
    _bystanders = _victimPosition nearEntities ['Man',3];
    {_zombie = getText(configFile >> 'CfgVehicles' >> typeOf _x >> 'author') isEqualTo 'Ryan';
    if(_zombie)then
    {
        _zombieKill = true;
    };
    } forEach _bystanders;
    if (_zombieKill) then
    {
        ["systemChatRequest", [format["%1 was eaten by a zombie!", (name _victim)]]] call ExileServer_object_player_event_killFeed;            
    }
    else
    {
        ["systemChatRequest", [format["%1 comitted suicide!", (name _victim)]]] call ExileServer_object_player_event_killFeed;
    };
}
else 
{
    if (vehicle _victim isEqualTo _killer) then
    {
        ["systemChatRequest", [format["%1 crashed!", (name _victim)]]] call ExileServer_object_player_event_killfeed;
    }
    else 
    {
        if (isNull _killer) then
        {
            ["systemChatRequest", [format["%1 died for an unknown reason! Maybe a zombie?", (name _victim)]]] call ExileServer_object_player_event_killfeed;
        }
        else 
        {
            _player = objNull;
            if (isPlayer _killer) then 
            {
                if ((typeOf _killer) isEqualTo "Exile_Unit_Player") then
                {
                    _player = _killer;    
                }
                else 
                {
                    _uid = getPlayerUID _killer;
                    {
                        if ((getPlayerUID _x) isEqualTo _uid) exitWith 
                        {
                            _player = _x;
                        };
                    }
                    forEach allPlayers;
                };
            }
            else 
            {
                if (isUAVConnected _killer) then 
                {
                    _player = (UAVControl _killer) select 0;
                };
            };
            if !(isNull _player) then
            {
                _killer = _player;
                if (_victim getVariable ["ExileIsBambi", false]) then
                {
                    _addKillStat = false;
                    _addDeathStat = false;
                    _fragAttributes pushBack "Bambi Slayer";
                    _killerRespectPoints pushBack ["BAMBI SLAYER", (getNumber (configFile >> "CfgSettings" >> "Respect" >> "Frags" >> "bambi"))];
                }
                else 
                {
                    _grpvictim = _victim getVariable ["ExileGroup",(group _victim)];
                    _grpkiller = _killer getVariable ["ExileGroup",(group _killer)];
                    if((_grpvictim isEqualTo _grpkiller)&&!(ExileGraveyardGroup isEqualTo _grpkiller))then
                    {
                        _log = format["%2 was team-killed by %1!", (name _killer), (name _victim)];
                        ["systemChatRequest", [_log]] call ExileServer_object_player_event_killfeed;
                        _fragAttributes pushBack "Teamkill";
                        _killerRespectPoints pushBack ["TEAMKILL", (getNumber (configFile >> "CfgSettings" >> "Respect" >> "Frags" >> "friendlyFire"))];
                        _normalkill = false;
                    }
                    else
                    {
                        _lastVictims = _killer getVariable ["ExileLastVictims", ["0", "1", "2"]];
                        _victimUID = _victim getVariable ["ExileOwnerUID", getPlayerUID _victim];
                        if (_victimUID in _lastVictims) then
                        {
                            _log = format["%1 keeps killing %2!", (name _killer), (name _victim)];
                            ["systemChatRequest", [_log]] call ExileServer_object_player_event_killfeed;
                            _fragAttributes pushBack "Domination";
                            _killerRespectPoints pushBack ["DOMINATION BONUS", (getNumber (configFile >> "CfgSettings" >> "Respect" >> "Frags" >> "domination"))];
                        }
                        else
                        {
                            _lastVictims deleteAt 0;
                            _lastVictims pushBack _victimUID;
                            _killer setVariable ["ExileLastVictims", _lastVictims];
                            if ((vehicle _killer) isEqualTo _killer) then 
                            {
                                if ((currentWeapon _killer) isEqualTo "Exile_Melee_Axe") then
                                {
                                    _fragAttributes pushBack "Humiliation";
                                    _killerRespectPoints pushBack ["HUMILIATION", (getNumber (configFile >> "CfgSettings" >> "Respect" >> "Frags" >> "humiliation"))];
                                }
                                else 
                                {
                                    _killerRespectPoints pushBack ["ENEMY FRAGGED", (getNumber (configFile >> "CfgSettings" >> "Respect" >> "Frags" >> "standard"))];
                                };
                            }
                            else 
                            {
                                _vehicleRole = assignedVehicleRole _killer;
                                switch (toLower (_vehicleRole select 0)) do 
                                {
                                    case "driver":
                                    {
                                        _vehicle = vehicle _killer;
                                        switch (true) do 
                                        {
                                            case (_vehicle isKindOf "ParachuteBase"):
                                            {
                                                _fragAttributes pushBack "Chute > Chopper";
                                                _killerRespectPoints pushBack ["CHUTE > CHOPPER", (getNumber (configFile >> "CfgSettings" >> "Respect" >> "Frags" >> "chuteGreaterChopper"))];
                                            };
                                            case (_vehicle isKindOf "Air"):
                                            {
                                                _fragAttributes pushBack "Big Bird";
                                                _killerRespectPoints pushBack ["BIG BIRD", (getNumber (configFile >> "CfgSettings" >> "Respect" >> "Frags" >> "bigBird"))];
                                            };
                                            default 
                                            {
                                                _fragAttributes pushBack "Road Kill";
                                                _killerRespectPoints pushBack ["ROAD KILL", (getNumber (configFile >> "CfgSettings" >> "Respect" >> "Frags" >> "roadKill"))];
                                            };
                                        };
                                    };
                                    case "turret":
                                    {
                                        if ((currentWeapon _killer) isKindOf "StaticWeapon") then 
                                        {
                                            _fragAttributes pushBack "Let it Rain";
                                            _killerRespectPoints pushBack ["LET IT RAIN", (getNumber (configFile >> "CfgSettings" >> "Respect" >> "Frags" >> "letItRain"))];
                                        }
                                        else 
                                        {
                                            _fragAttributes pushBack "Mad Passenger";
                                            _killerRespectPoints pushBack ["MAD PASSENGER", (getNumber (configFile >> "CfgSettings" >> "Respect" >> "Frags" >> "passenger"))];
                                        };
                                    };
                                    default
                                    {
                                        _fragAttributes pushBack "Mad Passenger";
                                        _killerRespectPoints pushBack ["MAD PASSENGER", (getNumber (configFile >> "CfgSettings" >> "Respect" >> "Frags" >> "passenger"))];
                                    };
                                };
                            };                        
                        };
                    };
                };
                if (_addKillStat) then
                {
                    if(_normalkill)then
                    {
                        _lastKillAt = _killer getVariable ["ExileLastKillAt", 0];
                        _killStack = _killer getVariable ["ExileKillStack", 0];
                        _killStack = _killStack + 1;
                        if (isNil "ExileServerHadFirstBlood") then
                        {
                            ExileServerHadFirstBlood = true;
                            _fragAttributes pushBack "First Blood";
                            _killerRespectPoints pushBack ["FIRST BLOOD", getNumber (configFile >> "CfgSettings" >> "Respect" >> "Bonus" >> "firstBlood")];
                        }
                        else 
                        {
                            if (time - _lastKillAt < (getNumber (configFile >> "CfgSettings" >> "Respect" >> "Bonus" >> "killStreakTimeout"))) then
                            {
                                _fragAttributes pushBack (format ["%1x Kill Streak", _killStack]);
                                _killerRespectPoints pushBack [(format ["%1x KILL STREAK", _killStack]), _killStack * (getNumber (configFile >> "CfgSettings" >> "Respect" >> "Bonus" >> "killStreak"))];
                            }
                            else 
                            {
                                _killStack = 1; 
                            };
                        };
                        _killer setVariable ["ExileKillStack", _killStack];
                        _killer setVariable ["ExileLastKillAt", time];
                    };
//                    _distance = floor(_victim distance _killer);
                    _fragAttributes pushBack (format ["%1m Range", _distance]);
                    _distanceBonus = (floor ((_distance min 3000) / 100)) * getNumber (configFile >> "CfgSettings" >> "Respect" >> "Bonus" >> "per100mDistance");
                    if (_distanceBonus > 0) then
                    {
                        _killerRespectPoints pushBack [(format ["%1m RANGE BONUS", _distance]), _distanceBonus];
                    };
                    _flagNextToKiller = _killer call ExileClient_util_world_getTerritoryAtPosition;
                    if !(isNull _flagNextToKiller) then 
                    {
                        if ((getPlayerUID _killer) in (_flagNextToKiller getVariable ["ExileTerritoryBuildRights", []])) then
                        {
                            _homieBonus = getNumber (configFile >> "CfgSettings" >> "Respect" >> "Bonus" >> "homie");
                            if (_homieBonus > 0) then
                            {
                                _fragAttributes pushBack "Homie";
                                _killerRespectPoints pushBack ["HOMIE BONUS", _homieBonus];
                            };
                        };
                    };
                    _flagNextToVictim = _victim call ExileClient_util_world_getTerritoryAtPosition;
                    if !(isNull _flagNextToVictim) then 
                    {
                        if ((getPlayerUID _victim) in (_flagNextToVictim getVariable ["ExileTerritoryBuildRights", []])) then
                        {
                            _raidBonus = getNumber (configFile >> "CfgSettings" >> "Respect" >> "Bonus" >> "raid");
                            if (_raidBonus > 0) then
                            {
                                _fragAttributes pushBack "Raid";
                                _killerRespectPoints pushBack ["RAID BONUS", _raidBonus];
                            };
                        };
                    };
                };
                _overallRespectChange = 0;
                {
                    _overallRespectChange = _overallRespectChange + (_x select 1);
                }
                forEach _killerRespectPoints;
                _newKillerScore = _killer getVariable ["ExileScore", 0];
                _newKillerScore = _newKillerScore + _overallRespectChange;
                _killer setVariable ["ExileScore", _newKillerScore];
                format["setAccountScore:%1:%2", _newKillerScore,getPlayerUID _killer] call ExileServer_system_database_query_fireAndForget;
                if(_normalkill)then
                {
                    _killMessage = format ["%1 was killed by %2 with %3 near %4", (name _victim), (name _killer), (text _weapon), (text _victimNear)];
                    if !(count _fragAttributes isEqualTo 0) then
                    {
                        _killMessage = _killMessage + " (" + (_fragAttributes joinString ", ") + ")";
                    };
                    ["systemChatRequest", [_killMessage]] call ExileServer_object_player_event_killfeed;
                    if (_addKillStat isEqualTo true) then
                    {
                        _newKillerFrags = _killer getVariable ["ExileKills", 0];
                        _newKillerFrags = _newKillerFrags + 1;
                        _killer setVariable ["ExileKills", _newKillerFrags];
                        format["addAccountKill:%1", getPlayerUID _killer] call ExileServer_system_database_query_fireAndForget;
                    };
                };
                [_killer, "showFragRequest", [_killerRespectPoints]] call ExileServer_system_network_send_to;
                _killer call ExileServer_object_player_sendStatsUpdate;
            }
            else 
            {
                ["systemChatRequest", [format["%1 was killed by an NPC (%2m Range)", (name _victim), floor(_victim distance _killer)]]] call ExileServer_object_player_event_killfeed;
            };
        };
    };
};
if (_addDeathStat isEqualTo true) then
{
    _newVictimDeaths = _victim getVariable ["ExileDeaths", 0];
    _newVictimDeaths = _newVictimDeaths + 1;
    _victim setVariable ["ExileDeaths", _newVictimDeaths];
    format["addAccountDeath:%1", getPlayerUID _victim] call ExileServer_system_database_query_fireAndForget;
    _victim call ExileServer_object_player_sendStatsUpdate;
};
[_victim] joinSilent ExileGraveyardGroup;
true

This is a bit of a fudge as Exile is being told it's a suicide but by scanning for zombies for 3m around the position of the _victim we can infer a zombie death.

1 person likes this

Share this post


Link to post
Share on other sites
On 4/15/2016 at 7:46 AM, speedweasel said:

I did, just now!

ExileServer_object_player_event_onMpKilled.sqf

  Hide contents

/**
 * ExileServer_object_player_event_onMpKilled
 *
 * Exile Mod
 * www.exilemod.com
 * © 2015 Exile Mod Team
 *
 * This work is licensed under the Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. 
 * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
 */
 
private["_zombieKill","_zombie","_bystanders","_weapon","_victimNear","_locationNames","_victim","_killer","_victimPosition","_addDeathStat","_addKillStat","_normalkill","_killerRespectPoints","_fragAttributes","_player","_grpvictim","_grpkiller","_log","_lastVictims","_victimUID","_vehicleRole","_vehicle","_lastKillAt","_killStack","_distance","_distanceBonus","_flagNextToKiller","_homieBonus","_flagNextToVictim","_raidBonus","_overallRespectChange","_newKillerScore","_killMessage","_newKillerFrags","_newVictimDeaths"];
if (!isServer || hasInterface) exitWith {};
_victim = _this select 0;
_killer = _this select 1;

diag_log format ["%1 killed %2", _killer, _victim];

if( isNull _victim ) exitWith {};
_victim setVariable ["ExileDiedAt", time];
if !(isPlayer _victim) exitWith {};
_victimPosition = getPos _victim;

_distance = floor(_victim distance _killer);

_locationNames = nearestLocations [getPos _victim, ["NameVillage","NameCity","NameCityCapital"], 4000];   
_victimNear = text (_locationNames select 0);
_weapon = currentWeapon _killer;

format["insertPlayerHistory:%1:%2:%3:%4:%5", getPlayerUID _victim, name _victim, _victimPosition select 0, _victimPosition select 1, _victimPosition select 2] call ExileServer_system_database_query_fireAndForget;
format["deletePlayer:%1", _victim getVariable ["ExileDatabaseId", -1]] call ExileServer_system_database_query_fireAndForget;
_victim setVariable ["ExileIsDead", true];
_victim setVariable ["ExileName", name _victim, true]; 
_victim call ExileServer_object_flies_spawn;
_addDeathStat = true;
_addKillStat = true;
_normalkill = true;
_killerRespectPoints = [];
_fragAttributes = [];
_zombieKill = false;

if (_victim isEqualTo _killer) then
{
    _bystanders = _victimPosition nearEntities ['Man',3];
    {_zombie = getText(configFile >> 'CfgVehicles' >> typeOf _x >> 'author') isEqualTo 'Ryan';
    if(_zombie)then
    {
        _zombieKill = true;
    };
    } forEach _bystanders;
    if (_zombieKill) then
    {
        ["systemChatRequest", [format["%1 was eaten by a zombie!", (name _victim)]]] call ExileServer_object_player_event_killFeed;            
    }
    else
    {
        ["systemChatRequest", [format["%1 comitted suicide!", (name _victim)]]] call ExileServer_object_player_event_killFeed;
    };
}
else 
{
    if (vehicle _victim isEqualTo _killer) then
    {
        ["systemChatRequest", [format["%1 crashed!", (name _victim)]]] call ExileServer_object_player_event_killfeed;
    }
    else 
    {
        if (isNull _killer) then
        {
            ["systemChatRequest", [format["%1 died for an unknown reason! Maybe a zombie?", (name _victim)]]] call ExileServer_object_player_event_killfeed;
        }
        else 
        {
            _player = objNull;
            if (isPlayer _killer) then 
            {
                if ((typeOf _killer) isEqualTo "Exile_Unit_Player") then
                {
                    _player = _killer;    
                }
                else 
                {
                    _uid = getPlayerUID _killer;
                    {
                        if ((getPlayerUID _x) isEqualTo _uid) exitWith 
                        {
                            _player = _x;
                        };
                    }
                    forEach allPlayers;
                };
            }
            else 
            {
                if (isUAVConnected _killer) then 
                {
                    _player = (UAVControl _killer) select 0;
                };
            };
            if !(isNull _player) then
            {
                _killer = _player;
                if (_victim getVariable ["ExileIsBambi", false]) then
                {
                    _addKillStat = false;
                    _addDeathStat = false;
                    _fragAttributes pushBack "Bambi Slayer";
                    _killerRespectPoints pushBack ["BAMBI SLAYER", (getNumber (configFile >> "CfgSettings" >> "Respect" >> "Frags" >> "bambi"))];
                }
                else 
                {
                    _grpvictim = _victim getVariable ["ExileGroup",(group _victim)];
                    _grpkiller = _killer getVariable ["ExileGroup",(group _killer)];
                    if((_grpvictim isEqualTo _grpkiller)&&!(ExileGraveyardGroup isEqualTo _grpkiller))then
                    {
                        _log = format["%2 was team-killed by %1!", (name _killer), (name _victim)];
                        ["systemChatRequest", [_log]] call ExileServer_object_player_event_killfeed;
                        _fragAttributes pushBack "Teamkill";
                        _killerRespectPoints pushBack ["TEAMKILL", (getNumber (configFile >> "CfgSettings" >> "Respect" >> "Frags" >> "friendlyFire"))];
                        _normalkill = false;
                    }
                    else
                    {
                        _lastVictims = _killer getVariable ["ExileLastVictims", ["0", "1", "2"]];
                        _victimUID = _victim getVariable ["ExileOwnerUID", getPlayerUID _victim];
                        if (_victimUID in _lastVictims) then
                        {
                            _log = format["%1 keeps killing %2!", (name _killer), (name _victim)];
                            ["systemChatRequest", [_log]] call ExileServer_object_player_event_killfeed;
                            _fragAttributes pushBack "Domination";
                            _killerRespectPoints pushBack ["DOMINATION BONUS", (getNumber (configFile >> "CfgSettings" >> "Respect" >> "Frags" >> "domination"))];
                        }
                        else
                        {
                            _lastVictims deleteAt 0;
                            _lastVictims pushBack _victimUID;
                            _killer setVariable ["ExileLastVictims", _lastVictims];
                            if ((vehicle _killer) isEqualTo _killer) then 
                            {
                                if ((currentWeapon _killer) isEqualTo "Exile_Melee_Axe") then
                                {
                                    _fragAttributes pushBack "Humiliation";
                                    _killerRespectPoints pushBack ["HUMILIATION", (getNumber (configFile >> "CfgSettings" >> "Respect" >> "Frags" >> "humiliation"))];
                                }
                                else 
                                {
                                    _killerRespectPoints pushBack ["ENEMY FRAGGED", (getNumber (configFile >> "CfgSettings" >> "Respect" >> "Frags" >> "standard"))];
                                };
                            }
                            else 
                            {
                                _vehicleRole = assignedVehicleRole _killer;
                                switch (toLower (_vehicleRole select 0)) do 
                                {
                                    case "driver":
                                    {
                                        _vehicle = vehicle _killer;
                                        switch (true) do 
                                        {
                                            case (_vehicle isKindOf "ParachuteBase"):
                                            {
                                                _fragAttributes pushBack "Chute > Chopper";
                                                _killerRespectPoints pushBack ["CHUTE > CHOPPER", (getNumber (configFile >> "CfgSettings" >> "Respect" >> "Frags" >> "chuteGreaterChopper"))];
                                            };
                                            case (_vehicle isKindOf "Air"):
                                            {
                                                _fragAttributes pushBack "Big Bird";
                                                _killerRespectPoints pushBack ["BIG BIRD", (getNumber (configFile >> "CfgSettings" >> "Respect" >> "Frags" >> "bigBird"))];
                                            };
                                            default 
                                            {
                                                _fragAttributes pushBack "Road Kill";
                                                _killerRespectPoints pushBack ["ROAD KILL", (getNumber (configFile >> "CfgSettings" >> "Respect" >> "Frags" >> "roadKill"))];
                                            };
                                        };
                                    };
                                    case "turret":
                                    {
                                        if ((currentWeapon _killer) isKindOf "StaticWeapon") then 
                                        {
                                            _fragAttributes pushBack "Let it Rain";
                                            _killerRespectPoints pushBack ["LET IT RAIN", (getNumber (configFile >> "CfgSettings" >> "Respect" >> "Frags" >> "letItRain"))];
                                        }
                                        else 
                                        {
                                            _fragAttributes pushBack "Mad Passenger";
                                            _killerRespectPoints pushBack ["MAD PASSENGER", (getNumber (configFile >> "CfgSettings" >> "Respect" >> "Frags" >> "passenger"))];
                                        };
                                    };
                                    default
                                    {
                                        _fragAttributes pushBack "Mad Passenger";
                                        _killerRespectPoints pushBack ["MAD PASSENGER", (getNumber (configFile >> "CfgSettings" >> "Respect" >> "Frags" >> "passenger"))];
                                    };
                                };
                            };                        
                        };
                    };
                };
                if (_addKillStat) then
                {
                    if(_normalkill)then
                    {
                        _lastKillAt = _killer getVariable ["ExileLastKillAt", 0];
                        _killStack = _killer getVariable ["ExileKillStack", 0];
                        _killStack = _killStack + 1;
                        if (isNil "ExileServerHadFirstBlood") then
                        {
                            ExileServerHadFirstBlood = true;
                            _fragAttributes pushBack "First Blood";
                            _killerRespectPoints pushBack ["FIRST BLOOD", getNumber (configFile >> "CfgSettings" >> "Respect" >> "Bonus" >> "firstBlood")];
                        }
                        else 
                        {
                            if (time - _lastKillAt < (getNumber (configFile >> "CfgSettings" >> "Respect" >> "Bonus" >> "killStreakTimeout"))) then
                            {
                                _fragAttributes pushBack (format ["%1x Kill Streak", _killStack]);
                                _killerRespectPoints pushBack [(format ["%1x KILL STREAK", _killStack]), _killStack * (getNumber (configFile >> "CfgSettings" >> "Respect" >> "Bonus" >> "killStreak"))];
                            }
                            else 
                            {
                                _killStack = 1; 
                            };
                        };
                        _killer setVariable ["ExileKillStack", _killStack];
                        _killer setVariable ["ExileLastKillAt", time];
                    };
//                    _distance = floor(_victim distance _killer);
                    _fragAttributes pushBack (format ["%1m Range", _distance]);
                    _distanceBonus = (floor ((_distance min 3000) / 100)) * getNumber (configFile >> "CfgSettings" >> "Respect" >> "Bonus" >> "per100mDistance");
                    if (_distanceBonus > 0) then
                    {
                        _killerRespectPoints pushBack [(format ["%1m RANGE BONUS", _distance]), _distanceBonus];
                    };
                    _flagNextToKiller = _killer call ExileClient_util_world_getTerritoryAtPosition;
                    if !(isNull _flagNextToKiller) then 
                    {
                        if ((getPlayerUID _killer) in (_flagNextToKiller getVariable ["ExileTerritoryBuildRights", []])) then
                        {
                            _homieBonus = getNumber (configFile >> "CfgSettings" >> "Respect" >> "Bonus" >> "homie");
                            if (_homieBonus > 0) then
                            {
                                _fragAttributes pushBack "Homie";
                                _killerRespectPoints pushBack ["HOMIE BONUS", _homieBonus];
                            };
                        };
                    };
                    _flagNextToVictim = _victim call ExileClient_util_world_getTerritoryAtPosition;
                    if !(isNull _flagNextToVictim) then 
                    {
                        if ((getPlayerUID _victim) in (_flagNextToVictim getVariable ["ExileTerritoryBuildRights", []])) then
                        {
                            _raidBonus = getNumber (configFile >> "CfgSettings" >> "Respect" >> "Bonus" >> "raid");
                            if (_raidBonus > 0) then
                            {
                                _fragAttributes pushBack "Raid";
                                _killerRespectPoints pushBack ["RAID BONUS", _raidBonus];
                            };
                        };
                    };
                };
                _overallRespectChange = 0;
                {
                    _overallRespectChange = _overallRespectChange + (_x select 1);
                }
                forEach _killerRespectPoints;
                _newKillerScore = _killer getVariable ["ExileScore", 0];
                _newKillerScore = _newKillerScore + _overallRespectChange;
                _killer setVariable ["ExileScore", _newKillerScore];
                format["setAccountScore:%1:%2", _newKillerScore,getPlayerUID _killer] call ExileServer_system_database_query_fireAndForget;
                if(_normalkill)then
                {
                    _killMessage = format ["%1 was killed by %2 with %3 near %4", (name _victim), (name _killer), (text _weapon), (text _victimNear)];
                    if !(count _fragAttributes isEqualTo 0) then
                    {
                        _killMessage = _killMessage + " (" + (_fragAttributes joinString ", ") + ")";
                    };
                    ["systemChatRequest", [_killMessage]] call ExileServer_object_player_event_killfeed;
                    if (_addKillStat isEqualTo true) then
                    {
                        _newKillerFrags = _killer getVariable ["ExileKills", 0];
                        _newKillerFrags = _newKillerFrags + 1;
                        _killer setVariable ["ExileKills", _newKillerFrags];
                        format["addAccountKill:%1", getPlayerUID _killer] call ExileServer_system_database_query_fireAndForget;
                    };
                };
                [_killer, "showFragRequest", [_killerRespectPoints]] call ExileServer_system_network_send_to;
                _killer call ExileServer_object_player_sendStatsUpdate;
            }
            else 
            {
                ["systemChatRequest", [format["%1 was killed by an NPC (%2m Range)", (name _victim), floor(_victim distance _killer)]]] call ExileServer_object_player_event_killfeed;
            };
        };
    };
};
if (_addDeathStat isEqualTo true) then
{
    _newVictimDeaths = _victim getVariable ["ExileDeaths", 0];
    _newVictimDeaths = _newVictimDeaths + 1;
    _victim setVariable ["ExileDeaths", _newVictimDeaths];
    format["addAccountDeath:%1", getPlayerUID _victim] call ExileServer_system_database_query_fireAndForget;
    _victim call ExileServer_object_player_sendStatsUpdate;
};
[_victim] joinSilent ExileGraveyardGroup;
true

This is a bit of a fudge as Exile is being told it's a suicide but by scanning for zombies for 3m around the position of the _victim we can infer a zombie death.

will this show AI kills ? or just PvP + Zombies ? ty

Share this post


Link to post
Share on other sites

This adds proximity and weapon values to the existing killfeed as well as distinguishing between suicides and zombie kills.  

Everything that is reported in vanilla Exile is still reported in this system, including when AI kills a player.

Share this post


Link to post
Share on other sites
Advertisement

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.