Jump to content
  • 0

Add Items to dead body


Guest

Question

Hi,

 

i've tryed for ages now to add items to a dead body, for the swap kit script. I can't do it, it won't delete the items i took and neither will it add my items, it seems like the Body inventory is not being updated or touched, whatever..

 

I did try it with addMagazineCargoGlobal, but unless i made it wrong, that didn't work neither...

 

/*
	Function Name: fnc_add_magazines
	Function Description: Add Magazines or Weapons to Unit
	Function Parameters: Unit, Weapons or Magazines to add, Type
	Function Return: Nothing
*/
	private["_unit","_magazineArray","_magslot","_type","_count"];
	
	_unit = _this select 0;
	_magazineArray = _this select 1;
	_type = _this select 2;
	
	if (_type == "magazine") then {
		{_unit removeMagazine _x;} forEach magazines _unit;
	
		{
			_unit addMagazine _x;
		} forEach _magazineArray;
	};
	if (_type == "weapon") then {
		removeAllWeapons _unit;
	
		{
			_unit addWeapon _x;
		} forEach _magazineArray;
	};
	
	player reveal _unit;

What is wrong with this script? It works fine, if i add the items to the player.. Then all items are removed and added correctly..

Link to comment
Share on other sites

24 answers to this question

Recommended Posts

  • 0

are you executing this script via client or server?

 

have you tried to add this function to server_playerDied.sqf?

 

Client. This can't be executed via server, as the client is getting the items of the body.. Also the inventory of the ai unit is what server side or client side? I don't know.. Maybe i can remote exec that:

 

/*
	Function Name: fnc_add_magazines
	Function Description: Add Magazines to Unit
	Function Parameters: Unit
	Function Return: Nothing
*/
	private["_unit","_magazineArray","_magslot","_type","_count"];
	
	_unit = _this select 0;
	_magazineArray = _this select 1;
	_type = _this select 2;
	
	if (_type == "magazine") then {
		if (_unit == player) then {
			{_unit removeMagazine _x;} forEach magazines _unit;
		
			{
				_unit addMagazine _x;
			} forEach _magazineArray;
		} else {
			[nil,nil,"per",rCLEARMAGAZINECARGO,_unit] call RE;
			
			{
				[nil,_unit,"per",rADDMAGAZINECARGO,_x] call RE;
			} forEach _magazineArray;
		};
		
	};
	if (_type == "weapon") then {
		removeAllWeapons _unit;
	
		{
			_unit addWeapon _x;
		} forEach _magazineArray;
	};
	
	player reveal _unit;

???

Link to comment
Share on other sites

  • 0

Ok und im Detail?

Bestimmte Items oder das komplette gear einmal tauschen?

Soll das direkt beim Tod ausgeführt werden oder über ein Kommando vom spieler? (Addaction)

 

Über ein Menü. Funktioniert genau so, wie Addaction aber sieht besser aus. Und nur die Items, also Essen, Trinken, Magazine etc.. Keine Waffen oder so..

Link to comment
Share on other sites

  • 0

also nur Magazine sollen gerettet werden und Waffen, Tools sollen verfallen?

Was ist mit Rucksack und Inhalt?

 

EDIT: Ich verstehe da noch nicht ganz die Logik dahinter, wieso sollte jemand diese Option auswählen anstatt einfach an der Leiche sein Zeug übers Gear menü zu holen?

Oder soll das direkt nach dem respawn auftauchen zum aktivieren?

Damit ich da weiß wie ich ungefähr vorgehen soll.

Link to comment
Share on other sites

  • 0

also nur Magazine sollen gerettet werden und Waffen, Tools sollen verfallen?

Was ist mit Rucksack und Inhalt?

 

EDIT: Ich verstehe da noch nicht ganz die Logik dahinter, wieso sollte jemand diese Option auswählen anstatt einfach an der Leiche sein Zeug übers Gear menü zu holen?

Oder soll das direkt nach dem respawn auftauchen zum aktivieren?

Damit ich da weiß wie ich ungefähr vorgehen soll.

 

Nein.

Man bekommt ein menü und wählt dann aus entweder alles tauschen oder nur rucksack tauschen oder nur waffen oder nur items tauschen.. Wenn du zum beispiel gestorben bist und die Waffe aber nicht die items tauschen willst klickst du auf Waffe Tauschen, wenn du die Items aber nicht die Waffe Tauschen willst klickst du auf Waffe Tauschen und so weiter.. Es geht einfach wesentlich schneller, als jedes item einzeln an zu klicken.

 

Link to comment
Share on other sites

  • 0

