Quasi Normal (Melano!)

Method for using the respect point system with ALL ai

3 posts in this topic

Hi,
Is that possible to have the respect point system automaticaly used whit any ai, or automaticaly use by a side.
I'm using ifferetn ai systems and having the points for some an not for other is frustrating.

I'm wondering if there is a methode/modification for a simplification of this "issue"

thanks in advance for the help.

Share this post


Link to post
Share on other sites

Look at the code from DMS, 

fn_PlayerAwardOnAIKill.sqf

Spoiler

/*
    DMS_fnc_PlayerAwardOnAIKill
    Created by eraser1
    Gives (or removes) a player's respect/poptabs for killing an AI.
    Usage:
    [
        _playerObj,
        _unit,
        _AISide,
        _AIType,
        _roadKilled
    ] call DMS_fnc_PlayerAwardOnAIKill;
    Returns nothing
*/

private ["_playerUID", "_playerObj", "_moneyChange", "_AISide", "_AIType", "_repChange", "_roadKilled", "_unitMoney", "_unit", "_unitRespect", "_playerMoney", "_playerRespect", "_unitName", "_msgType", "_msgParams"];

if !(params
[
    ["_playerObj",    objNull,    [objNull]    ],
    ["_unit",        objNull,    [objNull]    ],
    ["_AISide",        "",            [""]        ],
    ["_AIType",        "",            [""]        ],
    ["_roadKilled",    false,        [false]        ]
])
exitWith
{
    diag_log format ["DMS ERROR :: Calling DMS_fnc_PlayerAwardOnAIKill with invalid parameters: %1",_this];
};


_playerUID = getPlayerUID _playerObj;

