Example #1
0
        /// <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);
            }
        }
Example #2
0
        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();
        }
Example #3
0
        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();
        }
Example #4
0
        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();
        }
Example #5
0
        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();
        }
Example #6
0
        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);
        }