Jump to content

[TUTORIAL] Remove/Change Trading Animations (for faster trading)


Gr8

Recommended Posts

This Tutorial will teach you how to alter/change or remove trader animations for faster trading

 

Requirements:
* Basic knowledge of unpacking pbo's
* Custom compiles
 
* Common sense
* Text Editor (notepad++)
 


Installation

 
(If you already have a compiles file, Skip to #4 please)
 
1) Open your dayz_mission.pbo and open init.sqf

 
Find:

call compile preprocessFileLineNumbers "\z\addons\dayz_code\init\compiles.sqf"; //Compile regular functions

Replace it with:

call compile preprocessFileLineNumbers "fixes\compiles.sqf"; //Compile regular functions

2) Now make a folder called fixes
 
3) copy this file into the fixes folder

..\Steam\SteamApps\common\Arma 2 Operation Arrowhead\@DayZ_Epoch\addonsdayz_code.pbo\init\compiles.sqf 

(if you already have a custom compiles.sqf, start here)
 
4) Open fixes/compiles.sqf
 
Find:


call compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_traderMenuHive.sqf";

Replace it with:

call compile preprocessFileLineNumbers "fixes\player_traderMenuHive.sqf";

5) Copy this file into your fixes folder

..\Steam\SteamApps\common\Arma 2 Operation Arrowhead\@DayZ_Epoch\addonsdayz_code.pbo\compile\player_traderMenuHive.sqf 

6)  Open fixes/player_traderMenuHive.sqf 
 
Find: 

_File = "\z\addons\dayz_code\actions\" + _afile + ".sqf";

Replace it with:

_File = "fixes\trade\" + _afile + ".sqf";

7) Make a folder called trade inside the fixes folder
 
8) Download the appropriate file for your server and extract them inside the traders folder

Epoch

Epoch With Zupa 1.1 Single Currency
Epoch With Soul's Edit

9) Repack and you're done :)
 
 

Configuration

 

If you leave the way you installed it, it will be ready to go on the server. On my version of code, instead of the medic animation, it will do a pickup or lean animation which is way quicker than the medic animation.
 
however if you want to modify it to your likings, you may do so very easily.
 
To Change the animation of trading
 
Open every file inside the fixes/trade folder
 
Find:

player playActionNow "PutDown";

and replace "PutDown" with any other animation you like. Check this link for almost all the arma animation
 
 
 
To Remove the animation of trading
 
Open every file inside the fixes/trade folder
 
Find:

player playActionNow "PutDown";

Remove the line whole line, to simple get rid of the animation.
 
 

 

 

 

Credits:

Zupa

PeterBeer

Link to comment
Share on other sites

Seems to be a cool idea but doesent work for me.

The animation doesent loop and u could buy just one Item.

 

Check the link for new files, replace it with yours, Loop is now working

Link to comment
Share on other sites

Hey! THX for ur fast reply!

I replace my old files with ur updated one.

Faster trading works now but there is a new problem!

I cant cancle the trade with moving. He still trade as long ur money is empty.

 

Do u have a solution for this?

 

THX!

Link to comment
Share on other sites

Yes, trade_cancel.sqf is missing. Looking through the files I see the eniter block for the loop and to cancel was modified.

 

Zero

 

EDIT: Also noticed trade metals was not included. Wonder if this will cause an issue when the trader converts your metals... gonna revert back to the original methos until these problems are sorted out. Great idea though and much better than original animation. Hope someone smarter than me can get this working properly.

 

EDIT2: Also not included is when players trade zombie guts for biomeat, Whiskey bottles for Tin Etc. Hope this helps get in right direction :)

Link to comment
Share on other sites

Youre right, With a lack of a test server. I am struggling to make a stable version of this script :(

 

Its okay man! We will help test for you! I'd like to see this become a nice addition to our server and I know other people would too! Let me know what I can do! Keep up the good work! :)

 

Zero

Link to comment
Share on other sites

THX for the update but now when i buy something he start with the "PutDown" animation. i let him continue few times and then i move to concle the trade.

cancel works now but i have no Items in the inventory, no money was payed and it display the message "U have interrupt the trade"

Link to comment
Share on other sites

THX for the update but now when i buy something he start with the "PutDown" animation. i let him continue few times and then i move to concle the trade.

cancel works now but i have no Items in the inventory, no money was payed and it display the message "U have interrupt the trade"

 

Thanks for the update, will report to you with a new version soon :)

Link to comment
Share on other sites

I have the latest files installed on our server and it will continue to trade over 200m away from the trader without stopping. Im looking to find a way to make it cancel on each trade if that's okay with you, no guarantee's tho :)

