예제 #1
0
 public static void Buy(UserCharacter u, int store_no, int item_no, int number)
 {
     if (List.ContainsKey(store_no))
     {
         Store storeData = List[store_no];
         if (number <= 0)
         {
             u.userData.clientData.SendPacket(Packet.Dialog(0, "구매 불가", "구매 개수를 정확히 입력해주세요.")); return;
         }
         if (storeData.Items[item_no].number >= number || storeData.Items[item_no].number == -1)
         {
             int gold = storeData.Items[item_no].price * number;
             if (u.gold >= gold)
             {
                 if (storeData.Items[item_no].number != -1)
                 {
                     storeData.Items[item_no].number -= number;
                 }
                 u.loseGold(gold);
                 Command.gainItem(u, storeData.Items[item_no].item_no, number);
                 u.userData.clientData.SendPacket(Packet.StoreItem(storeData, storeData.Items[item_no]));
                 u.userData.clientData.SendPacket(Packet.Dialog(0, "구매 완료", $"{Item.Items[storeData.Items[item_no].item_no].name} 아이템을 {number}개 구매했습니다."));
             }
             else
             {
                 u.userData.clientData.SendPacket(Packet.Dialog(0, "구매 불가", "보유 금액이 부족합니다."));
             }
         }
         else
         {
             u.userData.clientData.SendPacket(Packet.Dialog(0, "구매 불가", "상점의 아이템 개수가 부족합니다."));
         }
     }
 }
예제 #2
0
        public static Hashtable CharacterCreate(UserCharacter c)
        {
            Hashtable msg = new Hashtable();

            msg.Add("part", CHARACTER_CREATE);
            msg.Add("no", c.no);
            msg.Add("name", c.name);
            msg.Add("str", c.str);
            msg.Add("dex", c.dex);
            msg.Add("int", c.Int);
            msg.Add("luk", c.luk);
            msg.Add("maxhp", c.maxhp);
            msg.Add("hp", c.hp);
            msg.Add("maxmp", c.maxmp);
            msg.Add("mp", c.mp);
            msg.Add("move_speed", c.move_speed);
            msg.Add("level", c.level);
            msg.Add("x", c.x);
            msg.Add("y", c.y);
            msg.Add("dir", c.direction);
            msg.Add("image", c.image);
            msg.Add("mapid", c.mapid);

            return(msg);
        }
예제 #3
0
        public static void gainItem(UserCharacter u, int item_no, int num)
        {
            Item item = Item.Items[item_no];

            if (item.type == 0)
            {
                string field, values;
                field   = "item_no,max_ability,ability,trade,sell,`use`,`character`";
                values  = $"'{item.no}','{item.max_ability}','{item.ability}',";
                values += $"'{(item.trade ? 1 : 0)}','{(item.sell ? 1 : 0)}','{(item.use ? 1 : 0)}','{u.name}'";
                DataTable rs;
                Item      obj;
                for (int i = 0; i < num; i++)
                {
                    Mysql.Query($"INSERT INTO storage_equipment ({field}) VALUES ({values})");

                    rs = Mysql.Query($"SELECT * FROM storage_equipment WHERE `character` = '{u.name}'");
                    Mysql.Query($"UPDATE storage_equipment SET `character` = '' WHERE no = '{rs.Rows[0]["no"]}'");
                    obj = new Item(rs.Rows[0], item);
                    Item.Equipments.Add(obj.no, obj);

                    u.gainItem(obj, 0);
                }
            }
            else
            {
                u.gainItem(item, num);
            }
        }
예제 #4
0
        // 드랍아이템을 획득합니다.
        public void gainDropItem(UserCharacter u, int index)
        {
            DropItem item = DropItems[index];

            item.gain(u);
            deleteDropItem(index);
        }
