Sir_Joker

Trader mit Respect zahlen (Gedankengang)

2 posts in this topic

Posted (edited)

Da eine Nachfrage im Forum erfolglos blieb habe ich mich auf die Suche gemacht, ob ich das nicht selber bewerkstelligen kann.
Da meine Kenntnisse beim scripten allerdings eingeschränkt sind, hier mal ein paar Gedankengänge, dass es so klappen könnte.

Beim Kauf eines Items (alles ausser Fahrzeuge) wird das Script 'ExileServer_system_trading_network_purchaseItemRequest.sqf' aufgerufen:
 

Spoiler

/**
* ExileServer_system_trading_network_purchaseItemRequest
*
* 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["_sessionID","_parameters","_itemClassName","_quantity","_containerType","_containerNetID","_playerObject","_vehicleObject","_salesPrice","_playerMoney","_responseCode"];
_sessionID = _this select 0;
_parameters = _this select 1;
_itemClassName = _parameters select 0;
_quantity = _parameters select 1;
_containerType = _parameters select 2;
_containerNetID = _parameters select 3;
try 
{
_playerObject = _sessionID call ExileServer_system_session_getPlayerObject;
if (_playerObject getVariable ["ExileMutex",false]) then
{
throw 12;
};
_playerObject setVariable ["ExileMutex",true];
_vehicleObject = objNull;
if (isNull _playerObject) then
{
throw 1;
};
if !(alive _playerObject) then
{
throw 2;
};
if !(isClass (missionConfigFile >> "CfgExileArsenal" >> _itemClassName) ) then
{
throw 3;
};
_salesPrice = getNumber (missionConfigFile >> "CfgExileArsenal" >> _itemClassName >> "price");
if (_salesPrice <= 0) then
{
throw 4;
};

_playerMoney = _playerObject getVariable ["ExileMoney", 0];
if (_playerMoney < _salesPrice) then
{
throw 5;
};
_playerMoney = _playerMoney - _salesPrice;
_playerObject setVariable ["ExileMoney", _playerMoney];
format["setAccountMoney:%1:%2", _playerMoney, (getPlayerUID _playerObject)] call ExileServer_system_database_query_fireAndForget;
[_sessionID, "purchaseItemResponse", [0, str _playerMoney, _itemClassName, 1, _containerType, _containerNetID]] call ExileServer_system_network_send_to;

if !(_vehicleObject isEqualTo objNull) then
{
_vehicleObject call ExileServer_object_vehicle_database_update;
}
else 
{
_playerObject call ExileServer_object_player_database_update;
};
}
catch 
{
_responseCode = _exception;
[_sessionID, "purchaseItemResponse", [_responseCode, "", "", 0, 0, ""]] call ExileServer_system_network_send_to;
};
_playerObject setVariable ["ExileMutex",false];
true


wenn ich das richtig lese werden hier einige Infos aus der DB und der config.cpp gelesen. 
u.a.

player ID Poptabs (_playerMoney) aus der DB und
Item und Verkaufspreis (_salesPrice) aus der config.cpp (CfgExileArsenal) wobei _salesPrice in der config mit price = zahl angegebn ist.
 

_salesPrice = getNumber (missionConfigFile >> "CfgExileArsenal" >> _itemClassName >> "price");


Frage 1: 

if Bedingung{ throw 1;}

wenn die Bedingung zutrifft wird der Rückgabewert 1 erzeugt.
Wird der unten bei catch { } weiterverarbeitet?


Frage 2:
_sellPrice wird aus dem Array in der config gelesen, Aufbau:

class name { quality = 1; price = 150; sellprice= 20; }

kann ich hier einfach einen Wert zufügen, also z.B.

class name { quality = 1; price = 150; sellprice= 20; score= 150; }

um dann mit

_salesScore = getNumber (missionConfigFile >> "CfgExileArsenal" >> _itemClassName >> "score");

den Wert einzulesen?

Zusammenfassend:
Ich möchte den Items die ich mit Respekt handeln will einen Wert "score" zuweisen.
In dem Script frage ich dann ab ob score >= 0 ist (ist ein nicht vergebener Wert hier 0 oder NULL?)
wenn ja berechne ich die Respektpunkte wie in dem Script die Poptabs, wenn nein erfolgt der Verkauf mit Poptabs.

Mein Lösungsansatz :

Spoiler


...

private["_sessionID","_parameters","_itemClassName","_quantity","_containerType","_containerNetID","_playerObject","_vehicleObject","_salesPrice","_playerMoney","_responseCode","_salesScore","_playerScore"];
_sessionID = _this select 0;
_parameters = _this select 1;
_itemClassName = _parameters select 0;
_quantity = _parameters select 1;
_containerType = _parameters select 2;
_containerNetID = _parameters select 3;
try 
{
_playerObject = _sessionID call ExileServer_system_session_getPlayerObject;
if (_playerObject getVariable ["ExileMutex",false]) then
{
throw 12;
};
_playerObject setVariable ["ExileMutex",true];
_vehicleObject = objNull;
if (isNull _playerObject) then
{
throw 1;
};
if !(alive _playerObject) then
{
throw 2;
};
if !(isClass (missionConfigFile >> "CfgExileArsenal" >> _itemClassName) ) then
{
throw 3;
};
_salesPrice = getNumber (missionConfigFile >> "CfgExileArsenal" >> _itemClassName >> "price");
if (_salesPrice <= 0) then
{
throw 4;
};

//Respect buy - Mod START
_playerScore = _playerObject getVariable ["ExileScore", 0];
_salesScore = _getNumber (missionConfigFile >> "CfgExileArsenal" >> _itemClassName >> "score");
if (_salesScore > 0) then //buy with Respect
{
if (_playerScore < _salesScore) then
{
throw 5;
};
_playerScore = _playerScore - _salesScore;
_playerObject setVariable ["ExileScore", _playerScore];
format["setAccountScore:%1:%2", _playerScore, (getPlayerUID _playerObject)] call ExileServer_system_database_query_fireAndForget;
[_sessionID, "purchaseItemResponse", [0, str _playerScore, _itemClassName, 1, _containerType, _containerNetID]] call ExileServer_system_network_send_to;
};
//buy with Respect END
else //Normal buy
{
_playerMoney = _playerObject getVariable ["ExileMoney", 0];
if (_playerMoney < _salesPrice) then
{
throw 5;
};
_playerMoney = _playerMoney - _salesPrice;
_playerObject setVariable ["ExileMoney", _playerMoney];
format["setAccountMoney:%1:%2", _playerMoney, (getPlayerUID _playerObject)] call ExileServer_system_database_query_fireAndForget;
[_sessionID, "purchaseItemResponse", [0, str _playerMoney, _itemClassName, 1, _containerType, _containerNetID]] call ExileServer_system_network_send_to;
};
// Respect buy - MOD END

if !(_vehicleObject isEqualTo objNull) then
{
_vehicleObject call ExileServer_object_vehicle_database_update;
}
else 
{
_playerObject call ExileServer_object_player_database_update;
};
}
catch 
{
_responseCode = _exception;
[_sessionID, "purchaseItemResponse", [_responseCode, "", "", 0, 0, ""]] call ExileServer_system_network_send_to;
}; 
_playerObject setVariable ["ExileMutex",false];
true

 

Ergebnis:
Server startet normal, kein Fehlereintrag im rpt, kann aber nichts kaufen oder verkaufen.
Hat irgendwer eine Idee oder ist mein Vorhaben aus irgendeinem Grund nicht umsetzbar?
Wie gesagt, ich sehe mich da als Anfänger, erwarte auch keine fertige Lösung sondern evtl. einen Denkanstoß.

Edited by Sir_Joker

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.