示例#1
0
 public void SetStep(SagaDB.Quest.Step s)
 {
     this.PutUInt(s.ID, 8);
     this.PutByte(2, 12);
     this.PutUInt(s.nextStep, 13);
     this.PutByte(s.Status, 17);
 }
示例#2
0
 public static Weapon GetActiveWeapon(SagaDB.Actors.ActorPC pc)
 {
     foreach (Weapon w in pc.Weapons)
     {
         if (w.active == 1) return w;
     }
     Weapon nw = new Weapon();
     nw.type = 0;
     return nw;
 }
示例#3
0
 public void SetActorInfo(SagaDB.Actors.ActorPC pc)
 {
     this.PutByte((byte)(pc.mapID + 0x65), 9);//Unknown
     this.PutByte((byte)(pc.Race), 10);
     this.PutByte(pc.mapID, 11);
     this.PutUShort(pc.maxHP, 12);
     this.PutUShort(pc.HP, 14);
     this.PutUShort(pc.maxSP, 16);
     this.PutUShort(pc.SP, 18);
     this.PutByte(pc.LP, 20);//Unknown
     this.PutByte((byte)pc.cLevel, 21);
     this.PutByte((byte)pc.job, 22);
     this.PutByte((byte)pc.jLevel, 23);
 }
示例#4
0
 private static void UpdateQuestItemSub(ActorPC pc, SagaDB.Quest.Quest quest,bool maploaded)
 {
     ActorEventHandlers.PC_EventHandler eh = (SagaMap.ActorEventHandlers.PC_EventHandler)pc.e;
     if (quest == null) return;
     if (!QuestItem.ContainsKey(quest.ID)) return;
     foreach (uint i in quest.Steps.Keys)
     {
         if (GetQuestStepStatus(pc, quest.ID, i) == 1)
         {
             if (!QuestItem[quest.ID].ContainsKey(i)) return;
             bool completed = true;
             SagaDB.Quest.Step step = quest.Steps[i];
             foreach (questI q in QuestItem[quest.ID][i])
             {
                 List<SagaDB.Items.Item> l = pc.inv.GetInventoryList();
                 if (step.SubSteps == null)
                 {
                     step.SubSteps = new Dictionary<byte, byte>();
                 }
                 if (!step.SubSteps.ContainsKey(q.SubSID))
                     step.SubSteps.Add(q.SubSID, 0);
                 foreach (SagaDB.Items.Item j in l)
                 {
                     if (j.id == q.id)
                     {
                         if (step.SubSteps[q.SubSID] >= q.ammount)
                         {
                             if (maploaded)
                             {
                                 Packets.Server.UpdateQuestSubStep p2 = new SagaMap.Packets.Server.UpdateQuestSubStep();
                                 p2.SetQuestID(quest.ID);
                                 p2.SetStep(i);
                                 if (q.SubSID != 0) p2.SetSubStep((byte)(q.SubSID - 1));
                                 p2.SetAmmount(j.stack);
                                 eh.C.netIO.SendPacket(p2, eh.C.SessionID);
                             }
                             continue;
                         }
                         Packets.Server.UpdateQuestSubStep p1 = new SagaMap.Packets.Server.UpdateQuestSubStep();
                         p1.SetQuestID(quest.ID);
                         p1.SetStep(i);
                         if (q.SubSID != 0) p1.SetSubStep((byte)(q.SubSID - 1));
                         p1.SetAmmount(j.stack);
                         eh.C.netIO.SendPacket(p1, eh.C.SessionID);
                         step.SubSteps[q.SubSID] = j.stack;
                     }
                 }
             }
             foreach (questI j in QuestItem[quest.ID][i])
             {
                 if (step.SubSteps[j.SubSID] < j.ammount)
                     completed = false;
             }
             if (completed)
                 SetQuestStepStatus(pc, quest.ID, i, 2);
         }
     }
 }
