public override void Spawn(String map, Vec3f position, Vec3f direction)
        {
            this.Map       = map;
            this.Position  = position;
            this.Direction = direction;

            spawned = true;

            if (this.Address != 0)
            {
                return;
            }

            if (this.Map != Player.Hero.Map)
            {
                return;
            }
            Process process = Process.ThisProcess();
            oCNpc   npc     = oCObjectFactory.GetFactory(process).CreateNPC("OTHERS_NPC");

            this.Address = npc.Address;
            sWorld.SpawnedVobDict.Add(npc.Address, this);

            if (npc.MagBook == null || npc.MagBook.Address == 0)
            {
                npc.MagBook = oCMag_Book.Create(process);
                npc.MagBook.SetOwner(npc);
            }


            setHideNames(this.hideName);

            for (int i = 0; i < this.Attributes.Length; i++)
            {
                npc.setAttributes((byte)i, this.Attributes[i]);
            }

            for (int i = 0; i < this.TalentSkills.Length; i++)
            {
                npc.SetTalentSkill(i, this.TalentSkills[i]);
            }
            for (int i = 0; i < this.TalentValues.Length; i++)
            {
                npc.SetTalentValue(i, this.TalentValues[i]);
            }
            for (int i = 0; i < this.Hitchances.Length; i++)
            {
                npc.SetHitChances(i, this.Hitchances[i]);
            }

            npc.SetVisual(this.Visual);
            npc.SetAdditionalVisuals(BodyMesh, bodyTex, skinColor, HeadMesh, headTex, teethTex, -1);



            //npc.HumanAI = new oCAiHuman(process, 0);
            //npc.AniCtrl = new oCAniCtrl_Human(process, 0);



            this.setDirection(direction);
            //Enable(Position);



            foreach (Item it in itemList)
            {
                this.addItemToContainer(it);
            }
            foreach (Item it in EquippedList)
            {
                if (!it.ItemInstance.MainFlags.HasFlag(MainFlags.ITEM_KAT_ARMOR) && !it.ItemInstance.MainFlags.HasFlag(MainFlags.ITEM_KAT_FF) && !it.ItemInstance.MainFlags.HasFlag(MainFlags.ITEM_KAT_NF))
                {
                    hNpc.blockSendEquip = true;
                    npc.Equip(new oCItem(process, it.Address));
                }
            }
            //if (this.Armor != null)
            //    setArmor(this.Armor);
            if (this.Weapon != null)
            {
                setWeapon(this.Weapon);
            }
            if (this.RangeWeapon != null)
            {
                setRangeWeapon(this.RangeWeapon);
            }

            for (int i = 0; i < Slots.Length; i++)
            {
                if (Slots[i] != null)
                {
                    setSlotItem(i, Slots[i]);
                }
            }

            foreach (String act in Overlays)
            {
                zString overlayStr = zString.Create(process, act);
                npc.ApplyOverlay(overlayStr);
                overlayStr.Dispose();
            }



            setScale(this.Scale);
            setFatness(this.Fatness);
            setWeaponMode(this.WeaponMode);

            if (enabled)
            {
                Enable(this.Position);
            }

            this.setInvisible(this.IsInvisible);
        }