Link to comment
Share on other sites

Hey,

 

Thanks for all the work so far, this is something i would really love on my server :) I can't get it to work though, i believe i have the latest files but it just kneels down and no trades occur, i had a bash at editing it myself but i tend to do round in circles logic wise till i forget where i am :/  i though t the error was:

        while {r_doLoop} do {
                _animState = animationState player;
                _isStarted = ["putdown",_animState] call fnc_inString;
                if (_isStarted) then {_started = true;};
                if(!_isStarted && !r_interrupt ) then {
                        player playActionNow "PutDown";
                        _isStarted = true;
                };
                if (_started && !_isStarted ) then {
                        r_doLoop = false;
                        sleep 1; // the amount of secs u want it to take to trade.
                        _finished = true;                      
                };
                if (r_interrupt) then {
                        r_doLoop = false;
                };
                sleep 0.1;
        };

As in if you follow it down:

 

_animState = hasvalue

_isStarted = true

_started = true

 

then the following 3 if statements in this r_doLoop dont address the case for both started and isstarted to be true and so nothing ever happens until you cancel out with an inturrupt. Also just trying to get my head around the reason for all this. When running this script i kneel down to do the putdown action but then never stand up again, i know medic animation is a loop, as in, the starting position for your character is the same as the ending one but this doesn't seem to be the case for the put down animation?

 

Is this possibly causing the line:

 

_isStarted = ["PutDown",_animState] call fnc_inString;

 

to always give a value and therefore this line:

 

