Jump to content

Recommended Posts

JBOY Throw Knife Script (updated 12/16/19)

With this script players and AI can throw knife objects.  Vanilla ARMA does not have a knife object, so I am using screw drivers and files.  Think of these as "guerilla knives" that have been ground to a sharp point and balanced for throwing.  You should also be able to use Mod objects with this script (like knives in Max Melee or Unsung mods).

Demo Mission Link (updated to V2):  https://www.dropbox.com/s/tga95kckxtrrf23/JBOY_ThrowKnifeV2.Stratis.zip?dl=0

Features:

  • Player can throw knife objects.  Knife target destination is determined by position of  center of screen (screenToWorld position), i.e., where the player is looking.
  • AI can throw knifes via scripts.  Knife target destination is provided by position.
  • AI throw accuracy is determined by their skill level for skill "AimingAccuracy".
  • AI can throw exactly on target also, via an additional parameter.  Good for cutscenes where you need the knife to arrive in an exact destination (like left eye of some bad hombre for example).
  • Knives stick on objects they hit.
  • Knives stick on AI when hit.  Attached position is relative to closest AI mempoint (head, hand, foot, spine, etc.).  So when wounded AI moves, the knives still show as stuck in relative position.

 

Limitations:

  • When AI killed by knives, I have to detach knives so they fall to the ground.  We would all rather see a nice "pin cushion" effect where knives are sticking out of dead AI in correct directions.  But  this is impossible because once a dead AI ragdolls, those positions are screwed up, and you see knives disconnected and suspended in air.  That is bad for immersion, so I opted to just detach them instead.

 

JBOY_Throw script:

Spoiler

// *****************************************************
// ** JBOY_throw.sqf 
// ** by JohnnyBoy
// **
// ** Simulates throwing a screwdriver, knife, dart.  It will stick in objects it hits.
// ** See sample mission init.sqf for usage examples
// *****************************************************
params[
	"_dartType",				// type of object thrown, like  "Land_Screwdriver_V1_F" or "Land_File_F"
	"_thrower",					// unit throwing knife (player or AI)
	["_targetPos",[]],			// Position knife is thrown at.  Need this for AI, not player.
	["_exact",false] 			// Set to true if you want knife to land in EXACT spot every time.  Good for cutscene.
								// Default is false, so AI skill AimingAccuracy controls how close to target pos the knife will land.
	];
//params["_dartType","_thrower",["_targetPos",[]], ["_exact",false], ["_detachOnDeath",true]];

// ****************************************************************
// For player, we use screenToWorld to calculate target pos (where knife will be thrown at).
// For non-player AI, raycast using eyeDirection
// ****************************************************************
if (_targetPos isEqualTo []) then
{
	if (isPlayer _thrower) then 
	{ 
	   _targetPos = screenToWorld [0.5,0.5];
	} else 
	{
	   //_eyeposThrower = eyePos _thrower;
	   _targetPosxxx = _thrower modelToWorld [0,20,1.5];
	   // randomize the endpoint a bit
	};
};
if !(isPlayer _thrower) then 
{ 
	if (!_exact) then
	{
		_skill = _thrower skill "aimingaccuracy";
		_accuracyOffset = 5;
		switch true do {
			case (_skill <= .1): {_accuracyOffset = 50}; // Higher unit's skill means a lower accuracyOffset
			case (_skill <= .2): {_accuracyOffset = 45};
			case (_skill <= .3): {_accuracyOffset = 40};
			case (_skill <= .4): {_accuracyOffset = 35};
			case (_skill <= .5): {_accuracyOffset = 30};
			case (_skill <= .6): {_accuracyOffset = 25};
			case (_skill <= .7): {_accuracyOffset = 20};
			case (_skill <= .8): {_accuracyOffset = 10};
			case (_skill <= .9): {_accuracyOffset = 15};
			case (_skill <=  1): {_accuracyOffset = 5};
		};
	   _targetPos = [(_targetPos select 0) + (((random _accuracyOffset)/100)* (selectRandom [1,-1])),
					 (_targetPos select 1) + (((random _accuracyOffset)/100)* (selectRandom [1,-1])),
					 (_targetPos select 2) + (((random _accuracyOffset)/100)* (selectRandom [1,-1]))];
	};
};

// ****************************************************************
// Specify which objects have the point backwards, so we must reverse them to point forwards
// ****************************************************************
_dirAdjust = 0;
_reverseDirObjects = ["Land_Screwdriver_V1_F","Land_Screwdriver_V2_F"];
if (_dartType in _reverseDirObjects) then {_dirAdjust = 180;};