if ((!isNull _playerObj) && {(_playerUID != "") && {_playerObj isKindOf "Exile_Unit_Player"}}) then
{
    _moneyChange = missionNamespace getVariable [format ["DMS_%1_%2_MoneyGain",_AISide,_AIType],0];
    _repChange = missionNamespace getVariable [format ["DMS_%1_%2_RepGain",_AISide,_AIType],0];
    _rankChange = missionNamespace getVariable [format ["DMS_%1_%2_RankGain",_AISide,_AIType],0];

    // Check for individually defined AI money/respect/rank.
    _unitMoney = _unit getVariable ["DMS_AI_Money",""];
    _unitRespect = _unit getVariable ["DMS_AI_Respect",""];
    _unitRank = _unit getVariable ["DMS_AI_Rank",""];

    if !(_unitMoney isEqualTo "") then
    {
        _moneyChange = _unitMoney;
    };

    if !(_unitRespect isEqualTo "") then
    {
        _repChange = _unitRespect;
    };

    if !(_unitRank isEqualTo "") then
    {
        _rankChange = _unitRank;
    };


    if (_roadKilled && {_unit getVariable ["DMS_Diff_RepOrTabs_on_roadkill",DMS_Diff_RepOrTabs_on_roadkill]}) then
    {
        _moneyChange = missionNamespace getVariable [format ["DMS_%1_%2_RoadkillMoney",_AISide,_AIType],0];
        _repChange = missionNamespace getVariable [format ["DMS_%1_%2_RoadkillRep",_AISide,_AIType],0];
        _rankChange = missionNamespace getVariable [format ["DMS_%1_%2_RoadkillRank",_AISide,_AIType],0];
    };


    if ((_moneyChange!=0) || {_repChange!=0} || {_rankChange!=0}) then
    {
        _playerMoney = _playerObj getVariable ["ExileMoney", 0];
        _playerRespect = _playerObj getVariable ["ExileScore", 0];
        _playerRank = _playerObj getVariable ["ExileHumanity", 0];
        _unitName = name _unit;

        /*
        if (DMS_DEBUG) then
        {
            format ["PlayerAwardOnAIKill :: Attempting to give %1 (%2) %3 poptabs and %4 respect and %5 rank. Player currently has %6 tabs and %7 respect and &8 rank.", name _playerObj, _playerUID, _moneyChange, _repChange, _rankChange,_playerMoney, _playerRespect,_playerRank] call DMS_fnc_DebugLog;
        };
        */

        if (_moneyChange!=0) then
        {
            private ["_msgType", "_msgParams", "_distance", "_attributes", "_distanceBonus"];

            // Set client's money
            // I also make sure that they don't get negative poptabs
            _playerMoney = (_playerMoney + _moneyChange) max 0;
            _playerObj setVariable ["ExileMoney",_playerMoney];

            _msgType = "moneyReceivedRequest";
            _msgParams = [str _playerMoney, format ["killed %1",_unitName]];

            if (_moneyChange<0) then
            {
                // Change message for players when they're actually LOSING poptabs
                _msgType = "notificationRequest";
                _msgParams = ["Whoops",[format ["Lost %1 poptabs from running over a %2 AI!",abs _moneyChange,_AIType]]];

                // With the error message the money value won't be updated on the client, so I just directly PVC the value.
                ExileClientPlayerMoney = _playerMoney;
                (owner _playerObj) publicVariableClient "ExileClientPlayerMoney";
                ExileClientPlayerMoney = nil;
            };

            if (DMS_Show_Kill_Poptabs_Notification) then
            {
                // Send notification and update client's money stats
                [_playerObj, _msgType, _msgParams] call ExileServer_system_network_send_to;
            }
            else
            {
                // Player's money will already be updated for negative values, so let's not create unnecessary network traffic by sending another PVC
                if (_moneyChange>0) then
                {
                    ExileClientPlayerMoney = _playerMoney;
                    (owner _playerObj) publicVariableClient "ExileClientPlayerMoney";
                    ExileClientPlayerMoney = nil;
                };
            };
        };

        if (_repChange!=0) then
        {
            _attributes = [[format ["KILLED %1",toUpper(_unitName)],_repChange]];

            if (DMS_AIKill_DistanceBonusCoefficient>0) then
            {
                _distance = floor (_unit distance _playerObj);

                if (_distance>DMS_AIKill_DistanceBonusMinDistance) then
                {
                    _distanceBonus = floor (_distance * DMS_AIKill_DistanceBonusCoefficient);
                    _attributes pushBack [format ["%1m RANGE BONUS",_distance], _distanceBonus];

                    _repChange = _repChange + _distanceBonus;
                };
            };

            // Set client's respect
            _playerRespect = _playerRespect + _repChange;
            _playerObj setVariable ["ExileScore",_playerRespect];

            if (DMS_Show_Kill_Respect_Notification) then
            {
                // Send frag message
                [_playerObj, "showFragRequest", [_attributes]] call ExileServer_system_network_send_to;
            };

            // Send updated respect value to client
            ExileClientPlayerScore = _playerRespect;
            (owner _playerObj) publicVariableClient "ExileClientPlayerScore";
            ExileClientPlayerScore = nil;
        };
        //DONKEYPUNCH CUSTOM KILL STAT ADD FOR AI KILL
        if (DMS_Add_AIKill2DB) then
        {
            _newKillerFrags = _killer getVariable ["ExileKills", 0];
            _newKillerFrags = _newKillerFrags + 1;
            _killer setVariable ["ExileKills", _newKillerFrags];
            format["addAccountKill:%1", getPlayerUID _killer] call ExileServer_system_database_query_fireAndForget;
            ExileClientPlayerKills = _newKillerFrags;
            (owner _playerObj) publicVariableClient "ExileClientPlayerKills";
            ExileClientPlayerKills = nil;
        };
        //DONKEYPUNCH CUSTOM KILL RANK CHANGE FOR AI KILL
        if (DMS_Enable_RankChange) then
        {
            if (_rankChange!=0) then
            {
                _playerRank = (_playerRank+_rankChange);
                _killer setVariable ["ExileHumanity",_playerRank];
                format["modifyAccountHumanity:%1:%2",_rankChange,getPlayerUID _killer] call ExileServer_system_database_query_fireAndForget;
                ExileClientPlayerHumanity = _playerRank;
                (owner _playerObj) publicVariableClient "ExileClientPlayerHumanity";
                ExileClientPlayerHumanity = nil;
            };
        };
        if (DMS_DEBUG) then
        {
            format ["PlayerAwardOnAIKill :: %1 (%2) awarded %3 poptabs and %4 respect for killing %5. Player's money is now %6, and respect is now %7. Roadkill: %8", name _playerObj, _playerUID, _moneyChange, _repChange, _unit, _playerMoney, _playerRespect, _roadKilled] call DMS_fnc_DebugLog;
        };

        // Update client database entry
        format["setAccountMoneyAndRespect:%1:%2:%3", _playerMoney, _playerRespect, _playerUID] call ExileServer_system_database_query_fireAndForget;

        if (DMS_Show_Party_Kill_Notification) then
        {
            private ["_group", "_members", "_msg"];

            _group = group _playerObj;
            _members = units _group;
            if (!(_group isEqualTo ExileGraveyardGroup) && {(count _members)>1}) then
            {
                _msg = format
                [
                    "%1 killed %2 from %3 meters away and received %4 poptabs, %5 respect and %6 rank.",
                    name _playerObj,
                    _unitName,
                    if !(isNil "_distance") then {_distance} else {floor(_unit distance _playerObj)},
                    _moneyChange,
                    _repChange,
                    _rankChange
                ];
                {
                    _msg remoteExecCall ["systemChat", _x];
                } forEach _members;
            };
        };
    }
    else
    {
        if (DMS_DEBUG) then
        {
            format ["PlayerAwardOnAIKill :: %1 (%2) was not awarded any poptabs or respect.", name _playerObj, _playerUID] call DMS_fnc_DebugLog;
        };
    };
}
else
{
    if (DMS_DEBUG) then
    {
        format ["PlayerAwardOnAIKill :: No reward for non-player _playerObj: %1",_playerObj] call DMS_fnc_DebugLog;
    };
};

Should give you a pretty good idea of how it works ^_^

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.