Examples: Difference between revisions
No edit summary |
No edit summary |
||
(8 intermediate revisions by the same user not shown) | |||
Line 90: | Line 90: | ||
</source> | </source> | ||
6. '''Very advanced''' | 6. '''Very advanced''' (v1.6 beta 2) | ||
This is the highest point of RFC or F. | This is the highest point of RFC or F. | ||
<source lang="lua"> | <source lang="lua"> | ||
Line 99: | Line 99: | ||
<source lang="lua" inline>compilestring("print(500)")()</source> | <source lang="lua" inline>compilestring("print(500)")()</source> | ||
</poem> | </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