// ****************************************************************
// calc position of throw and animate throw
// ****************************************************************
_eyepos_z = (eyePos _thrower) select 2;
_thrower_pos_z = (getposasl _thrower) select 2;
_eyeHeight = _eyepos_z - _thrower_pos_z;
_pos = [];
_vz = 0;
// ****************************************************************
// Play throw animation (animation differs with stance and current weapon)
// ****************************************************************
if (_eyeHeight > 1.4) then
{
   _pos = _thrower modelToWorld [.12, 1.5, 1.8] ;
   if (currentWeapon _thrower == (primaryWeapon _thrower) and (primaryWeapon _thrower) != "") then
   {
   //_thrower playActionNow "GestureGo";
     _thrower switchMove   "AwopPercMstpSgthWrflDnon_End1";
   }
   else
   {
		if  (currentWeapon _thrower == (handgunWeapon _thrower) and (handgunWeapon _thrower) != "") then
		{
			_thrower switchmove "AwopPercMstpSgthWpstDnon_Part3";
		} else {
			_thrower switchmove "AwopPercMstpSgthWnonDnon_throw";
		};
   };
   _vz = 0;
} else
{
   if (_eyeHeight > .8) then
   {
   _pos = _thrower modelToWorld [.12, 1.5 ,1.5] ;
   //_thrower playmove "AwopPknlMstpSgthWrflDnon_End";
   if (currentWeapon _thrower == (primaryWeapon _thrower) and (primaryWeapon _thrower) != "") then
   {
		_thrower switchmove "AwopPknlMstpSgthWrflDnon_End";
   }
   else
   {
		if  (currentWeapon _thrower == (handgunWeapon _thrower) and (handgunWeapon _thrower) != "") then
		{
			_thrower switchmove "AwopPknlMstpSgthWpstDnon_Part3";
		} else {
			_thrower switchmove "AwopPknlMstpSgthWrflDnon_throw";
		};
   };
   _vz = 0;
   
   } else
   {
   _pos = _thrower modelToWorld [.12, .8, .5] ;
   //_thrower playmove "AwopPpneMstpSgthWrflDnon_End";
    if (currentWeapon _thrower == (primaryWeapon _thrower) and (primaryWeapon _thrower) != "") then
   {
		_thrower switchmove "AwopPpneMstpSgthWrflDnon_End";
   }
   else
   {
		if  (currentWeapon _thrower == (handgunWeapon _thrower) and (handgunWeapon _thrower) != "") then
		{
			_thrower switchmove "AwopPpneMstpSgthWpstDnon_Part3";
		} else {
			_thrower switchmove "AwopPpneMstpSgthWnonDnon_end";
		};
   };
  
  _vz = 1;
  };
};
sleep .3; // allow time for animation to play
// To prevent an object being created per client, exit if object is not local.
//if (local _obj_to_replace) then {exit;};
// *** Create the object to throw
_knife = _dartType createVehicle [0,0,0];
knife = _knife;
_dir = getdir _thrower;
_knife setMass .01;
_speed = 0.0;
if (_thrower==player) then 
{ 
   _speed = 40; 
} else 
{
   _speed = 40; 
};
// B_9x21_Ball, B_408_Ball
// B_556x45_dual use sdar dual ammo as its least commonly used
_bullet = "B_408_Ball" createVehicle [10,10,1000];
_bullet disablecollisionwith _thrower;
_bullet setpos _pos;
  
_bullet setVelocity [0,0,0];
_shooter_dir = getdir _thrower;
_bullet setdir _shooter_dir;

_bullet setpos _pos;
_heading = [_pos, _targetPos] call BIS_fnc_vectorFromXToY;
_bulletHeading = _heading;
_bullet setVectorDir _heading; 
_velocity = [_heading, _speed] call BIS_fnc_vectorMultiply; 
_bullet setVelocity _velocity;
_throwPos = _pos;


_once = 1;
_ctr = 0;

while { ( ((_pos select 2) > .05) && ((_pos select 0) > 0) ) } do 
{
	_ctr = _ctr + 1;
	_knife setdir (_dir + _dirAdjust);
	_knife setpos _pos;
	sleep .01;
	_pos = getpos _bullet;
	_dir = getdir _bullet;
};   // end while
deleteVehicle _bullet;
_knife hideObjectGlobal true;
_nearArr = [];
_nearArr = nearestObjects [ _knife, ["Static","Land","House","ThingX"], 3, true];

