You last visited: Today at 23:16
Advertisement
[Release] CharacterData, EntitySpawn
Discussion on [Release] CharacterData, EntitySpawn within the SRO Coding Corner forum part of the Silkroad Online category.
01/15/2016, 08:08
#1
elite*gold: 0
Join Date: Jan 2009
Posts: 314
Received Thanks: 686
[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
Spawnpackets.zip
(4.8 KB, 664 views)
01/18/2016, 09:19
#2
elite*gold: 85
Join Date: Aug 2010
Posts: 1,278
Received Thanks: 525
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
01/18/2016, 09:23
#3
elite*gold: 166
Join Date: Apr 2009
Posts: 2,340
Received Thanks: 2,663
Quote:
Originally Posted by
Eslam Galull
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.
01/18/2016, 10:13
#4
elite*gold: 85
Join Date: Aug 2010
Posts: 1,278
Received Thanks: 525
Quote:
Originally Posted by
sarkoplata
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
01/18/2016, 14:31
#5
elite*gold: 0
Join Date: Jan 2009
Posts: 314
Received Thanks: 686
Quote:
Originally Posted by
Eslam Galull
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());
}
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
04/02/2016, 18:33
#7
elite*gold: 1117
Join Date: Dec 2013
Posts: 858
Received Thanks: 806
nice thanks
04/03/2016, 21:33
#8
elite*gold: 0
Join Date: Mar 2016
Posts: 27
Received Thanks: 4
Great release !
11/07/2017, 03:02
#9
elite*gold: 1117
Join Date: Dec 2013
Posts: 858
Received Thanks: 806
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 ||
11/13/2017, 12:03
#10
elite*gold: 0
Join Date: Nov 2009
Posts: 1,516
Received Thanks: 891
can you please upload to mirror?
11/13/2017, 17:03
#11
elite*gold: 0
Join Date: Jan 2009
Posts: 314
Received Thanks: 686
Quote:
Originally Posted by
KingDollar
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
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
can you please upload to mirror?
The content of the attachment should be the same as in the code blocks.
05/02/2019, 02:13
#12
elite*gold: 166
Join Date: Apr 2009
Posts: 2,340
Received Thanks: 2,663
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.
05/02/2019, 02:50
#13
elite*gold: 0
Join Date: Sep 2018
Posts: 431
Received Thanks: 979
Casually this packet is not in his Github silkroad documentation .. I found it sniffing source codes
05/10/2019, 07:42
#14
elite*gold: 0
Join Date: Jun 2010
Posts: 28
Received Thanks: 14
Quote:
Originally Posted by
homelesshobo
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
}
}
IDs 1-4 for MagicstoneMall
Code:
1 6894 ITEM_ETC_ARCHEMY_MAGICSTONE_ASTRAL_12 ????? ??? xxx SN_ITEM_ETC_ARCHEMY_MAGICSTONE_ASTRAL_12 SN_ITEM_ETC_ARCHEMY_MAGICSTONE_ASTRAL_TT_DESC 1 0 3 3 11 7 180000 3 0 1 1 1 255 1 1 0 0 0 0 0 0 0 0 0 0 -1 0 -1 0 -1 0 -1 0 -1 0 0 0 0 0 0 0 100 0 0 0 xxx item\etc\drop_archemy_1.bsr item\etc\archemy_magicstone_astral.ddj xxx xxx 100 2 0 0 12 0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0 0 0 0 0 0 0 0 0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12 MATTR_ASTRAL 0 ? 0, 0, 0, 0 0 ? 0, 0, 0, 0 100 xxx -1 xxx -1 xxx -1 xxx -1 xxx -1 xxx -1 xxx -1 xxx -1 xxx -1 xxx -1 xxx -1 xxx -1 xxx -1 xxx -1 xxx -1 xxx -1 xxx 0 0
Code:
1 6858 ITEM_ETC_ARCHEMY_MAGICSTONE_ATHANASIA_12 ??? ??? xxx SN_ITEM_ETC_ARCHEMY_MAGICSTONE_ATHANASIA_12 SN_ITEM_ETC_ARCHEMY_MAGICSTONE_ATHANASIA_TT_DESC 1 0 3 3 11 7 180000 3 0 1 1 1 255 1 1 0 0 0 0 0 0 0 0 0 0 -1 0 -1 0 -1 0 -1 0 -1 0 0 0 0 0 0 0 100 0 0 0 xxx item\etc\drop_archemy_1.bsr item\etc\archemy_magicstone_athanasia.ddj xxx xxx 100 2 0 0 12 0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0 0 0 0 0 0 0 0 0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12 MATTR_ATHANASIA 0 ? 0, 0, 0, 0 0 ? 0, 0, 0, 0 100 xxx -1 xxx -1 xxx -1 xxx -1 xxx -1 xxx -1 xxx -1 xxx -1 xxx -1 xxx -1 xxx -1 xxx -1 xxx -1 xxx -1 xxx -1 xxx -1 xxx 0 0
Code:
1 6882 ITEM_ETC_ARCHEMY_MAGICSTONE_LUCK_12 ??? ??? xxx SN_ITEM_ETC_ARCHEMY_MAGICSTONE_LUCK_12 SN_ITEM_ETC_ARCHEMY_MAGICSTONE_LUCK_TT_DESC 0 0 3 3 11 7 180000 3 0 1 1 1 255 3 1 0 0 0 0 476720 0 0 0 2500 95344 -1 0 -1 0 -1 0 -1 0 -1 0 0 0 0 0 0 0 100 0 0 0 xxx item\etc\drop_archemy_1.bsr item\etc\archemy_magicstone_luck.ddj xxx xxx 100 2 0 0 12 0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0 0 0 0 0 0 0 0 0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12 MATTR_LUCK 0 ? 0, 0, 0, 0 0 ? 0, 0, 0, 0 100 xxx -1 xxx -1 xxx -1 xxx -1 xxx -1 xxx -1 xxx -1 xxx -1 xxx -1 xxx -1 xxx -1 xxx -1 xxx -1 xxx -1 xxx -1 xxx -1 xxx 0 0
Code:
1 6870 ITEM_ETC_ARCHEMY_MAGICSTONE_SOLID_12 ??? ??? xxx SN_ITEM_ETC_ARCHEMY_MAGICSTONE_SOLID_12 SN_ITEM_ETC_ARCHEMY_MAGICSTONE_SOLID_TT_DESC 0 0 3 3 11 7 180000 3 0 1 1 1 255 3 1 0 0 0 0 476720 0 0 0 2500 95344 -1 0 -1 0 -1 0 -1 0 -1 0 0 0 0 0 0 0 100 0 0 0 xxx item\etc\drop_archemy_1.bsr item\etc\archemy_magicstone_solid.ddj xxx xxx 100 2 0 0 12 0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0 0 0 0 0 0 0 0 0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12 MATTR_SOLID 0 ? 0, 0, 0, 0 0 ? 0, 0, 0, 0 100 xxx -1 xxx -1 xxx -1 xxx -1 xxx -1 xxx -1 xxx -1 xxx -1 xxx -1 xxx -1 xxx -1 xxx -1 xxx -1 xxx -1 xxx -1 xxx -1 xxx 0 0
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
05/15/2019, 20:05
#15
elite*gold: 0
Join Date: Jun 2010
Posts: 28
Received Thanks: 14
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
}
}
Similar Threads
EntitySpawn (5378+)
03/26/2011 - CO2 Private Server - 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 23:16 .