示例#5
0
        private static void UpdateEnemyInfoSub(ActorPC pc, uint MobID, SagaDB.Quest.Quest quest, bool maploded)
        {
            ActorEventHandlers.PC_EventHandler eh = (SagaMap.ActorEventHandlers.PC_EventHandler)pc.e;
            if (quest == null) return;
            if (!Enemys.ContainsKey(quest.ID)) return;
            foreach (uint i in quest.Steps.Keys)
            {
                if (GetQuestStepStatus(pc, quest.ID, i) == 1)
                {
                    if (!Enemys[quest.ID].ContainsKey(i)) return;
                    bool completed = true;
                    SagaDB.Quest.Step step = quest.Steps[i];
                    foreach (EnemyInfo q in Enemys[quest.ID][i])
                    {
                        if (step.SubSteps == null)
                        {
                            step.SubSteps = new Dictionary<byte, byte>();
                        }
                        if (!step.SubSteps.ContainsKey(q.SubSID))
                            step.SubSteps.Add(q.SubSID, 0);
                        if (q.id.Contains(MobID))
                        {
                            if (step.SubSteps[q.SubSID] >= q.ammount)
                            {
                                if (maploded)
                                {
                                    Packets.Server.UpdateQuestSubStep p2 = new SagaMap.Packets.Server.UpdateQuestSubStep();
                                    p2.SetQuestID(quest.ID);
                                    p2.SetStep(i);
                                    if (q.SubSID != 0) p2.SetSubStep((byte)(q.SubSID - 1));
                                    p2.SetAmmount(step.SubSteps[q.SubSID]);
                                    eh.C.netIO.SendPacket(p2, eh.C.SessionID);
                                }
                                continue;
                            }
                            step.SubSteps[q.SubSID]++;
                            Packets.Server.UpdateQuestSubStep p1 = new SagaMap.Packets.Server.UpdateQuestSubStep();
                            p1.SetQuestID(quest.ID);
                            p1.SetStep(i);
                            if (q.SubSID != 0) p1.SetSubStep((byte)(q.SubSID - 1));
                            p1.SetAmmount(step.SubSteps[q.SubSID]);
                            eh.C.netIO.SendPacket(p1, eh.C.SessionID);
                        }

                    }
                    foreach (EnemyInfo j in Enemys[quest.ID][i])
                    {
                        if (step.SubSteps[j.SubSID] < j.ammount)
                            completed = false;
                    }
                    if (completed)
                        SetQuestStepStatus(pc, quest.ID, i, 2);
                }
            }
        }
示例#6
0
 public void OnAddItem(Item nitem, SagaDB.Items.ITEM_UPDATE_REASON reason)
 {
 }