if (_started && !_isStarted ) then {
 

to never be satisfied?

 

 

I thought this might be the case so i tried:

	while {r_doLoop} do {
		_animState = animationState player;
		_isStarted = ["PutDown",_animState] call fnc_inString;
		if (_isStarted) then {_started = true;};
		if(!_isStarted && !r_interrupt ) then {
			player playActionNow "PutDown";
			sleep 2;
			[objNull, player, rSwitchMove,""] call RE;
			player playActionNow "stop";
		};
		if (_started && !_isStarted ) then {
			_finished = true;
			r_doLoop = false;
		};
		if (r_interrupt) then {
			r_doLoop = false;
		};
		if (_started && _isStarted ) then {
			sleep 2;
			[objNull, player, rSwitchMove,""] call RE;
			player playActionNow "stop";
			_finished = true;
			r_doLoop = false;
		};
		sleep 0.1;
    };

To make it manually get up again after a certain amount of time like i think you were aiming for but now mine doesnt kneel in the first place lol, still says im trading though and never inturrupts...

 

Rambling aside I don't really know what i'm doing here, first attempt but i would love for this feature to work! :D

Link to comment
Share on other sites

HMM, have got it to work with a 2 second delay using the medic animation combination:

private ["_part_out","_part_in","_qty_out","_qty_in","_qty","_buy_o_sell","_textPartIn","_textPartOut","_bos","_needed","_started","_finished","_animState","_isStarted","_isMedic","_total_parts_out","_abort","_removed","_activatingPlayer","_traderID","_done"];
// [part_out,part_in, qty_out, qty_in,];

if(DZE_ActionInProgress) exitWith { cutText [(localize "str_epoch_player_103") , "PLAIN DOWN"] };
DZE_ActionInProgress = true;
 
_activatingPlayer = player;
 
_part_out = (_this select 3) select 0;
_part_in = (_this select 3) select 1;
_qty_out = (_this select 3) select 2;
_qty_in = (_this select 3) select 3;
_buy_o_sell = (_this select 3) select 4;
_textPartIn = (_this select 3) select 5;
_textPartOut = (_this select 3) select 6;
_traderID = (_this select 3) select 7;
 
_bos = 0;
if(_buy_o_sell == "sell") then {
    _bos = 1;
};

_abort = false;
 
// perform number of total trades
r_autoTrade = true;
while {r_autoTrade} do {

	_removed = 0;

	// check if current magazine count is greater than 20

	if ((count (magazines player)) > 20) exitWith { cutText [(localize "STR_DAYZ_CODE_2"), "PLAIN DOWN"]; r_autoTrade = false};

	_canAfford = false;
	if(_bos == 1) then {

		//sell
		_qty = {_x == _part_in} count magazines player;
		if (_qty >= _qty_in) then {
			_canAfford = true;
		};

	} else {

		//buy
		_trade_total = [[_part_in,_qty_in]] call epoch_itemCost;
		_total_currency = call epoch_totalCurrency;
		_return_change = _total_currency - _trade_total; 
		if (_return_change >= 0) then {
			_canAfford = true;
		};
	};

	if(!_canAfford) exitWith {
		_qty = {_x == _part_in} count magazines player;
		_needed =  _qty_in - _qty;
		cutText [format[(localize "str_epoch_player_184"),_needed,_textPartIn] , "PLAIN DOWN"];
		r_autoTrade = false
	};

	cutText [(localize "str_epoch_player_105"), "PLAIN DOWN"];

	[1,1] call dayz_HungerThirst;
	player playActionNow "Medic";

	//_dis=20;
	//_sfx = "repair";
	//[player,_sfx,0,false,_dis] call dayz_zombieSpeak;
	//[player,_dis,true,(getPosATL player)] spawn player_alertZombies;

	r_interrupt = false;
	_animState = animationState player;
	r_doLoop = true;
	_started = false;
	_finished = false;

	while {r_doLoop} do {
		_animState = animationState player;
		_isMedic = ["medic",_animState] call fnc_inString;
		if (_isMedic) then {
			_started = true;
			sleep 2;
			[objNull, player, rSwitchMove,""] call RE;
			player playActionNow "PlayerStand";
		};
		if (_started && !_isMedic) then {
			r_doLoop = false;
			_finished = true;
		};
		if (r_interrupt) then {
			r_doLoop = false;
		};
		sleep 0.1;
	};
	r_doLoop = false;

	if (!_finished) exitWith { 
		r_interrupt = false;
		if (vehicle player == player) then {
			[objNull, player, rSwitchMove,""] call RE;
			player playActionNow "stop";
		};
		cutText [(localize "str_epoch_player_106") , "PLAIN DOWN"];
	};

	if (_finished) then {

		//diag_log format["DEBUG TRADER DONE?: %1", _canAfford];

		// Continue with trade.
		if (isNil "_part_in") then { _part_in = "Unknown Item" };
		if (isNil "inTraderCity") then { inTraderCity = "Unknown Trader City" };
		if(_bos == 1) then {
			// Selling
			PVDZE_obj_Trade = [_activatingPlayer,_traderID,_bos,_part_in,inTraderCity,_part_out,_qty_out];
		} else {
			// Buying
			PVDZE_obj_Trade = [_activatingPlayer,_traderID,_bos,_part_out,inTraderCity,_part_in,_qty_in];
		};
		publicVariableServer  "PVDZE_obj_Trade";

		if(_bos == 0) then {
			// only wait for result when buying
			waitUntil {!isNil "dayzTradeResult"};
			if(dayzTradeResult == "PASS") then {
				_done = [[[_part_in,_qty_in]],0] call epoch_returnChange;
				if (_done) then {
					for "_x" from 1 to _qty_out do {
						player addMagazine _part_out;
					};
					cutText [format[(localize "str_epoch_player_186"),_qty_in,_textPartIn,_qty_out,_textPartOut], "PLAIN DOWN"];
				};
			} else {
				_abort = true;
				cutText [format[(localize "str_epoch_player_183"),_textPartOut] , "PLAIN DOWN"];
			};
		} else {
			_part_inClass =  configFile >> "CfgMagazines" >> _part_in;
			_removed = _removed + ([player,_part_inClass,_qty_in] call BIS_fnc_invRemove);
			if (_removed == _qty_in) then {
				[[[_part_out,_qty_out]],1] call epoch_returnChange;
			};
			cutText [format[(localize "str_epoch_player_186"),_qty_in,_textPartIn,_qty_out,_textPartOut], "PLAIN DOWN"];
		};
		dayzTradeResult = nil;
	};
	if(_abort) exitWith {r_autoTrade = false};

	sleep 1;
};

DZE_ActionInProgress = false;

Weird thing is if I change the variables to PutDown / _isPutDown / putdown following the same formatting rules and capitalisation as for the medic one it doesn't work, Is the action in the DB capitalised differently from what I have listed do you think or doesn't matter?

 

At a loss really but at least it works with the medic animation at the moment. Obviously the "sleep 2;" line in the "r_doLoop" section can be changed to whatever you want the delay to be ^^

Link to comment
Share on other sites

Thanks Nieechi for explaining the logic, I was messing aroung on this too, found out that Animation cannot be interupted and to stop it you have to manually stand up. So i added that when the players moves it interupts the trading, but it looks like when doing the animation, the player moves so it cancels it upon trading. 

 

Then The only successful thing i did is to remove the animation and put a sleep timer instead, that works good so far. I have updated the files with no animation code. 

 

My buddy Zupa and me are trying to add a medic animation and stop it so it doesnt take too long to trade

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
×
×
  • Create New...