Beispiel #1
0
        public sealed override void PostRemoveNotification(Thing thing, Thing newParent, int index, CylinderLinks link = CylinderLinks.Owner)
        {
            if (link == CylinderLinks.Owner)
            {
                //calling movement scripts
                //g_moveEvents->onPlayerDeEquip(this, thing->getItem(), static_cast<slots_t>(index)); //TODO: SCRIPTING
            }

            bool requireListUpdate = true;

            if (link == CylinderLinks.Owner || link == CylinderLinks.TopParent)
            {
                Item i = newParent as Item;

                if (i != null)
                {
                    requireListUpdate = i.GetHoldingPlayer() != this;
                }
                else
                {
                    requireListUpdate = newParent != this;
                }

                UpdateInventoryWeight();
                UpdateItemsLight();
                SendStats();
            }

            Item item = thing as Item;

            if (item != null)
            {
                Container container    = item as Container;
                Container topContainer = null;

                if (container != null)
                {
                    if (container.IsRemoved() || !Position.AreInRange(GetPosition(), container.GetPosition(), 1, 1, 0))
                    {
                        AutoCloseContainers(container);
                    }
                    else if (container.GetTopParent() == this)
                    {
                        OnSendContainer(container);
                    }
                    else if ((topContainer = container.GetTopParent() as Container) != null)
                    {
                        DepotChest depot = topContainer as DepotChest;
                        if (depot != null)
                        {
                            bool isOwner = false;

                            foreach (KeyValuePair <uint, DepotChest> depotChest in DepotChests)
                            {
                                if (depotChest.Value == depot)
                                {
                                    isOwner = true;
                                    OnSendContainer(container);
                                }
                            }

                            if (!isOwner)
                            {
                                AutoCloseContainers(container);
                            }
                        }
                        else
                        {
                            OnSendContainer(container);
                        }
                    }
                    else
                    {
                        AutoCloseContainers(container);
                    }
                }

                if (ShopOwner != null && requireListUpdate)
                {
                    //UpdateSaleShopList(item); TODO: SALE SHOP
                }
            }
        }
Beispiel #2
0
        public override void PostRemoveNotification(Thing thing, Thing newParent, int index, CylinderLinks link = CylinderLinks.Owner)
        {
            Thing parent = GetParent();

            if (parent != null)
            {
                parent.PostRemoveNotification(thing, newParent, index, CylinderLinks.Parent);
            }
        }
Beispiel #3
0
        public sealed override void PostAddNotification(Thing thing, Thing oldParent, int index, CylinderLinks link = CylinderLinks.Owner)
        {
            HashSet <Creature> list = new HashSet <Creature>();

            Map.GetSpectators(ref list, GetPosition(), true, true);
            foreach (Player spectator in list)
            {
                spectator.PostAddNotification(thing, oldParent, index, CylinderLinks.Near);
            }

            //add a reference to this item, it may be deleted after being added (mailbox for example)
            Creature creature = thing as Creature;
            Item     item;

            if (creature != null)
            {
                creature.IncrementReferenceCounter();
                item = null;
            }
            else
            {
                item = thing as Item;
                if (item != null)
                {
                    item.IncrementReferenceCounter();
                }
            }

            if (link == CylinderLinks.Owner)
            {
                if (Flags.HasFlag(TileFlags.Teleport))
                {
                    Teleport teleport = GetTeleportItem();
                    if (teleport != null)
                    {
                        teleport.AddThing(thing);
                    }
                }
                else if (Flags.HasFlag(TileFlags.TrashHolder))
                {
                    TrashHolder trashholder = GetTrashHolder();
                    if (trashholder != null)
                    {
                        trashholder.AddThing(thing);
                    }
                }
                else if (Flags.HasFlag(TileFlags.MailBox))
                {
                    Mailbox mailbox = GetMailbox();
                    if (mailbox != null)
                    {
                        mailbox.AddThing(thing);
                    }
                }

                //calling movement scripts TODO: Scripting
                //if (creature != null)
                //{
                //    g_moveEvents->onCreatureMove(creature, this, oldParent ? oldParent->getPosition() : getPosition(), MOVE_EVENT_STEP_IN);
                //}
                //else if (item)
                //{
                //    g_moveEvents->onItemMove(item, this, true);
                //}
            }

            //release the reference to this item onces we are finished
            if (creature != null)
            {
                Game.ReleaseCreature(creature);
            }
            else if (item != null)
            {
                Game.ReleaseItem(item);
            }
        }
Beispiel #4
0
        public sealed override void PostRemoveNotification(Thing thing, Thing newParent, int index, CylinderLinks link = CylinderLinks.Owner)
        {
            HashSet <Creature> list = new HashSet <Creature>();

            Map.GetSpectators(ref list, GetPosition(), true, true);

            if (GetThingCount() > 8)
            {
                OnUpdateTile(list);
            }

            foreach (Player spectator in list)
            {
                spectator.PostRemoveNotification(thing, newParent, index, CylinderLinks.Near);
            }

            //calling movement scripts
            Creature creature = thing as Creature;

            if (creature != null)
            {
                //g_moveEvents->onCreatureMove(creature, this, GetPosition(), MOVE_EVENT_STEP_OUT); //TODO: SCRIPTING
            }
            else
            {
                Item item = thing as Item;
                if (item != null)
                {
                    //g_moveEvents->onItemMove(item, this, false); //TODO: SCRIPTING
                }
            }
        }
Beispiel #5
0
 public virtual void PostRemoveNotification(Thing thing, Thing newParent, int index, CylinderLinks link = CylinderLinks.Owner)
 {
 }
Beispiel #6
0
 public virtual void PostAddNotification(Thing thing, Thing oldParent, int index, CylinderLinks link = CylinderLinks.Owner)
 {
 }