public void alertDirection(Vector3 newDirection, bool sendToPack) { if (sendToPack) { for (int i = 0; i < this.pack.animals.Count; i++) { Animal animal = this.pack.animals[i]; if (!(animal == null) && !(animal == this)) { animal.alertDirection(newDirection, false); } } } if (this.isDead) { return; } if (this.isStuck) { return; } if (this.isHunting) { return; } if (!this.isFleeing) { AnimalManager.sendAnimalStartle(this); } this._isFleeing = true; this.isWandering = false; this.isHunting = false; this.updateTicking(); this.target = this.getFleeTarget(newDirection); }
// Token: 0x060033BF RID: 13247 RVA: 0x0014FA48 File Offset: 0x0014DE48 public static void alert(Vector3 position, float radius) { float sqrRadius = radius * radius; if (LevelNavigation.checkNavigation(position)) { AlertTool.zombiesInRadius.Clear(); ZombieManager.getZombiesInRadius(position, sqrRadius, AlertTool.zombiesInRadius); for (int i = 0; i < AlertTool.zombiesInRadius.Count; i++) { Zombie zombie = AlertTool.zombiesInRadius[i]; if (!zombie.isDead) { zombie.alert(position, true); } } } AlertTool.animalsInRadius.Clear(); AnimalManager.getAnimalsInRadius(position, sqrRadius, AlertTool.animalsInRadius); for (int j = 0; j < AlertTool.animalsInRadius.Count; j++) { Animal animal = AlertTool.animalsInRadius[j]; if (!animal.isDead) { if (animal.asset != null) { if (animal.asset.behaviour != EAnimalBehaviour.IGNORE) { animal.alertPoint(position, true); } } } } }
// Token: 0x06001DCB RID: 7627 RVA: 0x000A0CA8 File Offset: 0x0009F0A8 protected override void execute(CSteamID executorID, string parameter) { if (!Provider.isServer) { CommandWindow.LogError(this.localization.format("NotRunningErrorText")); return; } if (!Provider.hasCheats) { CommandWindow.LogError(this.localization.format("CheatsErrorText")); return; } string[] componentsFromSerial = Parser.getComponentsFromSerial(parameter, '/'); if (componentsFromSerial.Length < 1 || componentsFromSerial.Length > 3) { CommandWindow.LogError(this.localization.format("InvalidParameterErrorText")); return; } bool flag = false; SteamPlayer steamPlayer; if (!PlayerTool.tryGetSteamPlayer(componentsFromSerial[0], out steamPlayer)) { steamPlayer = PlayerTool.getSteamPlayer(executorID); if (steamPlayer == null) { CommandWindow.LogError(this.localization.format("NoPlayerErrorText", new object[] { componentsFromSerial[0] })); return; } flag = true; } ushort num; if (!ushort.TryParse(componentsFromSerial[(!flag) ? 1 : 0], out num)) { CommandWindow.LogError(this.localization.format("InvalidAnimalIDErrorText", new object[] { componentsFromSerial[(!flag) ? 1 : 0] })); return; } if (!AnimalManager.giveAnimal(steamPlayer.player, num)) { CommandWindow.LogError(this.localization.format("NoAnimalIDErrorText", new object[] { num })); return; } CommandWindow.Log(this.localization.format("AnimalText", new object[] { steamPlayer.playerID.playerName, num })); }
// Token: 0x060018BA RID: 6330 RVA: 0x0008A1AC File Offset: 0x000885AC public void askDamage(byte amount, Vector3 newRagdoll, out EPlayerKill kill, out uint xp, bool trackKill = true) { kill = EPlayerKill.NONE; xp = 0u; if (amount == 0 || this.isDead) { return; } if (!this.isDead) { if ((ushort)amount >= this.health) { this.health = 0; } else { this.health -= (ushort)amount; } this.ragdoll = newRagdoll; if (this.health == 0) { kill = EPlayerKill.ANIMAL; if (this.asset != null) { xp = this.asset.rewardXP; } AnimalManager.dropLoot(this); AnimalManager.sendAnimalDead(this, this.ragdoll); if (trackKill) { for (int i = 0; i < Provider.clients.Count; i++) { SteamPlayer steamPlayer = Provider.clients[i]; if (!(steamPlayer.player == null) && !(steamPlayer.player.movement == null) && !(steamPlayer.player.life == null) && !steamPlayer.player.life.isDead) { if ((steamPlayer.player.transform.position - base.transform.position).sqrMagnitude < 262144f) { steamPlayer.player.quests.trackAnimalKill(this); } } } } } else if (this.asset != null && this.asset.panics != null && this.asset.panics.Length > 0) { AnimalManager.sendAnimalPanic(this); } this.lastRegen = Time.time; } }
// Token: 0x060026F4 RID: 9972 RVA: 0x000E7604 File Offset: 0x000E5A04 public static bool giveAnimal(Player player, ushort id) { AnimalAsset animalAsset = (AnimalAsset)Assets.find(EAssetType.ANIMAL, id); if (animalAsset != null) { Vector3 vector = player.transform.position + player.transform.forward * 6f; RaycastHit raycastHit; Physics.Raycast(vector + Vector3.up * 16f, Vector3.down, out raycastHit, 32f, RayMasks.BLOCK_VEHICLE); if (raycastHit.collider != null) { vector = raycastHit.point; } AnimalManager.spawnAnimal(id, vector, player.transform.rotation); return(true); } return(false); }
public void askDamage(byte amount, Vector3 newRagdoll, out EPlayerKill kill, out uint xp) { kill = EPlayerKill.NONE; xp = 0u; if (amount == 0 || this.isDead) { return; } if (!this.isDead) { if ((ushort)amount >= this.health) { this.health = 0; } else { this.health -= (ushort)amount; } this.ragdoll = newRagdoll; if (this.health == 0) { kill = EPlayerKill.ANIMAL; if (this.asset != null) { xp = this.asset.rewardXP; } AnimalManager.dropLoot(this); AnimalManager.sendAnimalDead(this, this.ragdoll); } else if (this.asset != null && this.asset.panics != null && this.asset.panics.Length > 0) { AnimalManager.sendAnimalPanic(this); } this.lastRegen = Time.time; } }
// Token: 0x060033BE RID: 13246 RVA: 0x0014F69C File Offset: 0x0014DA9C public static void alert(Player player, Vector3 position, float radius, bool sneak, Vector3 spotDir, bool isSpotOn) { radius *= Provider.modeConfigData.Players.Detect_Radius_Multiplier; radius = Mathf.Clamp(radius, 0f, 64f); if (player == null) { return; } float sqrRadius = radius * radius; if (player.movement.nav != 255) { if (ZombieManager.regions[(int)player.movement.nav].hasBeacon) { for (int i = 0; i < ZombieManager.regions[(int)player.movement.nav].zombies.Count; i++) { Zombie zombie = ZombieManager.regions[(int)player.movement.nav].zombies[i]; if (!zombie.isDead) { if (zombie.checkAlert(player)) { zombie.alert(player); } } } } AlertTool.zombiesInRadius.Clear(); ZombieManager.getZombiesInRadius(position, sqrRadius, AlertTool.zombiesInRadius); for (int j = 0; j < AlertTool.zombiesInRadius.Count; j++) { Zombie zombie2 = AlertTool.zombiesInRadius[j]; if (!zombie2.isDead) { if (zombie2.checkAlert(player)) { Vector3 vector = zombie2.transform.position - position; if (AlertTool.check(zombie2.transform.forward, vector, sqrRadius, sneak, spotDir, isSpotOn)) { RaycastHit raycastHit; Physics.Raycast(zombie2.transform.position + Vector3.up, -vector, out raycastHit, vector.magnitude * 0.95f, RayMasks.BLOCK_VISION); if (!(raycastHit.transform != null)) { zombie2.alert(player); } } } } } } AlertTool.animalsInRadius.Clear(); AnimalManager.getAnimalsInRadius(position, sqrRadius, AlertTool.animalsInRadius); for (int k = 0; k < AlertTool.animalsInRadius.Count; k++) { Animal animal = AlertTool.animalsInRadius[k]; if (!animal.isDead) { if (animal.asset != null) { if (animal.asset.behaviour == EAnimalBehaviour.DEFENSE) { if (!animal.isFleeing) { Vector3 vector2 = animal.transform.position - position; if (!AlertTool.check(animal.transform.forward, vector2, sqrRadius, sneak, spotDir, isSpotOn)) { goto IL_385; } RaycastHit raycastHit; Physics.Raycast(animal.transform.position + Vector3.up, -vector2, out raycastHit, vector2.magnitude * 0.95f, RayMasks.BLOCK_VISION); if (raycastHit.transform != null) { goto IL_385; } } animal.alertPoint(player.transform.position, true); } else if (animal.asset.behaviour == EAnimalBehaviour.OFFENSE) { if (animal.checkAlert(player)) { Vector3 vector3 = animal.transform.position - position; if (AlertTool.check(animal.transform.forward, vector3, sqrRadius, sneak, spotDir, isSpotOn)) { RaycastHit raycastHit; Physics.Raycast(animal.transform.position + Vector3.up, -vector3, out raycastHit, vector3.magnitude * 0.95f, RayMasks.BLOCK_VISION); if (!(raycastHit.transform != null)) { animal.alertPlayer(player, true); } } } } } } IL_385 :; } }
// Token: 0x060033E3 RID: 13283 RVA: 0x00151418 File Offset: 0x0014F818 public static void explode(Vector3 point, float damageRadius, EDeathCause cause, CSteamID killer, float playerDamage, float zombieDamage, float animalDamage, float barricadeDamage, float structureDamage, float vehicleDamage, float resourceDamage, float objectDamage, out List <EPlayerKill> kills, EExplosionDamageType damageType = EExplosionDamageType.CONVENTIONAL, float alertRadius = 32f, bool playImpactEffect = true, bool penetrateBuildables = false) { DamageTool.explosionKills.Clear(); kills = DamageTool.explosionKills; DamageTool.explosionRangeComparator.point = point; float num = damageRadius * damageRadius; DamageTool.regionsInRadius.Clear(); Regions.getRegionsInRadius(point, damageRadius, DamageTool.regionsInRadius); int layerMask; if (penetrateBuildables) { layerMask = RayMasks.BLOCK_EXPLOSION_PENETRATE_BUILDABLES; } else { layerMask = RayMasks.BLOCK_EXPLOSION; } if (structureDamage > 0.5f) { DamageTool.structuresInRadius.Clear(); StructureManager.getStructuresInRadius(point, num, DamageTool.regionsInRadius, DamageTool.structuresInRadius); DamageTool.structuresInRadius.Sort(DamageTool.explosionRangeComparator); for (int i = 0; i < DamageTool.structuresInRadius.Count; i++) { Transform transform = DamageTool.structuresInRadius[i]; if (!(transform == null)) { ushort id; if (ushort.TryParse(transform.name, out id)) { ItemStructureAsset itemStructureAsset = (ItemStructureAsset)Assets.find(EAssetType.ITEM, id); if (itemStructureAsset != null && !itemStructureAsset.proofExplosion) { Vector3 a = transform.transform.position - point; float magnitude = a.magnitude; Vector3 direction = a / magnitude; if (magnitude > 0.5f) { RaycastHit raycastHit; PhysicsUtility.raycast(new Ray(point, direction), out raycastHit, magnitude - 0.5f, layerMask, QueryTriggerInteraction.UseGlobal); if (raycastHit.transform != null && raycastHit.transform != transform.transform) { goto IL_17D; } } StructureManager.damage(transform, a.normalized, structureDamage, 1f - magnitude / damageRadius, true); } } } IL_17D :; } } if (resourceDamage > 0.5f) { DamageTool.resourcesInRadius.Clear(); ResourceManager.getResourcesInRadius(point, num, DamageTool.regionsInRadius, DamageTool.resourcesInRadius); DamageTool.resourcesInRadius.Sort(DamageTool.explosionRangeComparator); for (int j = 0; j < DamageTool.resourcesInRadius.Count; j++) { Transform transform2 = DamageTool.resourcesInRadius[j]; if (!(transform2 == null)) { Vector3 a2 = transform2.transform.position - point; float magnitude2 = a2.magnitude; Vector3 direction2 = a2 / magnitude2; if (magnitude2 > 0.5f) { RaycastHit raycastHit; PhysicsUtility.raycast(new Ray(point, direction2), out raycastHit, magnitude2 - 0.5f, layerMask, QueryTriggerInteraction.UseGlobal); if (raycastHit.transform != null && raycastHit.transform != transform2.transform) { goto IL_2A2; } } EPlayerKill eplayerKill; uint num2; ResourceManager.damage(transform2, a2.normalized, resourceDamage, 1f - magnitude2 / damageRadius, 1f, out eplayerKill, out num2); if (eplayerKill != EPlayerKill.NONE) { kills.Add(eplayerKill); } } IL_2A2 :; } } if (objectDamage > 0.5f) { DamageTool.objectsInRadius.Clear(); ObjectManager.getObjectsInRadius(point, num, DamageTool.regionsInRadius, DamageTool.objectsInRadius); DamageTool.objectsInRadius.Sort(DamageTool.explosionRangeComparator); for (int k = 0; k < DamageTool.objectsInRadius.Count; k++) { Transform transform3 = DamageTool.objectsInRadius[k]; if (!(transform3 == null)) { InteractableObjectRubble component = transform3.GetComponent <InteractableObjectRubble>(); if (!(component == null)) { if (!component.asset.rubbleProofExplosion) { for (byte b = 0; b < component.getSectionCount(); b += 1) { Transform section = component.getSection(b); Vector3 a3 = section.position - point; if (a3.sqrMagnitude < num) { float magnitude3 = a3.magnitude; Vector3 direction3 = a3 / magnitude3; if (magnitude3 > 0.5f) { RaycastHit raycastHit; PhysicsUtility.raycast(new Ray(point, direction3), out raycastHit, magnitude3 - 0.5f, layerMask, QueryTriggerInteraction.UseGlobal); if (raycastHit.transform != null && raycastHit.transform != transform3.transform) { goto IL_40B; } } EPlayerKill eplayerKill; uint num2; ObjectManager.damage(transform3, a3.normalized, b, objectDamage, 1f - magnitude3 / damageRadius, out eplayerKill, out num2); if (eplayerKill != EPlayerKill.NONE) { kills.Add(eplayerKill); } } IL_40B :; } } } } } } if (barricadeDamage > 0.5f) { DamageTool.barricadesInRadius.Clear(); BarricadeManager.getBarricadesInRadius(point, num, DamageTool.regionsInRadius, DamageTool.barricadesInRadius); BarricadeManager.getBarricadesInRadius(point, num, DamageTool.barricadesInRadius); DamageTool.barricadesInRadius.Sort(DamageTool.explosionRangeComparator); for (int l = 0; l < DamageTool.barricadesInRadius.Count; l++) { Transform transform4 = DamageTool.barricadesInRadius[l]; if (!(transform4 == null)) { Vector3 a4 = transform4.transform.position - point; float magnitude4 = a4.magnitude; Vector3 direction4 = a4 / magnitude4; if (magnitude4 > 0.5f) { RaycastHit raycastHit; PhysicsUtility.raycast(new Ray(point, direction4), out raycastHit, magnitude4 - 0.5f, layerMask, QueryTriggerInteraction.UseGlobal); if (raycastHit.transform != null && raycastHit.transform != transform4.transform) { goto IL_568; } } ushort id2; if (ushort.TryParse(transform4.name, out id2)) { ItemBarricadeAsset itemBarricadeAsset = (ItemBarricadeAsset)Assets.find(EAssetType.ITEM, id2); if (itemBarricadeAsset != null && !itemBarricadeAsset.proofExplosion) { BarricadeManager.damage(transform4, barricadeDamage, 1f - magnitude4 / damageRadius, true); } } } IL_568 :; } } if ((Provider.isPvP || damageType == EExplosionDamageType.ZOMBIE_ACID || damageType == EExplosionDamageType.ZOMBIE_FIRE || damageType == EExplosionDamageType.ZOMBIE_ELECTRIC) && playerDamage > 0.5f) { DamageTool.playersInRadius.Clear(); PlayerTool.getPlayersInRadius(point, num, DamageTool.playersInRadius); for (int m = 0; m < DamageTool.playersInRadius.Count; m++) { Player player = DamageTool.playersInRadius[m]; if (!(player == null) && !player.life.isDead) { if (damageType != EExplosionDamageType.ZOMBIE_FIRE || player.clothing.shirtAsset == null || !player.clothing.shirtAsset.proofFire || player.clothing.pantsAsset == null || !player.clothing.pantsAsset.proofFire) { Vector3 a5 = player.transform.position - point; float magnitude5 = a5.magnitude; Vector3 vector = a5 / magnitude5; if (magnitude5 > 0.5f) { RaycastHit raycastHit; PhysicsUtility.raycast(new Ray(point, vector), out raycastHit, magnitude5 - 0.5f, layerMask, QueryTriggerInteraction.UseGlobal); if (raycastHit.transform != null && raycastHit.transform != player.transform) { goto IL_7AA; } } if (playImpactEffect) { EffectManager.sendEffect(5, EffectManager.SMALL, player.transform.position + Vector3.up, -vector); EffectManager.sendEffect(5, EffectManager.SMALL, player.transform.position + Vector3.up, Vector3.up); } float num3 = 1f - Mathf.Pow(magnitude5 / damageRadius, 2f); if (player.movement.getVehicle() != null && player.movement.getVehicle().asset != null) { num3 *= player.movement.getVehicle().asset.passengerExplosionArmor; } EPlayerKill eplayerKill; DamageTool.damage(player, cause, ELimb.SPINE, killer, vector, playerDamage, num3, out eplayerKill); if (eplayerKill != EPlayerKill.NONE) { kills.Add(eplayerKill); } } } IL_7AA :; } } if (damageType == EExplosionDamageType.ZOMBIE_FIRE || zombieDamage > 0.5f) { DamageTool.zombiesInRadius.Clear(); ZombieManager.getZombiesInRadius(point, num, DamageTool.zombiesInRadius); for (int n = 0; n < DamageTool.zombiesInRadius.Count; n++) { Zombie zombie = DamageTool.zombiesInRadius[n]; if (!(zombie == null) && !zombie.isDead) { if (damageType == EExplosionDamageType.ZOMBIE_FIRE) { if (zombie.speciality == EZombieSpeciality.NORMAL) { ZombieManager.sendZombieSpeciality(zombie, EZombieSpeciality.BURNER); } } else { Vector3 a6 = zombie.transform.position - point; float magnitude6 = a6.magnitude; Vector3 vector2 = a6 / magnitude6; if (magnitude6 > 0.5f) { RaycastHit raycastHit; PhysicsUtility.raycast(new Ray(point, vector2), out raycastHit, magnitude6 - 0.5f, layerMask, QueryTriggerInteraction.UseGlobal); if (raycastHit.transform != null && raycastHit.transform != zombie.transform) { goto IL_964; } } if (playImpactEffect) { EffectManager.sendEffect((!zombie.isRadioactive) ? 5 : 95, EffectManager.SMALL, zombie.transform.position + Vector3.up, -vector2); EffectManager.sendEffect((!zombie.isRadioactive) ? 5 : 95, EffectManager.SMALL, zombie.transform.position + Vector3.up, Vector3.up); } EPlayerKill eplayerKill; uint num2; DamageTool.damage(zombie, vector2, zombieDamage, 1f - magnitude6 / damageRadius, out eplayerKill, out num2); if (eplayerKill != EPlayerKill.NONE) { kills.Add(eplayerKill); } } } IL_964 :; } } if (animalDamage > 0.5f) { DamageTool.animalsInRadius.Clear(); AnimalManager.getAnimalsInRadius(point, num, DamageTool.animalsInRadius); for (int num4 = 0; num4 < DamageTool.animalsInRadius.Count; num4++) { Animal animal = DamageTool.animalsInRadius[num4]; if (!(animal == null) && !animal.isDead) { Vector3 a7 = animal.transform.position - point; float magnitude7 = a7.magnitude; Vector3 vector3 = a7 / magnitude7; if (magnitude7 > 0.5f) { RaycastHit raycastHit; PhysicsUtility.raycast(new Ray(point, vector3), out raycastHit, magnitude7 - 0.5f, layerMask, QueryTriggerInteraction.UseGlobal); if (raycastHit.transform != null && raycastHit.transform != animal.transform) { goto IL_ACC; } } if (playImpactEffect) { EffectManager.sendEffect(5, EffectManager.SMALL, animal.transform.position + Vector3.up, -vector3); EffectManager.sendEffect(5, EffectManager.SMALL, animal.transform.position + Vector3.up, Vector3.up); } EPlayerKill eplayerKill; uint num2; DamageTool.damage(animal, vector3, animalDamage, 1f - magnitude7 / damageRadius, out eplayerKill, out num2); if (eplayerKill != EPlayerKill.NONE) { kills.Add(eplayerKill); } } IL_ACC :; } } if (vehicleDamage > 0.5f) { DamageTool.vehiclesInRadius.Clear(); VehicleManager.getVehiclesInRadius(point, num, DamageTool.vehiclesInRadius); for (int num5 = 0; num5 < DamageTool.vehiclesInRadius.Count; num5++) { InteractableVehicle interactableVehicle = DamageTool.vehiclesInRadius[num5]; if (!(interactableVehicle == null) && !interactableVehicle.isDead) { if (interactableVehicle.asset != null && interactableVehicle.asset.isVulnerableToExplosions) { Vector3 a8 = interactableVehicle.transform.position - point; float magnitude8 = a8.magnitude; Vector3 direction5 = a8 / magnitude8; if (magnitude8 > 0.5f) { RaycastHit raycastHit; PhysicsUtility.raycast(new Ray(point, direction5), out raycastHit, magnitude8 - 0.5f, layerMask, QueryTriggerInteraction.UseGlobal); if (raycastHit.transform != null && raycastHit.transform != interactableVehicle.transform) { goto IL_BED; } } VehicleManager.damage(interactableVehicle, vehicleDamage, 1f - magnitude8 / damageRadius, false); } } IL_BED :; } } AlertTool.alert(point, alertRadius); }
public void tick() { float delta = Time.time - this.lastTick; this.lastTick = Time.time; if (this.isHunting) { if (this.player != null && !this.player.life.isDead && this.player.stance.stance != EPlayerStance.SWIM) { this.target = this.player.transform.position; float num = Mathf.Pow(this.target.x - base.transform.position.x, 2f) + Mathf.Pow(this.target.z - base.transform.position.z, 2f); float num2 = Mathf.Abs(this.target.y - base.transform.position.y); if (num < (float)((!(this.player.movement.getVehicle() != null)) ? 5 : 19) && num2 < 2f) { if (Time.time - this.lastTarget > ((!Dedicator.isDedicated) ? 0.1f : 0.3f)) { if (this.isAttacking) { if (Time.time - this.lastAttack > this.attackTime / 2f) { this.isAttacking = false; byte b = this.asset.damage; b = (byte)((float)b * Provider.modeConfigData.Animals.Damage_Multiplier); if (this.player.movement.getVehicle() != null) { VehicleManager.damage(this.player.movement.getVehicle(), (float)b, 1f, true); } else { EPlayerKill eplayerKill; this.player.life.askDamage(b, (this.target - base.transform.position).normalized * (float)b, EDeathCause.ANIMAL, ELimb.SKULL, Provider.server, out eplayerKill); } } } else if (Time.time - this.lastAttack > 1f) { this.isAttacking = true; AnimalManager.sendAnimalAttack(this); } } } else if (num > 4096f) { this.player = null; this.isHunting = false; this.updateTicking(); } else { this.lastTarget = Time.time; this.isAttacking = false; } } else { this.player = null; this.isHunting = false; this.updateTicking(); } this.lastWander = Time.time; } this.move(delta); }
public void sendRevive(Vector3 position, float angle) { AnimalManager.sendAnimalAlive(this, position, MeasurementTool.angleToByte(angle)); }
public virtual void read(SteamChannel channel) { this.sequence = (int)channel.read(Types.INT32_TYPE); this.recov = (int)channel.read(Types.INT32_TYPE); this.keys = (ushort)channel.read(Types.UINT16_TYPE); byte b = (byte)channel.read(Types.BYTE_TYPE); if (b > 0) { this.serversideInputs = new Queue <InputInfo>((int)b); for (byte b2 = 0; b2 < b; b2 += 1) { InputInfo inputInfo = new InputInfo(); inputInfo.type = (ERaycastInfoType)((byte)channel.read(Types.BYTE_TYPE)); switch (inputInfo.type) { case ERaycastInfoType.NONE: inputInfo.point = (Vector3)channel.read(Types.VECTOR3_TYPE); inputInfo.normal = (Vector3)channel.read(Types.VECTOR3_TYPE); inputInfo.material = (EPhysicsMaterial)((byte)channel.read(Types.BYTE_TYPE)); break; case ERaycastInfoType.SKIP: inputInfo = null; break; case ERaycastInfoType.OBJECT: { inputInfo.point = (Vector3)channel.read(Types.VECTOR3_TYPE); inputInfo.direction = (Vector3)channel.read(Types.VECTOR3_TYPE); inputInfo.normal = (Vector3)channel.read(Types.VECTOR3_TYPE); inputInfo.material = (EPhysicsMaterial)((byte)channel.read(Types.BYTE_TYPE)); inputInfo.section = (byte)channel.read(Types.BYTE_TYPE); byte x = (byte)channel.read(Types.BYTE_TYPE); byte y = (byte)channel.read(Types.BYTE_TYPE); ushort index = (ushort)channel.read(Types.UINT16_TYPE); LevelObject @object = ObjectManager.getObject(x, y, index); if (@object != null && @object.transform != null && (inputInfo.point - @object.transform.position).sqrMagnitude < 256f) { inputInfo.transform = @object.transform; } else { inputInfo.type = ERaycastInfoType.NONE; } break; } case ERaycastInfoType.PLAYER: { inputInfo.point = (Vector3)channel.read(Types.VECTOR3_TYPE); inputInfo.direction = (Vector3)channel.read(Types.VECTOR3_TYPE); inputInfo.normal = (Vector3)channel.read(Types.VECTOR3_TYPE); inputInfo.limb = (ELimb)((byte)channel.read(Types.BYTE_TYPE)); CSteamID steamID = (CSteamID)channel.read(Types.STEAM_ID_TYPE); Player player = PlayerTool.getPlayer(steamID); if (player != null && (inputInfo.point - player.transform.position).sqrMagnitude < 256f) { inputInfo.material = EPhysicsMaterial.FLESH_DYNAMIC; inputInfo.player = player; inputInfo.transform = player.transform; } else { inputInfo = null; } break; } case ERaycastInfoType.ZOMBIE: { inputInfo.point = (Vector3)channel.read(Types.VECTOR3_TYPE); inputInfo.direction = (Vector3)channel.read(Types.VECTOR3_TYPE); inputInfo.normal = (Vector3)channel.read(Types.VECTOR3_TYPE); inputInfo.limb = (ELimb)((byte)channel.read(Types.BYTE_TYPE)); ushort id = (ushort)channel.read(Types.UINT16_TYPE); Zombie zombie = ZombieManager.getZombie(inputInfo.point, id); if (zombie != null && (inputInfo.point - zombie.transform.position).sqrMagnitude < 256f) { if (zombie.isRadioactive) { inputInfo.material = EPhysicsMaterial.ALIEN_DYNAMIC; } else { inputInfo.material = EPhysicsMaterial.FLESH_DYNAMIC; } inputInfo.zombie = zombie; inputInfo.transform = zombie.transform; } else { inputInfo = null; } break; } case ERaycastInfoType.ANIMAL: { inputInfo.point = (Vector3)channel.read(Types.VECTOR3_TYPE); inputInfo.direction = (Vector3)channel.read(Types.VECTOR3_TYPE); inputInfo.normal = (Vector3)channel.read(Types.VECTOR3_TYPE); inputInfo.limb = (ELimb)((byte)channel.read(Types.BYTE_TYPE)); ushort index2 = (ushort)channel.read(Types.UINT16_TYPE); Animal animal = AnimalManager.getAnimal(index2); if (animal != null && (inputInfo.point - animal.transform.position).sqrMagnitude < 256f) { inputInfo.material = EPhysicsMaterial.FLESH_DYNAMIC; inputInfo.animal = animal; inputInfo.transform = animal.transform; } else { inputInfo = null; } break; } case ERaycastInfoType.VEHICLE: { inputInfo.point = (Vector3)channel.read(Types.VECTOR3_TYPE); inputInfo.normal = (Vector3)channel.read(Types.VECTOR3_TYPE); inputInfo.material = (EPhysicsMaterial)((byte)channel.read(Types.BYTE_TYPE)); uint instanceID = (uint)channel.read(Types.UINT32_TYPE); InteractableVehicle vehicle = VehicleManager.getVehicle(instanceID); if (vehicle != null && (vehicle == channel.owner.player.movement.getVehicle() || (inputInfo.point - vehicle.transform.position).sqrMagnitude < 4096f)) { inputInfo.vehicle = vehicle; inputInfo.transform = vehicle.transform; } else { inputInfo = null; } break; } case ERaycastInfoType.BARRICADE: { inputInfo.point = (Vector3)channel.read(Types.VECTOR3_TYPE); inputInfo.normal = (Vector3)channel.read(Types.VECTOR3_TYPE); inputInfo.material = (EPhysicsMaterial)((byte)channel.read(Types.BYTE_TYPE)); byte x2 = (byte)channel.read(Types.BYTE_TYPE); byte y2 = (byte)channel.read(Types.BYTE_TYPE); ushort plant = (ushort)channel.read(Types.UINT16_TYPE); ushort num = (ushort)channel.read(Types.UINT16_TYPE); BarricadeRegion barricadeRegion; if (BarricadeManager.tryGetRegion(x2, y2, plant, out barricadeRegion) && (int)num < barricadeRegion.drops.Count) { Transform model = barricadeRegion.drops[(int)num].model; if (model != null && (inputInfo.point - model.transform.position).sqrMagnitude < 256f) { inputInfo.transform = model; } else { inputInfo = null; } } else { inputInfo = null; } break; } case ERaycastInfoType.STRUCTURE: { inputInfo.point = (Vector3)channel.read(Types.VECTOR3_TYPE); inputInfo.direction = (Vector3)channel.read(Types.VECTOR3_TYPE); inputInfo.normal = (Vector3)channel.read(Types.VECTOR3_TYPE); inputInfo.material = (EPhysicsMaterial)((byte)channel.read(Types.BYTE_TYPE)); byte x3 = (byte)channel.read(Types.BYTE_TYPE); byte y3 = (byte)channel.read(Types.BYTE_TYPE); ushort num2 = (ushort)channel.read(Types.UINT16_TYPE); StructureRegion structureRegion; if (StructureManager.tryGetRegion(x3, y3, out structureRegion) && (int)num2 < structureRegion.drops.Count) { Transform model2 = structureRegion.drops[(int)num2].model; if (model2 != null && (inputInfo.point - model2.transform.position).sqrMagnitude < 256f) { inputInfo.transform = model2; } else { inputInfo = null; } } else { inputInfo = null; } break; } case ERaycastInfoType.RESOURCE: { inputInfo.point = (Vector3)channel.read(Types.VECTOR3_TYPE); inputInfo.direction = (Vector3)channel.read(Types.VECTOR3_TYPE); inputInfo.normal = (Vector3)channel.read(Types.VECTOR3_TYPE); inputInfo.material = (EPhysicsMaterial)((byte)channel.read(Types.BYTE_TYPE)); byte x4 = (byte)channel.read(Types.BYTE_TYPE); byte y4 = (byte)channel.read(Types.BYTE_TYPE); ushort index3 = (ushort)channel.read(Types.UINT16_TYPE); Transform resource = ResourceManager.getResource(x4, y4, index3); if (resource != null && (inputInfo.point - resource.transform.position).sqrMagnitude < 256f) { inputInfo.transform = resource; } else { inputInfo = null; } break; } } if (inputInfo != null) { this.serversideInputs.Enqueue(inputInfo); } } } }
public static void explode(Vector3 point, float damageRadius, EDeathCause cause, CSteamID killer, float playerDamage, float zombieDamage, float animalDamage, float barricadeDamage, float structureDamage, float vehicleDamage, float resourceDamage, float objectDamage, EExplosionDamageType damageType = EExplosionDamageType.CONVENTIONAL, float alertRadius = 32f, bool playImpactEffect = true) { DamageTool.explosionRangeComparator.point = point; float num = damageRadius * damageRadius; DamageTool.regionsInRadius.Clear(); Regions.getRegionsInRadius(point, damageRadius, DamageTool.regionsInRadius); if (structureDamage > 0.5f) { DamageTool.structuresInRadius.Clear(); StructureManager.getStructuresInRadius(point, num, DamageTool.regionsInRadius, DamageTool.structuresInRadius); DamageTool.structuresInRadius.Sort(DamageTool.explosionRangeComparator); for (int i = 0; i < DamageTool.structuresInRadius.Count; i++) { Transform transform = DamageTool.structuresInRadius[i]; if (!(transform == null)) { ushort id; if (ushort.TryParse(transform.name, out id)) { ItemStructureAsset itemStructureAsset = (ItemStructureAsset)Assets.find(EAssetType.ITEM, id); if (itemStructureAsset != null && !itemStructureAsset.proofExplosion) { Vector3 vector = transform.transform.position - point; float magnitude = vector.magnitude; Vector3 vector2 = vector / magnitude; if (magnitude > 0.5f) { RaycastHit raycastHit; PhysicsUtility.raycast(new Ray(point, vector2), out raycastHit, magnitude - 0.5f, RayMasks.BLOCK_EXPLOSION, 0); if (raycastHit.transform != null && raycastHit.transform != transform.transform) { goto IL_154; } } StructureManager.damage(transform, vector.normalized, structureDamage, 1f - magnitude / damageRadius, true); } } } IL_154 :; } } if (resourceDamage > 0.5f) { DamageTool.resourcesInRadius.Clear(); ResourceManager.getResourcesInRadius(point, num, DamageTool.regionsInRadius, DamageTool.resourcesInRadius); DamageTool.resourcesInRadius.Sort(DamageTool.explosionRangeComparator); for (int j = 0; j < DamageTool.resourcesInRadius.Count; j++) { Transform transform2 = DamageTool.resourcesInRadius[j]; if (!(transform2 == null)) { Vector3 vector3 = transform2.transform.position - point; float magnitude2 = vector3.magnitude; Vector3 vector4 = vector3 / magnitude2; if (magnitude2 > 0.5f) { RaycastHit raycastHit; PhysicsUtility.raycast(new Ray(point, vector4), out raycastHit, magnitude2 - 0.5f, RayMasks.BLOCK_EXPLOSION, 0); if (raycastHit.transform != null && raycastHit.transform != transform2.transform) { goto IL_26D; } } EPlayerKill eplayerKill; uint num2; ResourceManager.damage(transform2, vector3.normalized, resourceDamage, 1f - magnitude2 / damageRadius, 1f, out eplayerKill, out num2); } IL_26D :; } } if (objectDamage > 0.5f) { DamageTool.objectsInRadius.Clear(); ObjectManager.getObjectsInRadius(point, num, DamageTool.regionsInRadius, DamageTool.objectsInRadius); DamageTool.objectsInRadius.Sort(DamageTool.explosionRangeComparator); for (int k = 0; k < DamageTool.objectsInRadius.Count; k++) { Transform transform3 = DamageTool.objectsInRadius[k]; if (!(transform3 == null)) { InteractableObjectRubble component = transform3.GetComponent <InteractableObjectRubble>(); if (!(component == null)) { if (!component.asset.rubbleProofExplosion) { for (byte b = 0; b < component.getSectionCount(); b += 1) { Transform section = component.getSection(b); Vector3 vector5 = section.position - point; if (vector5.sqrMagnitude < num) { float magnitude3 = vector5.magnitude; Vector3 vector6 = vector5 / magnitude3; if (magnitude3 > 0.5f) { RaycastHit raycastHit; PhysicsUtility.raycast(new Ray(point, vector6), out raycastHit, magnitude3 - 0.5f, RayMasks.BLOCK_EXPLOSION, 0); if (raycastHit.transform != null && raycastHit.transform != transform3.transform) { goto IL_3CA; } } EPlayerKill eplayerKill; uint num2; ObjectManager.damage(transform3, vector5.normalized, b, objectDamage, 1f - magnitude3 / damageRadius, out eplayerKill, out num2); } IL_3CA :; } } } } } } if (barricadeDamage > 0.5f) { DamageTool.barricadesInRadius.Clear(); BarricadeManager.getBarricadesInRadius(point, num, DamageTool.regionsInRadius, DamageTool.barricadesInRadius); BarricadeManager.getBarricadesInRadius(point, num, DamageTool.barricadesInRadius); DamageTool.barricadesInRadius.Sort(DamageTool.explosionRangeComparator); for (int l = 0; l < DamageTool.barricadesInRadius.Count; l++) { Transform transform4 = DamageTool.barricadesInRadius[l]; if (!(transform4 == null)) { Vector3 vector7 = transform4.transform.position - point; float magnitude4 = vector7.magnitude; Vector3 vector8 = vector7 / magnitude4; if (magnitude4 > 0.5f) { RaycastHit raycastHit; PhysicsUtility.raycast(new Ray(point, vector8), out raycastHit, magnitude4 - 0.5f, RayMasks.BLOCK_EXPLOSION, 0); if (raycastHit.transform != null && raycastHit.transform != transform4.transform) { goto IL_52A; } } ushort id2; if (ushort.TryParse(transform4.name, out id2)) { ItemBarricadeAsset itemBarricadeAsset = (ItemBarricadeAsset)Assets.find(EAssetType.ITEM, id2); if (itemBarricadeAsset != null && !itemBarricadeAsset.proofExplosion) { BarricadeManager.damage(transform4, barricadeDamage, 1f - magnitude4 / damageRadius, true); } } } IL_52A :; } } if ((Provider.isPvP || damageType == EExplosionDamageType.ZOMBIE_ACID || damageType == EExplosionDamageType.ZOMBIE_FIRE || damageType == EExplosionDamageType.ZOMBIE_ELECTRIC) && playerDamage > 0.5f) { DamageTool.playersInRadius.Clear(); PlayerTool.getPlayersInRadius(point, num, DamageTool.playersInRadius); for (int m = 0; m < DamageTool.playersInRadius.Count; m++) { Player player = DamageTool.playersInRadius[m]; if (!(player == null) && !player.life.isDead) { if (damageType != EExplosionDamageType.ZOMBIE_FIRE || player.clothing.shirtAsset == null || !player.clothing.shirtAsset.proofFire || player.clothing.pantsAsset == null || !player.clothing.pantsAsset.proofFire) { Vector3 vector9 = player.transform.position - point; float magnitude5 = vector9.magnitude; Vector3 vector10 = vector9 / magnitude5; if (magnitude5 > 0.5f) { RaycastHit raycastHit; PhysicsUtility.raycast(new Ray(point, vector10), out raycastHit, magnitude5 - 0.5f, RayMasks.BLOCK_EXPLOSION, 0); if (raycastHit.transform != null && raycastHit.transform != player.transform) { goto IL_760; } } if (playImpactEffect) { EffectManager.sendEffect(5, EffectManager.SMALL, player.transform.position + Vector3.up, -vector10); EffectManager.sendEffect(5, EffectManager.SMALL, player.transform.position + Vector3.up, Vector3.up); } float num3 = 1f - Mathf.Pow(magnitude5 / damageRadius, 2f); if (player.movement.getVehicle() != null && player.movement.getVehicle().asset != null) { num3 *= player.movement.getVehicle().asset.passengerExplosionArmor; } EPlayerKill eplayerKill; DamageTool.damage(player, cause, ELimb.SPINE, killer, vector10, playerDamage, num3, out eplayerKill); } } IL_760 :; } } if (damageType == EExplosionDamageType.ZOMBIE_FIRE || zombieDamage > 0.5f) { DamageTool.zombiesInRadius.Clear(); ZombieManager.getZombiesInRadius(point, num, DamageTool.zombiesInRadius); for (int n = 0; n < DamageTool.zombiesInRadius.Count; n++) { Zombie zombie = DamageTool.zombiesInRadius[n]; if (!(zombie == null) && !zombie.isDead) { if (damageType == EExplosionDamageType.ZOMBIE_FIRE) { if (zombie.speciality == EZombieSpeciality.NORMAL) { ZombieManager.sendZombieSpeciality(zombie, EZombieSpeciality.BURNER); } } else { Vector3 vector11 = zombie.transform.position - point; float magnitude6 = vector11.magnitude; Vector3 vector12 = vector11 / magnitude6; if (magnitude6 > 0.5f) { RaycastHit raycastHit; PhysicsUtility.raycast(new Ray(point, vector12), out raycastHit, magnitude6 - 0.5f, RayMasks.BLOCK_EXPLOSION, 0); if (raycastHit.transform != null && raycastHit.transform != zombie.transform) { goto IL_90E; } } if (playImpactEffect) { EffectManager.sendEffect((!zombie.isRadioactive) ? 5 : 95, EffectManager.SMALL, zombie.transform.position + Vector3.up, -vector12); EffectManager.sendEffect((!zombie.isRadioactive) ? 5 : 95, EffectManager.SMALL, zombie.transform.position + Vector3.up, Vector3.up); } EPlayerKill eplayerKill; uint num2; DamageTool.damage(zombie, vector12, zombieDamage, 1f - magnitude6 / damageRadius, out eplayerKill, out num2); } } IL_90E :; } } if (animalDamage > 0.5f) { DamageTool.animalsInRadius.Clear(); AnimalManager.getAnimalsInRadius(point, num, DamageTool.animalsInRadius); for (int num4 = 0; num4 < DamageTool.animalsInRadius.Count; num4++) { Animal animal = DamageTool.animalsInRadius[num4]; if (!(animal == null) && !animal.isDead) { Vector3 vector13 = animal.transform.position - point; float magnitude7 = vector13.magnitude; Vector3 vector14 = vector13 / magnitude7; if (magnitude7 > 0.5f) { RaycastHit raycastHit; PhysicsUtility.raycast(new Ray(point, vector14), out raycastHit, magnitude7 - 0.5f, RayMasks.BLOCK_EXPLOSION, 0); if (raycastHit.transform != null && raycastHit.transform != animal.transform) { goto IL_A6A; } } if (playImpactEffect) { EffectManager.sendEffect(5, EffectManager.SMALL, animal.transform.position + Vector3.up, -vector14); EffectManager.sendEffect(5, EffectManager.SMALL, animal.transform.position + Vector3.up, Vector3.up); } EPlayerKill eplayerKill; uint num2; DamageTool.damage(animal, vector14, animalDamage, 1f - magnitude7 / damageRadius, out eplayerKill, out num2); } IL_A6A :; } } if (vehicleDamage > 0.5f) { DamageTool.vehiclesInRadius.Clear(); VehicleManager.getVehiclesInRadius(point, num, DamageTool.vehiclesInRadius); for (int num5 = 0; num5 < DamageTool.vehiclesInRadius.Count; num5++) { InteractableVehicle interactableVehicle = DamageTool.vehiclesInRadius[num5]; if (!(interactableVehicle == null) && !interactableVehicle.isDead) { Vector3 vector15 = interactableVehicle.transform.position - point; float magnitude8 = vector15.magnitude; Vector3 vector16 = vector15 / magnitude8; if (magnitude8 > 0.5f) { RaycastHit raycastHit; PhysicsUtility.raycast(new Ray(point, vector16), out raycastHit, magnitude8 - 0.5f, RayMasks.BLOCK_EXPLOSION, 0); if (raycastHit.transform != null && raycastHit.transform != interactableVehicle.transform) { goto IL_B6C; } } VehicleManager.damage(interactableVehicle, vehicleDamage, 1f - magnitude8 / damageRadius, false); } IL_B6C :; } } AlertTool.alert(point, alertRadius); }