private void FireFixedGun(GameCommand cmdReceived, PlayerGame playerGame, Game game) { PlayerUnit playerUnit = this.flPlayerUnits.TypedItems <PlayerUnit>().Where(c => c.Id == cmdReceived.ObjectId && c.Unit.UserId == playerGame.UserId).FirstOrDefault(); if (playerUnit == null) { new CommandFeedback(cmdReceived, enCommandStatus.Rejected, "PlayerUnit not found").Save(this.FAppPrivate); } else { Unit myUnit = playerUnit.Unit; if (myUnit == null) { new CommandFeedback(cmdReceived, enCommandStatus.Rejected, "Unit not found").Save(this.FAppPrivate); } else { if (!myUnit.HasFixedGun || myUnit.FixedGunFiringRange < cmdReceived.Distance) { new CommandFeedback(cmdReceived, enCommandStatus.Rejected, "Unit doesn't have a fixed gun or distance out of range").Save(this.FAppPrivate); } else { int targetYpos = -1; int targetXpos = -1; switch (myUnit.Heading) { case enHeading.North: targetYpos = (int)(myUnit.Position.Ypos - cmdReceived.Distance); targetXpos = (int)(myUnit.Position.Xpos); break; case enHeading.NorthWest: targetYpos = (int)(myUnit.Position.Ypos - cmdReceived.Distance); targetXpos = (int)(myUnit.Position.Xpos - cmdReceived.Distance); break; case enHeading.South: targetYpos = (int)(myUnit.Position.Ypos + cmdReceived.Distance); targetXpos = (int)(myUnit.Position.Xpos); break; case enHeading.SouthWest: targetYpos = (int)(myUnit.Position.Ypos + cmdReceived.Distance); targetXpos = (int)(myUnit.Position.Xpos - cmdReceived.Distance); break; case enHeading.SouthEast: targetYpos = (int)(myUnit.Position.Ypos + cmdReceived.Distance); targetXpos = (int)(myUnit.Position.Xpos + cmdReceived.Distance); break; case enHeading.NorthEast: targetYpos = (int)(myUnit.Position.Ypos - cmdReceived.Distance); targetXpos = (int)(myUnit.Position.Xpos + cmdReceived.Distance); break; case enHeading.East: targetYpos = (int)(myUnit.Position.Ypos); targetXpos = (int)(myUnit.Position.Xpos + cmdReceived.Distance); break; case enHeading.West: targetYpos = (int)(myUnit.Position.Ypos); targetXpos = (int)(myUnit.Position.Xpos - cmdReceived.Distance); break; default: break; } if (targetXpos > -1 && targetYpos > -1) { PlayerUnit pu = this.flPlayerUnits.TypedItems <PlayerUnit>().Where(c => c.Unit.Position.Xpos == targetXpos && c.Unit.Position.Ypos == targetYpos).FirstOrDefault(); if (pu == null) { new CommandFeedback(cmdReceived, enCommandStatus.Rejected, "Target missed").Save(this.FAppPrivate); } else { Unit attackedUnit = pu.Unit; attackedUnit.Armor -= myUnit.FixedGunArmorDamage; attackedUnit.Shields -= myUnit.FixedGunShieldDamage; pu.Save(this.FAppPrivate); if (attackedUnit.Armor < 1 || attackedUnit.Shields < 1) { attackedUnit.Status = enUnitStatus.Destroyed; new CommandFeedback(cmdReceived, enCommandStatus.Accepted, attackedUnit.Name + " destroyed!").Save(this.FAppPrivate); pu.Delete(this.FAppPrivate); } else { new CommandFeedback(cmdReceived, enCommandStatus.Accepted, attackedUnit.Name + " hit!, enemy shields: " + attackedUnit.Shields + ", enemy armor: " + attackedUnit.Armor).Save(this.FAppPrivate); } } } } } } }