Networking Transform Hacks??
Hi, i have been looking into Unet a bit the past few days and have found that everyone uses the Player authoritive method but that's prone to players using client side cheats, including teleport hacks and Speed Hacks what i was looking at was a way to make the players movement calculated on the server and sent back to the client, as i had tried to host a server on a application game and in the client was was able to move the player around freely by dragging it around and it did so on the server, but you are unable to move other players around only your self. this is a major issue to tackle against the simplest form of hacking.
i had tried using commands to send input to the server and then have that update the players positions but i'm not quite their yet. i was wondering if i could get some help with what im doing wrong
public GameObject FPSCamera;
public CharacterController characterController;
public FirstPersonController fpsController;
private Transform playerTransform;
//sync position vars
[SyncVar]
private Vector3 syncPosition;
public float movementLerpRate = 15;
int moveX = 0;
int moveY = 0;
float moveSpeed = 0.2f;
private void Start ()
{
playerTransform = GetComponent<Transform>();
if (!isLocalPlayer)
{
FPSCamera.SetActive(false);
characterController.enabled = false;
fpsController.enabled = false;
}
}
void Update()
{
//Vector3.Lerp(playerTransform.position, syncPosition, Time.deltaTime * movementLerpRate);
Vector3 tempPos = new Vector3(playerTransform.position.x, playerTransform.position.y, playerTransform.position.z);
CmdChangePos(tempPos);
LerpPosition();
if (!isLocalPlayer)
return;
int oldMoveX = moveX;
int oldMoveY = moveY;
moveX = 0;
moveY = 0;
if (Input.GetKey(KeyCode.LeftArrow))
{
moveX -= 1;
}
if (Input.GetKey(KeyCode.RightArrow))
{
moveX += 1;
}
if (Input.GetKey(KeyCode.UpArrow))
{
moveY += 1;
}
if (Input.GetKey(KeyCode.DownArrow))
{
moveY -= 1;
}
if (moveX != oldMoveX || moveY != oldMoveY)
{
CmdMove(moveX, moveY);
}
}
[Command]
void CmdChangePos(Vector3 newPos)
{
syncPosition = newPos;
}
[Command]
public void CmdMove(int x, int y)
{
moveX = x;
moveY = y;
}
public void FixedUpdate()
{
if (NetworkServer.active)
{
transform.Translate(moveX * moveSpeed, moveY * moveSpeed, 0);
}
}
private void LerpPosition()
{
if (!isLocalPlayer)
{
playerTransform.position = Vector3.Lerp(playerTransform.position, syncPosition, Time.deltaTime * movementLerpRate);
}
}
i would of thought this was the right approach, but it seems that the players local position is still being synced, i have
Your answer
![](https://koobas.hobune.stream/wayback/20220612064912im_/https://answers.unity.com/themes/thub/images/avi.jpg)