Editing Server:Boats

Jump to navigation Jump to search

Warning: You are not logged in. Your IP address will be publicly visible if you make any edits. If you log in or create an account, your edits will be attributed to your username, along with other benefits.

The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then publish the changes below to finish undoing the edit.

Latest revision Your text
Line 38: Line 38:
</pre>
</pre>


and temporarily stored in the `character_data`.boatid field in the database. When you depart a boat, the opposite is true. 
and temporarily stored in the `character_data`.boatid field in the database.
 
Boarding and Leaving a boat have their own associated **OPCODE** and **EVENT** for purposes of scripting.
 


=== Opcodes ===
=== Opcodes ===
<pre>
utils/patches/patch_Mac.conf:


utils/patches/patch_Mac.conf:
<pre>
OP_BoardBoat=0xbb41
OP_BoardBoat=0xbb41
OP_LeaveBoat=0xbc41
OP_LeaveBoat=0xbc41
Line 52: Line 49:
</pre>
</pre>


These are the opcodes used by the TAKP client, but actual opcode values changed many times over the years.  Several versions of these opcodes can be found in the TAKP source repository.
=== Logsys Categories ===
 
GM characters can observe player profile packets showing boats being boarded/departed by setting debug logging in the database:
=== Boat Debugging ===
GM characters can observe player profile packets showing boats being boarded/departed by setting debug logging for Boats database, and they can also observe numerous other data about the boat's arrivals and departures, positions, grids, etc... via quest scripts associated with those Boats.  To enable this information, see [[#Database_Settings]] below.


==== Database Settings ====
==== Database ====
<pre>
<pre>
UPDATE logsys_categories SET log_to_gmsay = '3' WHERE log_category_description = 'Boats';
UPDATE logsys_categories SET log_to_gmsay = '3' WHERE log_category_description = 'Boats';
Line 66: Line 61:
UPDATE logsys_categories SET log_to_gmsay = '3' WHERE log_category_description = 'Quest Debug';
UPDATE logsys_categories SET log_to_gmsay = '3' WHERE log_category_description = 'Quest Debug';
</pre>
</pre>
Any values between 1 and 3 will enable logging (with increasing levels of detail), and 0 will disable it.


==== Source ====
==== Source ====
Line 81: Line 74:
         OutF(LogSys, Logs::Detail, Logs::Boats, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
         OutF(LogSys, Logs::Detail, Logs::Boats, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
} while (0)
} while (0)
</pre>
=== Common Ruletypes ===
common/ruletypes.h
<pre>
RULE_INT ( Zone, BoatDistance, 50) //In zones where boat name is not set in the PP, this is how far away from the boat …
…r is the ocean floor, so if you have NPCs that float near the top (sharks, boats) disabling these rules may break them!
RULE_BOOL ( NPC, BoatsRunByDefault, true) // Mainly to make it easier to adjust boats' timing on the fly.
</pre>
</pre>


=== Zone ===
=== Zone ===
==== API ====
==== API ====
zone/zone.h and zone/zone.cpp:
zone/zone.cpp:


This function iterates through a hardcoded list of zone short_names (qeynos, freporte, erudnext, butcher, oot, erudsxing, timorous, firiona, oasis, overthere, nro, iceclad)
<pre>
<pre>
bool Zone::IsBoatZone()
bool Zone::IsBoatZone()
</pre>
</pre>
This function iterates through a hardcoded list of zone ids (qeynos, freporte, erudnext, butcher, oot, erudsxing, timorous, firiona, oasis, overthere, nro, iceclad) and returns true if the current zone id matches one of the zones in this list.
zone/npc.h and zone/npc.cpp:


<pre>
zone/npc.h:
bool NPC::IsBoat()
{
return (GetBaseRace() == SHIP || GetBaseRace() == LAUNCH || GetBaseRace() == CONTROLLED_BOAT || GetBaseRace() == GHOST_SHIP);
}
</pre>
From the context of NPC namespace, you can check if an NPC is a boat both in C++ server source and via LUA quest scripting.


zone/mob.h and zone/mob.cpp:
The following is found in the NPC:: namespace:
<pre>
<pre>
bool Mob::IsBoat() const
bool IsBoat();
{
return (GetBaseRace() == SHIP || GetBaseRace() == LAUNCH || GetBaseRace() == CONTROLLED_BOAT || GetBaseRace() == GHOST_SHIP);
}
</pre>
</pre>
From the context of MOB namespace, you can check if an NPC is a boat both in C++ server source and via LUA quest scripting.