ok verstanden, hab aber trotzdem schonmal was zusammen geschustert, was hoffentlich das ist wonach du gesucht hast:

private ["_magazineTarget","_target","_player"];
_player = player;
_target = cursorTarget;
systemchat format ["_player: %1",_player];
systemchat format ["_target: %1",_target];

_magazineTarget = magazines _target;
systemchat format ["_magazineTarget: %1",_magazineTarget];

//remove Magazines player
{_player removeMagazine _x;systemchat format ["_x: %1",_x];} count (magazines _player);

systemchat "test1";
//add magazines player
{_player addMagazine _x;} count _magazineTarget;
systemchat "test2";
//remove weapons
{_target removeWeapon _x;} count (weapons _target);
systemchat "test3";
//remove magazines
{_target removeMagazine _x;} count (magazines _target);
systemchat "test4";

damit solltest du weiter arbeiten können :)

Link to comment
Share on other sites

  • 0

falls es dich noch interessieren könnte:

 

mit 

{[player,_x] call BIS_fnc_invAdd;} count _magazineTarget;

kriegst du ein sauberes Ergebnis hin, da du mit addmagizine eventuell bsp. 16/12 Items dem spieler geben kannst ^^

 

take_clothes.sqf hat zB so einen check drin:

  _result = [player,_itemNew] call BIS_fnc_invAdd;
   if (_result) then {
/* Add Skin*/
   } else {
     cutText ["I do not have enough room in my inventory.", "PLAIN DOWN"];
     player switchMove "";
     player playActionNow "stop";
   };
Link to comment
Share on other sites

  • 0

Das hier:

private ["_magazineTarget","_target","_player"];
_player = player;
_target = cursorTarget;
systemchat format ["_player: %1",_player];
systemchat format ["_target: %1",_target];

_magazineTarget = magazines _target;
systemchat format ["_magazineTarget: %1",_magazineTarget];

//remove Magazines player
{_player removeMagazine _x;systemchat format ["_x: %1",_x];} count (magazines _player);

systemchat "test1";
//add magazines player
{_player addMagazine _x;} count _magazineTarget;
systemchat "test2";
//remove weapons
{_target removeWeapon _x;} count (weapons _target);
systemchat "test3";
//remove magazines
{_target removeMagazine _x;} count (magazines _target);
systemchat "test4";

Is ein und dieselbe function, die ich auch benutzt habe und das hat für den Spieler funktioniert, für den toten aber nicht. Es werden keine Items, Waffen etc vom toten entfernt.. Das ist doch gerade mein Problem, alles andere is fertig.

Link to comment
Share on other sites

  • 0

doch wird es mit dieser funktion:

//remove weapons
{_target removeWeapon _x;} count (weapons _target);
systemchat "test3";
//remove magazines
{_target removeMagazine _x;} count (magazines _target);

hab es ja getestet und es funktioniert :)

 

hast du geguckt ob dein toter überhaupt exisitert? also ob _unit  überhaupt was rausgibt bzw. _unit == player wahr ist?

Link to comment
Share on other sites

  • 0

tjaaaahaaaa... das liegt daran, dass ein Spieler nicht gleichzeit 2 verschiedene units sein kann :)

 

Also heißt das du musst etwas abfragen, was beide gleich haben und zwar den Namen:

_nameTarget = 	_unit getVariable["bodyName","unknown"];
_namePlayer = 	player getVariable["bodyName","unknown"];

if (_nameTarget == _namePlayer) then {
Link to comment
Share on other sites

  • 0

so nach etwas schlaf sollte es bei mir hoffentlich etwas funktionieren :)

 

weiß nicht ob es eventuell daran liegt dass ich das im Editor mache, aber es funktioniert defentiv:

 

m8unxfrv.png

 

9uq494mj.png

 

ich habe aber so langsam glaube die Mechanik dahinter verstanden wie du es haben willst.

Ich versuche da mal  was neues und diesmal mit meiner eigenen Leiche auf dem Testserver :)

 

EDIT: 

Gerade getestet, lustigerweise werden die Sachen direkt nachdem sie dir übertragen worden sind wieder in die Leiche dupliziert.

Es funktioniert also an sich, nur lustigerweise wird der leiche auch nochmal genau das selbe hinzugefügt ^^

Schauen wa mal was sich da machen lässt :)

 

EDIT2:

 

Jab gerade alles mögliche versucht, sobald du das Gear per Client löscht wird es gleich darauf der Leiche wieder rein gesetzt.

Du musst es also über den Server machen, zumindest da Gear entfernen. Alles andere kann über den Client laufen :)

 

Du weißt wie sowas gemacht wird?

Link to comment
Share on other sites

  • 0

