Better Freezing System -
Dudits - 31.07.2011
Better Freezing System
Tutorial
Introduction
- In this tutorial I will show you how to make a player freezing system, many of you will probably jump to the reply and make "SetPlayerControllable NOOOOOOOOB" posts, if you're one of them either continue reading or just get out of the thread.
Requirements
- Basic Scripting knowledge.
- ZCMD. (Or you can just convert to your own command proccessor)
- SSCANF. (Or you can just use any other way of parameters defining you know)
Why you should use this system instead of using SetPlayerControllable
- This system will allow freezed players to move their screen view freely which has been suggested by many to be supported in future SA-MP scripting versions.
Better Freezing System
Let's get it done
Step 1
Add these variables to the top of your script.
pawn Код:
new Float:FX[MAX_PLAYERS], Float:FY[MAX_PLAYERS], Float:FZ[MAX_PLAYERS]; // X, Y, Z we will store the coordinates at when we freeze someone
new IsFrozen[MAX_PLAYERS]; // The variable we will use to check if a player is frozen or not
new playerb; // Definition for the player we're going to freeze, I like to keep it in public to avoid making new variable under each command
Step 2
Make your freeze and unfreeze commands.
pawn Код:
CMD:freeze(playerid, params[]) // ZCMD Start
{
if(sscanf(params, "u", playerb)) return SendClientMessage(playerid, 0xFFFFFFAA, "USAGE: /freeze [playerid]"); // SSCANF check if we entered an id or not
if(!IsPlayerConnected(playerb)) return SendClientMessage(playerid, 0xFFFFFFAA, "Invalid player id"); // Check if the player id we entered is valid
if(IsFrozen[playerb]) return SendClientMessage(playerid, 0xFFFFFFAA, "Player is already frozen."); // Check if the player is frozen already
IsFrozen[playerb] = 1; // Sets the player's frozen variable to 1
GetPlayerPos(playerb, FX[playerb], FY[playerb], FZ[playerb]); // Saves the player's coordinates to the variables we defined at the top
SendClientMessage(playerb, 0xFFFFFFAA, "You have been frozen."); // Sends a message to the player informing him about being frozen
return 1;
}
CMD:unfreeze(playerid, params[]) // ZCMD Start
{
if(sscanf(params, "u", playerb)) return SendClientMessage(playerid, 0xFFFFFFAA, "USAGE: /unfreeze [playerid]");// SSCANF check if we entered an id or not
if(!IsPlayerConnected(playerb)) return SendClientMessage(playerid, 0xFFFFFFAA, "Invalid player id"); // Check if the player id we entered is valid
if(!IsFrozen[playerb]) return SendClientMessage(playerid, 0xFFFFFFAA, "Player is not frozen."); // Check if the player is not frozen
IsFrozen[playerb] = 0; // Sets the player's frozen variable to 0
SendClientMessage(playerb, 0xFFFFFFAA, "You have been unfrozen."); // Sends a message to the player informing him about being unfrozen
return 1;
}
Step 3
Add this under OnPlayerUpdate.
pawn Код:
if(IsFrozen[playerid]) // Check to make sure the player is frozen
{
if(GetPlayerWeapon(playerid) != 0) // Check to see if the player is holding a weapon
{
SetPlayerArmedWeapon(playerid, 0); // Hides the weapon from player's hand, to prevent shooting while standing still
}
new Float:FFX, Float:FFY, Float:FFZ; // Variables we will use to compare to the ones we defined at the top
GetPlayerPos(playerid, FFX, FFY, FFZ); // Getting the player's current position
if(FX[playerid] != FFX || FY[playerid] != FFY || FZ[playerid] != FFZ) // Check to see if the player has moved
{
SetPlayerPos(playerid, FX[playerid], FY[playerid], FZ[playerid]); // Sets his position back to the coordinates he was frozen at
}
}
The End
We're Done
FAQ
- If you have any questions, bugs, suggestions reply 'n I will reply ASAP.
Credits
- Dudits
Hope this was helpful to anybody, enjoy.
Re: Better Freezing System -
LetsOWN[PL] - 31.07.2011
Smart :]
It seems to be usefull, cuz some cheats has anti admin-freeze system.
Well done
Greetz,
Lets
Re: Better Freezing System -
Dudits - 31.07.2011
Quote:
Originally Posted by LetsOWN[PL]
Smart :]
It seems to be usefull, cuz some cheats has anti admin-freeze system.
Well done
Greetz,
Lets
|
They have NOP SetPlayerPos too, but this would be exactly what someone would need if he wants people to be able to move their screen view while being frozen.
Thank you
Re: Better Freezing System -
[HiC]TheKiller - 31.07.2011
I have noticed a few errors in your code
pawn Код:
GetPlayerPos(playerb, FX, FY, FZ); // Saves the player's coordinates to the variables we defined at the top
Should be changed to
pawn Код:
GetPlayerPos(playerb, FX[playerb], FY[playerb], FZ[playerb]); // Saves the player's coordinates to the variables we defined at the top
Also, if you make a check on OnPlayerUpdate like that, it's not the best idea because it will be called quite a few times per second if you constantly check it.
Re: Better Freezing System -
Stylock - 31.07.2011
Or you could just freeze player with animation.
pawn Код:
ClearAnimations(playerid);
ApplyAnimation(playerid, "PED", "XPRESSscratch", 0.0, 1, 1, 1, 1, 0);
Got that from Slice's anti 2-shot FS.
Re: Better Freezing System -
Tigerkiller - 31.07.2011
it will be better when you check is player frozen then check theyre pos if !inrangeoffpoint then ban him because off hacks
Re: Better Freezing System -
Donya - 31.07.2011
better ≥
https://sampforum.blast.hk/showthread.php?tid=184118
Re: Better Freezing System -
alpha500delta - 31.07.2011
Also, under /freeze you use:
and under /unfreeze you use:
pawn Код:
if(IsFrozen[playerb]) return SendClientMessage(playerid, 0xFFFFFFAA, "Player is not frozen."); // Check if the player is not frozen
So you can't unfreeze the person... Did you even test this before posting?
Re: Better Freezing System -
Michael@Belgium - 31.07.2011
You forgot something:
pawn Код:
new playerb; //in both cmds ^^
Re: Better Freezing System -
Karlip - 31.07.2011
https://sampforum.blast.hk/showthread.php?tid=184118
This topic also has a solution to the incomplete freeze system.
Re: Better Freezing System -
OleKristian95 - 31.07.2011
Would be cool if you explained what this and that does. and not only write the codes.
Re: Better Freezing System -
System64 - 01.08.2011
nice but you should use u not i in the sscanf and not use IsPlayerConnected than INVALID_PLAYER_ID
Re: Better Freezing System -
TheArcher - 01.08.2011
Quote:
Originally Posted by Michael@Belgium
You forgot something:
pawn Код:
new playerb; //in both cmds ^^
|
No he made it in public that means playerb will call that player.
Anyways this is not the best way to create a freeze/unfreeze system beacuse OnPlayerUpdate calls that code everysecond. and what is the best way making it on OnPlayerUpdate
Re: Better Freezing System -
Dudits - 01.08.2011
Quote:
Originally Posted by [HiC]TheKiller
I have noticed a few errors in your code
pawn Код:
GetPlayerPos(playerb, FX, FY, FZ); // Saves the player's coordinates to the variables we defined at the top
Should be changed to
pawn Код:
GetPlayerPos(playerb, FX[playerb], FY[playerb], FZ[playerb]); // Saves the player's coordinates to the variables we defined at the top
Also, if you make a check on OnPlayerUpdate like that, it's not the best idea because it will be called quite a few times per second if you constantly check it.
|
Done.
Quote:
Originally Posted by YJIET
Or you could just freeze player with animation.
pawn Код:
ClearAnimations(playerid); ApplyAnimation(playerid, "PED", "XPRESSscratch", 0.0, 1, 1, 1, 1, 0);
Got that from Slice's anti 2-shot FS.
|
There are commands that clear the animation
Quote:
Originally Posted by Tigerkiller
it will be better when you check is player frozen then check theyre pos if !inrangeoffpoint then ban him because off hacks
|
The system isn't about detecting if the player is hacking or not, it's about freezing someone and making him able to move his camera, + packetloss makes people appear like hackers sometimes.
Quote:
Originally Posted by alpha500delta
Also, under /freeze you use:
and under /unfreeze you use:
pawn Код:
if(IsFrozen[playerb]) return SendClientMessage(playerid, 0xFFFFFFAA, "Player is not frozen."); // Check if the player is not frozen
So you can't unfreeze the person... Did you even test this before posting?
|
I tested it and deleted the code, then decided to make a tutorial here so I've missed few stuff, fixed.
Quote:
Originally Posted by Michael@Belgium
You forgot something:
pawn Код:
new playerb; //in both cmds ^^
|
It's defined on the top AKA can be usedi n any cmd ^^
Quote:
Originally Posted by OleKristian95
Would be cool if you explained what this and that does. and not only write the codes.
|
Would be cool if you read every green line besides the commands.
Quote:
Originally Posted by System64
nice but you should use u not i in the sscanf and not use IsPlayerConnected than INVALID_PLAYER_ID
|
Done, and IsPlayerConnected works good ye?
Everybody has his own scripting style.
Quote:
Originally Posted by Anthony_prince
No he made it in public that means playerb will call that player.
Anyways this is not the best way to create a freeze/unfreeze system beacuse OnPlayerUpdate calls that code everysecond. and what is the best way making it on OnPlayerUpdate
|
OnPlayerUpdate prevents you from moving totally, making a timer will make someone able to move for like a second then get TPed back, would do the trick but OnPlayerUpdate makes it more accurate.
Re: Better Freezing System -
dowster - 01.08.2011
Good job, i was wondering how to freeze a player but still allow him to move the view, going to make a security camera application in the gamemode im helping out on
Re: Better Freezing System -
TheArcher - 01.08.2011
Quote:
Originally Posted by Dudits
OnPlayerUpdate prevents you from moving totally, making a timer will make someone able to move for like a second then get TPed back, would do the trick but OnPlayerUpdate makes it more accurate.
|
Often the people dont know what they doing OnPlayerUpdate. Like sometime array and cells. So i dont think is a good idea put this code on OnPlayerUpdate only beacuse you move 1 sec and TPed again. But i think that happen if someone got 200ms. I will do some tests about it.
Re: Better Freezing System -
Dudits - 02.08.2011
Quote:
Originally Posted by Anthony_prince
Often the people dont know what they doing OnPlayerUpdate. Like sometime array and cells. So i dont think is a good idea put this code on OnPlayerUpdate only beacuse you move 1 sec and TPed again. But i think that happen if someone got 200ms. I will do some tests about it.
|
It prevents you from moving totally and allows you to be shot, making a 1 sec timer will making shooting the freezed person harder, can be used for tazers or tying someone you know..
Re: Better Freezing System -
Calgon - 02.08.2011
It's an extremely common misconception that OnPlayerUpdate should only be used for single lines of code - which is generally wrong. As long as you don't abuse intensive functions inside the callback, you're fine - and you should refine your code to be as minimal as possible, but I'd generally say the amount of code in the callback here is pretty much fine...
Anyhow, what's "better" about this? And what is this in comparison to?
Re: Better Freezing System -
TheArcher - 02.08.2011
Quote:
Originally Posted by Calg00ne
It's an extremely common misconception that OnPlayerUpdate should only be used for single lines of code - which is generally wrong. As long as you don't abuse intensive functions inside the callback, you're fine - and you should refine your code to be as minimal as possible, but I'd generally say the amount of code in the callback here is pretty much fine...
Anyhow, what's "better" about this? And what is this in comparison to?
|
Fully agree with you.
Re: Better Freezing System -
Dudits - 02.08.2011
Quote:
Originally Posted by Calg00ne
It's an extremely common misconception that OnPlayerUpdate should only be used for single lines of code - which is generally wrong. As long as you don't abuse intensive functions inside the callback, you're fine - and you should refine your code to be as minimal as possible, but I'd generally say the amount of code in the callback here is pretty much fine...
Anyhow, what's "better" about this? And what is this in comparison to?
|
Here's a very simple comparison.
TogglePlayerControllable.......................... ..........Better Freezing System
Prevents camera movement................................Allows camera movement
Prevents health/armor drain....(When being shot)....Allows health/armor drain