public void PlayNote(float scale) { effectP.worldPos = transform.position; effectP.origin = transform.position; effectP.scale = scale; EffectNetwork.Send(effectP); }
public void FireProjectile(BasePlayer player, Vector3 position, Vector3 velocity) { //var item = ItemManager.CreateByName("ammo.rifle.incendiary"); var itemModProjectile = item.info.GetComponent <ItemModProjectile>(); var projectile = itemModProjectile.projectileObject.Get().GetComponent <Projectile>(); //Puts($"itemModProjectile.projectileVelocity: {itemModProjectile.projectileVelocity}"); FiredProjectile firedProjectile = new FiredProjectile { itemDef = item.info, itemMod = itemModProjectile, projectilePrefab = projectile, firedTime = UnityEngine.Time.realtimeSinceStartup, travelTime = 0f, position = position, velocity = velocity, initialPosition = position, initialVelocity = velocity }; Add(firedProjectile); Effect effect = new Effect(); effect.Clear(); effect.Init(global::Effect.Type.Projectile, position, velocity, null); effect.scale = 2; effect.pooledString = itemModProjectile.projectileObject.resourcePath; effect.number = 1; EffectNetwork.Send(effect); }
private void PlayTuneStack() { if (!playingTune) { playingTune = true; } if (nextNote.Pluck) { effectP.worldPos = transform.position; effectP.origin = transform.position; effectP.scale = nextNote.NoteScale; EffectNetwork.Send(effectP); } else { effectS.worldPos = transform.position; effectS.origin = transform.position; effectS.scale = nextNote.NoteScale; EffectNetwork.Send(effectS); } if (tuneToPlay.Count > 0 && enabled) { Invoke("PlayTuneStack", nextNote.Delay); nextNote = tuneToPlay.Pop(); } else { if (!enabled) { tuneToPlay = new Stack <TuneNote>(); } playingTune = false; } }
private object CanLock(BasePlayer player, BaseLock @lock) { if (player == null || @lock == null) { return(null); } if (@lock.IsLocked()) { return(false); } if (playerPrefs.ContainsKey(player.UserIDString) && !playerPrefs[player.UserIDString]) { return(null); } var prefab = @lock.parentEntity.Get(true).ShortPrefabName; if (prefab == null) { return(null); } var codeLock = @lock as CodeLock; foreach (var type in lockableTypes) { if (!prefab.Contains(type)) { continue; } if (!permission.UserHasPermission(player.UserIDString, $"masterkey.{type}")) { return(null); } if (showMessages) { player.ChatMessage(Lang("UnlockedWith", player.UserIDString, type)); } if (logUsage) { Log(Lang("LogLock", null, PlayerName(player), type, player.transform.position)); } if (@lock != null) { @lock.SetFlag(BaseEntity.Flags.Locked, true); } if (player != null && codeLock != null) { EffectNetwork.Send(new Effect(codeLock.effectLocked.resourcePath, player.transform.position, Vector3.zero)); } return(false); } return(null); }
private void SVPlayNote(BaseEntity.RPCMessage msg) { byte num1 = msg.read.UInt8(); float num2 = msg.read.Float(); Effect effect = new Effect(this.soundEffect[(int)num1].resourcePath, (BaseEntity)this, 0U, Vector3.get_zero(), Vector3.get_forward(), msg.connection); effect.scale = (__Null)(double)num2; EffectNetwork.Send(effect); }
public static void Run(string strName, Vector3 posWorld = default(Vector3), Vector3 normWorld = default(Vector3), Connection sourceConnection = null, bool broadcast = false) { if (!string.IsNullOrEmpty(strName)) { reusableInstace.Init(Type.Generic, posWorld, normWorld, sourceConnection); reusableInstace.pooledString = strName; reusableInstace.broadcast = broadcast; EffectNetwork.Send(reusableInstace); } }
public static void Run(string strName, BaseEntity ent, uint boneID, Vector3 posLocal, Vector3 normLocal, Connection sourceConnection = null, bool broadcast = false) { if (!string.IsNullOrEmpty(strName)) { reusableInstace.Init(Type.Generic, ent, boneID, posLocal, normLocal, sourceConnection); reusableInstace.pooledString = strName; reusableInstace.broadcast = broadcast; EffectNetwork.Send(reusableInstace); } }
private void SVPlayNote(BaseEntity.RPCMessage msg) { byte num = msg.read.UInt8(); float single = msg.read.Float(); EffectNetwork.Send(new Effect(this.soundEffect[num].resourcePath, this, 0, Vector3.zero, Vector3.forward, msg.connection) { scale = single }); }
public static void Run( Effect.Type fxtype, Vector3 posWorld, Vector3 normWorld, Connection sourceConnection = null, bool broadcast = false) { Effect.reusableInstace.Init(fxtype, posWorld, normWorld, sourceConnection); Effect.reusableInstace.broadcast = broadcast; EffectNetwork.Send(Effect.reusableInstace); }
private void SendHit(BasePlayer attacker, HitInfo info) { if (info == null || attacker == null || !attacker.IsConnected) { return; } if (_storedData.DisabledUsers.Contains(attacker.userID)) { return; } if (info.HitEntity is BaseNpc && _showNpc) { GuiDisplay(attacker, _colorNpc, info); return; } var victim = info.HitEntity as BasePlayer; if (victim == null) { return; } if (victim == attacker) { return; } if (_useClans && _clansAPI) { if (AreClanMates(attacker.userID, victim.userID)) { GuiDisplay(attacker, _colorClan, info, false, "clans"); if (_useSound) { EffectNetwork.Send(new Effect(_mateSound, attacker.transform.position, Vector3.zero), attacker.net.connection); } return; } } if (_friendAPI && _useFriends && AreFriends(victim.userID.ToString(), attacker.userID.ToString())) { GuiDisplay(attacker, _colorFriend, info, false, "friends"); if (_useSound) { EffectNetwork.Send(new Effect(_mateSound, attacker.transform.position, Vector3.zero), attacker.net.connection); } return; } if (info.isHeadshot) { GuiDisplay(attacker, _colorHead, info, false, "", true); return; } GuiDisplay(attacker, _colorBody, info); }
public static void Run( Effect.Type fxtype, BaseEntity ent, uint boneID, Vector3 posLocal, Vector3 normLocal, Connection sourceConnection = null, bool broadcast = false) { Effect.reusableInstace.Init(fxtype, ent, boneID, posLocal, normLocal, sourceConnection); Effect.reusableInstace.broadcast = broadcast; EffectNetwork.Send(Effect.reusableInstace); }
void DisplayBannerToAll(string reason) { foreach (var player in BasePlayer.activePlayerList) { if (bannerdisplay == true) { string message = string.Empty; if (reason == "spawn") { message = $"{lang.GetMessage("SpawnMsg", this, player.UserIDString)}"; } if (reason == "killed") { message = $"{lang.GetMessage("KilledMsg", this, player.UserIDString)}"; } var CuiElement = new CuiElementContainer(); var PatrolBanner = CuiElement.Add(new CuiPanel { Image = { Color = bannercolor }, RectTransform = { AnchorMin = "0.20 0.85", AnchorMax = "0.80 0.90" }, CursorEnabled = false }); var closeButton = new CuiButton { Button = { Close = PatrolBanner, Color = "0.0 0.0 0.0 0.6" }, RectTransform = { AnchorMin = "0.90 0.01", AnchorMax = "0.99 0.99" }, Text = { Text = "X", FontSize = 20, Align = TextAnchor.MiddleCenter } }; CuiElement.Add(closeButton, PatrolBanner); CuiElement.Add(new CuiLabel { Text = { Text = $"{message}", FontSize = 20, Align = TextAnchor.MiddleCenter, Color = "1.0 1.0 1.0 1" }, RectTransform = { AnchorMin = "0.10 0.10", AnchorMax = "0.90 0.90" } }, PatrolBanner); CuiHelper.AddUi(player, CuiElement); timer.Once(12, () => { CuiHelper.DestroyUi(player, PatrolBanner); }); if (debug == true) { Puts($"BANNER DISPLAYING FOR PLAYER {player.displayName}"); } } if (sound == true) { var sound = new Effect("assets/bundled/prefabs/fx/player/howl.prefab", player, 0, Vector3.zero, Vector3.forward); EffectNetwork.Send(sound, player.net.connection); if (debug == true) { Puts($"PLAYING SOUND FOR PLAYER {player.displayName}"); } } } }
private void CreateProjectileEffectClientside(string prefabName, UnityEngine.Vector3 pos, UnityEngine.Vector3 velocity, int seed, Connection sourceConnection, bool silenced = false, bool forceClientsideEffects = false) { Effect effect = BaseProjectile.reusableInstance; effect.Clear(); effect.Init(Effect.Type.Projectile, pos, velocity, sourceConnection); effect.scale = (silenced ? 0f : 1f); if (forceClientsideEffects) { effect.scale = 2f; } effect.pooledString = prefabName; effect.number = seed; EffectNetwork.Send(effect); }
private void InitializeTimer() { if (AFKTimer != null && !AFKTimer.Destroyed) { AFKTimer.Destroy(); } AFKTimer = timer.Every(Settings.GeneralSettings.StatusRefreshInterval, () => { foreach (var trackedPlayer in TrackedPlayers.Values) { trackedPlayer.CheckPosition(Settings.CompareSettings.CompareRotation); if (trackedPlayer.TimeAFK >= Settings.GeneralSettings.SecondsToAFKStatus && !AFKPlayers.Contains(trackedPlayer.Player)) { AFKPlayers.Add(trackedPlayer.Player); } else if (trackedPlayer.TimeAFK < Settings.GeneralSettings.SecondsToAFKStatus && AFKPlayers.Contains(trackedPlayer.Player)) { AFKPlayers.Remove(trackedPlayer.Player); } if (Settings.NotificationSettings.NotifyPlayer && Settings.GeneralSettings.SecondsToAFKStatus - trackedPlayer.TimeAFK < Settings.NotificationSettings.NotifyPlayerTime) { Messenger(trackedPlayer.Player, true, mnotify); if (Settings.NotificationSettings.NotifyPlayerSound) { var beep = new Effect(); beep.Init(Effect.Type.Generic, trackedPlayer.Player.transform.position, trackedPlayer.Player.transform.forward); beep.pooledString = "assets/prefabs/tools/pager/effects/beep.prefab"; EffectNetwork.Send(beep, trackedPlayer.Player.Connection); } } } }); #if (DEBUG) Puts($"New timer initialized with {Settings.GeneralSettings.StatusRefreshInterval.ToString()} interval. " + $"Notifications are {(Settings.NotificationSettings.NotifyPlayer ? "ON" : "OFF")}. " + $"Sounds are {(Settings.NotificationSettings.NotifyPlayerSound ? "ON" : "OFF")}..."); #endif }
private void OnPlayerInput(BasePlayer player, InputState input) { if (player == null || input == null) { return; } if (input.IsDown(BUTTON.FORWARD) || input.IsDown(BUTTON.BACKWARD) || input.IsDown(BUTTON.LEFT) || input.IsDown(BUTTON.RIGHT)) { try { var activeCamera = player.GetMounted().GetComponentInParent <ComputerStation>() ?? null; if (activeCamera != null) { var cctv = activeCamera.currentlyControllingEnt.Get(true).GetComponent <CCTV_RC>(); if (cctv == null) { return; } if (cctv.IsStatic() && !player.IPlayer.HasPermission(permCCTVAdmin)) { return; } cctv.hasPTZ = true; float x = input.IsDown(BUTTON.RIGHT) ? 1f : (input.IsDown(BUTTON.LEFT) ? -1f : 0f); float y = input.IsDown(BUTTON.FORWARD) ? 1f : (input.IsDown(BUTTON.BACKWARD) ? -1f : 0f); #if DEBUG string lr = input.IsDown(BUTTON.RIGHT) ? "right" : (input.IsDown(BUTTON.LEFT) ? "left" : ""); string ud = input.IsDown(BUTTON.FORWARD) ? "up" : (input.IsDown(BUTTON.BACKWARD) ? "down" : ""); string udlr = ud + lr; Puts($"Trying to move camera {udlr}."); #endif float speed = 0.1f; if (input.IsDown(BUTTON.SPRINT)) { speed *= 3; } InputState inputState = new InputState(); inputState.current.mouseDelta.y = y * speed; inputState.current.mouseDelta.x = x * speed; cctv.UserInput(inputState, player); if (configData.playSound) { Effect effect = new Effect(moveSound, new Vector3(0, 0, 0), Vector3.forward); if (configData.playAtCamera) { effect.worldPos = cctv.transform.position; effect.origin = cctv.transform.position; } else { effect.worldPos = player.transform.position; effect.origin = player.transform.position; } EffectNetwork.Send(effect); } } } catch {} } }
private void playeffect(BasePlayer player, string[] args) { if (player == null) { if (args.Length != 2) { Puts(GetLang("usageExample", null)); return; } string argTarget = args[0]; string effect = args[1]; if (converttoulong(argTarget)) { ulong effectTarget = Convert.ToUInt64(argTarget); BasePlayer finaltarget = BasePlayer.FindByID(effectTarget); if (finaltarget == null) { Puts(GetLang("noPlayerFound", null)); return; } var finaleffect = new Effect(effect, finaltarget, 0, Vector3.zero, Vector3.forward); if (localEffect) { EffectNetwork.Send(finaleffect, finaltarget.net.connection); } else { EffectNetwork.Send(finaleffect); } Puts("Effect ran on " + finaltarget.displayName); return; } } else { if (args.Length != 2) { Player.Reply(player, GetLang("usageExample", player.UserIDString)); return; } string argTarget = args[0]; string effect = args[1]; if (converttoulong(argTarget)) { ulong effectTarget = Convert.ToUInt64(argTarget); BasePlayer finaltarget = BasePlayer.FindByID(effectTarget); if (finaltarget == null) { Player.Reply(player, GetLang("noPlayerFound", player.UserIDString)); return; } var finaleffect = new Effect(effect, finaltarget, 0, Vector3.zero, Vector3.forward); if (localEffect) { EffectNetwork.Send(finaleffect, finaltarget.net.connection); } else { EffectNetwork.Send(finaleffect); } Player.Reply(player, "Effect ran on " + finaltarget.displayName); return; } } }
private void TakePhoto(RPCMessage msg) { BasePlayer player = msg.player; Item item = GetItem(); if (player == null || item == null || item.condition <= 0f) { return; } byte[] array = msg.read.BytesWithSize(); if (array.Length > 102400 || !ImageProcessing.IsValidJPG(array, resolutionX, resolutionY)) { return; } Item item2 = ItemManager.Create(photoItem, 1, 0uL); if (item2 == null) { Debug.LogError("Failed to create photo item"); return; } if (item2.instanceData.subEntity == 0) { item2.Remove(); Debug.LogError("Photo has no sub-entity"); return; } BaseNetworkable baseNetworkable = BaseNetworkable.serverEntities.Find(item2.instanceData.subEntity); if (baseNetworkable == null) { item2.Remove(); Debug.LogError("Sub-entity was not found"); return; } PhotoEntity photoEntity; if ((object)(photoEntity = baseNetworkable as PhotoEntity) == null) { item2.Remove(); Debug.LogError("Sub-entity is not a photo"); return; } photoEntity.SetImageData(player.userID, array); if (!player.inventory.GiveItem(item2)) { item2.Drop(player.GetDropPosition(), player.GetDropVelocity()); } EffectNetwork.Send(new Effect(screenshotEffect.resourcePath, base.transform.position, base.transform.forward, msg.connection)); if (!hasSentAchievement && !string.IsNullOrEmpty("SUMMER_PAPARAZZI")) { Vector3 position = GetOwnerPlayer().eyes.position; Vector3 vector = GetOwnerPlayer().eyes.HeadForward(); List <BasePlayer> obj = Facepunch.Pool.GetList <BasePlayer>(); Vis.Entities(position + vector * 5f, 5f, obj, 131072); foreach (BasePlayer item3 in obj) { if (item3.isServer && item3 != GetOwnerPlayer() && item3.IsVisible(GetOwnerPlayer().eyes.position)) { hasSentAchievement = true; GetOwnerPlayer().GiveAchievement("SUMMER_PAPARAZZI"); break; } } Facepunch.Pool.FreeList(ref obj); } item.LoseCondition(1f); }
void FixedUpdate() { float time = Time.realtimeSinceStartup; if (input.current.buttons != input.previous.buttons && input.current.buttons != 0 && NextTimeToPress < time) { float num_shift = input.WasDown(BUTTON.SPRINT) ? 0.2f : 0; bool Strum = input.WasDown(BUTTON.DUCK); //fx/gestures/guitarstrum NextTimeToPress = time + noteTime; float num = (float)Math.Log((input.current.buttons / 262144), 2) / adjust + num_shift + start; //owner.ChatMessage(num.ToString("N2")); if (float.IsInfinity(num)) { return; } if (num > 7) { num = 7; } else if (num < -2) { num = -2; } if (!Strum) { effectP.worldPos = transform.position; effectP.origin = transform.position; effectP.scale = num; EffectNetwork.Send(effectP); } else { effectS.worldPos = transform.position; effectS.origin = transform.position; effectS.scale = num; EffectNetwork.Send(effectS); } if (Recording) { if (recTune == null) { recTune = new List <TuneNote>(); } if (recTune.Count == 0) { recTune = new List <TuneNote>(); TuneNote curNote = new TuneNote(num, 0f, !Strum); recTune.Add(curNote); nextNoteTime = time; } else { recTune[recTune.Count - 1].Delay = time - nextNoteTime; TuneNote curNote = new TuneNote(num, 0f, !Strum); recTune.Add(curNote); nextNoteTime = time; } } } }
private void CLProject(BaseEntity.RPCMessage msg) { BasePlayer basePlayer = msg.player; if (!this.VerifyClientAttack(basePlayer)) { base.SendNetworkUpdate(BasePlayer.NetworkQueue.Update); return; } if (basePlayer == null) { return; } if (basePlayer.IsHeadUnderwater()) { return; } if (!this.canThrowAsProjectile) { AntiHack.Log(basePlayer, AntiHackType.ProjectileHack, string.Concat("Not throwable (", base.ShortPrefabName, ")")); basePlayer.stats.combat.Log(this, "not_throwable"); return; } Item item = this.GetItem(); if (item == null) { AntiHack.Log(basePlayer, AntiHackType.ProjectileHack, string.Concat("Item not found (", base.ShortPrefabName, ")")); basePlayer.stats.combat.Log(this, "item_missing"); return; } ItemModProjectile component = item.info.GetComponent <ItemModProjectile>(); if (component == null) { AntiHack.Log(basePlayer, AntiHackType.ProjectileHack, string.Concat("Item mod not found (", base.ShortPrefabName, ")")); basePlayer.stats.combat.Log(this, "mod_missing"); return; } ProjectileShoot projectileShoot = ProjectileShoot.Deserialize(msg.read); if (projectileShoot.projectiles.Count != 1) { AntiHack.Log(basePlayer, AntiHackType.ProjectileHack, string.Concat("Projectile count mismatch (", base.ShortPrefabName, ")")); basePlayer.stats.combat.Log(this, "count_mismatch"); return; } basePlayer.CleanupExpiredProjectiles(); foreach (ProjectileShoot.Projectile projectile in projectileShoot.projectiles) { if (!basePlayer.HasFiredProjectile(projectile.projectileID)) { if (!base.ValidateEyePos(basePlayer, projectile.startPos)) { continue; } basePlayer.NoteFiredProjectile(projectile.projectileID, projectile.startPos, projectile.startVel, this, item.info, item); Effect effect = new Effect(); effect.Init(Effect.Type.Projectile, projectile.startPos, projectile.startVel, msg.connection); effect.scale = 1f; effect.pooledString = component.projectileObject.resourcePath; effect.number = projectile.seed; EffectNetwork.Send(effect); } else { AntiHack.Log(basePlayer, AntiHackType.ProjectileHack, string.Concat("Duplicate ID (", projectile.projectileID, ")")); basePlayer.stats.combat.Log(this, "duplicate_id"); } } item.SetParent(null); Interface.CallHook("OnMeleeThrown", basePlayer, item); if (this.canAiHearIt) { float single = 0f; if (component.projectileObject != null) { GameObject gameObject = component.projectileObject.Get(); if (gameObject != null) { Projectile component1 = gameObject.GetComponent <Projectile>(); if (component1 != null) { foreach (DamageTypeEntry damageType in component1.damageTypes) { single += damageType.amount; } } } } if (basePlayer != null) { Sensation sensation = new Sensation() { Type = SensationType.ThrownWeapon, Position = basePlayer.transform.position, Radius = 50f, DamagePotential = single, InitiatorPlayer = basePlayer, Initiator = basePlayer }; Sense.Stimulate(sensation); } } }
private void UnlockBlueprint(BasePlayer player, string itemShortName) { if (player == null) { return; } if (string.IsNullOrEmpty(itemShortName)) { return; } var playerUID = player.userID; var playersToShareWith = new List <BasePlayer>(); if (clansEnabled && (Clans != null || ClansReborn != null) && InClan(playerUID)) { playersToShareWith.AddRange(GetClanMembers(playerUID)); } if (friendsEnabled && Friends != null && HasFriends(playerUID)) { playersToShareWith.AddRange(GetFriends(playerUID)); } if (teamsEnabled && InTeam(playerUID)) { playersToShareWith.AddRange(GetTeamMembers(playerUID)); } foreach (BasePlayer sharePlayer in playersToShareWith) { if (sharePlayer != null) { var blueprintComponent = sharePlayer.blueprints; if (blueprintComponent == null) { return; } var itemDefinition = GetItemDefinition(itemShortName); if (itemDefinition == null) { return; } blueprintComponent.Unlock(itemDefinition); var soundEffect = new Effect("assets/prefabs/deployable/research table/effects/research-success.prefab", sharePlayer.transform.position, Vector3.zero); if (soundEffect == null) { return; } EffectNetwork.Send(soundEffect, sharePlayer.net.connection); } } }
private void CLProject(RPCMessage msg) { BasePlayer player = msg.player; if (!VerifyClientAttack(player)) { SendNetworkUpdate(); } else { if (player == null || player.IsHeadUnderwater()) { return; } if (!canThrowAsProjectile) { AntiHack.Log(player, AntiHackType.ProjectileHack, "Not throwable (" + base.ShortPrefabName + ")"); player.stats.combat.Log(this, "not_throwable"); return; } Item item = GetItem(); if (item == null) { AntiHack.Log(player, AntiHackType.ProjectileHack, "Item not found (" + base.ShortPrefabName + ")"); player.stats.combat.Log(this, "item_missing"); return; } ItemModProjectile component = item.info.GetComponent <ItemModProjectile>(); if (component == null) { AntiHack.Log(player, AntiHackType.ProjectileHack, "Item mod not found (" + base.ShortPrefabName + ")"); player.stats.combat.Log(this, "mod_missing"); return; } ProjectileShoot projectileShoot = ProjectileShoot.Deserialize(msg.read); if (projectileShoot.projectiles.Count != 1) { AntiHack.Log(player, AntiHackType.ProjectileHack, "Projectile count mismatch (" + base.ShortPrefabName + ")"); player.stats.combat.Log(this, "count_mismatch"); return; } player.CleanupExpiredProjectiles(); foreach (ProjectileShoot.Projectile projectile in projectileShoot.projectiles) { if (player.HasFiredProjectile(projectile.projectileID)) { AntiHack.Log(player, AntiHackType.ProjectileHack, "Duplicate ID (" + projectile.projectileID + ")"); player.stats.combat.Log(this, "duplicate_id"); } else if (ValidateEyePos(player, projectile.startPos)) { player.NoteFiredProjectile(projectile.projectileID, projectile.startPos, projectile.startVel, this, item.info, item); Effect effect = new Effect(); effect.Init(Effect.Type.Projectile, projectile.startPos, projectile.startVel, msg.connection); effect.scale = 1f; effect.pooledString = component.projectileObject.resourcePath; effect.number = projectile.seed; EffectNetwork.Send(effect); } } projectileShoot?.Dispose(); item.SetParent(null); Interface.CallHook("OnMeleeThrown", player, item); if (!canAiHearIt) { return; } float num = 0f; if (component.projectileObject != null) { GameObject gameObject = component.projectileObject.Get(); if (gameObject != null) { Projectile component2 = gameObject.GetComponent <Projectile>(); if (component2 != null) { foreach (DamageTypeEntry damageType in component2.damageTypes) { num += damageType.amount; } } } } if (player != null) { Sensation sensation = default(Sensation); sensation.Type = SensationType.ThrownWeapon; sensation.Position = player.transform.position; sensation.Radius = 50f; sensation.DamagePotential = num; sensation.InitiatorPlayer = player; sensation.Initiator = player; Sense.Stimulate(sensation); } } }
private void SendEffect(BasePlayer player, string sound) { var effect = new Effect(sound, player, 0, Vector3.zero, Vector3.forward); EffectNetwork.Send(effect, player.net.connection); }
private void CLProject(BaseEntity.RPCMessage msg) { BasePlayer player = msg.player; if (!this.VerifyClientAttack(player)) { this.SendNetworkUpdate(BasePlayer.NetworkQueue.Update); } else { if (Object.op_Equality((Object)player, (Object)null) || player.IsHeadUnderwater()) { return; } if (!this.canThrowAsProjectile) { AntiHack.Log(player, AntiHackType.ProjectileHack, "Not throwable (" + this.ShortPrefabName + ")"); player.stats.combat.Log((AttackEntity)this, "not_throwable"); } else { Item pickupItem = this.GetItem(); if (pickupItem == null) { AntiHack.Log(player, AntiHackType.ProjectileHack, "Item not found (" + this.ShortPrefabName + ")"); player.stats.combat.Log((AttackEntity)this, "item_missing"); } else { ItemModProjectile component1 = (ItemModProjectile)((Component)pickupItem.info).GetComponent <ItemModProjectile>(); if (Object.op_Equality((Object)component1, (Object)null)) { AntiHack.Log(player, AntiHackType.ProjectileHack, "Item mod not found (" + this.ShortPrefabName + ")"); player.stats.combat.Log((AttackEntity)this, "mod_missing"); } else { ProjectileShoot projectileShoot = ProjectileShoot.Deserialize((Stream)msg.read); if (((List <ProjectileShoot.Projectile>)projectileShoot.projectiles).Count != 1) { AntiHack.Log(player, AntiHackType.ProjectileHack, "Projectile count mismatch (" + this.ShortPrefabName + ")"); player.stats.combat.Log((AttackEntity)this, "count_mismatch"); } else { player.CleanupExpiredProjectiles(); using (List <ProjectileShoot.Projectile> .Enumerator enumerator = ((List <ProjectileShoot.Projectile>)projectileShoot.projectiles).GetEnumerator()) { while (enumerator.MoveNext()) { ProjectileShoot.Projectile current = enumerator.Current; if (player.HasFiredProjectile((int)current.projectileID)) { AntiHack.Log(player, AntiHackType.ProjectileHack, "Duplicate ID (" + (object)(int)current.projectileID + ")"); player.stats.combat.Log((AttackEntity)this, "duplicate_id"); } else if (this.ValidateEyePos(player, (Vector3)current.startPos)) { player.NoteFiredProjectile((int)current.projectileID, (Vector3)current.startPos, (Vector3)current.startVel, (AttackEntity)this, pickupItem.info, pickupItem); Effect effect = new Effect(); effect.Init(Effect.Type.Projectile, (Vector3)current.startPos, (Vector3)current.startVel, msg.connection); effect.scale = (__Null)1.0; effect.pooledString = component1.projectileObject.resourcePath; effect.number = current.seed; EffectNetwork.Send(effect); } } } pickupItem.SetParent((ItemContainer)null); Interface.CallHook("OnMeleeThrown", (object)player, (object)pickupItem); if (!this.canAiHearIt) { return; } float num = 0.0f; if (component1.projectileObject != null) { GameObject gameObject = component1.projectileObject.Get(); if (Object.op_Inequality((Object)gameObject, (Object)null)) { Projectile component2 = (Projectile)gameObject.GetComponent <Projectile>(); if (Object.op_Inequality((Object)component2, (Object)null)) { foreach (DamageTypeEntry damageType in component2.damageTypes) { num += damageType.amount; } } } } if (!Object.op_Inequality((Object)player, (Object)null)) { return; } Sense.Stimulate(new Sensation() { Type = SensationType.ThrownWeapon, Position = ((Component)player).get_transform().get_position(), Radius = 50f, DamagePotential = num, InitiatorPlayer = player, Initiator = (BaseEntity)player }); } } } } } }