Examples: Difference between revisions

From NPC for VCMP 0.4 Servers
Jump to navigation Jump to search
No edit summary
No edit summary
 
(16 intermediate revisions by the same user not shown)
Line 1: Line 1:
This page contains example for using Remote Call Functions.
This page contains example for using Remote Call Functions.
Suppose NPC is connected with ID 0 and RPCLib is loaded in that NPC when connecting.
Suppose NPC is connected with ID 0 and RPCLib is loaded in that NPC when connecting.
RFC=Remote Function Call
RFC=Remote Function Call <br />
1. Calling SendChat
<source>
<source>
ChatFunc<-RFC(0, "SendChat");
ChatFunc<-RFC(0, "SendChat");
Line 7: Line 8:
</source>
</source>


Two Parameters
2. '''Two Parameters'''  <br />
Npc script
Npc script
<source>
<source>
Line 25: Line 26:
<source>RFC(0,"MyFunc")(100, "OKAY");</source>
<source>RFC(0,"MyFunc")(100, "OKAY");</source>


Evaluate function inside function argument
3. Evaluate '''function inside function''' argument
npcscript:
npcscript:
<source>function Test(val1, val2 )
<source>function Test(val1, val2 )
Line 45: Line 46:
Calling of F means the value to be calculated when it reaches npc side.
Calling of F means the value to be calculated when it reaches npc side.


Another example: Printing NPC's position on console.
4. Another example: Printing NPC's position on console.
server:
server:
<source>RFC(0,"print")("My position is ");
<source>RFC(0,"print")("My position is ");
Line 51: Line 52:
</source>
</source>


Passing arrays: Huge arrays can also be passed. Raknet takes care of splitting the array into 4 or 5 message fragments and combine them at destination.
5. '''Passing arrays''': Huge arrays can also be passed. Raknet takes care of splitting the array into 4 or 5 message fragments and combine them at destination.
npcscript:
npcscript:
<source>
<source>
Line 65: Line 66:
<source>You passed an array of length 1000</source>
<source>You passed an array of length 1000</source>


Further advances.
 
Further advances<br />
You may create some class which has several members and each members point to a remote function.
You may create some class which has several members and each members point to a remote function.
<source>
<source>
Line 87: Line 89:
a[0].quit();
a[0].quit();
</source>
</source>
6. '''Very advanced''' (v1.6 beta 2)
This is the highest point of RFC or F.
<source lang="lua">
local script=compilestring("print(500)");
script();</source>will output:<source lang="lua" inline>500</source>
<poem>
But how do you call it remotely?
<source lang="lua" inline>compilestring("print(500)")()</source>
</poem>
<source lang="lua>
F("compilestring")("print(500)") == WON'T WORK
RFC(npcid, "print")(F("compilestring")("print(500)") == NICE TRY, BUT WON't WORK
</source>
The second parameter of RFC can '''not only be string !'''
<source lang="lua">
RFC(npcid, F("compilestring")("print(500)"))()</source>
<poem>It can be userdata returned by calling F (with two sets of brackets).
'''F inside F''': Not only RFC, the parameter (first) of F can be userdata returned by calling F(again, with two sets of brackets). i.e. F can be nested as follows:</poem>
<source>RFC(0,"print")(F(F("myfunction")())(999)</source>
is equivalent to <source lang="lua" inline> print( myfunction()(999) )</source> assuming myfunction returns a function, which is called with parameter (999) and whatever this second function returns is printed.
<poem>7. '''Creating function in client side from server'''. This is the continuation of 6.
We are going to create a function on client side:</poem>
<source lang="lua">RFC(0,F("compilestring")("function Test(){print(\"Hello\");}"))()</source>
This will create a function called <source lang="lua" inline>Test</source> on client side. Now let's call it:
<source lang="lua">RFC(0,"Test")()</source>
and we get the output (on client console) as <source lang="lua" inline>Hello</source>

Latest revision as of 18:04, 13 February 2023

This page contains example for using Remote Call Functions. Suppose NPC is connected with ID 0 and RPCLib is loaded in that NPC when connecting. RFC=Remote Function Call
1. Calling SendChat

ChatFunc<-RFC(0, "SendChat");
ChatFunc("Hello I am an NPC");

2. Two Parameters
Npc script

function MyFunc( a, b )
{
...
}

server script

MyFuncRemote=RFC(0, "MyFunc");
MyFuncRemote(100, "Okay");
...
MyFuncRemote(200, "Test"); //at a later time.

or in one line:

RFC(0,"MyFunc")(100, "OKAY");

3. Evaluate function inside function argument npcscript:

function Test(val1, val2 )
{
print("val1 is "+val1+" and val2 is "+val2+" \n");
}
function Calc(val2)
{
   if(val2>50)return 1;
   else return 0;
}

server:

TestRemote<-RFC(0,"Test");
TestRemote(50.0, "Calc(50.0)" ) ==WRONG
TestRemote(50.0, F("Calc")(50.0)) ==RIGHT

Calling of F means the value to be calculated when it reaches npc side.

4. Another example: Printing NPC's position on console. server:

RFC(0,"print")("My position is ");
RFC(0,"print")(F("GetMyPos")());

5. Passing arrays: Huge arrays can also be passed. Raknet takes care of splitting the array into 4 or 5 message fragments and combine them at destination. npcscript:

function LenArray(a)
{
print("You passed an array of length "+a.len());
}

server:

a<-array(1000,500);
RFC(0,"LenArray")(a);

output: (npc console)

You passed an array of length 1000


Further advances
You may create some class which has several members and each members point to a remote function.

class MyRFuncs
{
chat=null;print=null;command=null;quit=null;
}

and create an array, say a. a<-array(100) and when an npc is joined,

a[0].print=RFC(0,"print");
a[0].chat=RFC(0,"SendChat");
a[0].command=RFC(0,"SendCommand");
a[0].quit=RFC(0,"QuitServer");

and later use it like:

a[0].print("This is printed on a console\n"); a[0].chat("Hello everyone"); 
//or 
a[0].quit();

6. Very advanced (v1.6 beta 2) This is the highest point of RFC or F.

local script=compilestring("print(500)");
script();

will output:500

But how do you call it remotely?
compilestring("print(500)")()

F("compilestring")("print(500)") == WON'T WORK
RFC(npcid, "print")(F("compilestring")("print(500)") == NICE TRY, BUT WON't WORK

The second parameter of RFC can not only be string !

RFC(npcid, F("compilestring")("print(500)"))()

It can be userdata returned by calling F (with two sets of brackets).
F inside F: Not only RFC, the parameter (first) of F can be userdata returned by calling F(again, with two sets of brackets). i.e. F can be nested as follows:

RFC(0,"print")(F(F("myfunction")())(999)

is equivalent to print( myfunction()(999) ) assuming myfunction returns a function, which is called with parameter (999) and whatever this second function returns is printed.

7. Creating function in client side from server. This is the continuation of 6.
We are going to create a function on client side:

RFC(0,F("compilestring")("function Test(){print(\"Hello\");}"))()

This will create a function called Test on client side. Now let's call it:

RFC(0,"Test")()

and we get the output (on client console) as Hello