예제 #5
0
        public static Hashtable SelectCharacter(UserCharacter c)
        {
            Hashtable msg = new Hashtable();

            msg.Add("part", USER_SELECT_CHARACTER);
            msg.Add("name", c.name);
            msg.Add("map_id", c.mapid);
            msg.Add("map_x", c.x);
            msg.Add("map_y", c.y);
            msg.Add("direction", c.direction);
            msg.Add("image", c.image);
            msg.Add("exp", c.exp);
            msg.Add("gold", c.gold);
            msg.Add("maxexp", Exp.getLevel(c.level));
            msg.Add("level", c.level);
            msg.Add("maxhp", c.maxhp);
            msg.Add("maxmp", c.maxmp);
            msg.Add("hp", c.hp);
            msg.Add("mp", c.mp);
            msg.Add("str", c.str);
            msg.Add("dex", c.dex);
            msg.Add("int", c.Int);
            msg.Add("luk", c.luk);
            msg.Add("point", c.point);
            return(msg);
        }
예제 #6
0
        public static void Show(UserCharacter u, int no)
        {
            Store storeData = List[no];

            foreach (StoreItem item in storeData.Items.Values)
            {
                u.userData.clientData.SendPacket(Packet.StoreItem(storeData, item));
            }
        }
예제 #7
0
        public static Hashtable DeleteCharacter(UserCharacter c)
        {
            Hashtable msg = new Hashtable();

            msg.Add("part", CHARACTER_DELETE);
            msg.Add("name", c.name);

            return(msg);
        }
예제 #8
0
        public static Hashtable CharacterAnimation(UserCharacter u, int id)
        {
            Hashtable msg = new Hashtable();

            msg.Add("part", CHARACTER_ANIMATION);
            msg.Add("id", id);
            msg.Add("name", u.name);
            return(msg);
        }
예제 #9
0
        public static Hashtable CharacterDamage(UserCharacter u, string damage, bool critical = false)
        {
            Hashtable msg = new Hashtable();

            msg.Add("part", CHARACTER_DAMAGE);
            msg.Add("damage", damage);
            msg.Add("name", u.name);
            msg.Add("maxhp", u.maxhp);
            msg.Add("hp", u.hp);
            msg.Add("cri", critical ? 1 : 0);
            return(msg);
        }
예제 #10
0
        public static Hashtable Move(UserCharacter c)
        {
            Hashtable msg = new Hashtable();

            msg.Add("part", CHARACTER_MOVE);
            msg.Add("name", c.name);
            msg.Add("x", c.x);
            msg.Add("y", c.y);
            msg.Add("dir", c.direction);
            msg.Add("image", c.image);
            msg.Add("mapid", c.fieldData.mapid);
            return(msg);
        }
예제 #11
0
        // 필드의 NPC들을 해당 유저에게 로드합니다.
        public bool loadNPC(UserCharacter u)
        {
            if (!Users.ContainsKey(u.no))
            {
                return(false);
            }
            foreach (NPC obj in Map.Maps[mapid].npcData.Values)
            {
                u.userData.clientData.SendPacket(Packet.NPCCreate(obj));
            }

            return(true);
        }
예제 #12
0
 // Skill Book
 public static bool LearnCharacterSkill(UserCharacter u, Item item, int value)
 {
     if (!u.Skills.ContainsKey(Skill.Skills[value]))
     {
         u.learnSkill(Skill.Skills[value]);
     }
     else
     {
         u.userData.clientData.SendPacket(Packet.Dialog(0, "아이템 사용 불가", "이미 배운 스킬입니다."));
         return(false);
     }
     return(true);
 }
예제 #13
0
        // 필드의 몬스터들을 해당 유저에게 로드합니다.
        public bool loadEnemy(UserCharacter u)
        {
            if (!Users.ContainsKey(u.no))
            {
                return(false);
            }
            foreach (Enemy obj in Enemies)
            {
                u.userData.clientData.SendPacket(Packet.EnemyCreate(obj));
            }

            return(true);
        }
예제 #14
0
        // 필드의 드랍아이템들을 해당 유저에게 로드합니다.
        public bool loadDropItem(UserCharacter u)
        {
            if (!Users.ContainsKey(u.no))
            {
                return(false);
            }
            foreach (DropItem obj in DropItems.Values)
            {
                u.userData.clientData.SendPacket(Packet.DropItemCreate(obj));
            }

            return(true);
        }