_nearArr = _nearArr - [_thrower];
_nearArr = _nearArr - [_knife];
{if (typeOf _x in ["Land_Screwdriver_V1_F","Land_File_F"]) then {_nearArr = _nearArr- [_x]};} foreach _nearArr;
//hint str _nearArr;
_nearTerrainArr = [];

_cnt = 0;
_cnt = count _nearArr;
if (not((_pos select 0) > 0)) then 
{
	// *** bullet struck something, so we need to fall straight down
	// *** If there are near objects, then a vehicle or man may have been hit.
	if (_cnt > 0) then 
	{
		_nearObj = _nearArr select 0;
//player sidechat format ["_neararr=%1",_nearArr];
      //player sidechat format ["_nearObj=%1, distance=%2",_nearObj,( (_nearObj modelToWorld [0,0,0]) distance (_knife modelToWorld [0,0,0]) )];
		if ( (_nearObj isKindOF "Man") && (  (_nearObj distance _knife) <= 1.5 ) ) then 
		{ 
//systemChat "attach to man";
			_man = _nearObj;
			_stance = stance _man;
			switch (_stance) do {
				case "STAND": {_man setUnitPos "UP"; };
				case "CROUCH": { _man setUnitPos "MIDDLE"; };
				case "PRONE": { _man setUnitPos "MIDDLE"; };
			};
			_knife hideObjectGlobal true;
			_knife attachTo [_man, _man worldToModel getpos _knife];
			// Attach knife to nearest mempoint so when unit moves or changes stance, attached object maintains relative position
			_memPoints =
			[
			"pelvis","spine","spine1","spine2","spine3","neck","neck1","head","neck1","face_forehead","eyeleft","eyeright",
			"leftshoulder","leftarm","leftforearm","lefthand","rightshoulderspine3","rightshoulder","rightarm","rightforearm","righthand",
			"leftuplegpelvis","leftupleg","leftleg","leftfoot","rightuplegpelvis","rightupleg","rightleg","rightfoot"
			];

			_ball = "Sign_Sphere25cm_F" createVehicleLocal [0,0,0];
			hideObjectGlobal _ball;
			//_ball = "Land_File_F" createVehicleLocal [0,0,0];
			if (not isNull _man) then
			{
				_man reveal _thrower; // since knife bullet is spawned, the engine does not credit the thrower with being the attacker
				_attachPosArr = [];
				{
					_ball attachTo[_man,[0,0,0],_x]; 
					_attachPosArr pushback [_ball distance _knife, getposasl _ball,_x];
				} forEach _memPoints;
				_attachPosArr sort true;
				_memPoint = _attachPosArr select 0 select 2;
				_ball attachTo [_man, [0,0,0],_memPoint ];
				_knife attachTo [_man, _ball worldToModel getPos _knife,_memPoint ];
				deleteVehicle _ball;
				if (_memPoint in ["head","neck","face_forehead","eyeleft","eyeright"]) then {_man setdamage 1;};
//systemChat str ["knife attached relative to closest mempoint",_memPoint];
				//copyToClipboard str _attachPosArr;
			};

			
			//_dirTo = ([_man,_thrower] call BIS_fnc_relativeDirTo) +_dirAdjust;
			_dirTo = ([_thrower,_knife] call BIS_fnc_relativeDirTo) +_dirAdjust;
			_knife setDir _dirTo;
			_knife setVectordir  ( [eyepos _thrower, _targetPos] call BIS_fnc_vectorFromXToY);
			_knife hideObjectGlobal false;
			//_man setVariable ["JBOY_KnifeType",_dartType,true];
			// if (_detachOnDeath) then 
			// {
				_man addEventHandler ["Killed", 
				{	params ["_unit", "_killer", "_instigator", "_useEffects"];
					// Detach knife when man dies because attach position looks terrible when unit rag dolls.
					//{if (typeOf _x == _unit getVariable "JBOY_KnifeType") then {detach _x;};} foreach attachedObjects _unit;
					{detach _x;} forEach attachedObjects _unit;
					_n=[_unit] spawn {params["_unit"]; sleep 1; {detach _x;} forEach attachedObjects _unit;};
				}];
			//};
		} else
		{
			if ( _nearObj isKindOF "LandVehicle"// or _nearObj isKindOf "ThingX"
			) then 
			{
//player sidechat "attach vehicle or thingx";
				_knife hideObjectGlobal true;
				_knife attachTo [_nearObj, _nearObj worldToModel getpos _knife]; 
				_dirTo = ([_nearObj,_thrower] call BIS_fnc_relativeDirTo) +_dirAdjust;
				_knife setDir _dirTo;
				_knife setVectordir  ( [eyepos _thrower, _targetPos] call BIS_fnc_vectorFromXToY);
				_knife hideObjectGlobal false;
				//player sidechat format ["attach LandVehicle dirto=%1",_dirTo];
			 } else 
			 {
//player sidechat "attach other object";
				_nearObj allowdamage false;
				_knife enableCollisionWith _nearObj;
				_knife hideObjectGlobal true;
				if !(_nearObj isKindOF "Man") then
				{
					_knife attachTo [_nearObj, _nearObj worldToModel getpos _knife];
				};
				//_dirTo = ([_thrower,_knife] call BIS_fnc_relativeDirTo) +_dirAdjust;
				_dirAdjust = 0;
				if !(_dartType in _reverseDirObjects) then {_dirAdjust = 180;};
				_dirTo = (getdir _thrower)+ _dirAdjust;
				_knife setDir _dirTo;
				_knife setVectordir  ( [eyepos _thrower, _targetPos] call BIS_fnc_vectorFromXToY);
				_knife hideObjectGlobal false;
				_nearObj allowDamage true;
				//_knife enableSimulation false;
			 };
		};
	};
} else
{
	_knife setVelocity [0,0,0];
//player sidechat "no near obj";			 
   if ((_pos select 2)- _thrower_pos_z > .5) then
   {
		_awayObj =  "Land_Can_V3_F" createVehicle [1,1, 0];
		_knife hideObjectGlobal true;
		_knife attachTo [_awayObj, _awayObj worldToModel _pos]; 
		_knife setdir ([_thrower, getpos _knife] call BIS_fnc_DirTo);
		_knife setVectorDir _heading;
		_knife setVectordir  ( [eyepos _thrower, _targetPos] call BIS_fnc_vectorFromXToY);
		_knife hideObjectGlobal false;
    };

 };
