Skip to content

Commit

Permalink
Buffs: should be now possible to set for the first cliloc arguments,
Browse files Browse the repository at this point in the history
added chr.buffs member to return the current buffs
  • Loading branch information
turleypol committed Dec 29, 2023
1 parent 41e348c commit d1a8a73
Show file tree
Hide file tree
Showing 7 changed files with 72 additions and 40 deletions.
9 changes: 6 additions & 3 deletions pol-core/bscript/objaccess.cpp
Expand Up @@ -266,17 +266,19 @@ ObjMember object_members[] = {
{ MBR_PACKAGE, "package", true },
{ MBR_SWING_SPEED_INCREASE, "swing_speed_increase", true },
{ MBR_SWING_SPEED_INCREASE_MOD, "swing_speed_increase_mod", false },
{ MBR_EXPORTED_FUNCTIONS, "exported_functions", false }, // 250
{ MBR_EXPORTED_FUNCTIONS, "exported_functions", false }, // 250
{ MBR_DISABLE_INACTIVITY_TIMEOUT, "disable_inactivity_timeout", false },
{ MBR_CURSED, "cursed", false },
{ MBR_SNOOPSCRIPT, "snoopscript", false },
{ MBR_CHARACTER_OWNER, "character_owner", true },
{ MBR_PARRYCHANCE_MOD, "parrychance_mod", false },
{ MBR_BUFFS, "buffs", false },
};
int n_objmembers = sizeof object_members / sizeof object_members[0];
ObjMember* getKnownObjMember( const char* token )
{
static auto cache = []() -> std::unordered_map<std::string, ObjMember*> {
static auto cache = []() -> std::unordered_map<std::string, ObjMember*>
{
std::unordered_map<std::string, ObjMember*> m;
for ( int i = 0; i < n_objmembers; ++i )
{
Expand Down Expand Up @@ -461,7 +463,8 @@ int n_objmethods = sizeof object_methods / sizeof object_methods[0];
ObjMethod* getKnownObjMethod( const char* token )
{
// cache needs to hold a pointer to the original structure! eprog_read sets the override member
static auto cache = []() -> std::unordered_map<std::string, ObjMethod*> {
static auto cache = []() -> std::unordered_map<std::string, ObjMethod*>
{
std::unordered_map<std::string, ObjMethod*> m;
for ( int i = 0; i < n_objmethods; ++i )
{
Expand Down
3 changes: 2 additions & 1 deletion pol-core/bscript/objmembers.h
Expand Up @@ -287,13 +287,14 @@ enum MemberID
MBR_HIT_CHANCE_MOD,
MBR_PACKAGE,
MBR_SWING_SPEED_INCREASE,
MBR_SWING_SPEED_INCREASE_MOD, // 250
MBR_SWING_SPEED_INCREASE_MOD, // 250
MBR_EXPORTED_FUNCTIONS,
MBR_DISABLE_INACTIVITY_TIMEOUT,
MBR_CURSED,
MBR_SNOOPSCRIPT,
MBR_CHARACTER_OWNER, // 255
MBR_PARRYCHANCE_MOD,
MBR_BUFFS,
};


Expand Down
27 changes: 12 additions & 15 deletions pol-core/pol/mobile/charactr.cpp
Expand Up @@ -4207,17 +4207,18 @@ unsigned int Character::guildid() const
* Sends packets to the client accordingly
* @author Bodom
*/
void Character::addBuff( u16 icon, u16 duration, u32 cl_name, u32 cl_descr,
const std::string& arguments )
void Character::addBuff( u16 icon, u16 duration, u32 cl_name, const std::string& name_arguments,
u32 cl_descr, const std::string& desc_arguments )
{
// Icon is already present, must send a remove packet first or client will not update
delBuff( icon );

Core::gameclock_t end = Core::read_gameclock() + duration;
buffs_[icon] = { end, cl_name, cl_descr, arguments };
buffs_[icon] = { end, cl_name, cl_descr, name_arguments, desc_arguments };

if ( client != nullptr )
send_buff_message( this, icon, true, duration, cl_name, cl_descr, arguments );
send_buff_message( this, icon, true, duration, cl_name, name_arguments, cl_descr,
desc_arguments );
}

/**
Expand Down Expand Up @@ -4246,11 +4247,11 @@ bool Character::delBuff( u16 icon )
*/
void Character::clearBuffs()
{
for ( auto it = buffs_.begin(); it != buffs_.end(); ++it )
if ( client != nullptr )
{
if ( client != nullptr )
for ( const auto& buf : buffs_ )
{
send_buff_message( this, it->first, false );
send_buff_message( this, buf.first, false );
}
}
buffs_.clear();
Expand All @@ -4265,16 +4266,12 @@ void Character::send_buffs()
if ( client == nullptr )
return;

for ( auto it = buffs_.begin(); it != buffs_.end(); ++it )
for ( const auto& [icon, buf] : buffs_ )
{
int duration = it->second.end - Core::read_gameclock();
if ( duration < 0 )
duration = 0;
else if ( duration > 0xFFFF )
duration = 0xFFFF;
u16 duration = Clib::clamp_convert<u16>( buf.end - Core::read_gameclock() );

send_buff_message( this, it->first, true, static_cast<u16>( duration ), it->second.cl_name,
it->second.cl_descr, it->second.arguments );
send_buff_message( this, icon, true, duration, buf.cl_name, buf.name_arguments, buf.cl_descr,
buf.desc_arguments );
}
}

Expand Down
8 changes: 5 additions & 3 deletions pol-core/pol/mobile/charactr.h
Expand Up @@ -206,8 +206,9 @@ struct Buff
u32 cl_name;
// Description cliloc ID
u32 cl_descr;
// Unicode string, arguments to be replaced in cl_descr, separated by tabs
std::string arguments;
// Unicode string, arguments to be replaced in cl_name/cl_descr, separated by tabs
std::string name_arguments;
std::string desc_arguments;
};

struct reportable_t
Expand Down Expand Up @@ -719,7 +720,8 @@ class Character : public Core::UObject

// BUFF/DEBUFF BAR
public:
void addBuff( u16 icon, u16 duration, u32 cl_name, u32 cl_descr, const std::string& arguments );
void addBuff( u16 icon, u16 duration, u32 cl_name, const std::string& name_arguments,
u32 cl_descr, const std::string& desc_arguments );
bool delBuff( u16 icon );
void clearBuffs();
void send_buffs();
Expand Down
26 changes: 14 additions & 12 deletions pol-core/pol/ufunc.cpp
Expand Up @@ -2169,32 +2169,34 @@ void sendCharProfile( Character* chr, Character* of_who, const std::string& titl
* @param arguments arguments for cl_descr as string, separated by spaces
*/
void send_buff_message( Character* chr, u16 icon, bool show, u16 duration, u32 cl_name,
u32 cl_descr, const std::string& arguments )
const std::string& name_arguments, u32 cl_descr,
const std::string& desc_arguments )
{
PktHelper::PacketOut<PktOut_DF> msg;
msg->offset += 2; // length will be written later
msg->Write<u32>( chr->serial_ext );
msg->WriteFlipped<u16>( icon );
msg->Write<u8>( 0u ); // unknown, always 0
msg->Write<u8>( show ? 1u : 0u );
msg->WriteFlipped<u16>( show ? 1u : 0u );
if ( show )
{
msg->Write<u32>( 0u ); // unknown, always 0
msg->WriteFlipped<u16>( icon );
msg->Write<u8>( 0u ); // unknown, always 0
msg->Write<u8>( 1u ); // unknown, always 1
msg->Write<u32>( 0u ); // unknown, always 0
msg->WriteFlipped<u16>( 1u ); // unknown, always 1
msg->Write<u32>( 0u ); // unknown, always 0
msg->WriteFlipped<u16>( duration );
msg->Write<u16>( 0u ); // unknown, always 0
msg->Write<u8>( 0u ); // unknown, always 0
msg->WriteFlipped<u32>( cl_name );
msg->WriteFlipped<u32>( cl_descr );
msg->Write<u32>( 0u ); // unknown, always 0
msg->Write<u8>( 0u ); // unknown, always 0
msg->Write<u8>( 1u ); // unknown, always 1
msg->Write<u16>( 20u ); // a space character
msg->Write<u16>( 20u ); // a space character
msg->Write( Bscript::String::toUTF16( arguments ) );
msg->Write<u32>( 0u ); // 3rd cliloc?
auto nameargs = Bscript::String::toUTF16( name_arguments );
msg->WriteFlipped<u16>( nameargs.size() + 1 );
msg->Write( nameargs );
auto descargs = Bscript::String::toUTF16( desc_arguments );
msg->WriteFlipped<u16>( descargs.size() + 1 );
msg->Write( descargs );
msg->WriteFlipped<u16>( 1u ); // 3rd arg length?
msg->Write<u16>( 0u );
}

u16 len = msg->offset;
Expand Down
4 changes: 2 additions & 2 deletions pol-core/pol/ufunc.h
Expand Up @@ -240,8 +240,8 @@ void sendCharProfile( Mobile::Character* chr, Mobile::Character* of_who, const s
const std::string& utext, const std::string& etext );

void send_buff_message( Mobile::Character* chr, u16 icon, bool show, u16 duration = 0,
u32 cl_name = 0, u32 cl_descr = 0,
const std::string& arguments = std::string() );
u32 cl_name = 0, const std::string& name_arguments = std::string(),
u32 cl_descr = 0, const std::string& desc_arguments = std::string() );
} // namespace Core
} // namespace Pol
#endif
35 changes: 31 additions & 4 deletions pol-core/pol/uoscrobj.cpp
Expand Up @@ -51,6 +51,7 @@

#include "uoscrobj.h"

#include <memory>
#include <string>

#include "../bscript/berror.h"
Expand Down Expand Up @@ -2408,6 +2409,21 @@ BObjectImp* Character::get_script_member_id( const int id ) const
return new BLong( casting_spell() );
case MBR_LAST_TEXTCOLOR:
return new BLong( last_textcolor() );
case MBR_BUFFS:
{
auto buffs = std::make_unique<BDictionary>();
for ( const auto& [icon, buf] : buffs_ )
{
auto info = std::make_unique<BStruct>();
info->addMember( "name_cliloc", new BLong( buf.cl_name ) );
info->addMember( "desc_cliloc", new BLong( buf.cl_descr ) );
info->addMember( "end_time", new BLong( buf.end ) );
info->addMember( "name_args", new String( buf.name_arguments ) );
info->addMember( "desc_args", new String( buf.desc_arguments ) );
buffs->addMember( new BLong( icon ), info.release() );
}
return buffs.release();
}
}
// if all else fails, returns nullptr
return nullptr;
Expand Down Expand Up @@ -3322,20 +3338,31 @@ BObjectImp* Character::script_method_id( const int id, Core::UOExecutor& ex )
u16 duration;
u32 cl_name;
u32 cl_descr;
const String* text;
const String* desc_text;
std::string name_args;

if ( !ex.hasParams( 5 ) )
return new BError( "Not enough parameters" );
if ( ex.getParam( 0, icon ) && ex.getParam( 1, duration ) && ex.getParam( 2, cl_name ) &&
ex.getParam( 3, cl_descr ) && ex.getUnicodeStringParam( 4, text ) )
ex.getParam( 3, cl_descr ) && ex.getUnicodeStringParam( 4, desc_text ) )
{
if ( ex.hasParams( 6 ) )
{
const String* name_text;
if ( !ex.getUnicodeStringParam( 5, name_text ) )
break;
if ( name_text->length() > SPEECH_MAX_LEN )
return new BError( "Title text exceeds maximum size." );
name_args = name_text->value();
}

if ( !( icon && cl_name && cl_descr ) )
return new BError( "Invalid parameters" );

if ( text->length() > SPEECH_MAX_LEN )
if ( desc_text->length() > SPEECH_MAX_LEN )
return new BError( "Text exceeds maximum size." );

addBuff( icon, duration, cl_name, cl_descr, text->value() );
addBuff( icon, duration, cl_name, name_args, cl_descr, desc_text->value() );
return new BLong( 1 );
}
break;
Expand Down

0 comments on commit d1a8a73

Please sign in to comment.