/// <summary> /// Determine if the ship is going to be hit and get TTI /// </summary> /// <param name="guided">Missile targeting ship</param> /// <param name="tti">Time to Impact</param> /// <returns>True iff the missile is on course</returns> private bool GetTimeToImpact(GuidedMissile guided, out byte tti) { Vector3 displacement = m_controlled.GetPosition() - guided.MyEntity.GetPosition(); Vector3 velocity = guided.MyEntity.Physics.LinearVelocity - m_controlled.GetTopMostParent().Physics.LinearVelocity; float velDotDisp = velocity.Dot(ref displacement); if (velDotDisp < 0f) { // missile has missed tti = byte.MaxValue; return(false); } Vector3 tti_vector = displacement * displacement.LengthSquared() / (velDotDisp * displacement); float tti_squared = tti_vector.LengthSquared(); if (tti_squared > 3600f) { tti = byte.MaxValue; return(false); } tti = Convert.ToByte(Math.Sqrt(tti_squared)); return(true); }
/// <summary> /// 미사일 발사 메소드 /// </summary> public void FireChase() { // 살아있는 플레이어만 리스트에 추린다 List <Player> alivePlayer = new List <Player>(); for (int i = 0; i < Players.Length; i++) { if (!Players[i].IsDead) { alivePlayer.Add(Players[i]); } } // 플레이어 중 랜덤한 타겟을 선택 int index = Random.Range(0, alivePlayer.Count); int targetInstanceID = alivePlayer[index].ActorInstanceID; // 미사일을 추적모드로 발사 Transform missileFireTransform = MissileFireTransforms[MissileFireTransforms.Length - FireRemainCountPerOnetime]; GuidedMissile missile = SystemManager.Instance.GetCurrentSceneMain <InGameSceneMain>().BulletManager.Generate(BulletManager.GuidedMissileIndex, missileFireTransform.position) as GuidedMissile; if (missile) { missile.FireChase(targetInstanceID, actorInstanceID, missileFireTransform.right, MissileSpeed, Damage); } }
void GuidedMissiles() { if (countWaveDuration > 0) { if (spawnTimer <= 0) { int tempPosIndex = Random.Range(0, 3); if (tempPosIndex == 0) { spawnPosition.y = spawn[tempPosIndex].position.y; spawnPosition.x = Random.Range(-ABSOLUTE_X_SPAWN, ABSOLUTE_X_SPAWN); } else { spawnPosition.y = Random.Range(-ABSOLUTE_Y_SPAWN, ABSOLUTE_Y_SPAWN); spawnPosition.x = spawn[tempPosIndex].position.x; } GameObject Obj_guidedMissile = GuidedMissile.GetFromPool(spawnPosition, poolGuidedMissile); obstaclesList.Add(Obj_guidedMissile); spawnTimer = DifficultyController.instance.guidedMissileTimer; } else { spawnTimer -= Time.deltaTime; } } else { WaveManager(); } }
public static Relations getRelationsTo(this long identityId, IMyEntity target, Relations breakOn = Relations.NoOwner) { if (identityId == 0L) { return(Relations.NoOwner); } IMyCubeBlock asBlock = target as IMyCubeBlock; if (asBlock != null) { return(getRelationsTo(identityId, asBlock.OwnerId)); } IMyCubeGrid asGrid = target as IMyCubeGrid; if (asGrid != null) { return(getRelationsTo(identityId, asGrid, breakOn)); } IMyCharacter asChar = target as IMyCharacter; if (asChar != null) { if (asChar.IsBot) { return(Relations.Enemy); } IMyPlayer player = asChar.GetPlayer_Safe(); if (player != null) { return(getRelationsTo(identityId, player.IdentityId)); } Logger.DebugLog("character not found, treating as enemy: " + target.getBestName(), Logger.severity.WARNING); return(Relations.Enemy); } if (target is IMyMeteor) { return(Relations.Enemy); } if (target.IsMissile()) { long missileOwner; if (GuidedMissile.TryGetOwnerId(target.EntityId, out missileOwner)) { return(getRelationsTo(identityId, missileOwner)); } return(Relations.Enemy); } Logger.DebugLog("unknown entity, treating as enemy: " + target.getBestName(), Logger.severity.WARNING); return(Relations.Enemy); }
private void Update() { IMyEntity controlled = myPlayer.Controller.ControlledEntity as IMyEntity; if (controlled != m_controlled) { m_controlled = controlled; if (controlled is IMyCharacter) { m_soundEmitter = null; m_threat = null; RelayNode charNode; if (!Registrar.TryGetValue(controlled, out charNode)) { Log.DebugLog("Failed to get node for character: " + controlled.getBestName(), Logger.severity.WARNING); m_storage = null; return; } m_storage = () => charNode.Storage; Log.DebugLog("now controlling a character", Logger.severity.DEBUG); } else if (controlled is IMyCubeBlock) { IRelayPart shipClient = RelayClient.GetOrCreateRelayPart((IMyCubeBlock)controlled); m_storage = shipClient.GetStorage; m_soundEmitter = new MyEntity3DSoundEmitter((MyEntity)controlled); Log.DebugLog("now controlling a ship", Logger.severity.DEBUG); } else { Log.TraceLog("player controlling incompatible entity: " + controlled.getBestName(), Logger.severity.TRACE); m_storage = null; m_soundEmitter = null; m_threat = null; return; } } else if (m_storage == null || m_storage.Invoke() == null) { Log.TraceLog("no storage", Logger.severity.TRACE); m_threat = null; return; } if (UserSettings.GetSetting(UserSettings.BoolSettingName.MissileWarning)) { UpdateMissileThreat(); } else { m_threat = null; } }
protected override void Shoot() { base.Shoot(); if (lastBulletFired != null && lastBulletFired is GuidedMissile) { GuidedMissile missile = (GuidedMissile)lastBulletFired; missile.ResetVelocity(); missile.Impulse(impulseForce); } }
public void AEEndShootAnim() { smoke.SetActive(false); smoke.SetActive(true); GameObject missile = missilePool.GetPooledObject(); missile.transform.localPosition = missileInitialPos; missile.SetActive(true); GuidedMissile guidedMissile = missile.GetComponentInChildren <GuidedMissile>(); guidedMissile.speedFactor = speedFactor; missile.GetComponentInChildren <GuidedMissile>().speedFactor = speedFactor; shootInProgress = false; }
/// <summary> /// Warn the player of incoming missile by beeping incessantly. /// </summary> private void MissileAudioWarning() { if (Globals.UpdateCount < m_nextBeep || m_threat == null || m_threat.Stopped) { return; } byte tti; if (!GetTimeToImpact(m_threat, out tti)) { m_threat = null; Log.DebugLog("missile is no longer approaching", Logger.severity.DEBUG); return; } m_nextBeep = Globals.UpdateCount + tti; m_soundEmitter.PlaySound(m_sound, true); }
/// <summary> /// Looks for a missile threating the ship the player is controlling. /// </summary> private void UpdateMissileThreat() { if (!(m_controlled is IMyCubeBlock)) { //Log.DebugLog("not controlling a ship"); return; } if (m_storage == null) { Log.TraceLog("no storage getter"); return; } RelayStorage store = m_storage.Invoke(); if (store == null) { Log.TraceLog("no storage"); return; } byte timeToImpact = byte.MaxValue; m_threat = null; store.ForEachLastSeen((LastSeen seen) => { if (seen.Type == LastSeen.EntityType.Missile) { GuidedMissile guided; if (Registrar.TryGetValue(seen.Entity, out guided) && IsThreat(guided)) { Log.DebugLog("threat: " + guided.MyEntity, Logger.severity.TRACE); byte tti; if (GetTimeToImpact(guided, out tti) && tti < timeToImpact) { timeToImpact = tti; m_threat = guided; } } } }); }
private bool IsThreat(GuidedMissile guided) { Target guidedTarget = guided.CurrentTarget; return(guidedTarget != null && guidedTarget.Entity != null && !guided.Stopped && guidedTarget.Entity.GetTopMostParent() == m_controlled.GetTopMostParent()); }
//given an enemy direction, rotates the turret to face that direction and instantiates bullet void RotateAndShoot(Vector3 enemyDir) { //rotate turret and get intended bullet position if (enemyDir.x < 0 && enemyDir.y < 0) { //facing southwest MakeHeadVisible(turretSW, turretSE, turretNW, turretNE); bulletSpawn = transform.position + new Vector3(left, down, 0); } else if (enemyDir.x < 0) { //facing northwest MakeHeadVisible(turretNW, turretSW, turretSE, turretNE); bulletSpawn = transform.position + new Vector3(left, up, 0); } else if (enemyDir.y < 0) { //facing southeast MakeHeadVisible(turretSE, turretNW, turretNE, turretSW); bulletSpawn = transform.position + new Vector3(right, down, 0); } else { //facing northeast MakeHeadVisible(turretNE, turretNW, turretSW, turretSE); bulletSpawn = transform.position + new Vector3(right, up, 0); } Vector3 shootingDir = targetFuturePosition - bulletSpawn; //get force to be applied to bullet Vector3 bulletForce = shootingDir * strength; //instantiate guided missile if upgraded if (hasGuidedMissiles) { var missileClone = Instantiate(missilePrefab, bulletSpawn, Quaternion.identity); //get reference to missile's script GuidedMissile missile = missileClone.GetComponent <GuidedMissile>(); if (missile != null) { missile.Seek(currentTarget.transform); } } else { //otherwise instantiate bullet var bulletClone = Instantiate(bulletPrefab, bulletSpawn, Quaternion.identity); bulletClone.GetComponent <Rigidbody2D>().AddForce(bulletForce); //get reference to bullet's script Bullet bullet = bulletClone.GetComponent <Bullet>(); if (bullet != null) { bullet.Seek(currentTarget.transform); } } }
// 刷新场景内所有物体 public void Refresh(List <RootObject> temp_dic) { //服务器里没有本地有 foreach (RootObject value in temp_dic) { if (SenceObjects.ContainsKey(value.ID) && value.state == ObjectState.Destroy) { //Debug.Log(SenceObjects.ContainsKey(temptest) + ":::value.contains过滤后"+value.Name + ":::value.name"); //Ai销毁时,销毁对应的导弹 if (value.type == ObjectType.AI && guideddestroy.ContainsKey(value.ID)) { Destroy(guideddestroy[value.ID], 1f); } //不销毁Boss,只隐藏 if (value.type == ObjectType.AI) { AI ai = value as AI; if (ai.ai_type == AIType.LifeAndAttack && SenceObjects.ContainsKey(value.ID) && SenceObjects[value.ID] != null) { SenceObjects[value.ID].gameObject.SetActive(false); Destroy(SenceObjects[value.ID].GetComponent <SenceGameObject>()); } else { DestroySenceObject(SenceObjects[value.ID]); } } else { DestroySenceObject(SenceObjects[value.ID]); } } else if (value.type == ObjectType.AI && SenceObjects.ContainsKey(value.ID) && value.state != ObjectState.Destroy) { } } foreach (RootObject value in temp_dic) { //本地包含服务器物体 if (Recever.rInstance.SenceObjects.ContainsKey(value.ID) && value != null) { RefreshObject(value); } //本地不包含服务器物体 else if (!roleViews.ContainsKey(value.ID) && value.state != ObjectState.Destroy) { GameObject obj; Role player; AI ai; Bullet bullet; SenceGameObject obj_data; HP_View hpview; switch (value.type) { case ObjectType.Player: player = value as Role; //Debug.Log("<color.red>"+player.Index+"</color>"); obj = Instantiate(RolePrefabs[player.Index]) as GameObject; obj_data = obj.AddComponent <SenceGameObject>(); playerData = obj.AddComponent <PlayerController>(); playerData.prefabs = this.BulletPrefabs; obj_data.Player = obj.transform.FindChild("_player").gameObject; GradeTx = obj_data.Player.transform.FindChild("Grade").GetComponent <TextMesh>(); PlayerHPText = obj_data.Player.transform.FindChild("PlayerHPText").GetComponent <TextMesh>(); topworming = obj_data.Player.transform.FindChild("Canvas").FindChild("Image_info").GetComponentInChildren <TextMesh>(); rightrange = obj_data.Player.transform.FindChild("RightRange").GetComponent <TextMesh>(); leftrange = obj_data.Player.transform.FindChild("LeftRange").GetComponent <TextMesh>(); RefreshPlayerGrad(player.HP, player.Grade); obj_data.RightBattery = obj_data.Player.transform.FindChild("FireRR").gameObject.AddComponent <LookAt>(); obj_data.LeftBattery = obj_data.Player.transform.FindChild("FireLL").gameObject.AddComponent <LookAt>(); //obj_data.RightBattery.transform.FindChild("PaoL").gameObject.AddComponent<Gunrotate>(); //obj_data.LeftBattery.transform.FindChild("PaoR").gameObject.AddComponent<Gunrotate>(); obj_data.LeftFirePoint = obj_data.LeftBattery.transform.FindChild("FirePoint").gameObject; obj_data.RightFirePoint = obj_data.RightBattery.transform.FindChild("FirePoint").gameObject; FirePointcontroller temp1 = obj_data.LeftBattery.transform.FindChild("FirePoint").gameObject.AddComponent <FirePointcontroller>(); FirePointcontroller temp2 = obj_data.RightBattery.transform.FindChild("FirePoint").gameObject.AddComponent <FirePointcontroller>(); temp1.Init(false, true); temp2.Init(false, true); obj_data.RightRein = obj.transform.FindChild("Controller (right)").gameObject; obj_data.LeftRein = obj.transform.FindChild("Controller (left)").gameObject; //obj_data.Camera = obj.transform.FindChild("Camera (head)").gameObject; hpview = obj.AddComponent <HP_View>(); roleViews.Add(value.ID, hpview); hpview.role = value as Role; // Debug.Log("<color.red>obj_data._weapon " + obj_data._weapon+"******************</color>"); hpview.Init(); obj_data.SenceObject = value; DefaultWeapon = obj_data._player.useWeapon.Name; PlayerData = obj_data; SenceObjects.Add(value.ID, obj_data); send_player.Add(value.ID, obj_data); obj.transform.parent = this.transform; obj.name = "id_" + value.ID.ToString() + "_" + value.Name; //network_server.isScreening = false; break; case ObjectType.AI: ai = value as AI; //Debug.Log("<color=yellow>"+ai.Position+"</color>"); obj = null; switch (ai.ai_type) { case AIType.Lithe: obj = Instantiate(AiPrefabs[ai.Index], ai.Position, ai.Rotation) as GameObject; break; case AIType.Attack: obj = Instantiate(AiPrefabs[ai.Index], ai.Position, ai.Rotation) as GameObject; Aiattack_more = ai.Index; break; case AIType.LifeAndAttack: if (Boss == null) { obj = Instantiate(AiPrefabs[ai.Index], ai.Position, ai.Rotation) as GameObject; } else { obj = Boss; } Aiattack_max = ai.Index; // 初始化 AI只为大怪添加血条 hpview = obj.AddComponent <HP_View>(); roleViews.Add(value.ID, hpview); hpview.role = value as AI; hpview.Init(); break; case AIType.SmartAI: obj = Instantiate(AiPrefabs[ai.Index], ai.Position, ai.Rotation) as GameObject; Aiattack_min = ai.Index; break; case AIType.Stone: obj = Instantiate(StonePrefabs[ai.Index], ai.Position, ai.Rotation) as GameObject; break; default: Debug.LogError("没有对应的aitype"); break; } obj.SetActive(true); obj_data = obj.AddComponent <SenceGameObject>(); obj_data.EnemyEffect = obj.transform.FindChild("Enemy Explode").gameObject; obj_data.gameObject.tag = SenceGameObject.AI_TAG; if (ai.ai_type != AIType.Stone) { obj.AddComponent <Follo>(); obj.GetComponent <BoxCollider>().size = new Vector3(5f, 2.5f, 5f); } obj_data.SenceObject = value; SenceObjects.Add(value.ID, obj_data); obj.transform.parent = this.transform; obj.name = "id_" + value.ID.ToString() + "_" + value.Name; break; case ObjectType.Bullet: bullet = value as Bullet; strs = bullet.Name.Split('_'); id = int.Parse(strs[0]); bullet.Name = strs[1]; obj_data = CreateBullet(bullet, false); //Debug.Log(SenceObjects[id]._pc_man.Index+">>>>>"+Aiattack_min+">>>>>"+Aiattack_more+">>>>>>"+Aiattack_max); /*生成敌机子弹时播放音效*/ if (SenceObjects.ContainsKey(id) && SenceObjects[id]._pc_man.Index == Aiattack_more) { // Audiocontroller.instans.PlayGameAudio("Ss01"); } if (SenceObjects.ContainsKey(id) && SenceObjects[id]._pc_man.Index == Aiattack_max) { // Audiocontroller.instans.PlayGameAudio("kehuan"); } if (SenceObjects.ContainsKey(id) && SenceObjects[id]._pc_man.Index == Aiattack_min) { // Audiocontroller.instans.PlayGameAudio("Ss02"); } if (SenceObjects.ContainsKey(id)) { //SenceObjects[id].transform.FindChild("Enemy").FindChild("FireFlower").gameObject.SetActive(true); if (SenceObjects[id]._pc_man.ai_type != AIType.LifeAndAttack) { if (SenceObjects[id].GetComponentInChildren <LookAtPlayer>()) { obj_data.gameObject.transform.position = SenceObjects[id].GetComponentInChildren <LookAtPlayer>().gameObject.transform.position; } else { Debug.LogError("没有找到lookatplayer"); obj_data.gameObject.transform.position = SenceObjects[id].transform.position; } } else { Debug.LogError("生成子弹时找不到对应的发射点"); obj_data.gameObject.transform.position = value.Position; } //控制开火特效 if (SenceObjects[id] != null && SenceObjects[id].GetComponentInChildren <LookAtPlayer>() && SenceObjects[id]._pc_man.ai_type != AIType.Stone) { //Debug.Log("<color=yellow>"+SenceObjects[id].name+"</color>"); SenceObjects[id].GetComponentInChildren <LookAtPlayer>().isFire = true; } else { Debug.LogError("没有找到;LookAtPlayer;"); } } else { Debug.LogError("生成子弹时找不到对应的发射点"); obj_data.gameObject.transform.position = value.Position; } obj_data.gameObject.transform.rotation = value.Rotation; ray = new Ray(obj_data.transform.position, obj_data.transform.forward); if (Physics.Raycast(ray, out hit) && hit.transform.gameObject.CompareTag(SenceGameObject.PLAYER_TAG) && !HurtPoints.ContainsKey(obj_data.SenceObject.ID)) { HurtPoints.Add(obj_data.SenceObject.ID, hit.point); } obj_data.gameObject.GetComponent <Rigidbody>().AddForce(obj_data.transform.forward * MsgCenter.LUACH_FORCE * 2); obj_data.gameObject.tag = SenceGameObject.AI_BULLET_TAG; Destroy(obj_data.gameObject, 10f); //SenceObjects.Add(value.ID, obj_data); break; case ObjectType.PlayerBullet: //bullet = value as Bullet; //obj_data = CreateBullet(bullet,false); //obj_data.gameObject.transform.position = value.Position; //obj_data.gameObject.transform.rotation = value.Rotation; //SenceObjects.Add(value.ID, obj_data); break; case ObjectType.Weapon: // if (value.state != ObjectState.Destroy) { string temppath = dropOut.ReadXML(value.Name); GameObject tempobj = Resources.Load(temppath) as GameObject; // Debug.Log("<color=yellow>生成掉;落物" + value.Name +value.Position+ "</color>"); GameObject OBJ = Instantiate(tempobj, value.Position, value.Rotation) as GameObject; OBJ.AddComponent <BOX_co>(); BoxCollider box = OBJ.GetComponent <BoxCollider>(); box.center = Vector3.zero; box.size = Vector3.one; SenceGameObject objdate = OBJ.AddComponent <SenceGameObject>(); objdate.SenceObject = value; SenceObjects.Add(value.ID, objdate); //OBJ.transform.position = value.Position; //OBJ.transform.rotation = value.Rotation; OBJ.SetActive(true); } break; case ObjectType.UI: UIMenu ui = value as UIMenu; SenceGameObject mune_data = Recever.rInstance.DisplayMenu(ui.IsStart); if (ui.IsStart) { GameState = Datas.GameState.Start; } else { GameState = Datas.GameState.End; } mune_data.SenceObject = ui; SenceObjects.Add(mune_data.SenceObject.ID, mune_data); if (ui.PageTab != null && sort.Count <= 10) { sort.Add(ui.PageTab); } else { Debug.Log("<color=red>分数数组长度" + sort.Count + "</color>"); } if (ui.Name != null && rankingname.Count <= 10) { rankingname.Add(ui.Name); } else { Debug.Log("<color=red>名字数组长度" + rankingname.Count + "</color>"); } break; case ObjectType.Ranking: ranking = value as Ranking; obj = new GameObject(); obj_data = obj.AddComponent <SenceGameObject>(); obj_data.SenceObject = ranking; SenceObjects.Add(ranking.ID, obj_data); break; case ObjectType.GuidedMissile: GuidedMissile gu = value as GuidedMissile; Debug.Log(gu.type); GameObject guided = Instantiate(Bullets["weapon3"]); // guided.AddComponent<Collider_items>(); obj_data = guided.AddComponent <SenceGameObject>(); obj_data.SenceObject = value; guided.tag = SenceGameObject.PLAYER_BULLET_TAG; //if(gu.Name == "right") //{ // guided.GetComponent<Rigidbody>().velocity = PlayerData.RightRein.transform.forward; //}else{ // guided.GetComponent<Rigidbody>().velocity = PlayerData.LeftRein.transform.forward; //} guided.transform.position = gu.Position; Guided guid = guided.AddComponent <Guided>(); if (gu.target_id == null || !SenceObjects.ContainsKey(gu.target_id)) { guid.Target = null; } else { //导弹目标为掉落物时没有爆炸效果 if (SenceObjects[gu.target_id].type != ObjectType.Weapon) { obj_data.EnemyEffect = guided.transform.FindChild("Enemy Explode").gameObject; } //设置导弹的目标,及与目标对应,一起消失 guid.Target = SenceObjects[gu.target_id].transform; if (!guideddestroy.ContainsKey(gu.target_id)) { guideddestroy.Add(gu.target_id, guided); } } SenceObjects.Add(gu.ID, obj_data); break; } } } }