_knife hideObjectGlobal false;

 

init.sqf has examples of how to call this script:

Spoiler


JBOY_throw = compile (preprocessFileLineNumbers "JBOY_throw.sqf");

// Add throw action for player
aThrowAction      = player addAction ["Throw file", {[ "Land_File_F", player ] execvm "JBOY_throw.sqf";}];
aThrowAction1     = player addAction ["Throw screwdriver", {[ "Land_Screwdriver_V1_F", player ] execvm "JBOY_throw.sqf";}];
// Could use knife objects from mods like Max Melee, Unsung etc...
//gThrowAction      = player addAction ["Throw knife", {[ "Combat_Knife_F", player ] execvm "JBOY_throw.sqf";}];

// Add action to command an AI named slick to throw 
aAiThrow1 = player addAction ["AI Throw (accuracy based on skill setting)", 
{
	_targetPos = popupTarget modelToWorld [0,0, 1.18]; // this position offset is dead center for this particular target object
	[ "Land_Screwdriver_V1_F", slick, _targetPos ] execvm "JBOY_throw.sqf";
}];

aAiThrow2 = player addAction ["AI Throw with perfect accuracy.", 
{
	_targetPos = popupTarget2 modelToWorld [0,0, 1.175]; 
	[ "Land_Screwdriver_V1_F", slick, _targetPos, true ] execvm "JBOY_throw.sqf";
}];

aAiThrow3 = player addAction ["AI Throw at balloons.", 
{
	[] spawn {
		{
			slick dowatch balloon2;
			sleep .5;
			if (alive _x) then
			{
				_targetPos = _x modelToWorld [0,0, .4];
				[ "Land_Screwdriver_V1_F", slick, _targetPos] execvm "JBOY_throw.sqf";
				sleep .5;
			};
		} foreach [balloon1, balloon2, balloon3];
	};	
}];

aAiThrow4 = player addAction ["AI Throw at Assigned Target", 
{
	_targetPos = (assignedTarget slick) modelToWorld [0,0, 1.6];
	[ "Land_Screwdriver_V1_F", slick, _targetPos ] execvm "JBOY_throw.sqf";
}];

