Vice City: Multiplayer

Server Development => Scripting and Server Management => Topic started by: Nihongo^ on Jul 26, 2023, 06:37 PM

Title: Restrict /skin when player on groud
Post by: Nihongo^ on Jul 26, 2023, 06:37 PM
How do i restrict /skin when player fall down (player on ground after getting hit with weapon ) ?

Most of players in my server do evade with /skin <id>. It immediately change the skin and player get up on exact moment

i made this one but it works only for 1 second and after that player can use skin ( it take around 4/5 seconds for the player to get up properly and run )
if (cmd == "skin") {
        if (player.Action == 42) {
            MessagePlayer("You cannot use /skin while on the ground.", player);
            return;
        }
}
Title: Re: Restrict /skin when player on groud
Post by: habi on Jul 27, 2023, 05:50 AM
function onPlayerActionChange(player, oldaction, newaction){
If(newaction == 42){
player.IsFallen=true;
NewTimer("SetAlright", 5000,1,player.ID);
}
}

function SetAlright(playerId){
local player=FindPlayer(playerId);
if(player)

  if(GetTickCount() - player.TimeFallen > 4900000)//in milliseconds and taking account of precision error possible in timer.
  player.IsFallen = false;
}else
  FallenPlayers[playerId] = false;
}

function onScriptLoad(){
CPlayer.__getTable.IsFallen<-function (){ return ::FallenPlayers[this.ID] }
CPlayer.__getTable.TimeFallen<-function (){ return ::TimeFallen[this.ID] }
CPlayer.__setTable.IsFallen<-function (state){ ::FallenPlayers[this.ID]= state;
if(state)::TimeFallen[this.ID]=::GetTickCount();
}
FallenPlayers<-array(GetMaxPlayers(),  false);
TimeFallen<- array(GetTickCount(), 0 );
}

if (cmd == "skin") {
        if (player.IsFallen == true) {
          //Your message
           MessagePlayer("You cannot use /skin while on the ground.", player);
            return;
        }
}
Title: Re: Restrict /skin when player on groud
Post by: Nihongo^ on Jul 27, 2023, 06:49 AM
Thanks habi, but i have question

why do we put all this funnctions in onScriptLoad?. When we can simple put the timer when player fall

function onScriptLoad(){
CPlayer.__getTable.IsFallen<-function (){ return ::FallenPlayers[this.ID] }
CPlayer.__getTable.TimeFallen<-function (){ return ::TimeFallen[this.ID] }
CPlayer.__setTable.IsFallen<-function (state){ ::FallenPlayers[this.ID]= state;
if(state)::TimeFallen[this.ID]=::GetTickCount();
}
FallenPlayers<-array(GetMaxPlayers(),  false);
TimeFallen<- array(GetTickCount(), 0 );
}
and isn't we can use

FallenPlayers = false; In Playerclass instead of 
FallenPlayers<-array(GetMaxPlayers(),  false);

and i am confused with this
if(GetTickCount() - player.TimeFallen > 4900000)Why do we need gettick count etc when there's a timer

Title: Re: Restrict /skin when player on groud
Post by: habi on Jul 27, 2023, 09:01 AM
We use tickcount because of 5 second timer.
What does timer do?
Sets player.IsFallen = false

Why use tickcount?
I don't know if it is possible, but for whatever reasons player fall and rise in 4 seconds and again fall.

If you think this situation, then there will be a loophole in the code. To avoid that, i used tickcount to determine when exactly does he fall down before setting his state to it

I think it is okay to place the code outside onScriptLoad. One problem was that slots cannot be added to CPlayer class once it is initialized, but slots are added to __getTable member of CPlayer class and not to CPlayer class. So that problem is solved.

Also,
Quote from: Nihongo^ on Jul 27, 2023, 06:49 AMand isn't we can use

FallenPlayers = false; In Playerclass instead of 
FallenPlayers<-array(GetMaxPlayers(),  false)
No, because it is an sqrat class.
Title: Re: Restrict /skin when player on groud
Post by: Nihongo^ on Jul 27, 2023, 09:09 PM
Thanks for reply, just one thing server run fine in windows but at Linux server not load its not gives any error
but it stop loading after adding this


CPlayer.__getTable.IsFallen<-function (){ return ::FallenPlayers[this.ID] }
CPlayer.__getTable.TimeFallen<-function (){ return ::TimeFallen[this.ID] }
CPlayer.__setTable.IsFallen<-function (state){ ::FallenPlayers[this.ID]= state;
if(state)::TimeFallen[this.ID]=::GetTickCount();
}
Title: Re: Restrict /skin when player on groud
Post by: habi on Jul 28, 2023, 02:00 AM
function SetAlright(playerId){
local player=FindPlayer(playerId);
if(player)
{
  if(GetTickCount() - player.TimeFallen > 4900000)//in milliseconds and taking account of precision error possible in timer.
  player.IsFallen = false;
}else
 FallenPlayers[playerId] = false;
}
}
Sorry i missed a brace '}'
Title: Re: Restrict /skin when player on groud
Post by: Nihongo^ on Jul 28, 2023, 10:07 AM
No no its not about the bracket

server not load when i put this line
CPlayer.__getTable.IsFallen<-function (){ return ::FallenPlayers[this.ID] }
CPlayer.__getTable.TimeFallen<-function (){ return ::TimeFallen[this.ID] }
CPlayer.__setTable.IsFallen<-function (state){ ::FallenPlayers[this.ID]= state;
if(state)::TimeFallen[this.ID]=::GetTickCount();
}

(https://i.postimg.cc/1tSjQ843/Screenshot-2023-07-28-140541.png)

P.S i even tried with the bracket but still the same problem
Title: Re: Restrict /skin when player on groud
Post by: habi on Jul 28, 2023, 06:35 PM
Forget the bracket, it was correct.
But change
If(newaction == 42){to
if(newaction == 42){the 'I' was capital letter.

It is tested and working for me.
Title: Re: Restrict /skin when player on groud
Post by: Diego^ on Aug 06, 2023, 02:12 AM
Quote from: Nihongo^ on Jul 26, 2023, 06:37 PMHow do i restrict /skin when player fall down (player on ground after getting hit with weapon ) ?

Most of players in my server do evade with /skin <id>. It immediately change the skin and player get up on exact moment

i made this one but it works only for 1 second and after that player can use skin ( it take around 4/5 seconds for the player to get up properly and run )
if (cmd == "skin") {
        if (player.Action == 42) {
            MessagePlayer("You cannot use /skin while on the ground.", player);
            return;
        }
}


if (cmd == "skin") {
        if (player.Action == 42 || player.Action == 43) {
            MessagePlayer("You cannot use /skin while on the ground.", player);
            return;
        }
}

Simple ;)
Title: Re: Restrict /skin when player on groud
Post by: habi on Aug 06, 2023, 03:23 AM
Quote from: Diego^ on Aug 06, 2023, 02:12 AMif (cmd == "skin") {
        if (player.Action == 42 || player.Action == 43) {
            MessagePlayer("You cannot use /skin while on the ground.", player);
            return;
        }
}

Simple ;)
hmm that is correct
Title: Re: Restrict /skin when player on groud
Post by: 2b2ttianxiu on Aug 11, 2023, 01:20 AM
if(GetTickCount() - player.TimeFallen > 4900000)//in milliseconds and taking account of precision error possible in timer.
4900000 -> 81 minutes??? r u kidd me?
Title: Re: Restrict /skin when player on groud
Post by: habi on Aug 11, 2023, 08:30 AM
4900000 = lol, my mistake it must be 4900.