예제 #15
0
        public static void gainItem(UserCharacter u, DropItem dropitem)
        {
            Item item;
            Item obj;

            if (dropitem.trash && dropitem.dropData.item_type == 0)
            {
                item = Item.Equipments[dropitem.dropData.item_no];
            }
            else
            {
                item = Item.Items[dropitem.dropData.item_no];
            }
            if (item.type == 0)
            {
                if (!dropitem.trash)
                {
                    DataTable rs;
                    Mysql.Query($"INSERT INTO storage_equipment ({dropitem.field}) VALUES ({dropitem.values})");

                    // 아이템 재 로드하여 no 번호 추출 및 캐릭터, 변수 업데이트
                    rs = Mysql.Query($"SELECT * FROM storage_equipment WHERE `character` = '{u.name}'");
                    Mysql.Query($"UPDATE storage_equipment SET `character` = '' WHERE no = '{rs.Rows[0]["no"]}'");

                    obj = new Item(rs.Rows[0], item);
                    Item.Equipments.Add(obj.no, obj);

                    // 실제 인벤토리에 추가
                    u.gainItem(obj, 0);
                }
                else
                {
                    obj = Item.Equipments[dropitem.dropData.item_no];
                    u.gainItem(obj, 0);
                }
            }
            else
            {
                if (!dropitem.trash)
                {
                    u.gainItem(item, 1);
                }
                else
                {
                    obj = Item.Items[dropitem.dropData.item_no];
                    u.gainItem(obj, dropitem.number);
                }
            }
        }
예제 #16
0
 // 필드의 유저들을 해당 유저에게 로드합니다.
 public bool loadUser(UserCharacter u)
 {
     if (!Users.ContainsKey(u.no))
     {
         return(false);
     }
     foreach (UserCharacter c in Users.Values)
     {
         if (c == u)
         {
             continue;
         }
         u.userData.clientData.SendPacket(Packet.CharacterCreate(c));
     }
     return(true);
 }
예제 #17
0
 // 필드에 해당 유저를 입장시킵니다.
 public bool join(UserCharacter u, int _x, int _y)
 {
     if (Users.ContainsKey(u.no))
     {
         return(false);
     }
     AllSendPacket(Packet.CharacterCreate(u));
     u.FieldData = this;
     Users.Add(u.no, u);
     u.moveto(_x, _y, u.direction);
     loadUser(u);
     loadNPC(u);
     loadEnemy(u);
     loadDropItem(u);
     return(true);
 }
예제 #18
0
 public void startEvent(UserCharacter u)
 {
     if (!u.isMessage)
     {
         u.isMessage = true;
         u.page      = default_action;
         u.npcData   = this;
     }
     if (u.page != 0)
     {
         Actions[u.page].start(u);
     }
     else
     {
         u.resetMessage();
     }
 }
예제 #19
0
 // 포탈(장소이동) 판정
 public bool portal(UserCharacter u)
 {
     if (Users.ContainsKey(u.no))
     {
         Map map = Map.Maps[mapid];
         // 포탈 판정
         if (map.portalData.ContainsKey($"{u.x},{u.y}"))
         {
             Portal portal = map.portalData[$"{u.x},{u.y}"];
             // 이동시키기
             leave(u.no);
             Map.Maps[portal.move_mapid].Fields[0].join(u, portal.move_x, portal.move_y);
             return(true);
         }
     }
     return(false);
 }
예제 #20
0
 public void active(UserCharacter u)
 {
     if (!IsActive && wait_time == 0)
     {
         IsActive = true;
         count    = skillData.count;
         delay    = 0;
         // MP 깎아야됨
         if (!Skill.userData.ContainsKey(u.no))
         {
             Skill.userData.Add(u.no, u);
         }
     }
     else
     {
         // 대기중 또는 사용중
     }
 }
