// prevents to fall through the scene in case we are jumping 'uphill' public static Vector3 BuildSafeFinalPositionForLeavingCover(AgentActionCoverLeave.E_Type type, Vector3 position, Vector3 right, Vector3 forward) { switch (type) { case AgentActionCoverLeave.E_Type.Right: case AgentActionCoverLeave.E_Type.Left: float multiplierHelper = 1; if (type == AgentActionCoverLeave.E_Type.Left) { multiplierHelper = -1.0f; } return(BuildSafeFinalPositionForLeavingCover(position + right * multiplierHelper * 1.5f + forward * 1.1f)); case AgentActionCoverLeave.E_Type.Jump: return(BuildSafeFinalPositionForLeavingCover(position + forward * 2.0f)); case AgentActionCoverLeave.E_Type.JumpUp: return(position + Vector3.up * 1.4f + forward * 0.65f); case AgentActionCoverLeave.E_Type.Back: return(BuildSafeFinalPositionForLeavingCover(position + forward * 1.1f)); } Debug.LogWarning("BuildSafeFinalPositionForLeavingCover : Unsupported type of cover leaving : Action.TypeOfLeave"); return(position); }
protected void CoverLeave(AgentActionCoverLeave.E_Type typeOfLeave, uLink.NetworkMessageInfo info) { //TODO: How is this? I believe we definitelly cannot afford to ignore the CoverLeave event on both on proxies and I think we //should not ignore it on server too. No doubt about proxies - they should just do what they are told to do. //About the server - how can we ignore it without fixing a client? If we ignore it, the player stayes in a cover forever //which might cause both: visual artefacts and even detecting player as a cheater. //I don't think that a potential cheater can gain much of benefit by leaving the cover prematurely. //if (Owner.BlackBoard.DontUpdate) // return; if (Owner.IsInCover) { #if !DEADZONE_CLIENT if (Owner.IsServer) { ServerAnticheat.ReportCoverLeave(Owner.NetworkView.owner, typeOfLeave, info); Owner.NetworkView.RPC("CoverLeave", uLink.RPCMode.OthersExceptOwner, typeOfLeave); } #endif AgentActionCoverLeave action = AgentActionFactory.Create(AgentActionFactory.E_Type.CoverLeave) as AgentActionCoverLeave; action.TypeOfLeave = typeOfLeave; action.FinalViewDirection = Owner.BlackBoard.Cover.Forward; action.Cover = Owner.BlackBoard.Cover; Owner.BlackBoard.ActionAdd(action); } }
public static void ReportCoverLeave(uLink.NetworkPlayer player, AgentActionCoverLeave.E_Type typeOfLeave, uLink.NetworkMessageInfo info) { }
bool CheckCapsule(Cover c, AgentActionCoverLeave.E_Type type) { bool result = true; Transform T = c.transform; Vector3 center = T.position; Vector3 scale = T.lossyScale; Vector3 right = T.right; Vector3 forward = T.forward; Vector3 rightPos = center + right * scale.x * 0.5f; Vector3 leftPos = center - right * scale.x * 0.5f; Vector3 up = Vector3.up * scale.y * 0.5f; Vector3 testedPosition = center; Vector3 fromPos = center; Color debugColor = Color.white; switch (type) { case AgentActionCoverLeave.E_Type.JumpUp: testedPosition = AnimStateCoverLeave.BuildSafeFinalPositionForLeavingCover(type, center, right, forward); debugColor = Color.cyan; fromPos = center; if (!CheckCapsuleAtPos(AnimStateCoverLeave.BuildSafeFinalPositionForLeavingCover(type, rightPos, right, forward), debugColor, rightPos + up)) { result = false; } if (!CheckCapsuleAtPos(AnimStateCoverLeave.BuildSafeFinalPositionForLeavingCover(type, leftPos, right, forward), debugColor, leftPos + up)) { result = false; } break; case AgentActionCoverLeave.E_Type.Left: testedPosition = AnimStateCoverLeave.BuildSafeFinalPositionForLeavingCover(type, leftPos, right, forward); debugColor = Color.red; fromPos = leftPos; break; case AgentActionCoverLeave.E_Type.Right: testedPosition = AnimStateCoverLeave.BuildSafeFinalPositionForLeavingCover(type, rightPos, right, forward); debugColor = Color.green; fromPos = rightPos; break; case AgentActionCoverLeave.E_Type.Back: testedPosition = AnimStateCoverLeave.BuildSafeFinalPositionForLeavingCover(type, center, right, -forward); debugColor = Color.blue; fromPos = center; if (!CheckCapsuleAtPos(AnimStateCoverLeave.BuildSafeFinalPositionForLeavingCover(type, rightPos, right, -forward), debugColor, rightPos + up)) { result = false; } if (!CheckCapsuleAtPos(AnimStateCoverLeave.BuildSafeFinalPositionForLeavingCover(type, leftPos, right, -forward), debugColor, leftPos + up)) { result = false; } break; } if (!CheckCapsuleAtPos(testedPosition, debugColor, fromPos + up)) { result = false; } return(result); }