Add respawning and "death"

This commit is contained in:
Sofia 2020-08-08 09:50:37 +03:00
parent edd6e1def3
commit e127e253d1
5 changed files with 71 additions and 13 deletions

View File

@ -38,7 +38,7 @@ RenderSettings:
m_ReflectionIntensity: 1
m_CustomReflection: {fileID: 0}
m_Sun: {fileID: 0}
m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1}
m_IndirectSpecularColor: {r: 0.17393494, g: 0.2174847, b: 0.299652, a: 1}
m_UseRadianceAmbientProbe: 0
--- !u!157 &3
LightmapSettings:
@ -11623,6 +11623,36 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: ef9117cc11410da479d1af23fbe77b23, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!1 &1280423820
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1280423821}
m_Layer: 0
m_Name: SpawnPoint
m_TagString: Respawn
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &1280423821
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1280423820}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0.02, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 0}
m_RootOrder: 11
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &1349294154
GameObject:
m_ObjectHideFlags: 0

View File

@ -83,17 +83,23 @@ namespace NeonTea.Quakeball.Networking.Instances {
Players.Add(LocalPlayer.Id, LocalPlayer);
SelfIdentified = true;
SpawnPckt spawn = new SpawnPckt();
SpawnPckt spawn = new SpawnPckt(LocalPlayer.Controlled.transform.position);
spawn.Location = LocalPlayer.Controlled.transform.position;
Peer.SendReliable(Server.uid, spawn);
} else if (packet is SpawnPckt) {
SpawnPckt spawn = (SpawnPckt)packet;
if (spawn.PlayerId == LocalPlayer.Id) {
if (spawn.PlayerId == LocalPlayer.Id && spawn.IsInitial) {
return; // Ignore, it's their own.
}
if (spawn.IsInitial) {
Player obj = Net.SpawnPlayer(spawn.Location).GetComponent<Player>();
NetPlayer player = new NetPlayer(spawn.PlayerId, obj);
Players.Add(spawn.PlayerId, player);
} else {
if (Players.ContainsKey(spawn.PlayerId)) {
HandlePlayerDeath(spawn.PlayerId, spawn.Location);
}
}
} else if (packet is MultiplePlayerUpdatesPckt) {
MultiplePlayerUpdatesPckt multiple = (MultiplePlayerUpdatesPckt)packet;
foreach (PlayerUpdatePckt pckt in multiple.Updates) {
@ -185,5 +191,11 @@ namespace NeonTea.Quakeball.Networking.Instances {
Peer.SendUnreliable(Server.uid, packet);
}
}
public void HandlePlayerDeath(ulong uid, Vector3 respawn) {
if (Players[uid].Controlled != null) {
Players[uid].Controlled.transform.position = respawn;
}
}
}
}

View File

@ -57,9 +57,7 @@ namespace NeonTea.Quakeball.Networking.Instances {
if (p.Controlled == null) { // Not yet initialized, sending later.
continue;
}
SpawnPckt spawn = new SpawnPckt();
spawn.PlayerId = p.Id;
spawn.Location = p.Controlled.transform.position;
SpawnPckt spawn = new SpawnPckt(p.Controlled.transform.position, p.Id);
Peer.SendReliableLater(conn.uid, spawn);
}
NetPlayer RemotePlayer = new NetPlayer(PlayerIdCounter++);
@ -80,13 +78,11 @@ namespace NeonTea.Quakeball.Networking.Instances {
public override void Handle(Connection conn, Packet packet) {
if (packet is SpawnPckt) {
SpawnPckt spawn = (SpawnPckt)packet;
if (Players[conn.uid].Controlled == null) {
if (Players[conn.uid].Controlled == null && spawn.IsInitial) {
Player obj = Net.SpawnPlayer(spawn.Location).GetComponent<Player>();
Players[conn.uid].Controlled = obj;
spawn = new SpawnPckt();
spawn.PlayerId = conn.uid;
spawn.Location = obj.transform.position;
spawn = new SpawnPckt(obj.transform.position, conn.uid);
SendReliableToAll(spawn, except: spawn.PlayerId);
}
} else if (packet is PlayerUpdatePckt) {
@ -208,5 +204,13 @@ namespace NeonTea.Quakeball.Networking.Instances {
HitPckt hit = new HitPckt(id);
SendReliableToAll(hit);
}
public void HandlePlayerDeath(ulong uid) {
Vector3 point = GameObject.FindGameObjectWithTag("Respawn").transform.position;
Player player = Players[uid].Controlled;
player.transform.position = point;
SpawnPckt spawn = new SpawnPckt(point, uid, false);
SendReliableToAll(spawn);
}
}
}

View File

@ -6,6 +6,13 @@ namespace NeonTea.Quakeball.Networking.Packets {
public ulong PlayerId;
public Vector3 Location;
public bool IsInitial;
public SpawnPckt(Vector3 location, ulong id = 0, bool isinitial = true) {
PlayerId = id;
Location = location;
IsInitial = isinitial;
}
public override void Read(ByteBuffer buffer) {
float x = buffer.ReadFloat();
@ -13,6 +20,7 @@ namespace NeonTea.Quakeball.Networking.Packets {
float z = buffer.ReadFloat();
Location = new Vector3(x, y, z);
PlayerId = buffer.ReadULong();
IsInitial = buffer.ReadBool();
}
public override void Write(ByteBuffer buffer) {
@ -20,6 +28,7 @@ namespace NeonTea.Quakeball.Networking.Packets {
buffer.Write(Location.y);
buffer.Write(Location.z);
buffer.Write(PlayerId);
buffer.Write(IsInitial);
}
}

View File

@ -195,6 +195,9 @@ namespace NeonTea.Quakeball.Players {
}
public void Hit() {
if (Net.Singleton.Instance is Server) {
((Server)Net.Singleton.Instance).HandlePlayerDeath(NetId);
}
Debug.Log("I was hit! Aaagh!");
Splatter.Play();
}