// At start of mission, AI throws 5 knives.  How tight the grouping (accuracy) of the knives is based on unit's AimingAccuracy skill.
sleep 2;
[] spawn {
	{
		slick setdir ([slick, popupTarget] call BIS_fnc_dirTo);
		//_targetPos = [getposasl popupTarget select 0, getposasl popupTarget select 1, 1.25]
		_targetPos = popupTarget modelToWorld [0,0, 1.18];
		[ "Land_Screwdriver_V1_F", slick, _targetPos] execvm "JBOY_throw.sqf";
		sleep 1;
	} foreach [1,1,1,1,1];
};

 

 

 

  • Like 15
  • Thanks 3

Share this post


Link to post
Share on other sites

Looks pretty fun man - have to try this out. My grandmother was a Cherokee knife thrower from Oklahoma- scary woman.

 

Too bad knives cant stay on position -im guessing this is similar to as to why bullet wounds cant directly display at exact location on the recently dead?

  • Like 6

Share this post


Link to post
Share on other sites
36 minutes ago, froggyluv said:

My grandmother was a Cherokee knife thrower from Oklahoma- scary woman.

Is her last name Warren perhaps? 😀

  • Like 1
  • Haha 3

Share this post


Link to post
Share on other sites

A very nice addition making stealth missions a bit more achievable  :thumbsup:

  • Like 3

Share this post


Link to post
Share on other sites
11 hours ago, froggyluv said:

Too bad knives cant stay on position -im guessing this is similar to as to why bullet wounds cant directly display at exact location on the recently dead?

I think wounds/blood textures are simple additional object textures, where they've created a single texture per area (head, torso, left arm, right arm, legs).  So the blood spots don't match exactly where the bullet hit (except by chance).  I think the knife position problem has to do with rag dolling.  Once the unit rag dolls, the relative positions for attachable mempoints is off.  Its an internal thing that I have no visibility too.

Share this post


Link to post
Share on other sites
16 minutes ago, johnnyboy said:

I think wounds/blood textures are simple additional object textures, where they've created a single texture per area (head, torso, left arm, right arm, legs).  So the blood spots don't match exactly where the bullet hit (except by chance).  I think the knife position problem has to do with rag dolling.  Once the unit rag dolls, the relative positions for attachable mempoints is off.  Its an internal thing that I have no visibility too.

 

Ahh yes thats true -yours is a rag problem (as usual).

 

Way above my pay grade but i think I remember reading someone who was trying to create custom bullet holes to match exactly where the unit was shot -but ran into problems when the model rotated or something like that. If your knives are matching up and holding (until the ragging problem at death) I would think a custom bullet hole texture would too..no?

Share this post


Link to post
Share on other sites
1 minute ago, froggyluv said:

Way above my pay grade but i think I remember reading someone who was trying to create custom bullet holes to match exactly where the unit was shot -but ran into problems when the model rotated or something like that. If your knives are matching up and holding (until the ragging problem at death) I would thing a custom bullet hole texture would too..no?

Actually the knives don't hold up perfectly when moving (no attached objects do), but by attaching to mempoints instead of relative to unit pos in general, they hold up reasonably well.  But if you look closely they do shift around while moving.  So its not perfect, and that is probably the bullet hole problem also.  In my case, the unit will hopefully be killed quickly so player doesn't see too much weirdness.  And hopefully a little weirdness is worth it to have this additional capability.

  • Like 4

Share this post


Link to post
Share on other sites

Nice work Johhnboy!

This would definitely add more options to killing and enemy in the game.

 

For knife object, i believe Ravage mod has one used for gutting animals killed, and these two mods.

Arma3 Inventory Items

http://www.armaholic.com/page.php?id=28752

Throwing weapons

http://www.armaholic.com/page.php?id=35273

Share this post


Link to post
Share on other sites
7 hours ago, Gunter Severloh said:

For knife object, i believe Ravage mod has one used for gutting animals killed, and these two mods.

Thanks for the leads Gunter!

  • Like 1

Share this post


Link to post
Share on other sites

Bravo j-boy, another glorious & eye-popping script to the ever impressive heap!  Ok, I'm off to throw knives at some A3 goats and sheep... :z:

 

  • Haha 2

Share this post


Link to post
Share on other sites

Super addition m8 ... is there any way to limit throwable items number ? I'm using a "Kabar" knife from my mod (works fine) but there is no logic to have unlimited knives to throw (I'm using your script mostly on players against AIs).

 

Thanks again for your work.

Share this post


Link to post
Share on other sites
4 hours ago, Αplion said:

Super addition m8 ... is there any way to limit throwable items number ? I'm using a "Kabar" knife from my mod (works fine) but there is no logic to have unlimited knives to throw (I'm using your script mostly on players against AIs).

 

Thanks again for your work.