示例#7
0
        private void AddBonus(Actor actor, SagaDB.Items.Bonus i, BonusType type, bool unequip, uint id)
        {
            bool isRate = false;
            ActorPC pc = null;
            ActorEventHandlers.PC_EventHandler eh = null;
            if (actor.type == ActorType.PC)
            {
                pc = (ActorPC)actor;
                eh = (SagaMap.ActorEventHandlers.PC_EventHandler)pc.e;
            }
            if (i.Value > 20000 || i.Value < -20000)
            {
                isRate = true;
            }
            switch (i.Effect)
            {
                case ADDITION_BONUS.STR:
                    if (actor.type != ActorType.PC || type != BonusType.Equipment) return;
                    pc.BattleStatus.strbonus += AddInt(i.Value, isRate, pc.str, unequip);
                    break;
                case ADDITION_BONUS.DEX:
                    if (actor.type != ActorType.PC || type != BonusType.Equipment) return;
                    pc.BattleStatus.dexbonus += AddInt(i.Value, isRate, pc.dex, unequip);
                    break;
                case ADDITION_BONUS.CON:
                    if (actor.type != ActorType.PC || type != BonusType.Equipment) return;
                    pc.BattleStatus.conbonus += AddInt(i.Value, isRate, pc.con, unequip);
                    break;
                case ADDITION_BONUS.INT:
                    if (actor.type != ActorType.PC || type != BonusType.Equipment) return;
                    pc.BattleStatus.intbonus += AddInt(i.Value, isRate, pc.intel, unequip);
                    break;
                case ADDITION_BONUS.LUK:
                    if (actor.type != ActorType.PC || type != BonusType.Equipment) return;
                    pc.BattleStatus.lukbonus += AddInt(i.Value, isRate, pc.luk, unequip);
                    break;
                case ADDITION_BONUS.PhysicalDef:
                    if (type == BonusType.Equipment)
                        actor.BattleStatus.defbonus += AddInt(i.Value, isRate, actor.BattleStatus.def, unequip);
                    if (type == BonusType.Skill)
                        actor.BattleStatus.defskill += AddInt(i.Value, isRate, actor.BattleStatus.def, unequip);
                    break;
                case ADDITION_BONUS.HPMax:
                    if (actor.type != ActorType.PC) return;
                    if (type == BonusType.Equipment)
                        pc.BattleStatus.hpbonus += AddInt(i.Value, isRate, pc.BattleStatus.hpBasic, unequip);
                    if (type == BonusType.Skill)
                        pc.BattleStatus.hpskill += (short)AddInt(i.Value, isRate, pc.BattleStatus.hpBasic, unequip);
                    Skills.SkillHandler.CalcHPSP(ref pc);
                    break;
                case ADDITION_BONUS.SPMax:
                    if (actor.type != ActorType.PC) return;
                    if (type == BonusType.Equipment)
                        pc.BattleStatus.spbonus += AddInt(i.Value, isRate, pc.BattleStatus.spBasic, unequip);
                    if (type == BonusType.Skill)
                        pc.BattleStatus.spskill += (short)AddInt(i.Value, isRate, pc.BattleStatus.spBasic, unequip);
                    Skills.SkillHandler.CalcHPSP(ref pc);
                    break;
                case ADDITION_BONUS.HPRecover:
                    if (pc.Tasks.ContainsKey("RegenerationHP"))
                    {
                        Tasks.Regeneration hp = (Tasks.Regeneration)pc.Tasks["RegenerationHP"];
                        if (type == BonusType.Equipment)
                            pc.BattleStatus.hpregbonus += AddInt(i.Value, isRate, hp.hp, unequip);
                        if (type == BonusType.Skill)
                            pc.BattleStatus.hpregskill += AddInt(i.Value, isRate, hp.hp, unequip);
                    }
                    break;
                case ADDITION_BONUS.SPRecover:
                    if (pc.Tasks.ContainsKey("RegenerationSP"))
                    {
                        Tasks.Regeneration sp = (Tasks.Regeneration)pc.Tasks["RegenerationSP"];
                        if (type == BonusType.Equipment)
                            pc.BattleStatus.spregbonus += AddInt(i.Value, isRate, sp.hp, unequip);
                        if (type == BonusType.Skill)
                            pc.BattleStatus.spregskill += AddInt(i.Value, isRate, sp.hp, unequip);
                    }
                    break;
                case ADDITION_BONUS.PhysicalFlee:
                    if (type == BonusType.Equipment)
                        actor.BattleStatus.fleebonus += AddInt(i.Value, isRate, actor.BattleStatus.flee, unequip);
                    if (type == BonusType.Skill)
                        actor.BattleStatus.fleeskill += AddInt(i.Value, isRate, actor.BattleStatus.flee, unequip);
                    break;
                case ADDITION_BONUS.RangedFlee:
                    if (type == BonusType.Equipment)
                        actor.BattleStatus.rfleebonus += AddInt(i.Value, isRate, actor.BattleStatus.rflee, unequip);
                    if (type == BonusType.Skill)
                        actor.BattleStatus.rfleeskill += AddInt(i.Value, isRate, actor.BattleStatus.rflee, unequip);
                    break;
                case ADDITION_BONUS.MagicalFlee:
                    if (type == BonusType.Equipment)
                        actor.BattleStatus.mfleebonus += AddInt(i.Value, isRate, actor.BattleStatus.mflee, unequip);
                    if (type == BonusType.Skill)
                        actor.BattleStatus.mfleeskill += AddInt(i.Value, isRate, actor.BattleStatus.mflee, unequip);
                    break;
                case ADDITION_BONUS.PhysicalATK:
                    int min, max;
                    if (actor.type != ActorType.PC) return;
                    Skills.SkillHandler.GetPCATK(pc, out min, out max);
                    if (type == BonusType.Equipment)
                        actor.BattleStatus.atkbonus += AddInt(i.Value, isRate, max, unequip);
                    if (type == BonusType.Skill)
                        actor.BattleStatus.atkskill += AddInt(i.Value, isRate, max, unequip);
                    Skills.SkillHandler.CalcAtk(ref actor);
                    break;
                case ADDITION_BONUS.MaxWDamage:
                case ADDITION_BONUS.AtkMax:
                    if (type == BonusType.Skill)
                        actor.BattleStatus.atkmaxbonus += AddInt(i.Value, isRate, 0, unequip);
                    break;
                case ADDITION_BONUS.MinWDamage:
                case ADDITION_BONUS.AtkMin:
                    if (type == BonusType.Skill)
                        actor.BattleStatus.atkminbonus += AddInt(i.Value, isRate, 0, unequip);
                    break;
                case ADDITION_BONUS.MaxMWDamage:
                case ADDITION_BONUS.MagicalAtkMax:
                    if (type == BonusType.Skill)
                        actor.BattleStatus.matkmaxbonus += AddInt(i.Value, isRate, 0, unequip);
                    break;
                case ADDITION_BONUS.MinMWDamage:
                case ADDITION_BONUS.MagicalAtkMin:
                    if (type == BonusType.Skill)
                        actor.BattleStatus.matkminbonus += AddInt(i.Value, isRate, 0, unequip);
                    break;
                case ADDITION_BONUS.MaxRWDamage:
                case ADDITION_BONUS.RangedAtkMax:
                    if (type == BonusType.Skill)
                        actor.BattleStatus.ratkmaxbonus += AddInt(i.Value, isRate, 0, unequip);
                    break;
                case ADDITION_BONUS.WalkSpeed:
                    if (actor.type == ActorType.PC)
                    {
                        if (type == BonusType.Skill)
                            actor.BattleStatus.speedskill += AddInt(i.Value, isRate, 500, unequip);
                        else
                            actor.BattleStatus.speedbonus += AddInt(i.Value, isRate, 500, unequip);
                    }
                    else
                    {
                        Scripting.Mob mob = (Scripting.Mob)actor.e;
                        mob.WalkBonus += AddInt(i.Value, isRate, mob.mWalkSpeed, unequip);
                        mob.RunBonus += AddInt(i.Value, isRate, mob.mRunSpeed, unequip);
                    }
                    break;

                case ADDITION_BONUS.ItemHPRecover:
                    if (actor.type == ActorType.PC)
                    {
                        int value = SagaLib.Global.Random.Next(i.Value, (int)(i.Value * (1.5)));
                        pc.HP = (ushort)(pc.HP + value);
                        if (pc.HP > pc.maxHP) pc.HP = pc.maxHP;
                        eh.C.SendCharStatus(0);
                        eh.C.SendSkillEffect(id, SagaMap.Skills.SkillEffects.HP, (uint)value);
                    }
                    break;
                case ADDITION_BONUS.ItemSPRecover:
                    if (actor.type == ActorType.PC)
                    {
                        int value = SagaLib.Global.Random.Next(i.Value, (int)(i.Value * (1.5)));
                        pc.HP = (ushort)(pc.SP + value);
                        if (pc.SP > pc.maxHP) pc.SP = pc.maxSP;
                        eh.C.SendCharStatus(0);
                        eh.C.SendSkillEffect(id, SagaMap.Skills.SkillEffects.SP, (uint)value);
                    }
                    break;
            }
        }
