• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

polserver / polserver / 13163655424

05 Feb 2025 06:02PM UTC coverage: 58.476% (+0.4%) from 58.057%
13163655424

push

github

web-flow
Expansion helper classes for central handling of features (#756)

* use uoexpansion enums for A9, B9 flags
added TOL to uoexpansion
currently unsure where this will end

simplified account initialisation, added errorcheck

* Expansion classes for server and account
fixed flags

* use of AccountExpansion,ServerExpansion
extended tests
splitted unittest file
added missing test for Min/MaxAttackRange

* more micro performance for world saving
use all 4 cores in CI builds
fix compiler flag warning on windows

* save test for weight_multiplier

* enable gothic,rustictiles when using HSA expansion

* removed ancient unused files

* addressed comments
renamed ServerExpansion to ServerFeatures
added method for expansion name

* got rid of client UOExpansionFlag which is the same as the accout
expansion

* updated core-changes and docs

* updated generated ssopt

* test for tooltips
changed method names
removed/clarified comments

* npc hitchance was never saved
added missing npc save tests

* hitchance bug exists also for items...
added missing test for movemode

465 of 525 new or added lines in 30 files covered. (88.57%)

16 existing lines in 7 files now uncovered.

41768 of 71427 relevant lines covered (58.48%)

388521.09 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

66.67
/pol-core/pol/tooltips.cpp
1
/** @file
2
 *
3
 * @par History
4
 * - 2007/04/07 MuadDib:   send_object_cache_to_inrange updated from just UObject* to
5
 *                         const UObject* for compatibility across more areas.
6
 * - 2009/01/03 MuadDib:   Some generic recoding to remove useless code. O_O
7
 * - 2009/01/27 MuadDib:   Rewrote Obj Cache Building/Sending.
8
 * - 2009/07/26 MuadDib:   Packet struct refactoring.
9
 * - 2009/09/06 Turley:    Changed Version checks to bitfield client->ClientType
10
 */
11

12

13
#include "tooltips.h"
14

15
#include <stddef.h>
16
#include <string>
17

18
#include "../bscript/impstr.h"
19
#include "../clib/clib_endian.h"
20
#include "../clib/rawtypes.h"
21
#include "../plib/uoexpansion.h"
22
#include "item/item.h"
23
#include "item/itemdesc.h"
24
#include "mobile/charactr.h"
25
#include "network/client.h"
26
#include "network/packetdefs.h"
27
#include "network/packethelper.h"
28
#include "network/packets.h"
29
#include "network/pktin.h"
30
#include "ufunc.h"
31
#include "uobject.h"
32
#include "uworld.h"
33

34
namespace Pol
35
{
36
namespace Core
37
{
38
using namespace Network::PktHelper;
39

40

41
void handle_request_tooltip( Network::Client* client, PKTIN_B6* msgin )
×
42
{
43
  u32 serial = cfBEu32( msgin->serial );
×
44
  if ( !IsCharacter( serial ) )
×
45
  {
46
    Items::Item* item = find_legal_item( client->chr, serial );
×
47
    if ( item != nullptr )
×
48
    {
49
      const Items::ItemDesc& id = item->itemdesc();
×
50
      if ( !id.tooltip.empty() )
×
51
      {
52
        PacketOut<Network::PktOut_B7> msg;
×
53
        msg->offset += 2;
×
54
        msg->Write<u32>( item->serial_ext );
×
55
        msg->WriteFlipped( Bscript::String::toUTF16( id.tooltip ) );
×
56
        u16 len = msg->offset;
×
57
        msg->offset = 1;
×
58
        msg->WriteFlipped<u16>( len );
×
59
        msg.Send( client, len );
×
60
      }
×
61
    }
62
  }
63
}
×
64

65
// needed if A9 flag is sent with 0x20, single click no longer works. see about text# 1042971 for
66
// 0xD6
67
void send_object_cache( Network::Client* client, const UObject* obj )
156✔
68
{
69
  if ( !settingsManager.ssopt.features.supportsAOS() )
156✔
NEW
70
    return;
×
71
  auto pkt_rev = Network::ObjRevisionPkt( obj->serial_ext, obj->rev() );
156✔
72
  pkt_rev.Send( client );
156✔
73
}
156✔
74

75
void send_object_cache_to_inrange( const UObject* obj )
6,289✔
76
{
77
  if ( !settingsManager.ssopt.features.supportsAOS() )
6,289✔
NEW
78
    return;
×
79
  auto pkt_rev = Network::ObjRevisionPkt( obj->serial_ext, obj->rev() );
6,289✔
80

81
  WorldIterator<OnlinePlayerFilter>::InMaxVisualRange( obj,
6,289✔
82
                                                       [&]( Mobile::Character* chr )
6,289✔
83
                                                       {
84
                                                         if ( chr->in_visual_range( obj ) )
74✔
85
                                                           pkt_rev.Send( chr->client );
70✔
86
                                                         // FIXME need to check character's
87
                                                         // additional_legal_items.
88
                                                       } );
74✔
89
}
6,289✔
90

91

92
void SendAOSTooltip( Network::Client* client, UObject* obj, bool vendor_content )
5✔
93
{
94
  std::string desc;
5✔
95
  if ( obj->isa( UOBJ_CLASS::CLASS_CHARACTER ) )
5✔
96
  {
97
    Mobile::Character* chr = (Mobile::Character*)obj;
4✔
98

99
    desc = fmt::format( "{} \t{}\t {}", chr->title_prefix(), chr->name(), chr->title_suffix() );
8✔
100
    if ( chr->has_title_race() )
4✔
101
      desc += fmt::format( "{}({})", chr->has_title_suffix() ? " " : "", chr->title_race() );
2✔
102
    if ( chr->has_title_guild() )
4✔
103
      desc +=
104
          fmt::format( "{}[{}]", ( chr->has_title_suffix() || chr->has_title_race() ) ? " " : "",
4✔
105
                       chr->title_guild() );
6✔
106
  }
107
  else if ( vendor_content )
1✔
108
  {
109
    Items::Item* item = (Items::Item*)obj;
×
110
    desc = item->merchant_description();
×
111
  }
112
  else
113
    desc = obj->description();
1✔
114

115
  PacketOut<Network::PktOut_D6> msg;
5✔
116
  msg->offset += 2;
5✔
117
  msg->WriteFlipped<u16>( 1u );  // u16 unk1
5✔
118
  msg->Write<u32>( obj->serial_ext );
5✔
119
  msg->offset += 2;  // u8 unk2,unk3
5✔
120
  msg->WriteFlipped<u32>( obj->rev() );
5✔
121
  if ( obj->isa( UOBJ_CLASS::CLASS_CHARACTER ) )
5✔
122
    msg->WriteFlipped<u32>( 1050045u );  // ~1_PREFIX~~2_NAME~~3_SUFFIX~
4✔
123
  else
124
    msg->WriteFlipped<u32>( 1042971u );  // ~1_NOTHING~
1✔
125

126
  std::vector<u16> utf16 = Bscript::String::toUTF16( desc );
5✔
127
  u16 textlen = static_cast<u16>( utf16.size() );
5✔
128
  if ( ( textlen * 2 ) > ( 0xFFFF - 22 ) )
5✔
129
  {
130
    textlen = 0xFFFF / 2 - 22;
×
131
    utf16.resize( textlen );
×
132
  }
133
  msg->WriteFlipped<u16>( textlen * 2u );
5✔
134
  msg->Write( utf16, false );
5✔
135
  msg->offset += 4;  // indicates end of property list
5✔
136
  u16 len = msg->offset;
5✔
137
  msg->offset = 1;
5✔
138
  msg->WriteFlipped<u16>( len );
5✔
139
  msg.Send( client, len );
5✔
140
}
5✔
141
}  // namespace Core
142
}  // namespace Pol
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc