Register for your free account! | Forgot your password?

Go Back   elitepvpers > Popular Games > Silkroad Online > SRO Coding Corner
You last visited: Today at 21:22

  • Please register to post and access all features, it's quick, easy and FREE!


[Release] CharacterData, EntitySpawn

Discussion on [Release] CharacterData, EntitySpawn within the SRO Coding Corner forum part of the Silkroad Online category.

Reply
 
Old   #1
 
elite*gold: 0
Join Date: Jan 2009
Posts: 240
Received Thanks: 446
[Release] CharacterData, EntitySpawn

Meh...so with the release of I can pretty much release my packet structure used for the character parsing.
As a little extra I will add the most complete structure for 0x3015 / 0x3019 you may find for free.

SERVER_AGENT_CHARACTER_DATA (0x3013):
Code:
4   uint    ServerTime               //SROTimeStamp
4   uint    RefObjID
1   byte    Scale
1   byte    CurLevel
1   byte    MaxLevel
8   ulong   ExpOffset
4   uint    SExpOffset
8   ulong   RemainGold
4   uint    RemainSkillPoint
2   ushort  RemainStatPoint
1   byte    RemainHwanCount
4   uint    GatheredExpPoint
4   uint    HP
4   uint    MP
1   byte    AutoInverstExp
1   byte    DailyPK
2   ushort  TotalPK
4   uint    PKPenaltyPoint
1   byte    HwanLevel
1   byte    FreePVP           //0 = None, 1 = Red, 2 = Gray, 3 = Blue, 4 = White, 5 = Gold

//Inventory
1   byte    Inventory.Size
1   byte    Inventory.ItemCount
for (int i = 0; i < Inventory.ItemCount; i++)
{
    1   byte    item.Slot
    
    4   uint    item.RentType
    if(item.RentType == 1)    
    {
        2   ushort  item.RentInfo.CanDelete
        4   uint    item.RentInfo.PeriodBeginTime
        4   uint    item.RentInfo.PeriodEndTime        
    }
    else if(item.RentType == 2)
    {
        2   ushort  item.RentInfo.CanDelete
        2   ushort  item.RentInfo.CanRecharge
        4   uint    item.RentInfo.MeterRateTime        
    }
    else if(item.RentType == 3)
    {
        2   ushort  item.RentInfo.CanDelete
        2   ushort  item.RentInfo.CanRecharge
        4   uint    item.RentInfo.PeriodBeginTime
        4   uint    item.RentInfo.PeriodEndTime   
        4   uint    item.RentInfo.PackingTime        
    }
    
    4   uint    item.RefItemID
    if(item.TypeID1 == 3)
    {
        //ITEM_        
        if(item.TypeID2 == 1)
        {
            //ITEM_CH
            //ITEM_EU
            //AVATAR_
            1   byte    item.OptLevel
            8   ulong   item.Variance
            4   uint    item.Data       //Durability
            1   byte    item.MagParamNum
            for(int paramIndex = 0; paramIndex < item.MagParamNum; paramIndex++)
            {
                4   uint    magParam.Type
                4   uint    magParam.Value                
            }
            
            1   byte    bindingOptionType   //1 = Socket
            1   byte    bindingOptionCount
            for (int bindingOptionIndex = 0; bindingOptionIndex < bindingOptionCount; bindingOptionIndex++)
            {
                1   byte bindingOption.Slot
                4   uint bindingOption.ID
                4   uint bindingOption.nParam1
            }
            
            1   byte    bindingOptionType   //2 = Advanced elixir
            1   byte    bindingOptionCount
            for (int bindingOptionIndex = 0; bindingOptionIndex < bindingOptionCount; bindingOptionIndex++)
            {
                1   byte bindingOption.Slot
                4   uint bindingOption.ID
                4   uint bindingOption.OptValue
            }            
        }
        else if(item.TypeID2 == 2)
        {            
            if(item.TypeID3 == 1)
            {                                
                //ITEM_COS_P
                1   byte    State
                4   uint    RefObjID
                2   ushort  Name.Length
                *   string  Name
                if(item.TypeID4 == 2)
                {
                    //ITEM_COS_P (Ability)
                    4   uint    SecondsToRentEndTime
                }
                1   byte    unkByte0
            }
            else if(item.TypeID3 == 2)
            {
                //ITEM_ETC_TRANS_MONSTER
                4   uint    RefObjID
            }
            else if(item.TypeID3 == 3)
            {
                //MAGIC_CUBE
                4   uint    Quantity        //Do not confuse with StackCount, this indicates the amount of elixirs in the cube
            }
        }
        else if(item.TypeID2 == 3)
        {
            //ITEM_ETC
            2   ushort  item.StackCount
            
            if(item.TypeID3 == 11)
            {
                if(item.TypeID4 == 1 || item.TypeID4 == 2)
                {
                    //MAGICSTONE, ATTRSTONE
                    1   byte    AttributeAssimilationProbability
                }
            }
            else if(item.TypeID3 == 14 || item.TypeID4 == 2)
            {
                //ITEM_MALL_GACHA_CARD_WIN
                //ITEM_MALL_GACHA_CARD_LOSE
                1   byte    item.MagParamCount
                for (int paramIndex = 0; paramIndex < MagParamNum; paramIndex++)
                {
                    4   uint magParam.Type
                    4   uint magParam.Value
                }
            }
        } 
    }
}

