Walking man: Difference between revisions

From NPC for VCMP 0.4 Servers
Jump to navigation Jump to search
No edit summary
Line 1: Line 1:
<poem style="border: 2px solid #d6d2c5; background-color: #f9f4e6; padding: 1em;">
<poem style="border: 2px solid #d6d2c5; background-color: #f9f4e6; padding: 1em;">
This script uses SetAnim every 100 ms.
This script uses SetAnim every 100 ms.  
</poem>
</poem>
<poem style="border: 2px solid #d6d2c5; background-color: #f9f4e6; padding: 1em;">
<poem style="border: 2px solid #d6d2c5; background-color: #f9f4e6; padding: 1em;">
Line 8: Line 8:
This script is made as of npcclient version 1.6 beta 4 patch 1.  
This script is made as of npcclient version 1.6 beta 4 patch 1.  
</poem>
</poem>
==Introduction==
This is a npcscript which remotely execute server functions. With the help of npc04 plugin, it dynamically creates as well as delete functions in the roottable of server. One of the function it creates on server is a timer which calls <source inline>player.SetAnim(0,0)</source> where player is the npc, at regular intervals. At the same time it updates position from npcscript. This creates the effect that the npc is walking.
The npc04 plugin currently allow function calls through clientscriptdata only if the client is admin.  Hence it is required to make the walking npc an admin (<source inline>player.Admin=true</source>) in the server.
<source lang="lua">
function onPlayerJoin( player )
{
if(player.IsNPC && player.IP=="127.0.0.1") //automatically make npc admin to execute commands. ip check is important.
player.IsAdmin=true;
}
</source>
==Server Side==
==Server Side==
1. In scripts/main.nut, connect our npc using  
1. In scripts/main.nut, connect our npc using  

Revision as of 16:26, 4 November 2024

This script uses SetAnim every 100 ms.

This script requires modules: LibRPC and z-finder.

This script is made as of npcclient version 1.6 beta 4 patch 1.

Introduction

This is a npcscript which remotely execute server functions. With the help of npc04 plugin, it dynamically creates as well as delete functions in the roottable of server. One of the function it creates on server is a timer which calls player.SetAnim(0,0) where player is the npc, at regular intervals. At the same time it updates position from npcscript. This creates the effect that the npc is walking. The npc04 plugin currently allow function calls through clientscriptdata only if the client is admin. Hence it is required to make the walking npc an admin (player.Admin=true) in the server.

function onPlayerJoin( player )
{
	if(player.IsNPC && player.IP=="127.0.0.1") //automatically make npc admin to execute commands. ip check is important.
		player.IsAdmin=true;
}

Server Side

1. In scripts/main.nut, connect our npc using

ConnectNPC("[npc]captain", "walking_man.nut", false, "", "rpclib z-finder")

false - console off, put true - console on
"" - host IP, default to 127.0.0.1
rpclib - npc module (to be placed in npcscripts/plugins)

z-finder - another module to get z co-ordinates

Map File

2. You need to place default.map in server directory. This map-file was previously referred as vicecity.map in this wiki

NPC side

3. Create npcscripts/walking_man.nut The following script expects "default.map" mapfile on server directory.

target<-null;timerid<-null;
WALK_START <- Vector(-872.146, -431.502, 11.5288);
WALK_END <- Vector( -870.825, -296.79, 11.173);
function WalkToPoint(point)
{
	target=point;
	if(timerid==null)
	{
		timerid=SetTimerEx("step_forward",100,0);
        //Remotely calling functions 'compilestring' of server.
		RFC(F("compilestring")("function SetWalkingAnimation(id){ local p=FindPlayer(id); if(p && IsPlayerNPC(id))p.SetAnim(0,0);else WalkTimer"+GetMyID()+".Delete()}"))();
		RFC(F("compilestring")("WalkTimer"+GetMyID()+"<-NewTimer(\"SetWalkingAnimation\",100,0,"+GetMyID()+")"))();
	}
}
function onDestinationReached()
{
	if( GetDistanceFromMeToPoint( WALK_START ) < 2 )
		WalkToPoint( WALK_END );
	else if( GetDistanceFromMeToPoint( WALK_END ) < 2 )
	{
		WalkToPoint( WALK_START );
        //print something on server console.
		RFC("print")("npc: i completed one round of patrol");
	}
}
function step_forward()
{
	local newpos=GetMyPos()+(target-GetMyPos()).Normalised()*0.14;
	newpos.z=FindZFor2DCoord(newpos.x, newpos.y)+1.0425;
	SetLocalValue(V_POS, newpos);
	SetLocalValue(F_ANGLE, atan2(-(target.x-GetMyPosX()),target.y-GetMyPosY()));
	if((target-GetMyPos()).Length()<0.8)//reached destination
	{
		if(timerid!=null)
			KillTimer(timerid);
		timerid=null;
		//stop timer of server
		RFC(F("compilestring")("WalkTimer"+GetMyName()+".Delete()"))();
	}
	else SendOnFootSyncDataLV();
	if(timerid==null)
		onDestinationReached();
}
function OnNPCSpawn() 
{ 
	SetTimerEx("SetMyPos",700, 1, WALK_START );
//	SetMyPos(WALK_START);
	//print(GetMyPos());
	SetTimerEx("WalkToPoint", 1000, 1, WALK_END );
	//WalkToPoint( WALK_END );
	//Acquire weapon and skin
	RFC(F("compilestring")("FindPlayer("+GetMyID()+").SetWeapon(4,1);"))();
	RFC(F("compilestring")("FindPlayer("+GetMyID()+").Skin=1"))();
	SetTimerEx("SetLocalValue", 1000,1, I_CURWEP, 4);
}
function OnNPCScriptLoad(params)
{
	if(!MiamiScale_Init("default.map"))
	{
		SendChat("My map is not loaded. Bye");
		QuitServer();
	}
}
function OnNPCScriptUnload()
{
	MiamiScale_Unload();
}