Thanks Aplion.   It would be simple enough for anyone to add additional logic to support the limit:

  • Add a KnifeInventoryLimit variable to a unit, or a global variable that sets the same limit for all units.
  • Add an KnifeCount variable to unit.
  • Add a AddKnife (take knife action) action script that allows user to pick up a knife.  This would increment KnifeCount variable for the unit.  This function would also not allow increaseing KnifeCount beyond KnifeInventoryLimit.
  • Modify ThrowKnife to decrement knife count every time a knife is thrown.

This is a great idea, but I have so many other projects going, I don't plan on doing this any time soon.  if you or someone else wants to add this feature, please do, and I will incorporate it and give you credit.  Or feel free to modify your own copy any way you like.

 

I'm curious, what is your mod with the Kabar?  Found your mods, they look great!  Is the Kabar in the main HAFM mod or the one named "Core"?

  • Like 2

Share this post


Link to post
Share on other sites

Also just noticed that your script doesn't seem to work on MP ... not sure if it is something by my side ... I'm using this addAction which works fine on SP.

 

ThrowAction = player addAction ["<t color='#FF0000'>Throw Knife</t>  <img size='2' image='\HAFM_Objects\data\ui\ico_hafm_knife_ca.paa'/>", {["Land_hafm_knife_F", player] execvm "scripts\throwKnives.sqf";},[],1.5,false,true,"","true",-1,false,"",""];

... and I have inserted, of course, my knife classname into your script as well.

Share this post


Link to post
Share on other sites
3 minutes ago, Αplion said:

Also just noticed that your script doesn't seem to work on MP ... not sure if it is something by my side ... I'm using this addAction which works fine on SP.

I'm not surprised.  It needs some statements converted to remote_exec for a start. It ain't perfect!  Still needs some work. Not sure when I will make time for it though.

Share this post


Link to post
Share on other sites

I hope you to find some time to work further on this script m8 as it looks very promising and will be a very nice addition for all mission makers here. Thanks for your work so far.

  • Thanks 1

Share this post


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

 

I'm curious, what is your mod with the Kabar?  Found your mods, they look great!  Is the Kabar in the main HAFM mod or the one named "Core"?

 

My main mod (not the naval part) can be found here and Kabar knife is just an item (you can find it under "Props - Things - Food" for the moment. I've added this knife after I saw your script (the 3d model was ready from past time) and thought that would be useful.

 

Glad you liked my mod m8.

Share this post


Link to post
Share on other sites

Nicelly done JBoy!!!

 

We have a lot of fun with those throwable Screwdrivers in Ravage missions on our dedicated MP server.

Just noted that when you respawn the throw screwdriver message is not working anymore.

Any idea why?

 

Many thanks in advance for your help and contribution to Arma community.

Martin

  • Thanks 1

Share this post


Link to post
Share on other sites
4 hours ago, LBMartin_Boh said:

Just noted that when you respawn the throw screwdriver message is not working anymore.

Thanks for the report.  This should fix the problem.

 

Move these two lines from the init.sqf (delete from this file), and add them in a new file called initPlayerLocal.sqf in the same mission directory:

aThrowAction      = player addAction ["Throw file", {[ "Land_File_F", player ] call JBOY_throw;}];
aThrowAction1     = player addAction ["Throw screwdriver", {[ "Land_Screwdriver_V1_F", player ] call JBOY_throw;}];

I have some more changes to make, and will incorporate this change  in the next release (a few weeks away probably).

 

Thanks for giving it a whirl!

Share this post


Link to post
Share on other sites

Version 2 released.  Link in top post is updated to latest version of demo mission.

Change Log:

  • Improved MP compatibility (player throw action now appears after respawn), and now using remote_exec for all switchMove commands.  
  • Player ability to throw at higher targets improved.
  • Limiting number of knives to carry now enforced by mission parameter defined in init.sqf.  Thanks to @Aplion for the suggestion.
  • Allows defining container objects with "Take knives" action, which allows unit to take max allowed knives in one Take.  This container will have infinite knives for the taking.
  • Allows defining a single knife object to take (and visible object disappears when you take it).
  • Mission maker designates a single knife type to be used in mission in the init.sqf.  For the demo I have set this to "Land_File_F", but it could set to the screwdriver object, or your favorite Mod's knife object.  I no longer support throwing screwdrivers AND  files (more than one knife type).  This simplified new inventory tracking to one knife type only.
  • Like 1
  • Thanks 4

Share this post


Link to post
Share on other sites

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now

×