//AvatarInventory
1   byte    AvatarInventory.Size
1   byte    AvatarInventory.ItemCount
for (int i = 0; i < Inventory.ItemCount; i++)
{
    1   byte    item.Slot
    
    4   uint    item.RentType
    if(item.RentType == 1)    
    {
        2   ushort  item.RentInfo.CanDelete
        4   uint    item.RentInfo.PeriodBeginTime
        4   uint    item.RentInfo.PeriodEndTime        
    }
    else if(item.RentType == 2)
    {
        2   ushort  item.RentInfo.CanDelete
        2   ushort  item.RentInfo.CanRecharge
        4   uint    item.RentInfo.MeterRateTime        
    }
    else if(item.RentType == 3)
    {
        2   ushort  item.RentInfo.CanDelete
        2   ushort  item.RentInfo.CanRecharge
        4   uint    item.RentInfo.PeriodBeginTime
        4   uint    item.RentInfo.PeriodEndTime   
        4   uint    item.RentInfo.PackingTime        
    }
    
    4   uint    item.RefItemID
    if(item.TypeID1 == 3)
    {
        //ITEM_        
        if(item.TypeID2 == 1) //TODO: Narrow filters for AvatarInventory
        {
            //ITEM_CH
            //ITEM_EU
            //AVATAR_
            1   byte    item.OptLevel
            8   ulong   item.Variance
            4   uint    item.Data       //Durability
            1   byte    item.MagParamNum
            for(int paramIndex = 0; paramIndex < item.MagParamNum; paramIndex++)
            {
                4   uint    magParam.Type
                4   uint    magParam.Value                
            }
            
            1   byte    bindingOptionType   //1 = Socket
            1   byte    bindingOptionCount
            for (int bindingOptionIndex = 0; bindingOptionIndex < bindingOptionCount; bindingOptionIndex++)
            {
                1   byte bindingOption.Slot
                4   uint bindingOption.ID
                4   uint bindingOption.nParam1
            }
            
            1   byte    bindingOptionType   //2 = Advanced elixir
            1   byte    bindingOptionCount
            for (int bindingOptionIndex = 0; bindingOptionIndex < bindingOptionCount; bindingOptionIndex++)
            {
                1   byte bindingOption.Slot
                4   uint bindingOption.ID
                4   uint bindingOption.OptValue
            }            
        }
    }
}

1   byte    unkByte1    //not a counter

//Masteries
1   byte    nextMastery
while(nextMastery == 1)
{
    4   uint    mastery.ID
    1   byte    mastery.Level   
    
    1   byte    nextMastery
}

1   byte    unkByte2    //not a counter

//Skills
1   byte    nextSkill
while(nextSkill == 1)
{
    4   uint    skill.ID
    1   byte    skill.Enabled   
    
    1   byte    nextSkill
}

//Quests
2   ushort  CompletedQuestCount
*   uint[]  CompletedQuests

