942 lines
27 KiB
C#
942 lines
27 KiB
C#
using System.Net.Http.Headers;
|
|
using DragonLi.Core;
|
|
using DragonLi.Frame;
|
|
using MechanicalAge;
|
|
using Mirror;
|
|
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using Unity.VisualScripting;
|
|
using UnityEngine;
|
|
using UnityEngine.UI;
|
|
using UnityEngine.XR;
|
|
using XPlugin.Data.JsonLiteDB;
|
|
using static XPlugin.Data.JsonLiteDB.JsonLiteDB;
|
|
|
|
public class Player : NetworkRoomPlayer, IDamagable
|
|
{
|
|
[Header("身体")]
|
|
public Transform LeftHand;
|
|
public Transform RightHand;
|
|
|
|
public Collider colliderSelf;
|
|
|
|
public Transform ownerTempHand;
|
|
|
|
/// <summary>
|
|
/// 最大血量
|
|
/// </summary>
|
|
public float maxHp = 10000;
|
|
private float currentHp;
|
|
public float Health
|
|
{
|
|
get
|
|
{
|
|
return currentHp;
|
|
}
|
|
set
|
|
{
|
|
currentHp = value;
|
|
}
|
|
}
|
|
|
|
public InputDevice leftHandDevice;
|
|
private InputDevice rightHandDevice;
|
|
|
|
[Header("武器预制体")]
|
|
public GameObject DoubleGunPre;
|
|
public GameObject LargeGunPre;
|
|
public GameObject SuperGunPre;
|
|
public GameObject RocketGunPre;
|
|
public GameObject ShotGunPre;
|
|
public GameObject GrenadeGunPre;
|
|
|
|
public GameObject TempHandPre;
|
|
|
|
/// <summary>
|
|
/// 手上的武器
|
|
/// </summary>
|
|
private List<Launcher[]> Weapons = new List<Launcher[]>();
|
|
/// <summary>
|
|
/// 双手状态
|
|
/// </summary>
|
|
public HandState NowHandState = HandState.Empty;
|
|
/// <summary>
|
|
/// 现在手上的武器
|
|
/// </summary>
|
|
public int NowWeaponIndex = -1;
|
|
|
|
/// <summary>
|
|
/// 切换之前的武器
|
|
/// </summary>
|
|
public int lastNoWeaponIndex = -1;
|
|
|
|
public WeaponType lastNoWeaponType;
|
|
|
|
private Transform left;
|
|
private Transform right;
|
|
|
|
[SyncVar]
|
|
public int playerId;
|
|
|
|
public StatisticManager statisticManager;
|
|
|
|
public MRNetworkManager mRNetworkManager;
|
|
|
|
[SyncVar]
|
|
public float atkBuff = 0.5f;
|
|
|
|
[Header("角色BUFF状态")]
|
|
public bool isAtkBuff = false;
|
|
public bool isDeeBuff = false;
|
|
public GameObject owner;
|
|
|
|
public bool isClickSwith = false;
|
|
private bool debugSwitch = false;
|
|
|
|
public override void OnStartServer()
|
|
{
|
|
base.OnStartServer();
|
|
}
|
|
|
|
[ClientRpc]
|
|
public void SetIsAtkBuff(bool value)
|
|
{
|
|
GameManager.Ins.buffAtk = value? 1:0;
|
|
isAtkBuff = value;
|
|
}
|
|
|
|
[ClientRpc]
|
|
public void SetIsDeeBuff(bool value)
|
|
{
|
|
GameManager.Ins.buffDef = value? 1:0;
|
|
isDeeBuff = value;
|
|
}
|
|
|
|
public new void Start()
|
|
{
|
|
base.Start();
|
|
#if UNITY_ANDROID && PICO
|
|
leftHandDevice = InputDevices.GetDeviceAtXRNode(XRNode.LeftHand);
|
|
rightHandDevice = InputDevices.GetDeviceAtXRNode(XRNode.RightHand);
|
|
#endif
|
|
Health = maxHp;
|
|
if (isLocalPlayer)
|
|
{
|
|
GameInit.Ins.self = this;
|
|
StatisticManager.Ins.playerIndex = index;
|
|
CreateHand();
|
|
PickUpWeapon(WeaponType.DoubleGun, -999);
|
|
}
|
|
if (isServer)
|
|
{
|
|
colliderSelf.enabled = true;
|
|
|
|
}
|
|
EventDispatcher.TriggerEvent("GetHand", LeftHand, RightHand);
|
|
}
|
|
|
|
public void SetBlood(float num)
|
|
{
|
|
Health += num;
|
|
EventDispatcher.TriggerEvent("HpChange", currentHp, maxHp);
|
|
}
|
|
|
|
//只再服务器执行
|
|
[ServerCallback]
|
|
public void OnTriggerEnter(Collider other)
|
|
{
|
|
if (isServer)
|
|
{
|
|
CustomEvent.Trigger(GameInit.Ins.Event.gameObject, "PlayerTrigger", other);
|
|
// 血包
|
|
if (other.tag == "BloodBag")
|
|
{
|
|
AudioManager.Ins?.SoundPlayOneShot("shiqu", false);
|
|
StatisticManager.Ins?.AddGetPropAmount(index);
|
|
BloodBag bloodBagScript = other.transform.GetComponent<BloodBag>();
|
|
bloodBagScript.ColliderBloodBag();
|
|
float hpAdd = bloodBagScript.hpAdd;
|
|
if (currentHp + hpAdd <= maxHp)
|
|
{
|
|
SetBlood(hpAdd);
|
|
}
|
|
else
|
|
{
|
|
SetBlood(maxHp - currentHp);
|
|
}
|
|
}
|
|
if (other.tag == "AtkBuff")
|
|
{
|
|
AudioManager.Ins?.SoundPlayOneShot("shiqu", false);
|
|
StatisticManager.Ins?.AddGetPropAmount(index);
|
|
AtkBuff atkBuffScript = other.transform.GetComponent<AtkBuff>();
|
|
atkBuffScript.ColliderAtkBuff();
|
|
SetIsAtkBuff(true);
|
|
CoroutineTaskManager.Instance.WaitSecondTodo(() =>
|
|
{
|
|
SetIsAtkBuff(false);
|
|
}, 10.0f);
|
|
}
|
|
|
|
if (other.tag == "DeeBuff")
|
|
{
|
|
AudioManager.Ins?.SoundPlayOneShot("shiqu", false);
|
|
StatisticManager.Ins?.AddGetPropAmount(index);
|
|
AtkBuff atkBuffScript = other.transform.GetComponent<AtkBuff>();
|
|
atkBuffScript.ColliderAtkBuff();
|
|
SetIsDeeBuff(true);
|
|
CoroutineTaskManager.Instance.WaitSecondTodo(() =>
|
|
{
|
|
SetIsDeeBuff(false);
|
|
}, 10.0f);
|
|
}
|
|
// 武器道具
|
|
if (other.tag == "WeaponProp")
|
|
{
|
|
Debug.Log("触碰武器道具");
|
|
|
|
WeaponProp prop = other.transform.GetComponent<WeaponProp>();
|
|
prop.Collider();
|
|
PickUpWeapon(prop.weaponType, prop.amount);
|
|
StatisticManager.Ins?.AddGetPropAmount(index);
|
|
}
|
|
if (other.tag == "GameStartPoint")
|
|
{
|
|
GameManager.Ins?.ShowLandmark(0, 1);
|
|
NetworkServer.Destroy(other.gameObject);
|
|
StoryManager.Ins.CreateStoryItem();
|
|
TempInfo tempInfo = GameManager.Ins.tempDescInfos[2];
|
|
// for (int i = 0; i < tempInfo.Positions.Length; i++)
|
|
// {
|
|
// GameManager.Ins.GenerateTurret(tempInfo.Positions[i], tempInfo.Scales[i], tempInfo.Angles[i]);
|
|
// }
|
|
Debug.Log("触碰光柱");
|
|
//GameManager.Ins.GenerateDoor();
|
|
GameManager.Ins.GameOK();
|
|
|
|
//进入游戏
|
|
GameManager.Ins.HudMessage(0);
|
|
StartCoroutine(StoryManager.Ins?.MyCoroutine());
|
|
CoroutineTaskManager.Instance.WaitSecondTodo(() =>
|
|
{
|
|
AudioManager.Ins?.SoundPlay("bgm2", true);
|
|
}, 10.0f);
|
|
|
|
CoroutineTaskManager.Instance.WaitSecondTodo(() =>
|
|
{
|
|
AudioManager.Ins?.SoundPlay("bgm3", true);
|
|
}, 30.0f);
|
|
}
|
|
// if (other.tag == "Story1")
|
|
// {
|
|
// //进入门 关闭大门
|
|
// GameManager.Ins.HudMessage(0);
|
|
// other.gameObject.GetComponent<BoxCollider>().enabled = false;
|
|
// StartCoroutine(StoryManager.Ins?.MyCoroutine());
|
|
// CoroutineTaskManager.Instance.WaitSecondTodo(() =>
|
|
// {
|
|
// NetworkServer.Destroy(other.gameObject);
|
|
// }, 4.0f);
|
|
// CoroutineTaskManager.Instance.WaitSecondTodo(() =>
|
|
// {
|
|
// AudioManager.Ins?.SoundPlay("bgm2", true);
|
|
// }, 10.0f);
|
|
//
|
|
// CoroutineTaskManager.Instance.WaitSecondTodo(() =>
|
|
// {
|
|
// AudioManager.Ins?.SoundPlay("bgm3", true);
|
|
// }, 30.0f);
|
|
// }
|
|
|
|
if (other.tag == "EnergyPump")
|
|
{
|
|
AudioManager.Ins?.SoundPlayOneShot("TouchEnergyPump", false);
|
|
EnergyPump energyPumpScript = other.transform.GetComponent<EnergyPump>();
|
|
energyPumpScript.ShowLandMask();
|
|
EventDispatcher.TriggerEvent("NextTrriger");
|
|
energyPumpScript.ColliderEnergyPump();
|
|
}
|
|
}
|
|
}
|
|
|
|
private bool IsAvlie = true;
|
|
|
|
public float time = 0;
|
|
|
|
public float OnReceiveDamage(float damage, object info, Transform _sender)
|
|
{
|
|
var curDamage = GameManager.Ins.buffDef>0? damage/GameManager.Ins.buffDef:damage;
|
|
SetBlood(-curDamage);
|
|
if (currentHp <= 0)
|
|
{
|
|
GameManager.Ins.GameStart = false;
|
|
GameInit.Ins.UIHudDie.SetActive(true);
|
|
Switch2Empty();
|
|
MonoSingleton<CoroutineTaskManager>.Instance.WaitSecondTodo(() =>
|
|
{
|
|
IsAvlie = false;
|
|
}, 2f, this);
|
|
MonoSingleton<CoroutineTaskManager>.Instance.WaitSecondTodo(() =>
|
|
{
|
|
GameInit.Ins.UIHudDie.SetActive(false);
|
|
GameInit.Ins.AliveUI.SetActive(true);
|
|
Swith2TargetWeapon(lastNoWeaponType);
|
|
GameManager.Ins.GameStart = true;
|
|
currentHp = maxHp;
|
|
IsAvlie = true;
|
|
GameInit.Ins.restartCountDownText.text = "";
|
|
time = 0;
|
|
}, 5.5f, this);
|
|
}
|
|
if (currentHp > 0)
|
|
{
|
|
GameInit.Ins.HitUI.SetActive(true);
|
|
MonoSingleton<CoroutineTaskManager>.Instance.WaitSecondTodo(() =>
|
|
{
|
|
GameInit.Ins.HitUI.SetActive(false);
|
|
}, 1f, this);
|
|
}
|
|
return currentHp;
|
|
}
|
|
|
|
[Command]
|
|
public void CmdPlaySwitchSound()
|
|
{
|
|
GameManager.Ins.PlaySwitchGunSound();
|
|
}
|
|
|
|
public void Update()
|
|
{
|
|
if (!isLocalPlayer)
|
|
{
|
|
return;
|
|
}
|
|
|
|
for (int i = 0; i < Weapons.Count; i++)
|
|
{
|
|
if (i == NowWeaponIndex)
|
|
{
|
|
Launcher l1 = Weapons[i][0];
|
|
Launcher l2 = Weapons[i][1];
|
|
if (l1 != null)
|
|
{
|
|
TriggerEventAmount(Weapons[i][0].bullet_amount);
|
|
}
|
|
if (l2 != null)
|
|
{
|
|
TriggerEventAmount(Weapons[i][1].bullet_amount);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (IsAvlie == false)
|
|
{
|
|
time += Time.deltaTime;
|
|
if (time >= 0.8f)
|
|
{
|
|
GameInit.Ins.restartCountDownText.text = "3";
|
|
}
|
|
if (time >= 2.0f)
|
|
{
|
|
GameInit.Ins.restartCountDownText.text = "2";
|
|
}
|
|
if (time >= 3.0f)
|
|
{
|
|
GameInit.Ins.restartCountDownText.text = "1";
|
|
}
|
|
}
|
|
|
|
// 同步相机-身体
|
|
if (GameInit.Ins.MRCamera != null)
|
|
{
|
|
transform.position = GameInit.Ins.MRCamera.transform.position;
|
|
transform.rotation = GameInit.Ins.MRCamera.transform.rotation;
|
|
}
|
|
|
|
#if UNITY_EDITOR
|
|
// 切换武器
|
|
if (isLocalPlayer && Input.GetKeyDown(KeyCode.Tab) && GameManager.Ins.GameStart)
|
|
{
|
|
Switch2NextWeaponCmd();
|
|
}
|
|
if (isLocalPlayer && Input.GetKeyDown(KeyCode.LeftAlt) && GameManager.Ins.GameStart)
|
|
{
|
|
Switch2BeforeWeaponCmd();
|
|
}
|
|
|
|
// 创建能量罩
|
|
if (isLocalPlayer && Input.GetKeyDown(KeyCode.F))
|
|
{
|
|
GameManager.Ins.CreateShield(transform.position);
|
|
}
|
|
|
|
// 创建11
|
|
if (isLocalPlayer && Input.GetKeyDown(KeyCode.V))
|
|
{
|
|
GameManager.Ins.CreateAtkBuff(transform.position + new Vector3(1, 0, 0));
|
|
}
|
|
|
|
// 秒杀
|
|
if (isLocalPlayer && Input.GetKeyDown(KeyCode.K))
|
|
{
|
|
for (int i = 0; i < GameManager.Ins.enemyList.Count; i++)
|
|
{
|
|
if (GameManager.Ins.enemyList[i] != null)
|
|
{
|
|
GameManager.Ins.enemyList[i].GetComponent<IDamagable>().ApplyDamage(100000000000, true, null);
|
|
}
|
|
}
|
|
}
|
|
|
|
// M打开debug
|
|
if (isLocalPlayer && Input.GetKeyDown(KeyCode.M))
|
|
{
|
|
debugSwitch = !debugSwitch;
|
|
if (debugSwitch)
|
|
{
|
|
DebugPanel.Ins.Show();
|
|
}
|
|
else
|
|
{
|
|
DebugPanel.Ins.Hide();
|
|
}
|
|
}
|
|
|
|
// z切换空手
|
|
if (isLocalPlayer && Input.GetKeyDown(KeyCode.Z))
|
|
{
|
|
Switch2EmptyCmd();
|
|
}
|
|
#endif
|
|
|
|
#if !UNITY_EDITOR && UNITY_ANDROID && PICO
|
|
if (rightHandDevice != null)
|
|
{
|
|
Vector2 value;
|
|
rightHandDevice.TryGetFeatureValue(CommonUsages.primary2DAxis, out value);
|
|
|
|
if (value.magnitude > 0)
|
|
{
|
|
// 根据轴的值判断摇杆朝向
|
|
if (!isClickSwith && value.x < 0 && GameManager.Ins.GameStart)
|
|
{
|
|
// 摇杆朝左
|
|
isClickSwith = true;
|
|
GameManager.Ins.PlaySwitchGunSound();
|
|
Switch2BeforeWeaponCmd();
|
|
}
|
|
else if (!isClickSwith && value.x > 0 && GameManager.Ins.GameStart)
|
|
{
|
|
// 摇杆朝右
|
|
isClickSwith = true;
|
|
GameManager.Ins.PlaySwitchGunSound();
|
|
Switch2NextWeaponCmd();
|
|
}
|
|
}
|
|
else if (value.magnitude == 0)
|
|
{
|
|
isClickSwith = false;
|
|
}
|
|
if (value.Equals(Vector2.zero))
|
|
{
|
|
isClickSwith = false;
|
|
}
|
|
}
|
|
|
|
// 呼出debug
|
|
if (leftHandDevice != null && rightHandDevice != null)
|
|
{
|
|
bool leftValue;
|
|
leftHandDevice.TryGetFeatureValue(CommonUsages.secondaryButton, out leftValue);
|
|
bool rightValue;
|
|
rightHandDevice.TryGetFeatureValue(CommonUsages.secondaryButton, out rightValue);
|
|
if (leftValue && rightValue)
|
|
{
|
|
debugSwitch = !debugSwitch;
|
|
if (debugSwitch)
|
|
{
|
|
DebugPanel.Ins.Show();
|
|
}
|
|
else
|
|
{
|
|
DebugPanel.Ins.Hide();
|
|
}
|
|
}
|
|
}
|
|
|
|
// 同步手柄
|
|
if (GameInit.Ins.MRLeftControl != null)
|
|
{
|
|
LeftHand.transform.position = GameInit.Ins.MRLeftControl.position;
|
|
LeftHand.transform.rotation = GameInit.Ins.MRLeftControl.rotation;
|
|
}
|
|
|
|
if (GameInit.Ins.MRRightControl != null)
|
|
{
|
|
RightHand.transform.position = GameInit.Ins.MRRightControl.position;
|
|
RightHand.transform.rotation = GameInit.Ins.MRRightControl.rotation;
|
|
}
|
|
#endif
|
|
|
|
#if !UNITY_EDITOR && UNITY_ANDROID && VIVE
|
|
// 同步手柄
|
|
if (GameInit.Ins.MRLeftControl != null)
|
|
{
|
|
LeftHand.transform.position = GameInit.Ins.MRLeftControl.position;
|
|
LeftHand.transform.rotation = GameInit.Ins.MRLeftControl.rotation;
|
|
}
|
|
|
|
if (GameInit.Ins.MRRightControl != null)
|
|
{
|
|
RightHand.transform.position = GameInit.Ins.MRRightControl.position;
|
|
RightHand.transform.rotation = GameInit.Ins.MRRightControl.rotation;
|
|
}
|
|
#endif
|
|
}
|
|
|
|
public override void OnGUI()
|
|
{
|
|
if (!showRoomGUI)
|
|
return;
|
|
|
|
NetworkRoomManager room = NetworkManager.singleton as NetworkRoomManager;
|
|
if (room)
|
|
{
|
|
if (!room.showRoomGUI)
|
|
return;
|
|
|
|
// DrawPlayerReadyState();
|
|
// DrawPlayerReadyButton();
|
|
}
|
|
}
|
|
|
|
void DrawPlayerReadyState()
|
|
{
|
|
GUILayout.BeginArea(new Rect(20f + (index * 100), 200f, 90f, 130f));
|
|
|
|
GUILayout.Label($"Player [{index + 1}]");
|
|
|
|
if (readyToBegin)
|
|
GUILayout.Label("Ready");
|
|
else
|
|
GUILayout.Label("Not Ready");
|
|
|
|
// if (((isServer && index > 0) || isServerOnly) && GUILayout.Button("REMOVE"))
|
|
// {
|
|
// // This button only shows on the Host for all players other than the Host
|
|
// // Host and Players can't remove themselves (stop the client instead)
|
|
// // Host can kick a Player this way.
|
|
// GetComponent<NetworkIdentity>().connectionToClient.Disconnect();
|
|
// }
|
|
|
|
GUILayout.EndArea();
|
|
}
|
|
|
|
void DrawPlayerReadyButton()
|
|
{
|
|
if (NetworkClient.active && isLocalPlayer)
|
|
{
|
|
GUILayout.BeginArea(new Rect(20f, 300f, 120f, 20f));
|
|
|
|
if (readyToBegin)
|
|
{
|
|
if (GUILayout.Button("Cancel"))
|
|
CmdChangeReadyState(false);
|
|
}
|
|
else
|
|
{
|
|
if (GUILayout.Button("Ready"))
|
|
CmdChangeReadyState(true);
|
|
}
|
|
|
|
GUILayout.EndArea();
|
|
}
|
|
}
|
|
|
|
#region 武器系统
|
|
|
|
/// <summary>
|
|
/// 创建武器
|
|
/// </summary>
|
|
/// <param name="type"></param>
|
|
/// <returns></returns>
|
|
[Server]
|
|
public GameObject CreateWeapon(WeaponType type)
|
|
{
|
|
GameObject gun = null;
|
|
switch (type)
|
|
{
|
|
case WeaponType.DoubleGun:
|
|
gun = Instantiate(DoubleGunPre);
|
|
break;
|
|
case WeaponType.LargeGun:
|
|
gun = Instantiate(LargeGunPre);
|
|
break;
|
|
case WeaponType.SuperGun:
|
|
gun = Instantiate(SuperGunPre);
|
|
break;
|
|
case WeaponType.RocketGun:
|
|
gun = Instantiate(RocketGunPre);
|
|
break;
|
|
case WeaponType.ShotGun:
|
|
gun = Instantiate(ShotGunPre);
|
|
break;
|
|
case WeaponType.GrenadeGun:
|
|
gun = Instantiate(GrenadeGunPre);
|
|
break;
|
|
}
|
|
return gun;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 装载武器
|
|
/// </summary>
|
|
/// <param name="handType"></param>
|
|
/// <param name="weaponType"></param>
|
|
/// <returns></returns>
|
|
public Launcher LoadWeapon(HandType handType, WeaponType weaponType)
|
|
{
|
|
GameObject gun = CreateWeapon(weaponType);
|
|
Launcher launcher = gun.GetComponent<Launcher>();
|
|
launcher.hand = handType;
|
|
launcher.type = weaponType;
|
|
return launcher;
|
|
}
|
|
|
|
[TargetRpc]
|
|
public void TriggerEvent(WeaponType weaponType)
|
|
{
|
|
EventDispatcher.TriggerEvent("ChangeWeaponIcon", weaponType, 0);
|
|
}
|
|
|
|
|
|
[TargetRpc]
|
|
public void TriggerEventAmount(float amount)
|
|
{
|
|
if (amount == -999) amount = 0;
|
|
EventDispatcher.TriggerEvent("ShowBulletAmount", amount);
|
|
|
|
}
|
|
|
|
/// <summary>
|
|
/// 拾取武器
|
|
/// </summary>
|
|
/// <param name="weaponType"></param>
|
|
/// <param name="owner"></param>
|
|
[Command(requiresAuthority = false)]
|
|
public void PickUpWeapon(WeaponType weaponType, int amount)
|
|
{
|
|
TriggerEvent(weaponType);
|
|
Launcher find = null;
|
|
for (int i = 0; i < Weapons.Count; i++)
|
|
{
|
|
for (int j = 0; j < Weapons[i].Length; j++)
|
|
{
|
|
Launcher launcher = Weapons[i][j];
|
|
if (launcher != null && launcher.type == weaponType)
|
|
{
|
|
find = launcher;
|
|
break;
|
|
}
|
|
}
|
|
if (find != null)
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (find != null)
|
|
{
|
|
Debug.Log("添加弹药 - " + weaponType);
|
|
find.StuffBullet(amount);
|
|
Swith2TargetWeapon(weaponType);
|
|
}
|
|
else
|
|
{
|
|
Debug.Log("增加新武器 - " + weaponType);
|
|
Launcher left = null;
|
|
Launcher right = null;
|
|
switch (weaponType)
|
|
{
|
|
case WeaponType.DoubleGun:
|
|
left = LoadWeapon(HandType.Left, weaponType);
|
|
left.StuffBullet(-999);
|
|
right = LoadWeapon(HandType.Right, weaponType);
|
|
right.StuffBullet(-999);
|
|
break;
|
|
case WeaponType.LargeGun:
|
|
right = LoadWeapon(HandType.Right, weaponType);
|
|
right.StuffBullet(amount);
|
|
break;
|
|
case WeaponType.RocketGun:
|
|
right = LoadWeapon(HandType.Right, weaponType);
|
|
right.StuffBullet(amount);
|
|
break;
|
|
case WeaponType.ShotGun:
|
|
right = LoadWeapon(HandType.Right, weaponType);
|
|
right.StuffBullet(amount);
|
|
break;
|
|
case WeaponType.GrenadeGun:
|
|
right = LoadWeapon(HandType.Right, weaponType);
|
|
right.StuffBullet(amount);
|
|
break;
|
|
case WeaponType.SuperGun:
|
|
right = LoadWeapon(HandType.Right, weaponType);
|
|
right.StuffBullet(amount);
|
|
break;
|
|
}
|
|
Launcher[] launchers = { left, right };
|
|
Weapons.Add(launchers);
|
|
Swith2TargetWeapon(weaponType);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 切换到下个武器
|
|
/// </summary>
|
|
[Command]
|
|
public void Switch2NextWeaponCmd()
|
|
{
|
|
Switch2NextWeapon();
|
|
}
|
|
[Command]
|
|
public void Switch2BeforeWeaponCmd()
|
|
{
|
|
Switch2BeforeWeapon();
|
|
}
|
|
|
|
/// <summary>
|
|
/// 切换到下个武器
|
|
/// </summary>
|
|
[Server]
|
|
public void Switch2NextWeapon()
|
|
{
|
|
Debug.Log("切换到下个武器");
|
|
// 空手
|
|
if (NowHandState == HandState.Empty)
|
|
{
|
|
Debug.Log("空手->可有武器状态");
|
|
NowHandState = HandState.HaveWeapon;
|
|
}
|
|
|
|
// 无武器
|
|
if (Weapons.Count <= 0)
|
|
{
|
|
Debug.Log("无武器");
|
|
return;
|
|
}
|
|
|
|
NowWeaponIndex++;
|
|
if (NowWeaponIndex > Weapons.Count - 1)
|
|
{
|
|
NowWeaponIndex = 0;
|
|
}
|
|
|
|
UpdateWeapons();
|
|
}
|
|
|
|
/// <summary>
|
|
/// 切换到上个武器
|
|
/// </summary>
|
|
[Server]
|
|
public void Switch2BeforeWeapon()
|
|
{
|
|
Debug.Log("切换到下个武器");
|
|
// 空手
|
|
if (NowHandState == HandState.Empty)
|
|
{
|
|
Debug.Log("空手->可有武器状态");
|
|
NowHandState = HandState.HaveWeapon;
|
|
}
|
|
|
|
// 无武器
|
|
if (Weapons.Count <= 0)
|
|
{
|
|
Debug.Log("无武器");
|
|
return;
|
|
}
|
|
|
|
NowWeaponIndex--;
|
|
if (NowWeaponIndex < 0)
|
|
{
|
|
NowWeaponIndex = Weapons.Count - 1;
|
|
}
|
|
|
|
UpdateWeapons();
|
|
}
|
|
|
|
/// <summary>
|
|
/// 切换到指定武器
|
|
/// </summary>
|
|
[Server]
|
|
public void Swith2TargetWeapon(WeaponType type)
|
|
{
|
|
Debug.Log("切换到指定武器");
|
|
int find = -1;
|
|
for (int i = 0; i < Weapons.Count; i++)
|
|
{
|
|
for (int j = 0; j < Weapons[i].Length; j++)
|
|
{
|
|
Launcher launcher = Weapons[i][j];
|
|
if (launcher != null && launcher.type == type)
|
|
{
|
|
find = i;
|
|
break;
|
|
}
|
|
}
|
|
if (find != -1)
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (find != -1)
|
|
{
|
|
NowWeaponIndex = find;
|
|
}
|
|
|
|
UpdateWeapons();
|
|
}
|
|
|
|
[Command]
|
|
public void EntertTurret(NetworkIdentity turret)
|
|
{
|
|
turret.AssignClientAuthority(connectionToClient);
|
|
}
|
|
|
|
[Command]
|
|
public void ExitTurret(NetworkIdentity turret)
|
|
{
|
|
turret.RemoveClientAuthority();
|
|
}
|
|
|
|
/// <summary>
|
|
/// 武器更新
|
|
/// </summary>
|
|
[Server]
|
|
public void UpdateWeapons()
|
|
{
|
|
CmdPlaySwitchSound();
|
|
if (left != null)
|
|
{
|
|
left.gameObject.SetActive(false);
|
|
NetworkServer.UnSpawn(left.gameObject);
|
|
left = null;
|
|
}
|
|
if (right != null)
|
|
{
|
|
right.gameObject.SetActive(false);
|
|
NetworkServer.UnSpawn(right.gameObject);
|
|
right = null;
|
|
}
|
|
|
|
for (int i = 0; i < Weapons.Count; i++)
|
|
{
|
|
if (i == NowWeaponIndex)
|
|
{
|
|
Launcher l1 = Weapons[i][0];
|
|
Launcher l2 = Weapons[i][1];
|
|
if (l1 != null)
|
|
{
|
|
left = l1.transform;
|
|
left.gameObject.SetActive(true);
|
|
NetworkServer.Spawn(l1.gameObject, gameObject);
|
|
//EventDispatcher.TriggerEvent("ChangeWeaponIcon", Weapons[i][0].type, 0);
|
|
TriggerEvent(Weapons[i][0].type);
|
|
}
|
|
if (l2 != null)
|
|
{
|
|
right = l2.transform;
|
|
right.gameObject.SetActive(true);
|
|
NetworkServer.Spawn(l2.gameObject, gameObject);
|
|
TriggerEvent(Weapons[i][1].type);
|
|
//EventDispatcher.TriggerEvent("ChangeWeaponIcon", Weapons[i][1].type, 0);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
[Command(requiresAuthority = false)]
|
|
public void CreateHand()
|
|
{
|
|
Debug.Log("创建手");
|
|
GameObject tempHandLeft = Instantiate(TempHandPre);
|
|
NetworkServer.Spawn(tempHandLeft, gameObject);
|
|
tempHandLeft.GetComponent<TempHand>().hand = HandType.Left;
|
|
|
|
|
|
GameObject tempHandRight = Instantiate(TempHandPre);
|
|
NetworkServer.Spawn(tempHandRight, gameObject);
|
|
tempHandRight.GetComponent<TempHand>().hand = HandType.Right;
|
|
ownerTempHand = tempHandRight.transform;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 删除武器
|
|
/// </summary>
|
|
[Command(requiresAuthority = false)]
|
|
public void DelWeapon()
|
|
{
|
|
bool change = false;
|
|
for (int i = 0; i < Weapons.Count; i++)
|
|
{
|
|
for (int j = 0; j < Weapons[i].Length; j++)
|
|
{
|
|
Launcher launcher = Weapons[i][j];
|
|
if (launcher != null && launcher.bullet_amount <= 0 && launcher.bullet_amount != -999)
|
|
{
|
|
change = true;
|
|
Weapons[i] = null;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if (change)
|
|
{
|
|
Weapons.RemoveAll(x => x == null);
|
|
Switch2NextWeapon();
|
|
}
|
|
}
|
|
|
|
[Command]
|
|
public void Switch2EmptyCmd()
|
|
{
|
|
Switch2Empty();
|
|
}
|
|
|
|
/// <summary>
|
|
/// 切换为空手
|
|
/// </summary>
|
|
[Server]
|
|
public void Switch2Empty()
|
|
{
|
|
|
|
if (NowWeaponIndex >= 0)
|
|
{
|
|
for (int i = 0; i < Weapons[NowWeaponIndex].Length; i++)
|
|
{
|
|
if (Weapons[NowWeaponIndex][i] != null)
|
|
{
|
|
lastNoWeaponType = Weapons[NowWeaponIndex][i].GetComponent<Launcher>().type;
|
|
}
|
|
}
|
|
}
|
|
|
|
NowHandState = HandState.Empty;
|
|
NowWeaponIndex = -1;
|
|
UpdateWeapons();
|
|
}
|
|
|
|
|
|
[TargetRpc]
|
|
public void ApplyDamage(float value, object info, Transform _sender)
|
|
{
|
|
OnReceiveDamage(value, info, _sender);
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
|