EDIT2:

 

Jab gerade alles mögliche versucht, sobald du das Gear per Client löscht wird es gleich darauf der Leiche wieder rein gesetzt.

Du musst es also über den Server machen, zumindest da Gear entfernen. Alles andere kann über den Client laufen :)

 

Du weißt wie sowas gemacht wird?

 

Du meinst PublicVariableServer? Ja, das weiß ich :) Aber benutz ich dann ein und dieselbe Funktion, also kopier ich alles einfach dort hin oder muss ich das umschreiben?

Link to comment
Share on other sites

  • 0

nein kannst du 1 zu 1 verwenden, aber halt nur das löschen des Gears des Toten. Das übertragen auf den Spieler kann der Client selbst ausführen

 

Danke. Würde das hier funktionieren:

 

"PVDZE_swap_kit" addPublicVariableEventHandler {
	private["_target","_type","_caller","_backpack"];
		_target = ((_this select 1) select 0);
		_type = ((_this select 1) select 1);
		_caller = ((_this select 1) select 2);
		if (count (_this select 1) > 2) then {
			_backpack = ((_this select 1) select 3);
		};
		
		diag_log (format["[DEBUG] Player %1 Initialized deletion of %2 for %3",_caller,_type,_target]);

		if (_type == "weapon") {
			{_target removeWeapon _x;} count (weapons _target);
			PVDZE_swap_kit_success = true;
			(owner _caller) publicVariableClient "PVDZE_swap_kit_success";
		};
		if (_type == "magazine") {
			{_target removeMagazine _x;} count (magazines _target);
			PVDZE_swap_kit_success = true;
			(owner _caller) publicVariableClient "PVDZE_swap_kit_success";
		};
		if (_type == "backpack") {
			removeBackpack _target;
			_target addBackpack _backpack;
			_bp = unitBackpack _unit;
			
			PVDZE_swap_kit_success = true;
			(owner _caller) publicVariableClient "PVDZE_swap_kit_success";
		};
};

Besonders der Teil mit dem Rucksack.

Link to comment
Share on other sites

  • 0

weiß ich nicht so aus dem stehgreif ^^

 

ich setze solche funktionen gerne dann immer in die server_functions und schreibe es in die publicEH.sqf, sieht aber an sich gut aus.

 

hast du denn keinen Testserver?

 

Es hat den ganzen Server gekillt. Ich konnte mich nicht mehr einloggen.

Link to comment
Share on other sites

  • 0

ich schreib dir mal später wie ich das gemacht habe :)

 

EDIT: so habe ich das gemacht:

 

server_functions.sqf

die Funktion zum entfernen des Gears


server_swapGear = {
private ["_itemPlayer","_type","_item","_target","_player"];
_player = _this select 0;
_target = _this select 1;
_type = _this select 2;
_item = [];
_itemPlayer = [];

//magazines
if (_type == "mags") then {
	//grab the Magazines of Target
	_item = magazines _target;
	_itemPlayer = magazines _player;

};

if (_type == "weaps") then {

	//grab the Weapons (inlcuded Tools) of Target
	_item = weapons _target;
	_itemPlayer = weapons _player;
};
//Gear tauschen?
//remove Magazines player
{[_player,_x] call BIS_fnc_invRemove;} count _itemPlayer;

//remove magazines target
{[_target,_x] call BIS_fnc_invRemove;} count _item;

//add choosen Items to Player
{[_player,_x] call BIS_fnc_invAdd;} forEach _item;

//add choosen Items to Target
{[_target,_x] call BIS_fnc_invAdd;} forEach _itemPlayer;


};

publicEH.sqf

 

irgendwo im isServer Bereich:

"Swap_Gear" 			addPublicVariableEventHandler {(_this select 1) spawn server_swapGear

und im Script selbst die funktion folgendermaßen aufrufen:

Swap_Gear = [_player,_target,_type];
publicVariableServer "Swap_Gear";

Ich kann dir aber nicht sagen, ob das der perfomance beste weg ist, es ist nur der weg den ich momentan gefunden habe.

 

Es könnte eventuell sein, dass man auch die Leiche selbst das Script ausführen lassen kann, für bessere perfomance, muss ich aber testen :)

Link to comment
Share on other sites

  • 0

Thank you very much! I prefer it my way, to help to prevent duping (it won't add items to the player unless the server send the variable back and confirmed, that the items have been removed.. I just forgot to add "then" in my IF... That's why the server wouldn't start... I'll be sending you the full version, once i'm done - if you want it?

Link to comment
Share on other sites

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
  • Advertisement
  • Discord

×
×
  • Create New...