An effort to improve episode 6 support for private servers

I'm not going to get into Ep8. :p

I might add client-side support for a title. Anyone know what the condition is/was for getting the "Champion of Shaiya" title?

The Champion of Shaiya title was set by this packet (it also came with a red glow overlay). This title was set whenever you had the “Title of Throne” item equipped (iirc it was in pet slot). It was added in US ps0240.

 
Perfect. Thanks for answering. That's the logic I will use. They can change it to something else if they want.
 
This is kinda neat. I'll commit it to the repo as soon as I feel ok about it.

Shaiya0001.JPG
 
IIRC, that title was related to the guild ranking 1, but i may be wrong.
 
The .eft file was missing a sequence entry. It loaded, but didn't render the effect in-game. I fixed it. I'm probably gonna add this to the repo later. I'm not gonna try to implement the packet.

Shaiya0002.JPG
 
I thought the file was attached to my last message. 🫤
 

Attachments

  • Character_Effect_01.zip
    357 bytes · Views: 12
Dear developer, can the following skills work?
SkillIdAbility
39673
41278
 
I'm not gonna be able to make those percentage skills work the way I want in every possible scenario without adding several detours. For now, I'm gonna go with no.
 
Last edited:
I should be more clear. When I say I tried them, I mean I tried to implement the abilities to the spec in the description. Of course, they can work if you change the skill data, but I'm pretty sure you understand that already.
 
I have modified the skilldata but Magic attack cannot set percentage
update Skills set AbilityType1 = 27, SuccessValue=100 where SkillID =397 and SkillLevel <100
update Skills set AbilityValue1 = 28, SuccessValue=100 where SkillID =412 and SkillLevel <100 --Magic attack cannot set percentage
update Skills set AbilityType1 = 26, SuccessValue=100 where SkillID =396 and SkillLevel <100
 
update Skills set AbilityValue1 = 28, SuccessValue=100 where SkillID =412 and SkillLevel <100 --Magic attack cannot set percentage

Is AbilityValue1 a typo? Did you mean to write AbilityType1?
 
this is my skill data:

USE [PS_GameDefs]
GO