1   byte    ActiveQuestCount
for(int activeQuestIndex = 0; activeQuestIndex < ActiveQuestCount; activeQuestIndex++)
{
    4   uint    quest.RefQuestID
    1   byte    quest.AchivementCount
    1   byte    quest.RequiresAutoShareParty
    1   byte    quest.Type
    if(quest.Type == 28)
    {
        4   uint    remainingTime
    }
    1   byte    quest.Status
    
    if(quest.Type != 8)
    {
        1   byte    quest.ObjectiveCount
        for(int objectiveIndex = 0; objectiveIndex < quest.ObjectiveCount; objectiveIndex++)
        {
            1   byte    objective.ID
            1   byte    objective.Status        //0 = Done, 1  = On
            2   ushort  objective.Name.Length
            *   string  objective.Name
            1   byte    objective.TaskCount
            for(int taskIndex = 0; taskIndex < objective.TaskCount; taskIndex++)
            {
                4   uint    task.Value
            }
        }
    }
    
    if(quest.Type == 88)
    {
        1   byte    RefObjCount
        for(int refObjIndex = 0; refObjIndex < RefObjCount; refObjIndex++)
        {
            4   uint    RefObjID    //NPCs
        }
    }
}

1   byte    unkByte3        //Structure changes!!!

//CollectionBook
4   uint    CollectionBookStartedThemeCount
for(int i = 0; i < StartedCollectionCount)
{
    4   uint    theme.Index
    4   uint    theme.StartedDateTime   //SROTimeStamp
    4   uint    theme.Pages
}

4   uint    UniqueID

//Position
2   ushort  Position.RegionID
4   float   Position.X
4   float   Position.Y
4   float   Position.Z
2   ushort  Position.Angle

//Movement
1   byte    Movement.HasDestination
1   byte    Movement.Type
if(Movement.HasDestination)
{    
    2   ushort  Movement.DestinationRegion        
    if(Position.RegionID < short.MaxValue)
    {
        //World
        2   ushort  Movement.DestinationOffsetX
        2   ushort  Movement.DestinationOffsetY
        2   ushort  Movement.DestinationOffsetZ
    }
    else
    {
        //Dungeon
        4   uint  Movement.DestinationOffsetX
        4   uint  Movement.DestinationOffsetY
        4   uint  Movement.DestinationOffsetZ
    }
}
else
{
    1   byte    Movement.Source     //0 = Spinning, 1 = Sky-/Key-walking
    2   ushort  Movement.Angle      //Represents the new angle, character is looking at
}

//State
1   byte    State.LifeState         //1 = Alive, 2 = Dead
1   byte    State.unkByte0
1   byte    State.MotionState       //0 = None, 2 = Walking, 3 = Running, 4 = Sitting
1   byte    State.Status            //0 = None, 1 = Hwan, 2 = Untouchable, 3 = GameMasterInvincible, 5 = GameMasterInvisible, 5 = ?, 6 = Stealth, 7 = Invisible
4   float   State.WalkSpeed
4   float   State.RunSpeed
4   float   State.HwanSpeed
1   byte    State.BuffCount
for (int i = 0; i < State.BuffCount; i++)
{
    4   uint    Buff.RefSkillID
    4   uint    Buff.Duration
    if(skill.Params.Contains(1701213281))
    {
        //1701213281 -> atfe -> "auto transfer effect" like Recovery Division
        1   bool    IsCreator
    }
}

2   ushort  Name.Length
*   string  Name
2   ushort  JobName.Length
*   string  JobName
1   byte    JobType
1   byte    JobLevel
4   uint    JobExp
4   uint    JobContribution
4   uint    JobReward
1   byte    PVPState                //0 = White, 1 = Purple, 2 = Red
1   byte    TransportFlag
1   byte    InCombat
if(TransportFlag == 1)
{
    4   uint    Transport.UniqueID
}

1   byte    PVPFlag                 //0 = Red Side, 1 = Blue Side, 0xFF = None
8   ulong   GuideFlag
4   uint    JID
1   byte    GMFlag