示例#8
0
        public void OnAddItem( Item nItem, SagaDB.Items.ITEM_UPDATE_REASON reason )
        {
            byte index, amount;
            AddItemResult res = I.inv.AddItem(nItem, out index, out amount);
            if (res == AddItemResult.ERROR)
            {
                Logger.ShowWarning("pc event handler: cannot add item with ID " + nItem.id,null);
                return;
            }

            nItem.index = index;
            nItem.stack = amount;

            if (res == AddItemResult.NEW_INDEX)
            {
                Packets.Server.AddItem p1 = new SagaMap.Packets.Server.AddItem();
                p1.SetContainer(CONTAINER_TYPE.INVENTORY);
                p1.SetItem(nItem);
                C.netIO.SendPacket(p1, C.SessionID);
                MapServer.charDB.NewItem(this.C.Char, nItem);
            }

            Packets.Server.UpdateItem p2 = new SagaMap.Packets.Server.UpdateItem();
            p2.SetContainer(CONTAINER_TYPE.INVENTORY);
            p2.SetItemIndex(nItem.index);
            p2.SetAmount(nItem.stack);
            p2.SetUpdateType(SagaMap.Packets.Server.ITEM_UPDATE_TYPE.AMOUNT);
            p2.SetUpdateReason(reason);
            C.netIO.SendPacket(p2, C.SessionID);
            MapServer.charDB.UpdateItem(this.C.Char, nItem);
        }