/****** Object: Table [dbo].[Skills] Script Date: 03/12/2022 10:34:00 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[Skills](
[RowID] [int] IDENTITY(1,1) NOT NULL,
[SkillID] [int] NOT NULL,
[SkillLevel] [tinyint] NOT NULL,
[SkillName] [varchar](300) NOT NULL,
[Country] [tinyint] NOT NULL,
[Attackfighter] [tinyint] NOT NULL,
[Defensefighter] [tinyint] NOT NULL,
[Patrolrogue] [tinyint] NOT NULL,
[Shootrogue] [tinyint] NOT NULL,
[Attackmage] [tinyint] NOT NULL,
[Defensemage] [tinyint] NOT NULL,
[PrevSkillID] [smallint] NOT NULL,
[ReqLevel] [smallint] NOT NULL,
[Grow] [tinyint] NOT NULL,
[SkillPoint] [tinyint] NOT NULL,
[TypeShow] [tinyint] NOT NULL,
[TypeAttack] [tinyint] NOT NULL,
[TypeEffect] [tinyint] NOT NULL,
[TypeDetail] [smallint] NOT NULL,
[NeedWeapon1] [tinyint] NOT NULL,
[NeedWeapon2] [tinyint] NOT NULL,
[NeedWeapon3] [tinyint] NOT NULL,
[NeedWeapon4] [tinyint] NOT NULL,
[NeedWeapon5] [tinyint] NOT NULL,
[NeedWeapon6] [tinyint] NOT NULL,
[NeedWeapon7] [tinyint] NOT NULL,
[NeedWeapon8] [tinyint] NOT NULL,
[NeedWeapon9] [tinyint] NOT NULL,
[NeedWeapon10] [tinyint] NOT NULL,
[NeedWeapon11] [tinyint] NOT NULL,
[NeedWeapon12] [tinyint] NOT NULL,
[NeedWeapon13] [tinyint] NOT NULL,
[NeedWeapon14] [tinyint] NOT NULL,
[NeedWeapon15] [tinyint] NOT NULL,
[Shield] [tinyint] NOT NULL,
[SP] [smallint] NOT NULL,
[MP] [smallint] NOT NULL,
[ReadyTime] [tinyint] NOT NULL,
[ResetTime] [smallint] NOT NULL,
[AttackRange] [tinyint] NOT NULL,
[StateType] [tinyint] NOT NULL,
[AttrType] [tinyint] NOT NULL,
[Disable] [smallint] NOT NULL,
[SuccessType] [tinyint] NOT NULL,
[SuccessValue] [tinyint] NOT NULL,
[TargetType] [tinyint] NOT NULL,
[ApplyRange] [tinyint] NOT NULL,
[MultiAttack] [tinyint] NOT NULL,
[KeepTime] [smallint] NOT NULL,
[Weapon1] [tinyint] NOT NULL,
[Weapon2] [tinyint] NOT NULL,
[Weaponvalue] [tinyint] NOT NULL,
[Bag] [tinyint] NOT NULL,
[Arrow] [smallint] NOT NULL,
[DamageType] [tinyint] NOT NULL,
[DamageHP] [smallint] NOT NULL,
[DamageSP] [smallint] NOT NULL,
[DamageMP] [smallint] NOT NULL,
[TimeDamageType] [tinyint] NOT NULL,
[TimeDamageHP] [smallint] NOT NULL,
[TimeDamageSP] [smallint] NOT NULL,
[TimeDamageMP] [smallint] NOT NULL,
[AddDamageHP] [smallint] NOT NULL,
[AddDamageSP] [smallint] NOT NULL,
[AddDamageMP] [smallint] NOT NULL,
[AbilityType1] [tinyint] NULL,
[AbilityValue1] [smallint] NULL,
[AbilityType2] [tinyint] NULL,
[AbilityValue2] [smallint] NULL,
[AbilityType3] [tinyint] NULL,
[AbilityValue3] [smallint] NULL,
[AbilityType4] [tinyint] NULL,
[AbilityValue4] [smallint] NULL,
[AbilityType5] [tinyint] NULL,
[AbilityValue5] [smallint] NULL,
[AbilityType6] [tinyint] NULL,
[AbilityValue6] [smallint] NULL,
[AbilityType7] [tinyint] NULL,
[AbilityValue7] [smallint] NULL,
[AbilityType8] [tinyint] NULL,
[AbilityValue8] [smallint] NULL,
[AbilityType9] [tinyint] NULL,
[AbilityValue9] [smallint] NULL,
[AbilityType10] [tinyint] NULL,
[AbilityValue10] [smallint] NULL,
[HealHP] [smallint] NOT NULL,
[HealSP] [smallint] NOT NULL,
[HealMP] [smallint] NOT NULL,
[TimeHealHP] [smallint] NOT NULL,
[TimeHealSP] [smallint] NOT NULL,
[TimeHealMP] [smallint] NOT NULL,
[DefenceType] [tinyint] NOT NULL,
[DefenceValue] [tinyint] NOT NULL,
[LimitHP] [tinyint] NOT NULL,
[FixRange] [tinyint] NOT NULL,
[ChangeType] [smallint] NOT NULL,
[ChangeLevel] [smallint] NOT NULL,
[UpdateDate] [datetime] NOT NULL
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO
 
Can I keep your Skype? I would like to contact you to customize some features, but Discord is not available in our country. The above text is from the translation
 
C++:
void CUser::AddApplySkillBuff(CUser* user, SkillInfo* skillInfo)
{
    typedef void(__stdcall* LPFN)(CUser*, SkillInfo*);
    (*(LPFN)0x494140)(user, skillInfo);
}

I tried using this to add skill buff to a player, it just triggered the animation of using the buff and it didn't add the buff icon.

C++:
auto charName = args.at(0);  // character name
auto skillId = std::stoi(args.at(1));
auto skillLevel = std::stoi(args.at(2));

auto user = CWorld::FindUser(charName.c_str());
if (!user) {
    std::stringstream output_format;
    output_format << "Character " << charName << " not found";
    output = output_format.str();
    return 0; // Exit if user is not found
}

auto skill = CGameData::GetSkillInfo(skillId, skillLevel);
if (!skill) {
    std::stringstream output_format;
    output_format << "Skill with ID " << skillId << " and level " << skillLevel << " not found";
    output = output_format.str();
    return 0; // Exit if skill is not found
}

// Apply the skill buff
CUser::AddApplySkillBuff(user, skill);

// Prepare the SkillUseOutgoing2 packet
SkillApplyOutgoing outgoing{};
outgoing.id = user->applySkills.last->id;
outgoing.skillId = skill->skillId;
outgoing.skillLv = skill->skillLv;

//Send the skill usage packet to the user
Helpers::Send(user, &outgoing, sizeof(SkillApplyOutgoing));

// Output a success message
std::stringstream output_format;
output_format << "Skill " << skillId << " (Level " << skillLevel << ") triggered for " << charName;
output = output_format.str();
return 0;
 
@Zhein

How about this?

C++:
// Prepare the SkillUseOutgoing packet
SkillUseOutgoing outgoing{};
outgoing.senderId = user->connection.object.id;
outgoing.targetId = user->connection.object.id;
outgoing.skillId = skill->skillId;
outgoing.skillLv = skill->skillLv;

// Send the skill usage packet to the user
Helpers::Send(user, &outgoing, sizeof(SkillUseOutgoing));

// Apply the skill buff
CUser::AddApplySkillBuff(user, skill);
 
Back
Top