1   byte    ActivationFlag          //ConfigType:0 --> (0 = Not activated, 7 = activated)
1   byte    Hotkeys.Count           //ConfigType:1
for(int i = 0; i < hotkeyCount; i++)
{
    1   byte    hotkey.SlotSeq
    1   byte    hotkey.SlotContentType
    4   uint    hotkey.SlotData
}
2   ushort  AutoHPConfig            //ConfigType:11
2   ushort  AutoMPConfig            //ConfigType:12
2   ushort  AutoUniversalConfig     //ConfigType:13
1   byte    AutoPotionDelay         //ConfigType:14

1   byte    blockedWhisperCount
for(int i = 0; i < blockedWhisperCount; i++)
{
    2   ushort  Target.Length
    *   string  Target
}

4   uint    unkUShort0      //Structure changes!!!
1   byte    unkByte4        //Structure changes!!!

//EOP
SERVER_AGENT_ENTITY_SPAWN (0x3015, 0x3019):
Code:
4   uint    RefObjID
if(obj.TypeID1 == 1)
{
    //BIONIC:
    //  CHARACTER
    //  NPC
    //      NPC_FORTRESS_STRUCT
    //      NPC_MOB
    //      NPC_COS
    //      NPC_FORTRESS_COS    
    
    if(obj.TypeID2 == 1)
    {
        //CHARACTER
        1   byte    Scale
        1   byte    HwanLevel
        1   byte    PVPCape         //0 = None, 1 = Red, 2 = Gray, 3 = Blue, 4 = White, 5 = Orange
        1   byte    AutoInverstExp  //1 = Beginner Icon, 2 = Helpful, 3 = Beginner & Helpful
        
        //Inventory
        1   byte    Inventory.Size
        1   byte    Inventory.ItemCount
        for (int i = 0; i < Inventory.ItemCount; i++)
        {
            4   uint    item.RefItemID
            if(item.TypeID1 == 3 && item.TypeID2 == 1)
            {
                1   byte    item.OptLevel
            }
        }        
        //AvatarInventory
        1   byte    Inventory.Size
        1   byte    Inventory.ItemCount
        for (int i = 0; i < Inventory.ItemCount; i++)
        {
            4   uint    item.RefItemID
            if(item.TypeID1 == 3 && item.TypeID2 == 1)
            {
                1   byte    item.OptLevel
            }
        }
        
        //Mask
        1   byte    HasMask
        if(HasMask)
        {
            4   uint    mask.RefObjID
            if (maskObject.TypeID1 == obj.TypeID1 &&
                maskObject.TypeID2 == obj.TypeID2)
            {
                //Duplicate
                1   byte    Mask.Scale
                1   byte    Mask.ItemCount
                for(int i = 0; i < Mask.ItemCount; i++)
                {
                    4   uint    item.RefItemID
                }
            }
        }
    }
    else if(obj.TypeID2 == 2 && obj.TypeID3 == 5)
    {
        //NPC_FORTRESS_STRUCT
        4   uint    HP
        4   uint    RefEventStructID
        2   ushort  State
    }
    4   uint    UniqueID
    
    //Position
    2   ushort  Position.RegionID
    4   float   Position.X
    4   float   Position.Y
    4   float   Position.Z
    2   ushort  Position.Angle
    
    //Movement
    1   byte    Movement.HasDestination
    1   byte    Movement.Type
    if(Movement.HasDestination)
    {
        //MD (Mouse destination)
        2   ushort  Movement.DestinationRegion        
        if(Position.RegionID < short.MaxValue)
        {
            //World
            2   ushort  Movement.DestinationOffsetX
            2   ushort  Movement.DestinationOffsetY
            2   ushort  Movement.DestinationOffsetZ
        }
        else
        {
            //Dungeon
            4   uint  Movement.DestinationOffsetX
            4   uint  Movement.DestinationOffsetY
            4   uint  Movement.DestinationOffsetZ
        }
    }
    else
    {
        1   byte    Movement.Source  //0 = Spinning, 1 = Sky-/Key-walking
        2   ushort  Movement.Angle   //Represents the new angle, character is looking at
        //FC_GO_FORWARD
        //
    }
    
    //State
    1   byte    State.LifeState     //1 = Alive, 2 = Dead
    1   byte    State.unkByte0
    1   byte    State.MotionState   //0 = None, 2 = Walking, 3 = Running, 4 = Sitting
    1   byte    State.Status        //0 = None, 1 = Hwan, 2 = Untouchable, 3 = GameMasterInvincible, 5 = GameMasterInvisible, 5 = ?, 6 = Stealth, 7 = Invisible
    4   float   State.WalkSpeed
    4   float   State.RunSpeed
    4   float   State.HwanSpeed
    1   byte    State.BuffCount
    for (int i = 0; i < State.BuffCount; i++)
    {
        4   uint    Buff.RefSkillID
        4   uint    Buff.Duration
        if(skill.Params.Contains(1701213281))
        {
            //1701213281 -> atfe -> "auto transfer effect" like Recovery Division
            1   bool    IsCreator
        }
    }
    
    if(obj.TypeID2 == 1)
    {
        //CHARACTER
        2   ushort  Name.Length
        2   string  Name
        
        1   byte    JobType            //0 = None, 1 = Trader, 2 = Tief, 3 = Hunter
        1   byte    JobLevel
        1   byte    PVPState         //0 = White (Neutral), 1 = Purple (Assaulter), 2 = Red
        1   byte    TransportFlag
        1   byte    InCombat
        if(TransportFlag)
        {
            4   uint    Transport.UniqueID            
        }
        1   byte    ScrollMode         //0 = None, 1 = Return Scroll, 2 = Bandit Return Scroll
        1   byte    InteractMode       //0 = None 2 = P2P, 4 = P2N_TALK, 6 = OPNMKT_DEAL
        1   byte    unkByte4

        //Guild
        2   ushort  Guild.Name.Length
        *   string  Guild.Name
        if(Inventory.ContainsJobEquipment == false)
        {
            4   uint    Guild.ID
            2   ushort  GuildMember.Nickname.Length
            *   string  GuildMember.Nickname
            4   uint    Guild.LastCrestRev
            4   uint    Union.ID
            4   uint    Union.LastCrestRev
            1   byte    Guild.IsFriendly            //0 = Hostile, 1 = Friendly
            1   byte    GuildMember.SiegeAuthority  //See SiegeAuthority.cs
        }
        
        if(InteractMode == 4) //P2N_TALK
        {
            2   ushort  Stall.Name.Length
            *   string  Stall.Name
            4   uint    Stall.RefItemID         //Decoration
        }
        1   byte    EquipmentCooldown
        1   byte    PKFlag
    }
    else if(obj.TypeID2 == 2)
    {
        //NPC        
        1   byte    TalkFlag
        if(TalkFlag == 2)
        {
            1   byte    TalkOptionCount
            *   byte[]  TalkOptions            
        }
        
        if(obj.TypeID3 == 2)
        {
            //NPC_MOB
            1   byte    Rarity
            if(obj.TypeID4 == 2 || obj.TypeID4 == 3)
            {
                1   byte    Appearance  //Randomized by server.
            }
        }
        else if(obj.TypeID3 == 3)
        {
            //NPC_COS
            if(obj.TypeID4 == 3 || obj.TypeID4 == 4)
            {
                //NPC_COS_P (Growth)
                //NPC_COS_P (Ability)
                2   ushort  Name.Length
                2   string  Name
            }
            
            if(obj.TypeID4 == 5)
            {
                //NPC_COS_GUILD
                2   ushort  GuildName.Length
                2   string  GuildName
            }
            else
            {
                2   ushort  Owner.Name.Length
                2   string  Owner.Name
            }

            if(obj.TypeID4 == 2 ||      //NPC_COS_T
               obj.TypeID4 == 3 ||      //NPC_COS_P (Growth)
               obj.TypeID4 == 4 ||      //NPC_COS_P (Ability)
               obj.TypeID4 == 5)        //NPC_COS_GUILD
            {                   
               1    byte    JobType
               if(obj.TypeID4 != 4) //NO NPC_COS_P (Ability)
               {                       
                   1    byte    MurderFlag    //0 = White, 1 = Purple, 2 = Red
               }
               
               if(obj.TypeID4 == 5)
               {
                    //NPC_COS_GUILD
                   4    uint    Owner.RefObjID
               }
            }
            
            4    uint    Owner.UniqueID
        }
        else if (obj.TypeID3 == 4)
        {
            //NPC_FORTRESS_COS            
            4   uint    Guild.ID
            2   ushort  Guild.Name.Length
            *   string  Guild.Name
        }
    }
}
else if(obj.TypeID1 == 3)
{
    //ITEM:
    //  ITEM_EQUIP
    //  ITEM_ETC
    //      ITEM_ETC_MONEY_GOLD
    //      ITEM_ETC_TRADE
    //      ITEM_ETC_QUEST    

    if(obj.TypeID2 == 1)
    {
        //ITEM_EQUIP        
        1   byte    OptLevel
    }
    else if(obj.TypeID2 == 3)
    {
        //ITEM_ETC        
        if(obj.TypeID3 == 5 && obj.TypeID4 == 0)
        {
            //ITEM_ETC_MONEY_GOLD
            4   uint    Amount            
        }
        else if(obj.TypeID3 == 8 || obj.TypeID3 == 9)        
        {
            //ITEM_ETC_TRADE
            //ITEM_ETC_QUEST
            4   ushort  Owner.Name.Length
            *   string  Owner.Name
        }        
    }    
    4   uint    UniqueID
    2   ushort  Position.RegionID
    4   float   Position.X
    4   float   Position.Y
    4   float   Position.Z
    2   ushort  Position.Angle
    1   bool    hasOwner
    if(hasOwner)
    {
        4   uint    Owner.JID        
    }
    1   byte    Rarity
}
else if(obj.TypeID1 == 4)
{
    //PORTALS:
    //  STORE
    //  INS_TELEPORTER
    
    4   uint    UniqueID
    2   ushort  Position.RegionID
    4   float   Position.X
    4   float   Position.Y
    4   float   Position.Z
    2   ushort  Position.Angle

    1   byte    unkByte0
    1   byte    unkByte1
    1   byte    unkByte2
    1   byte    unkByte3
    if(unkByte3 == 1)
    {
        //Regular
        4   uint    unkUInt0
        4   uint    unkUInt1
    }
    else if(unkByte3 == 6)
    {
        //Dimension Hole
        2   ushort  Owner.Name.Length
        *   string  Owner.Name
        4   uint    Owner.UniqueID
    }
    
    if(unkByte1 == 1)
    {
        //STORE_EVENTZONE_DEFAULT
        4   uint    unkUInt3
        1   byte    unkByte5
    }
}
else if(RefObjID == uint.MaxValue)
{
    //EVENT_ZONE (Traps, Buffzones, ...)
    2   ushort  unkUShort0
    4   uint    RefSkillID
    4   uint    UniqueID
    2   ushort  Position.RegionID
    4   float   Position.X
    4   float   Position.Y
    4   float   Position.Z
    2   ushort  Position.Angle
}