示例#9
0
文件: Map.cs 项目: Willyham/SagaRO2
 public ChangeEquipArgs(SagaDB.Items.EQUIP_SLOT eSlot, int itemID)
 {
     this.eSlot = eSlot;
     this.itemID = itemID;
 }
示例#10
0
 public void SetUpdateReason(SagaDB.Items.ITEM_UPDATE_REASON reason)
 {
     this.PutByte((byte)reason, 6);
 }
示例#11
0
 private static void LoseDura(ActorPC pc, SagaDB.Items.EQUIP_SLOT slot)
 {
     Packets.Server.ItemAdjust p = new SagaMap.Packets.Server.ItemAdjust();
     ActorEventHandlers.PC_EventHandler eh = (SagaMap.ActorEventHandlers.PC_EventHandler)pc.e;
     if (pc.inv.EquipList.ContainsKey(slot))
         if (pc.inv.EquipList[slot].durability > 0)
         {
             pc.inv.EquipList[slot].durability--;
             p.SetContainer(1);
             p.SetFunction(SagaMap.Packets.Server.ItemAdjust.Function.Durability);
             p.SetSlot((byte)slot);
             p.SetValue(pc.inv.EquipList[slot].durability);
             eh.C.netIO.SendPacket(p, eh.C.SessionID);
             if (pc.inv.EquipList[slot].durability == 0)
             {
                 pc.inv.EquipList[slot].active = 0;
                 p = new SagaMap.Packets.Server.ItemAdjust();
                 p.SetContainer(1);
                 p.SetSlot((byte)slot);
                 p.SetFunction(SagaMap.Packets.Server.ItemAdjust.Function.Active);
                 p.SetValue(0);
                 eh.C.netIO.SendPacket(p, eh.C.SessionID);
                 Bonus.BonusHandler.Instance.EquiqItem(pc, pc.inv.EquipList[slot], true);
                 SkillHandler.CalcHPSP(ref pc);
                 eh.C.SendCharStatus(0);
                 eh.C.SendExtStats();
                 eh.C.SendBattleStatus();
                 MapServer.charDB.UpdateItem(pc, pc.inv.EquipList[slot]);
             }
         }
 }