/// <summary> Applies this weapon to the given player, and sets up necessary state. </summary> public virtual void Enable(Player p) { if (!hookedEvents) { OnPlayerClickEvent.Register(PlayerClickCallback, Priority.Low); OnBlockChangingEvent.Register(BlockChangingCallback, Priority.Low); hookedEvents = true; } this.p = p; p.ClearBlockchange(); p.weapon = this; if (p.Supports(CpeExt.PlayerClick)) { p.Message(Name + " engaged, click to fire at will"); } else { p.Message(Name + " engaged, fire at will"); p.aiming = true; aimer = new AimBox(); aimer.Hook(p); } }
protected override void UnhookEventHandlers() { OnPlayerDeathEvent.Unregister(HandlePlayerDeath); OnPlayerChatEvent.Unregister(HandlePlayerChat); OnPlayerCommandEvent.Unregister(HandlePlayerCommand); OnBlockChangingEvent.Unregister(HandleBlockChanging); OnPlayerSpawningEvent.Unregister(HandlePlayerSpawning); OnTabListEntryAddedEvent.Unregister(HandleTabListEntryAdded); OnSentMapEvent.Unregister(HandleSentMap); OnJoinedLevelEvent.Unregister(HandleJoinedLevel); base.UnhookEventHandlers(); }
protected override void HookEventHandlers() { OnPlayerDeathEvent.Register(HandlePlayerDeath, Priority.High); OnPlayerChatEvent.Register(HandlePlayerChat, Priority.High); OnPlayerCommandEvent.Register(HandlePlayerCommand, Priority.High); OnBlockChangingEvent.Register(HandleBlockChanging, Priority.High); OnPlayerSpawningEvent.Register(HandlePlayerSpawning, Priority.High); OnTabListEntryAddedEvent.Register(HandleTabListEntryAdded, Priority.High); OnSentMapEvent.Register(HandleSentMap, Priority.High); OnJoinedLevelEvent.Register(HandleJoinedLevel, Priority.High); base.HookEventHandlers(); }
protected override void UnhookEventHandlers() { OnEntitySpawnedEvent.Unregister(HandleEntitySpawned); OnTabListEntryAddedEvent.Unregister(HandleTabListEntryAdded); OnMoneyChangedEvent.Unregister(HandleMoneyChanged); OnBlockChangingEvent.Unregister(HandleBlockChanging); OnSendingModelEvent.Unregister(HandleSendingModel); OnPlayerConnectEvent.Unregister(HandlePlayerConnect); OnPlayerMoveEvent.Unregister(HandlePlayerMove); OnPlayerSpawningEvent.Unregister(HandlePlayerSpawning); OnJoinedLevelEvent.Unregister(HandleJoinedLevel); OnPlayerChatEvent.Unregister(HandlePlayerChat); OnGettingCanSeeEntityEvent.Unregister(HandleCanSeeEntity); base.UnhookEventHandlers(); }
protected override void HookEventHandlers() { OnEntitySpawnedEvent.Register(HandleEntitySpawned, Priority.High); OnTabListEntryAddedEvent.Register(HandleTabListEntryAdded, Priority.High); OnMoneyChangedEvent.Register(HandleMoneyChanged, Priority.High); OnBlockChangingEvent.Register(HandleBlockChanging, Priority.High); OnSendingModelEvent.Register(HandleSendingModel, Priority.High); OnPlayerConnectEvent.Register(HandlePlayerConnect, Priority.High); OnPlayerMoveEvent.Register(HandlePlayerMove, Priority.High); OnPlayerSpawningEvent.Register(HandlePlayerSpawning, Priority.High); OnJoinedLevelEvent.Register(HandleJoinedLevel, Priority.High); OnPlayerChatEvent.Register(HandlePlayerChat, Priority.High); OnGettingCanSeeEntityEvent.Register(HandleCanSeeEntity, Priority.High); base.HookEventHandlers(); }
public void HandleManualChange(ushort x, ushort y, ushort z, bool placing, BlockID block, bool checkPlaceDist) { BlockID old = level.GetBlock(x, y, z); if (old == Block.Invalid) { return; } if (jailed || frozen || possessed) { RevertBlock(x, y, z); return; } if (!agreed) { Message(mustAgreeMsg); RevertBlock(x, y, z); return; } if (level.IsMuseum && Blockchange == null) { return; } bool deletingBlock = !painting && !placing; if (Unverified) { Authenticator.Current.RequiresVerification(this, "modify blocks"); RevertBlock(x, y, z); return; } if (LSGame.Instance.Running && LSGame.Instance.Map == level && LSGame.Instance.IsPlayerDead(this)) { Message("You are out of the round, and cannot build."); RevertBlock(x, y, z); return; } if (ClickToMark && DoBlockchangeCallback(x, y, z, block)) { return; } bool cancel = false; OnBlockChangingEvent.Call(this, x, y, z, block, placing, ref cancel); if (cancel) { return; } if (old >= Block.Air_Flood && old <= Block.Door_Air_air) { Message("Block is active, you cannot disturb it."); RevertBlock(x, y, z); return; } if (!deletingBlock) { PhysicsArgs args = level.foundInfo(x, y, z); if (args.HasWait) { return; } } if (Rank == LevelPermission.Banned) { return; } if (checkPlaceDist) { int dx = Pos.BlockX - x, dy = Pos.BlockY - y, dz = Pos.BlockZ - z; int diff = (int)Math.Sqrt(dx * dx + dy * dy + dz * dz); if (diff > ReachDistance + 4) { Logger.Log(LogType.Warning, "{0} attempted to build with a {1} distance offset", name, diff); Message("You can't build that far away."); RevertBlock(x, y, z); return; } } if (!CheckManualChange(old, deletingBlock)) { RevertBlock(x, y, z); return; } BlockID raw = placing ? block : Block.Air; block = BlockBindings[block]; if (ModeBlock != Block.Invalid) { block = ModeBlock; } BlockID newB = deletingBlock ? Block.Air : block; ChangeResult result; if (old == newB) { // Ignores updating blocks that are the same and revert block back only to the player result = ChangeResult.Unchanged; } else if (deletingBlock) { result = DeleteBlock(old, x, y, z); } else if (!CommandParser.IsBlockAllowed(this, "place", block)) { // Not allowed to place new block result = ChangeResult.Unchanged; } else { result = PlaceBlock(old, x, y, z, block); } if (result != ChangeResult.Modified) { // Client always assumes that the place/delete succeeds // So if actually didn't, need to revert to the actual block if (!Block.VisuallyEquals(raw, old)) { RevertBlock(x, y, z); } } OnBlockChangedEvent.Call(this, x, y, z, result); }