if(packet.Opcode == 0x3015)
{    
    if(obj.TypeID1 == 0x01 || obj.TypeID1 == 0x4)
    {
        //BIONIC and STORE
        1    byte    unkByte6
    }
    else if(obj.TypeID1 == 0x03)
    {
        1    byte    DropSource
        4    uint    Dropper.UniqueID
    }
}
//EOP
SOME TYPOS MAY HAVE SLIPPED IN WHILE WRITING MY CODE INTO PSEUDO. YOU SHOULD DOUBLE CHECK A FEW THINGS BUT THE GENERAL STRUCTURE IS CORRECT FOR THE MOST PART, SORRY. \_(ツ)_/
Attached Files
File Type: zip Spawnpackets.zip (4.8 KB, 284 views)



DaxterSoul is offline  
Thanks
29 Users
Old 01/18/2016, 09:19   #2
 
elite*gold: 85
Join Date: Aug 2010
Posts: 1,276
Received Thanks: 494
well should i mention that in group spawn you have to calculate the amount of Packets & store it by recording start group spawn , End group spawn packets then parse it


Eslam Galull is offline  
Old 01/18/2016, 09:23   #3
 
elite*gold: 0
Join Date: Apr 2009
Posts: 2,182
Received Thanks: 2,397
Quote:
Originally Posted by Eslam Galull View Post
well should i mention that in group spawn you have to calculate the amount of Packets & store it by recording start group spawn , End group spawn packets then parse it
No you should not.

