function onKeyDown(player,key) //Now only KL can trigger the loop execution
{
if(key==Key_I)
{
Message("Key: I");
}
if(key==Key_J)
{
Message("Key: J");
}
if(key==Key_K)
{
Message("Key: K");
AddKeyTable(player.ID,key);
}
if(key==Key_L)
{
Message("Key: L");
AddKeyTable(player.ID,key);
}
}
class PlayerClass //Create two items here, one to store buttons pressed by the player and the other to keep repeating the timer
{
keytimer=null;
keytable=null;
}
function onScriptLoad()
{
state<-array(100,null);
//Here are the keys on the test keyboard
Key_I<-BindKey(true,0x49,0,0);
Key_J<-BindKey(true,0x4A,0,0);
Key_K<-BindKey(true,0x4B,0,0);
Key_L<-BindKey(true,0x4C,0,0);
}
function onPlayerJoin(player)
{
state[player.ID]=PlayerClass(player.Name);
}
function onPlayerPart(player,reason)
{
if(state[player.ID].keytimer!=null) //When the player exits, delete these two things
{
state[player.ID].keytimer.Delete();
state[player.ID].keytimer=null;
state[player.ID].keytable.clear();
state[player.ID].keytable=null;
}
state[player.ID]=null;
}
function onKeyDown(player,key)
{
//When you press the key, the corresponding text will be displayed
if(key==Key_I) Message("Key: I");
if(key==Key_J) Message("Key: J");
if(key==Key_K) Message("Key: K");
if(key==Key_L) Message("Key: L");
AddKeyTable(player.ID,key); //Saves the key that the player presses
}
function onKeyUp(player,key)
{
RemoveKeyTable(player.ID,key); //Delete the key saved by the player
}
function AddKeyTable(i,key)
{
local plr=FindPlayer(i);
if(plr)
{
if(state[plr.ID].keytable==null) state[plr.ID].keytable={}; //The first time the key is pressed, the table is created
if(state[plr.ID].keytable.rawin(key))
{
}
else state[plr.ID].keytable.rawset(key,key); //If the key is not in the table, add it
if(state[plr.ID].keytimer==null) //If the repetition timer is not created, create it
{
state[plr.ID].keytimer=NewTimer("onKeyProcess",10,0,plr.ID);
}
}
}
function RemoveKeyTable(i,key) //Here is the delete key function
{
local plr=FindPlayer(i);
if(plr)
{
if(state[plr.ID].keytable!=null)
{
if(state[plr.ID].keytable.rawin(key)) //If the key exists in the player's table
{
state[plr.ID].keytable.rawdelete(key); //Delete it
if(state[plr.ID].keytable.len()==0)
{
state[plr.ID].keytable=null; //If there are no keys in the table, delete the table
if(state[plr.ID].keytimer!=null) //Also delete timer
{
state[plr.ID].keytimer.Delete();
state[plr.ID].keytimer=null;
}
}
}
}
}
}
function onKeyProcess(i)
{
local plr=FindPlayer(i);
if(plr)
{
if(state[plr.ID].keytable!=null)
{
if(state[plr.ID].keytable.len()>0)
{
local nokey=0;
for(local i=0;i<state[plr.ID].keytable.len()+1000;i++) //Create a loop to get the keys in the player's store table
{
if(state[plr.ID].keytable.rawin(i))
{
local key=state[plr.ID].keytable.rawget(i);
nokey=0;
onKeyDown(plr,key); //Execute this key
}
else nokey+=1;
if(nokey>=10) break; //The 10 here is the number you set when you create the number of binding keys
}
}
}
}
}
Quote from: PSL on Mar 11, 2024, 10:41 AMWhen the NPC is in the vehicle and is the driver, the vehicle cannot pass the Vehicle.AddSpeed to add speed.its not a bug, same with idle (afk/away) player. addspeed works only when vehicle's syncer (player) is not away. you need to hande vehicle speed/pos by NPC's code, the driver of a car. its only correct method.
QuoteThis will return a function object which can be used as if it is the remote function itself.(except of return values)So r will always be true.
npclist<-array(100, false);
function RegisterNPC(playerid, isnpc)
{
npclist[playerid]=isnpc;
}
function OnPlayerStreamIn(playerid)
{
print("I see the " GetPlayerName(playerid) " enter my field of view, and his ID is: " playerid ".");
local r=npclist[playerid];
if(r)print(" He is an npc\n");
}
//--server side//when a new player joins inform all npcs if the player is PC(Playable Character) or NPC(Non Playable Character).
function onPlayerJoin(player)
{
local plr;
for(local i=0;i<GetMaxPlayers();i )
{
plr = FindPlayer(i);
if(plr && plr.IsNPC)
{
//Send information
RFC(i, "RegisterNPC")(player.ID, player.IsNPC);
}
}
//When an npc joins the server send information about all existing Characters (Playable or Non Playable) to it.
if(player.IsNPC)
{
for(local i=0;i<GetMaxPlayers();i++)
{
plr= FindPlayer(i);
if(plr)
RFC(player.ID, "RegisterNPC")(i, plr.IsNPC);
}
}
}
1. IsNPC or IsNPC()
DiePos<-{}; //Create a table where you can store coordinates
function onPlayerPart(player, reason) {
if (DiePos.rawin(player.ID))
DiePos.rawdelete(player.ID);
}
function onPlayerSpawn(player)
{
if(DiePos.rawin(player.ID)) //If an ID exists in the table
{
player.Pos=DiePos.rawget(player.ID); //Restores the player to death point
DiePos.rawdelete(player.ID); //Delete coordinates after recovery
}
}
function onPlayerDeath(player,reason)
{
if(reason!=43)
{
DiePos.rawset(player.ID,player.Pos); //After the player dies, the ID is used as the search object, and the death coordinates are stored in the table
}
}
Quote from: PSL on Mar 09, 2024, 08:11 AMThe following code may help youDiePos<-{}; //Create a table where you can store coordinates
function onPlayerSpawn(player)
{
if(DiePos.rawin(player.ID)) //If an ID exists in the table
{
player.Pos=DiePos.rawget(player.ID); //Restores the player to death point
DiePos.rawdelete(player.ID); //Delete coordinates after recovery
}
}
function onPlayerDeath(player,reason)
{
DiePos.rawset(player.ID,player.Pos); //After the player dies, the ID is used as the search object, and the death coordinates are stored in the table
}
function onPlayerPart(player, reason) {
if (DiePos.rawin(player.ID))
DiePos.rawdelete(player.ID);
}