예제 #21
0
        // Function
        public static void attack(UserCharacter u, UserSkill skill)
        {
            int damage = Convert.ToInt32(skill.skillData.power + skill.level * skill.skillData.level_power + (u.Int + Command.rand.Next(u.luk)) * skill.skillData.power_factor);

            u.animation(skill.skillData.use_animation);
            foreach (Enemy c in u.fieldData.Enemies)
            {
                if (c.IsDead)
                {
                    continue;
                }
                if (IsRange(skill.skillData.range_type, skill.skillData.range, u, c))
                {
                    c.animation(skill.skillData.target_animation);
                    c.damage(damage.ToString(), false, u);
                }
            }
        }
예제 #22
0
        public static Hashtable CharacterStatusUpdate(UserCharacter u)
        {
            Hashtable msg = new Hashtable();

            msg.Add("part", CHARACTER_STATUS);
            msg.Add("exp", u.exp);
            msg.Add("gold", u.gold);
            msg.Add("maxexp", Exp.getLevel(u.level));
            msg.Add("level", u.level);
            msg.Add("maxhp", u.maxhp);
            msg.Add("maxmp", u.maxmp);
            msg.Add("hp", u.hp);
            msg.Add("mp", u.mp);
            msg.Add("str", u.str);
            msg.Add("dex", u.dex);
            msg.Add("int", u.Int);
            msg.Add("luk", u.luk);
            msg.Add("point", u.point);
            return(msg);
        }
예제 #23
0
        public void loadCharacter()
        {
            int           index = 0;
            UserCharacter _char;

            characters = new Dictionary <int, UserCharacter>();
            DataTable u = Mysql.Query($"SELECT * FROM user_character WHERE user_no ='{no}'");

            if (u == null)
            {
                return;
            }
            foreach (DataRow c in u.Rows)
            {
                _char = new UserCharacter(this, index);
                _char.loadData(c);
                characters.Add(index, _char);
                index++;
            }
        }
예제 #24
0
        public static void Sell(UserCharacter u, Item item, int number)
        {
            if (item.type != 0 && number == 0)
            {
                u.userData.clientData.SendPacket(Packet.Dialog(0, "판매 불가", "판매 개수를 정확히 입력해주세요.")); return;
            }

            if (u.Inventory[item].number >= number)
            {
                int gold = number == 0 ? item.price : item.price * number;
                u.gainGold(gold);
                u.loseItem(item, number);
                u.userData.clientData.SendPacket(Packet.Dialog(0, "판매 완료", $"아이템을 {gold}골드에 판매하였습니다."));
                if (item.type == 0)
                {
                    Mysql.Query($"DELETE FROM storage_equipment WHERE no = '{item.no}'");
                    Item.Equipments.Remove(item.no);
                }
            }
            else
            {
                u.userData.clientData.SendPacket(Packet.Dialog(0, "판매 불가", "아이템의 개수를 확인해주세요."));
            }
        }
예제 #25
0
 public static void testFunction(UserCharacter u, NPC npcData)
 {
     Msg.Info(u.name);
     Msg.Info(npcData.name);
 }
예제 #26
0
 // Recovery Value
 public static bool RecoveryHpValue(UserCharacter u, Item item, int value)
 {
     u.animation(item.animation_id);
     u.damage((-value).ToString(), false);
     return(true);
 }
예제 #27
0
 public static bool RecoveryAllRate(UserCharacter u, Item item, int value)
 {
     return(true);
 }
예제 #28
0
 // Enemy
 public static bool addEnemy(UserCharacter u, Item item, int value)
 {
     u.fieldData.addEnemy(value, u.x, u.y - 1);
     return(true);
 }
예제 #29
0
 public void gain(UserCharacter u)
 {
     values += $"'{u.name}'";
     Command.gainItem(u, this);
     u.userData.clientData.SendPacket(Packet.EventTrigger());
 }
예제 #30
0
 public static void Dead(Enemy e, UserCharacter u)
 {
     // delegate 호출
     DelegateQuestEvent?.Invoke(e, u);
 }