@daxter
Got these stuff parsed for years but most of the bytes were just unknown data. It feels like my life is complete now, thanks for the clean release.
sarkoplata is offline  
Thanks
5 Users
Old 01/18/2016, 10:13   #4
 
elite*gold: 85
Join Date: Aug 2010
Posts: 1,276
Received Thanks: 494
Quote:
Originally Posted by sarkoplata View Post
No you should not.

@daxter
Got these stuff parsed for years but most of the bytes were just unknown data. It feels like my life is complete now, thanks for the clean release.
i parse it to when i done my bot , but the point when i surf Zbot source its collect data for group spawn and store packets till it ends then parse it


Eslam Galull is offline  
Old 01/18/2016, 14:31   #5
 
elite*gold: 0
Join Date: Jan 2009
Posts: 240
Received Thanks: 446
Quote:
Originally Posted by Eslam Galull View Post
i parse it to when i done my bot , but the point when i surf Zbot source its collect data for group spawn and store packets till it ends then parse it
Sometimes expressing something in code is easier than words...
Code:
        private static byte groupSpawnType;
        private static ushort groupSpawnAmount;
        private static Packet groupSpawnPacket;

        public static void EntityGroupSpawnBegin(Packet packet)
        {
            groupSpawnType = packet.ReadByte();
            groupSpawnAmount = packet.ReadUShort();
            groupSpawnPacket = new Packet(0x3019);
        }

        public static void EntityGroupSpawnEnd(Packet packet)
        {
            groupSpawnPacket.Lock();

            for (int i = 0; i < groupSpawnAmount; i++)
            {
                if (groupSpawnType == 0x01)
                {
                    //spawn
                    _parseEntity(groupSpawnPacket);
                }
                else 
                {
                    //despawn
                    uint uniqueID = groupSpawnPacket.ReadUInt();
                }
            }
        }

        public static void EntityGroupSpawnData(Packet packet)
        {
            groupSpawnPacket.WriteByteArray(packet.GetBytes());
        }
