|
|
@@ -1,196 +1,41 @@
|
|
|
+using System;
|
|
|
using System.Collections;
|
|
|
using System.Collections.Generic;
|
|
|
using UnityEngine;
|
|
|
using Newtonsoft.Json;
|
|
|
-using Newtonsoft.Json.Linq;
|
|
|
|
|
|
public class RabbitHuntGameMode_OnlinePK : RabbitHuntGameMode, ChallengeGameModeLocalPK
|
|
|
{
|
|
|
- SocketPlayer socketPlayer;
|
|
|
- public int myPlayerIndex = -1;
|
|
|
- public bool IsMyPlayerInited() {
|
|
|
- return myPlayerIndex >= 0;
|
|
|
- }
|
|
|
- public bool IsMyPlayerRunning() {
|
|
|
- return myPlayerIndex == currentPlayerIndex;
|
|
|
- }
|
|
|
- public bool IsMainHost() {
|
|
|
- return myPlayerIndex == 0;
|
|
|
- }
|
|
|
- public bool IsCopyHost() {
|
|
|
- return myPlayerIndex > 0;
|
|
|
- }
|
|
|
- public int roundID = 0;
|
|
|
public int currentPlayerIndex = 0; // 双人0和1
|
|
|
float singleShootReadyTime = 30f;
|
|
|
float singleShootReadyTimeMax = 30f;
|
|
|
public RabbitHuntGameMode_OnlinePK(GameMgr gameMgr) : base(gameMgr) {
|
|
|
+ onlineHelper = new OnlineHelper(this);
|
|
|
hunterGamePlayerScoreCounter = new HunterGamePlayerScoreCounter(this);
|
|
|
}
|
|
|
|
|
|
public override void Start()
|
|
|
{
|
|
|
- if (GameObject.Find("SocketPlayer") == null) {
|
|
|
- PKMatchingView.MoniMatchForTestInGameScene(() => {
|
|
|
- myPlayerIndex = GlobalData.playerIndexInRoom;
|
|
|
- OnStart();
|
|
|
- });
|
|
|
- } else {
|
|
|
- myPlayerIndex = GlobalData.playerIndexInRoom;
|
|
|
- OnStart();
|
|
|
- }
|
|
|
- socketPlayer = GameObject.Find("SocketPlayer").GetComponent<SocketPlayer>();
|
|
|
- socketPlayer.onReceivePKGameData = onReceivePKGameData;
|
|
|
-
|
|
|
- AutoSwitchBanUserControlBow();
|
|
|
+ onlineHelper.InitSocketPlayer(OnStart);
|
|
|
}
|
|
|
|
|
|
private void OnStart() {
|
|
|
- banCreateAnimal = IsCopyHost();
|
|
|
- banOnBowArrowShootOut = IsCopyHost();
|
|
|
+ banCreateAnimal = onlineHelper.IsCopyHost();
|
|
|
+ banOnBowArrowShootOut = onlineHelper.IsCopyHost();
|
|
|
SetLevel(5);
|
|
|
AddHuntGameView();
|
|
|
this.gameMgr.transform.Find("HunterGameView_LocalPK").gameObject.SetActive(true);
|
|
|
}
|
|
|
|
|
|
public override void onBowShoot() {
|
|
|
- if (IsCopyHost()) {
|
|
|
- socketPlayer.UploadPKGameData("onBowShoot", "");
|
|
|
+ if (onlineHelper.IsCopyHost()) {
|
|
|
+ onlineHelper.socketPlayer.UploadPKGameData("onBowShoot", "");
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- Quaternion bowTargetQua;
|
|
|
- bool hasBowTargBtQua;
|
|
|
- void onReceivePKGameData(string key, string data) {
|
|
|
- if (!IsMyPlayerInited()) return;
|
|
|
- if (key == "logic") {
|
|
|
- SyncLogicData syncLogicData = JsonConvert.DeserializeObject<SyncLogicData>(data);
|
|
|
- // if (syncLogicData.roundID > roundID ||
|
|
|
- // (syncLogicData.roundID == roundID && syncLogicData.currentPlayerIndex != myPlayerIndex)
|
|
|
- // ) {
|
|
|
-
|
|
|
- // }
|
|
|
- syncLogicData.Output(this);
|
|
|
- AutoSwitchBanUserControlBow();
|
|
|
- }
|
|
|
- if (key == "bow") {
|
|
|
- if (!IsMyPlayerRunning()) {
|
|
|
- string[] quaStr = data.Split(',');
|
|
|
- if (quaStr.Length == 6) {
|
|
|
- bowTargetQua.x = float.Parse(quaStr[0]);
|
|
|
- bowTargetQua.y = float.Parse(quaStr[1]);
|
|
|
- bowTargetQua.z = float.Parse(quaStr[2]);
|
|
|
- bowTargetQua.w = float.Parse(quaStr[3]);
|
|
|
- hasBowTargBtQua = true;
|
|
|
- ArmBow.ins.phase = int.Parse(quaStr[4]);
|
|
|
- GameAssistUI.ins.playerScaleAimValue_OnlinePK = int.Parse(quaStr[5]);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- if (key == "arrow") {
|
|
|
- List<ArrowSync.SyncData> arrowSyncDataList = JsonConvert.DeserializeObject<List<ArrowSync.SyncData>>(data);
|
|
|
- foreach (var item in arrowSyncMap) {
|
|
|
- item.Value.hasSetSyncData = false;
|
|
|
- }
|
|
|
- GameObject arrowPrefab = ArmBow.ins.arrow;
|
|
|
- foreach (var item in arrowSyncDataList) {
|
|
|
- ArrowSync arrowSync;
|
|
|
- arrowSyncMap.TryGetValue(item.id, out arrowSync);
|
|
|
- if (arrowSync == null) {
|
|
|
- GameObject arrowObj = GameObject.Instantiate(arrowPrefab);
|
|
|
- arrowSync = arrowObj.AddComponent<ArrowSync>();
|
|
|
- arrowSync.SetSyncData(item, true);
|
|
|
- arrowSyncMap[item.id] = arrowSync;
|
|
|
- } else {
|
|
|
- arrowSync.SetSyncData(item);
|
|
|
- }
|
|
|
- arrowSync.hasSetSyncData = true;
|
|
|
- }
|
|
|
- List<int> removeIDs = null;
|
|
|
- foreach (var item in arrowSyncMap) {
|
|
|
- if (!item.Value.hasSetSyncData) {
|
|
|
- if (removeIDs == null) removeIDs = new List<int>();
|
|
|
- removeIDs.Add(item.Key);
|
|
|
- }
|
|
|
- }
|
|
|
- if (removeIDs != null) {
|
|
|
- foreach (var id in removeIDs) {
|
|
|
- ArrowSync arrowSync = arrowSyncMap[id];
|
|
|
- arrowSyncMap.Remove(id);
|
|
|
- if (arrowSync && arrowSync.gameObject) {
|
|
|
- GameObject.Destroy(arrowSync.gameObject);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- if (key == "onBowShoot") {
|
|
|
- GameEventCenter.ins.onBowArrowShootOut?.Invoke(null, null);
|
|
|
- }
|
|
|
- if (key == "DoNextShoot") {
|
|
|
- DoNextShoot();
|
|
|
- }
|
|
|
- if (key == "animals") {
|
|
|
- List<RabbitSyncData> syncDataList = JsonConvert.DeserializeObject<List<RabbitSyncData>>(data);
|
|
|
- foreach (var item in animalSyncMap) {
|
|
|
- item.Value.isInvalid = true;
|
|
|
- }
|
|
|
- foreach (var item in syncDataList) {
|
|
|
- Rabbit animalSync;
|
|
|
- animalSyncMap.TryGetValue(item.id, out animalSync);
|
|
|
- if (animalSync == null) {
|
|
|
- GameObject animalObject = GameObject.Instantiate(animalPrefab, Vector3.zero, Quaternion.identity, animalsBaseT);
|
|
|
- animalSync = animalObject.GetComponent<Rabbit>();
|
|
|
- animalSync.isMirror = true;
|
|
|
- animalSync.inputSyncData = item;
|
|
|
- animalObject.SetActive(true);
|
|
|
- animalSyncMap[item.id] = animalSync;
|
|
|
- } else {
|
|
|
- animalSync.inputSyncData = item;
|
|
|
- }
|
|
|
- animalSync.isInvalid = false;
|
|
|
- }
|
|
|
- List<int> removeIDs = null;
|
|
|
- foreach (var item in animalSyncMap) {
|
|
|
- if (item.Value.isInvalid) {
|
|
|
- if (removeIDs == null) removeIDs = new List<int>();
|
|
|
- removeIDs.Add(item.Key);
|
|
|
- }
|
|
|
- }
|
|
|
- if (removeIDs != null) {
|
|
|
- foreach (var id in removeIDs) {
|
|
|
- Rabbit animalSync = animalSyncMap[id];
|
|
|
- animalSyncMap.Remove(id);
|
|
|
- if (animalSync && animalSync.gameObject) {
|
|
|
- GameObject.Destroy(animalSync.gameObject);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- if (key == "RUpdate") {
|
|
|
- if (int.Parse(data) == roundID) {
|
|
|
- OnUpdate(0.033f, false);
|
|
|
- }
|
|
|
- }
|
|
|
- if (key == "OnHit") {
|
|
|
- string[] dataSplits = data.Split(',');
|
|
|
- int uid = int.Parse(dataSplits[0]);
|
|
|
- string partName = dataSplits[1];
|
|
|
- foreach (var item in Rabbit.rabbitSet) {
|
|
|
- if (item.uid == uid) {
|
|
|
- item.OnHitLogic(null, partName);
|
|
|
- break; //一定要break,原因1:这是唯一ID,后续也没必要检测了,原因2:这里可能会触发死亡,死亡会触发下个动物生成,Set集合的元素+1,继续遍历会出现modifyException
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- void AutoSwitchBanUserControlBow() {
|
|
|
- BowCamera.ins.banLogic = ArmBow.ins.banLogic = !IsMyPlayerRunning();
|
|
|
- }
|
|
|
|
|
|
public override bool DoNextShoot() {
|
|
|
- if (IsCopyHost()) {
|
|
|
- socketPlayer.UploadPKGameData("DoNextShoot", "");
|
|
|
+ if (onlineHelper.IsCopyHost()) {
|
|
|
+ onlineHelper.socketPlayer.UploadPKGameData("DoNextShoot", "");
|
|
|
return false;
|
|
|
}
|
|
|
foreach (var item in Rabbit.rabbitSet) {
|
|
|
@@ -221,15 +66,16 @@ public class RabbitHuntGameMode_OnlinePK : RabbitHuntGameMode, ChallengeGameMode
|
|
|
currentPlayerIndex++;
|
|
|
currentPlayerIndex %= 2;
|
|
|
singleShootReadyTime = singleShootReadyTimeMax;
|
|
|
- roundID++;
|
|
|
+ onlineHelper.roundID++;
|
|
|
}
|
|
|
|
|
|
public override void Update() {
|
|
|
- if (!IsMyPlayerInited()) return;
|
|
|
- if (!IsMainHost()) return;
|
|
|
- if (!IsMyPlayerRunning()) return;
|
|
|
+ if (!onlineHelper.IsMyPlayerInited()) return;
|
|
|
+ if (!onlineHelper.IsMainHost()) return;
|
|
|
+ if (!onlineHelper.IsMyPlayerRunning()) return;
|
|
|
OnUpdate(Time.deltaTime, pauseTimeCounting);
|
|
|
}
|
|
|
+
|
|
|
void OnUpdate(float dt, bool _pauseTimeCounting) {
|
|
|
if (gameMgr.gameOver || _pauseTimeCounting) return;
|
|
|
if (this.time > 0) {
|
|
|
@@ -247,84 +93,8 @@ public class RabbitHuntGameMode_OnlinePK : RabbitHuntGameMode, ChallengeGameMode
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- int lastRoundID = -1;
|
|
|
- bool gameEnd = false;
|
|
|
- public override void FrameUpdate()
|
|
|
- {
|
|
|
- if (!IsMyPlayerInited()) return;
|
|
|
- AutoSwitchBanUserControlBow();
|
|
|
- Upload();
|
|
|
- if (!IsMyPlayerRunning() && hasBowTargBtQua) {
|
|
|
- BowCamera.ins.transform.rotation = Quaternion.Lerp(BowCamera.ins.transform.rotation, bowTargetQua, Time.deltaTime * 12);
|
|
|
- }
|
|
|
- if (roundID > lastRoundID) {
|
|
|
- lastRoundID = roundID;
|
|
|
- BanBowReady();
|
|
|
- AddReadyView();
|
|
|
- }
|
|
|
- if (gameEnd && !gameMgr.gameOver) {
|
|
|
- AnnounceGameOver();
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- float lastUploadTime = 0;
|
|
|
- void Upload() {
|
|
|
- float curTime = Time.realtimeSinceStartup;
|
|
|
- if (curTime - lastUploadTime > 0.033) {
|
|
|
- lastUploadTime = curTime;
|
|
|
- UploadLogic();
|
|
|
- UploadBow();
|
|
|
- UploadArrows();
|
|
|
- UploadAnimals();
|
|
|
- UploadRequestUpdate();
|
|
|
- UploadOnHit();
|
|
|
- }
|
|
|
- }
|
|
|
- void UploadLogic() {
|
|
|
- if (!IsMainHost()) return;
|
|
|
- SyncLogicData data = new SyncLogicData().Input(this);
|
|
|
- socketPlayer.UploadPKGameData("logic", data);
|
|
|
- }
|
|
|
- void UploadBow() {
|
|
|
- if (!IsMyPlayerRunning()) return;
|
|
|
- Quaternion qua = BowCamera.ins.transform.rotation;
|
|
|
- int aimScaleValue = GameAssistUI.ins.aimScaleValue;
|
|
|
- if (!GameAssistUI.ins.scaleAimOn) aimScaleValue = 0;
|
|
|
- socketPlayer.UploadPKGameData("bow", qua.x + "," + qua.y + "," + qua.z + "," + qua.w + "," + ArmBow.ins.phase + "," + aimScaleValue);
|
|
|
- }
|
|
|
- Dictionary<int, ArrowSync> arrowSyncMap = new Dictionary<int, ArrowSync>();
|
|
|
- void UploadArrows() {
|
|
|
- List<ArrowSync.SyncData> arrowSyncDataList = new List<ArrowSync.SyncData>();
|
|
|
- foreach (var item in Arrow.arrowSet) {
|
|
|
- if (item.outputSyncData == null || !item.outputSyncData.inited) continue;
|
|
|
- arrowSyncDataList.Add(item.outputSyncData);
|
|
|
- }
|
|
|
- socketPlayer.UploadPKGameData("arrow", arrowSyncDataList);
|
|
|
- }
|
|
|
- Dictionary<int, Rabbit> animalSyncMap = new Dictionary<int, Rabbit>();
|
|
|
- void UploadAnimals() {
|
|
|
- if (!IsMainHost()) return;
|
|
|
- List<RabbitSyncData> syncDataList = new List<RabbitSyncData>();
|
|
|
- foreach (var item in Rabbit.rabbitSet) {
|
|
|
- if (item.outputSyncData == null || !item.outputSyncData.inited) continue;
|
|
|
- syncDataList.Add(item.outputSyncData);
|
|
|
- }
|
|
|
- socketPlayer.UploadPKGameData("animals", syncDataList);
|
|
|
- }
|
|
|
- void UploadRequestUpdate() {
|
|
|
- if (!IsCopyHost()) return;
|
|
|
- if (!IsMyPlayerRunning()) return;
|
|
|
- if (pauseTimeCounting) return;
|
|
|
- socketPlayer.UploadPKGameData("RUpdate", this.roundID.ToString());
|
|
|
- }
|
|
|
-
|
|
|
- void UploadOnHit() {
|
|
|
- foreach (var item in Rabbit.rabbitSet) {
|
|
|
- if (item.onHitData != null) {
|
|
|
- socketPlayer.UploadPKGameData("OnHit", item.onHitData);
|
|
|
- item.onHitData = null;
|
|
|
- }
|
|
|
- }
|
|
|
+ public override void FrameUpdate() {
|
|
|
+ onlineHelper.OnFrameUpdate();
|
|
|
}
|
|
|
|
|
|
//localPK interface
|
|
|
@@ -338,6 +108,10 @@ public class RabbitHuntGameMode_OnlinePK : RabbitHuntGameMode, ChallengeGameMode
|
|
|
public HunterGamePlayerScoreCounter getHunterGamePlayerScoreCounter() {
|
|
|
return hunterGamePlayerScoreCounter;
|
|
|
}
|
|
|
+
|
|
|
+ //###------------
|
|
|
+ //### 联机部分
|
|
|
+ //###------------
|
|
|
|
|
|
public class SyncLogicData {
|
|
|
public int roundID;
|
|
|
@@ -349,7 +123,7 @@ public class RabbitHuntGameMode_OnlinePK : RabbitHuntGameMode, ChallengeGameMode
|
|
|
public int[] hitScores;
|
|
|
public bool gameEnd = false;
|
|
|
public SyncLogicData Input(RabbitHuntGameMode_OnlinePK src) {
|
|
|
- roundID = src.roundID;
|
|
|
+ roundID = src.onlineHelper.roundID;
|
|
|
currentPlayerIndex = src.currentPlayerIndex;
|
|
|
singleShootReadyTime = src.singleShootReadyTime;
|
|
|
animalCount = src.animalCount;
|
|
|
@@ -360,14 +134,271 @@ public class RabbitHuntGameMode_OnlinePK : RabbitHuntGameMode, ChallengeGameMode
|
|
|
return this;
|
|
|
}
|
|
|
public void Output(RabbitHuntGameMode_OnlinePK dest) {
|
|
|
- dest.roundID = roundID;
|
|
|
+ dest.onlineHelper.roundID = roundID;
|
|
|
dest.currentPlayerIndex = currentPlayerIndex;
|
|
|
dest.singleShootReadyTime = singleShootReadyTime;
|
|
|
dest.animalCount = animalCount;
|
|
|
dest.arrowCount = arrowCount;
|
|
|
dest.time = time;
|
|
|
dest.getHunterGamePlayerScoreCounter().hitScores = hitScores;
|
|
|
- dest.gameEnd = gameEnd;
|
|
|
+ dest.onlineHelper.gameEnd = gameEnd;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ OnlineHelper onlineHelper;
|
|
|
+ public class OnlineHelper {
|
|
|
+ RabbitHuntGameMode_OnlinePK gameMode;
|
|
|
+ public OnlineHelper(RabbitHuntGameMode_OnlinePK gameMode) {
|
|
|
+ this.gameMode = gameMode;
|
|
|
+ }
|
|
|
+ public SocketPlayer socketPlayer;
|
|
|
+ public int myPlayerIndex = -1;
|
|
|
+ public bool IsMyPlayerInited() {
|
|
|
+ return myPlayerIndex >= 0;
|
|
|
+ }
|
|
|
+ public bool IsMyPlayerRunning() {
|
|
|
+ return myPlayerIndex == gameMode.currentPlayerIndex;
|
|
|
+ }
|
|
|
+ public bool IsMainHost() {
|
|
|
+ return myPlayerIndex == 0;
|
|
|
+ }
|
|
|
+ public bool IsCopyHost() {
|
|
|
+ return myPlayerIndex > 0;
|
|
|
+ }
|
|
|
+ public int roundID = 0;
|
|
|
+ public bool gameEnd = false;
|
|
|
+
|
|
|
+ public void InitSocketPlayer(Action successCallback) {
|
|
|
+ if (GameObject.Find("SocketPlayer") == null) {
|
|
|
+ PKMatchingView.MoniMatchForTestInGameScene(() => {
|
|
|
+ myPlayerIndex = GlobalData.playerIndexInRoom;
|
|
|
+ if (successCallback != null) successCallback();
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ myPlayerIndex = GlobalData.playerIndexInRoom;
|
|
|
+ if (successCallback != null) successCallback();
|
|
|
+ }
|
|
|
+ socketPlayer = GameObject.Find("SocketPlayer").GetComponent<SocketPlayer>();
|
|
|
+ socketPlayer.onReceivePKGameData = onReceivePKGameData;
|
|
|
+ AutoSwitchBanUserControlBow();
|
|
|
+ JC.Unity.CoroutineStarter.Start(CheckAndUpload());
|
|
|
+ }
|
|
|
+ bool IsCanUpload() {
|
|
|
+ return GameMgr.ins == gameMode.gameMgr && gameMode.gameMgr;
|
|
|
+ }
|
|
|
+ WaitForSecondsRealtime uploadOnceTime = new WaitForSecondsRealtime(0.033f);
|
|
|
+ IEnumerator CheckAndUpload() {
|
|
|
+ Debug.Log("协程-同步数据-开始");
|
|
|
+ while (IsCanUpload()) {
|
|
|
+ try
|
|
|
+ {
|
|
|
+ Upload();
|
|
|
+ }
|
|
|
+ catch (System.Exception e)
|
|
|
+ {
|
|
|
+ Debug.LogError(e.Message);
|
|
|
+ Debug.LogError(e.StackTrace);
|
|
|
+ }
|
|
|
+ yield return uploadOnceTime;
|
|
|
+ }
|
|
|
+ Debug.Log("协程-同步数据-停止");
|
|
|
+ }
|
|
|
+
|
|
|
+ Quaternion bowTargetQua;
|
|
|
+ bool hasBowTargBtQua;
|
|
|
+ void onReceivePKGameData(string key, string data) {
|
|
|
+ if (!IsMyPlayerInited()) return;
|
|
|
+ if (key == "logic") {
|
|
|
+ SyncLogicData syncLogicData = JsonConvert.DeserializeObject<SyncLogicData>(data);
|
|
|
+ syncLogicData.Output(this.gameMode);
|
|
|
+ AutoSwitchBanUserControlBow();
|
|
|
+ }
|
|
|
+ if (key == "bow") {
|
|
|
+ if (!IsMyPlayerRunning()) {
|
|
|
+ string[] quaStr = data.Split(',');
|
|
|
+ if (quaStr.Length == 6) {
|
|
|
+ bowTargetQua.x = float.Parse(quaStr[0]);
|
|
|
+ bowTargetQua.y = float.Parse(quaStr[1]);
|
|
|
+ bowTargetQua.z = float.Parse(quaStr[2]);
|
|
|
+ bowTargetQua.w = float.Parse(quaStr[3]);
|
|
|
+ hasBowTargBtQua = true;
|
|
|
+ ArmBow.ins.phase = int.Parse(quaStr[4]);
|
|
|
+ GameAssistUI.ins.playerScaleAimValue_OnlinePK = int.Parse(quaStr[5]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (key == "arrow") {
|
|
|
+ List<ArrowSync.SyncData> arrowSyncDataList = JsonConvert.DeserializeObject<List<ArrowSync.SyncData>>(data);
|
|
|
+ foreach (var item in arrowSyncMap) {
|
|
|
+ item.Value.hasSetSyncData = false;
|
|
|
+ }
|
|
|
+ GameObject arrowPrefab = ArmBow.ins.arrow;
|
|
|
+ foreach (var item in arrowSyncDataList) {
|
|
|
+ ArrowSync arrowSync;
|
|
|
+ arrowSyncMap.TryGetValue(item.id, out arrowSync);
|
|
|
+ if (arrowSync == null) {
|
|
|
+ GameObject arrowObj = GameObject.Instantiate(arrowPrefab);
|
|
|
+ arrowSync = arrowObj.AddComponent<ArrowSync>();
|
|
|
+ arrowSync.SetSyncData(item, true);
|
|
|
+ arrowSyncMap[item.id] = arrowSync;
|
|
|
+ } else {
|
|
|
+ arrowSync.SetSyncData(item);
|
|
|
+ }
|
|
|
+ arrowSync.hasSetSyncData = true;
|
|
|
+ }
|
|
|
+ List<int> removeIDs = null;
|
|
|
+ foreach (var item in arrowSyncMap) {
|
|
|
+ if (!item.Value.hasSetSyncData) {
|
|
|
+ if (removeIDs == null) removeIDs = new List<int>();
|
|
|
+ removeIDs.Add(item.Key);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (removeIDs != null) {
|
|
|
+ foreach (var id in removeIDs) {
|
|
|
+ ArrowSync arrowSync = arrowSyncMap[id];
|
|
|
+ arrowSyncMap.Remove(id);
|
|
|
+ if (arrowSync && arrowSync.gameObject) {
|
|
|
+ GameObject.Destroy(arrowSync.gameObject);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (key == "onBowShoot") {
|
|
|
+ GameEventCenter.ins.onBowArrowShootOut?.Invoke(null, null);
|
|
|
+ }
|
|
|
+ if (key == "DoNextShoot") {
|
|
|
+ gameMode.DoNextShoot();
|
|
|
+ }
|
|
|
+ if (key == "animals") {
|
|
|
+ List<RabbitSyncData> syncDataList = JsonConvert.DeserializeObject<List<RabbitSyncData>>(data);
|
|
|
+ foreach (var item in animalSyncMap) {
|
|
|
+ item.Value.isInvalid = true;
|
|
|
+ }
|
|
|
+ foreach (var item in syncDataList) {
|
|
|
+ Rabbit animalSync;
|
|
|
+ animalSyncMap.TryGetValue(item.id, out animalSync);
|
|
|
+ if (animalSync == null) {
|
|
|
+ GameObject animalObject = GameObject.Instantiate(gameMode.animalPrefab, Vector3.zero, Quaternion.identity, gameMode.animalsBaseT);
|
|
|
+ animalSync = animalObject.GetComponent<Rabbit>();
|
|
|
+ animalSync.isMirror = true;
|
|
|
+ animalSync.inputSyncData = item;
|
|
|
+ animalObject.SetActive(true);
|
|
|
+ animalSyncMap[item.id] = animalSync;
|
|
|
+ } else {
|
|
|
+ animalSync.inputSyncData = item;
|
|
|
+ }
|
|
|
+ animalSync.isInvalid = false;
|
|
|
+ }
|
|
|
+ List<int> removeIDs = null;
|
|
|
+ foreach (var item in animalSyncMap) {
|
|
|
+ if (item.Value.isInvalid) {
|
|
|
+ if (removeIDs == null) removeIDs = new List<int>();
|
|
|
+ removeIDs.Add(item.Key);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (removeIDs != null) {
|
|
|
+ foreach (var id in removeIDs) {
|
|
|
+ Rabbit animalSync = animalSyncMap[id];
|
|
|
+ animalSyncMap.Remove(id);
|
|
|
+ if (animalSync && animalSync.gameObject) {
|
|
|
+ GameObject.Destroy(animalSync.gameObject);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (key == "RUpdate") {
|
|
|
+ if (int.Parse(data) == roundID) {
|
|
|
+ gameMode.OnUpdate(uploadOnceTime.waitTime, false);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (key == "OnHit") {
|
|
|
+ string[] dataSplits = data.Split(',');
|
|
|
+ int uid = int.Parse(dataSplits[0]);
|
|
|
+ string partName = dataSplits[1];
|
|
|
+ foreach (var item in Rabbit.rabbitSet) {
|
|
|
+ if (item.uid == uid) {
|
|
|
+ item.OnHitLogic(null, partName);
|
|
|
+ break; //一定要break,原因1:这是唯一ID,后续也没必要检测了,原因2:这里可能会触发死亡,死亡会触发下个动物生成,Set集合的元素+1,继续遍历会出现modifyException
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public void AutoSwitchBanUserControlBow() {
|
|
|
+ BowCamera.ins.banLogic = ArmBow.ins.banLogic = !IsMyPlayerRunning();
|
|
|
+ }
|
|
|
+
|
|
|
+ int lastRoundID = -1;
|
|
|
+ public void OnFrameUpdate() {
|
|
|
+ if (!IsMyPlayerInited()) return;
|
|
|
+ AutoSwitchBanUserControlBow();
|
|
|
+ if (!IsMyPlayerRunning() && hasBowTargBtQua) {
|
|
|
+ BowCamera.ins.transform.rotation = Quaternion.Lerp(BowCamera.ins.transform.rotation, bowTargetQua, Time.deltaTime * 12);
|
|
|
+ }
|
|
|
+ if (roundID > lastRoundID) {
|
|
|
+ lastRoundID = roundID;
|
|
|
+ gameMode.BanBowReady();
|
|
|
+ gameMode.AddReadyView();
|
|
|
+ }
|
|
|
+ if (gameEnd && !gameMode.gameMgr.gameOver) {
|
|
|
+ gameMode.AnnounceGameOver();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ void Upload() {
|
|
|
+ if (!IsMyPlayerInited()) return;
|
|
|
+ UploadLogic();
|
|
|
+ UploadBow();
|
|
|
+ UploadArrows();
|
|
|
+ UploadAnimals();
|
|
|
+ UploadRequestUpdate();
|
|
|
+ UploadOnHit();
|
|
|
+ }
|
|
|
+ void UploadLogic() {
|
|
|
+ if (!IsMainHost()) return;
|
|
|
+ SyncLogicData data = new SyncLogicData().Input(this.gameMode);
|
|
|
+ socketPlayer.UploadPKGameData("logic", data);
|
|
|
+ }
|
|
|
+ void UploadBow() {
|
|
|
+ if (!IsMyPlayerRunning()) return;
|
|
|
+ Quaternion qua = BowCamera.ins.transform.rotation;
|
|
|
+ int aimScaleValue = GameAssistUI.ins.aimScaleValue;
|
|
|
+ if (!GameAssistUI.ins.scaleAimOn) aimScaleValue = 0;
|
|
|
+ socketPlayer.UploadPKGameData("bow", qua.x + "," + qua.y + "," + qua.z + "," + qua.w + "," + ArmBow.ins.phase + "," + aimScaleValue);
|
|
|
+ }
|
|
|
+ Dictionary<int, ArrowSync> arrowSyncMap = new Dictionary<int, ArrowSync>();
|
|
|
+ void UploadArrows() {
|
|
|
+ List<ArrowSync.SyncData> arrowSyncDataList = new List<ArrowSync.SyncData>();
|
|
|
+ foreach (var item in Arrow.arrowSet) {
|
|
|
+ if (item.outputSyncData == null || !item.outputSyncData.inited) continue;
|
|
|
+ arrowSyncDataList.Add(item.outputSyncData);
|
|
|
+ }
|
|
|
+ socketPlayer.UploadPKGameData("arrow", arrowSyncDataList);
|
|
|
+ }
|
|
|
+ Dictionary<int, Rabbit> animalSyncMap = new Dictionary<int, Rabbit>();
|
|
|
+ void UploadAnimals() {
|
|
|
+ if (!IsMainHost()) return;
|
|
|
+ List<RabbitSyncData> syncDataList = new List<RabbitSyncData>();
|
|
|
+ foreach (var item in Rabbit.rabbitSet) {
|
|
|
+ if (item.outputSyncData == null) continue;
|
|
|
+ syncDataList.Add(item.outputSyncData);
|
|
|
+ }
|
|
|
+ socketPlayer.UploadPKGameData("animals", syncDataList);
|
|
|
+ }
|
|
|
+ void UploadRequestUpdate() {
|
|
|
+ if (!IsCopyHost()) return;
|
|
|
+ if (!IsMyPlayerRunning()) return;
|
|
|
+ if (gameMode.pauseTimeCounting) return;
|
|
|
+ socketPlayer.UploadPKGameData("RUpdate", this.roundID.ToString());
|
|
|
+ }
|
|
|
+
|
|
|
+ void UploadOnHit() {
|
|
|
+ foreach (var item in Rabbit.rabbitSet) {
|
|
|
+ if (item.onHitData != null) {
|
|
|
+ socketPlayer.UploadPKGameData("OnHit", item.onHitData);
|
|
|
+ item.onHitData = null;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|