zone/client.h
zone/client.h
Line 130: Line 101:
void SetBoatID(uint32 boatid);
void SetBoatID(uint32 boatid);
void SetBoatName(const char* boatname);
void SetBoatName(const char* boatname);
void SendToBoat(bool messageonly) // Sometimes, the client doesn't send OP_LeaveBoat, so the boat values don't get cleared.
void SendToBoat(bool messageonly)
                              // This can lead difficulty entering the zone, since some people's client's don't like
                              // the boat timeout period.
</pre>
These functions are also exposed via LUA quest scripting.
 
zone/client_packet.h
<pre>
void Handle_OP_BoardBoat(const EQApplicationPacket *app);
void Handle_OP_ControlBoat(const EQApplicationPacket *app);
void Handle_OP_LeaveBoat(const EQApplicationPacket *app);
</pre>
</pre>
If you need to customize behavior when clients send packets indicating interaction with boats.


zone/command.h:
zone/command.h:
Line 151: Line 111:
</pre>
</pre>


zone/entity.h:
<pre>
void GetBoatInfo(Client* client);
uint8 GetClientCountByBoatNPCID(uint32 boatid);
uint8 GetClientCountByBoatID(uint32 entityid);
</pre>
zone/lua_parser_events.h
zone/lua_parser_events.h
<pre>
<pre>
Line 171: Line 125:
char* GetBoatName();
char* GetBoatName();
void SetBoatName(const char* in_boatname);
void SetBoatName(const char* in_boatname);
</pre>
zone/mob_movement_manager.h
<pre>
void UpdatePathBoat(Mob *who, float x, float y, float z, MobMovementMode mode);
</pre>
</pre>


Line 242: Line 191:
INSERT INTO `grid_entries` (`gridid`, `zoneid`, `number`, `x`, `y`, `z`, `heading`, `pause`, `centerpoint`) VALUES (16, 68, 11, 3595, 491, -11.9, 0, 0, 0);
INSERT INTO `grid_entries` (`gridid`, `zoneid`, `number`, `x`, `y`, `z`, `heading`, `pause`, `centerpoint`) VALUES (16, 68, 11, 3595, 491, -11.9, 0, 0, 0);
</pre>
</pre>
==== Complete Example ====
The following is a complete example of database changes that were needed to implement the four shuttles leaving BB docks to the Maiden's Voyage in Timorous Deep:
* https://github.com/EQMacEmu/Server/blob/main/utils/sql/git/required/2023_12_29_BB_to_TD_Shuttles.sql


=== LUA Scripting ===
=== LUA Scripting ===
Line 253: Line 198:
* event_waypoint_arrive
* event_waypoint_arrive
* event_waypoint_depart
* event_waypoint_depart
* event_enter_zone
* event_board_boat
* event_leave_boat
=== Functions ===
* GetBoatNPCID()
* e.self:GetBoatName()
* e.self:SetBoatID(uint32 boatid);
* e.self:SetBoatName(const char* boatname);
void SendToBoat(bool messageonly)
* ent:GetBoatID() or e.self:GetBoatID()
This function can be used from the entity or player namespace, and usually to compare to an integer boatid value.


==== Example Scripts ====
==== Example Scripts ====
Line 279: Line 210:
* https://github.com/EQMacEmu/quests/blob/main/timorous/Maidens_Voyage.lua  
* https://github.com/EQMacEmu/quests/blob/main/timorous/Maidens_Voyage.lua  
* https://github.com/EQMacEmu/quests/blob/main/timorous/Muckskimmer.lua
* https://github.com/EQMacEmu/quests/blob/main/timorous/Muckskimmer.lua
* https://github.com/EQMacEmu/quests/blob/main/timorous/player.lua
* https://github.com/EQMacEmu/quests/blob/main/firiona/player.lua
* https://github.com/EQMacEmu/quests/blob/main/oasis/player.lua
* https://github.com/EQMacEmu/quests/blob/main/butcher/player.lua
* https://github.com/EQMacEmu/quests/blob/main/freporte/player.lua
* https://github.com/EQMacEmu/quests/blob/main/qeynos/player.lua
* https://github.com/EQMacEmu/quests/blob/main/erudnext/player.lua

Please note that all contributions to The Al`Kabor Project Wiki may be edited, altered, or removed by other contributors. If you do not want your writing to be edited mercilessly, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see The Al'Kabor Project Wiki:Copyrights for details). Do not submit copyrighted work without permission!

To edit this page, please answer the question that appears below (more info):

Cancel Editing help (opens in new window)