DaxterSoul is offline  
Thanks
4 Users
Old 01/18/2016, 19:33   #6
 
elite*gold: 0
Join Date: Aug 2010
Posts: 41
Received Thanks: 3
UR the best as always my bro <3
medolife20 is offline  
Old 04/02/2016, 18:33   #7


 
elite*gold: 307
Join Date: Dec 2013
Posts: 826
Received Thanks: 594
nice thanks
KingDollar is offline  
Old 04/03/2016, 21:33   #8
 
elite*gold: 0
Join Date: Mar 2016
Posts: 23
Received Thanks: 4
Great release !
Doctor Strange is offline  
Old 11/07/2017, 03:02   #9


 
elite*gold: 307
Join Date: Dec 2013
Posts: 826
Received Thanks: 594
there was a problem in your parse that makes me
parsing the items side again
else if(item.TypeID3 == 14 || item.TypeID4 == 2)

it should be && not ||
KingDollar is offline  
Old 11/13/2017, 12:03   #10
 
elite*gold: 0
Join Date: Nov 2009
Posts: 1,487
Received Thanks: 862
can you please upload to mirror?
ahmed4ever2u is offline  
Old 11/13/2017, 17:03   #11
 
elite*gold: 0
Join Date: Jan 2009
Posts: 240
Received Thanks: 446
Quote:
Originally Posted by KingDollar View Post
there was a problem in your parse that makes me
parsing the items side again
else if(item.TypeID3 == 14 || item.TypeID4 == 2)

it should be && not ||
Yes, and there are a lot more straight up parsing issues from my side. Most COS specific parts are broken.
Quote:
Originally Posted by DaxterSoul View Post
SOME TYPOS MAY HAVE SLIPPED IN WHILE WRITING MY CODE INTO PSEUDO. YOU SHOULD DOUBLE CHECK A FEW THINGS BUT THE GENERAL STRUCTURE IS CORRECT FOR THE MOST PART, SORRY. \_(ツ)_/
Quote:
Originally Posted by ahmed4ever2u View Post
can you please upload to mirror?
The content of the attachment should be the same as in the code blocks.
DaxterSoul is offline  
Thanks
1 User
Old 05/02/2019, 02:13   #12
 
elite*gold: 0
Join Date: Apr 2009
Posts: 2,182
Received Thanks: 2,397
Having to deal with groupspawn after a looong time, few remarks:
if(obj.TypeID3 == 2) { //NPC_MOB TypeID3 should be 1 instead of2.

Also for ContainsJobEquipment, you can check the char's items typeIDs for
Code:
Item.TypeID1 == 3 && Item.TypeID2 == 1 && Item.TypeID3 == 7
thanks again for the release, will update if I find any other typo.
sarkoplata is offline  
Thanks
1 User
Old 05/02/2019, 02:50   #13
 
elite*gold: 0
Join Date: Sep 2018
Posts: 50
Received Thanks: 26
Casually this packet is not in his Github silkroad documentation .. I found it sniffing source codes
JellyBitz is offline  
Old 05/10/2019, 07:42   #14
 
elite*gold: 0
Join Date: Jun 2010
Posts: 21
Received Thanks: 0
Quote:
Originally Posted by homelesshobo View Post
In some VSRO versions, the alchemy stone part only includes the assimilation probability for non-itemmall alchemy stones:
After all, they seem to always have a 100% probability anyway.

Code:
if(item.TypeID3 == 11)
{
    // 7 = MagicStoneMall
    // Astral, Immortal, Lucky, Steady
    // CodeName128:
    // ITEM_ETC_ARCHEMY_MAGICSTONE_ASTRAL
    // ITEM_ETC_ARCHEMY_MAGICSTONE_ATHANASIA
    // ITEM_ETC_ARCHEMY_MAGICSTONE_LUCK
    // ITEM_ETC_ARCHEMY_MAGICSTONE_SOLID
    if(item.TypeID4 != 7)
    {
        //MAGICSTONE, ATTRSTONE
        1   byte    AttributeAssimilationProbability
    }
}
I try just now this code but because of pillow is get error and a lot of Item gets error because they typeID3 = 11 and TypeID4 = Something but ıtem is not alcemy regular ıtem thats why gets error

oksn123 is offline  
Old 05/15/2019, 20:05   #15
 
elite*gold: 0
Join Date: Jun 2010
Posts: 21
Received Thanks: 0
Code:
            if(item.TypeID3 == 1)
            {                                
                //ITEM_COS_P
                1   byte    State
                4   uint    RefObjID
                2   ushort  Name.Length
                *   string  Name
                if(item.TypeID4 == 2)
                {
                    //ITEM_COS_P (Ability)
                    4   uint    SecondsToRentEndTime
                }
                1   byte    unkByte0
            }
This is get error i found why when buy wolf or other in the mall and dont opened yet cant read name or anything get state 1 its mean dont open yet

Code:
 
            if(item.TypeID3 == 1)
            {                                
                //ITEM_COS_P
                1   byte    State
if(state == 2 || state == 3 || state == 4){
                4   uint    RefObjID
                2   ushort  Name.Length
                *   string  Name
                if(item.TypeID4 == 2)
                {
                    //ITEM_COS_P (Ability)
                    4   uint    SecondsToRentEndTime
                }
                1   byte    unkByte0
}
            }


oksn123 is offline  
Reply



« Style Janghan How to change ? | Movement packets »

Similar Threads
EntitySpawn (5378+)
03/26/2011 - CO2 PServer - Discussions / Questions - 7 Replies
Thank you .Kinshi, Thank you Impulse. Thank you Moderator for closing this (in advance) :D #request close.
[RELEASE] 5298 EntitySpawn Packet Structures
09/13/2010 - CO2 PServer Guides & Releases - 12 Replies
Entity Spawn: (10014) Spoiler: Offset| Type | Value 0 | Short | Size 2 | Short | Type 75 | Byte | Level 78 | Short | HairStyle 80 | Short | CharX 82 | Short | CharY 123 | int | QuizPoints



All times are GMT +2. The time now is 21:22.


Powered by vBulletin®
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.

BTC: 3KeUpz52VCbhmLwuwydqxu6U1xsgbT8YT5
ETH: 0xc6ec801B7563A4376751F33b0573308aDa611E05

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2019 elitepvpers All Rights Reserved.