Compare commits

...

139 Commits

Author SHA1 Message Date
David Markowitz
f76d28584e bleh 2023-07-15 23:35:58 -07:00
David Markowitz
0779f33c2e Merge branch 'main' into AddEntitySerializeTests 2023-07-15 14:30:37 -07:00
David Markowitz
455f9470a5 Move EntityManager to Game namespace (#1140)
* Move EntityManager to Game namespace

* move initialization to later

Need to wait for dZoneManager to be initialized.

* Fix bugs

- Cannot delete from a RandomAccessIterator while in a range based for loop.

Touchup zone manager initialize

replace magic numbers with better named constants
replace magic zonecontrol id with a more readable hex alternative
condense stack variables
move initializers closer to their use
initialize entity manager with zone control

change initialize timings

If zone is not zero we expect to initialize the entity manager during zone manager initialization

Add constexpr for zone control LOT

* Add proper error handling

* revert vanity changes

* Update WorldServer.cpp

* Update dZoneManager.cpp
2023-07-15 13:56:33 -07:00
EmosewaMC
2b1edfa7e5 Add Construction and serialize test
Update EntityTests.cpp
2023-07-14 17:41:28 -07:00
EmosewaMC
972db85dbf Update EntityTests.cpp 2023-07-14 17:39:58 -07:00
EmosewaMC
7321382fe2 Add Construction and serialize test 2023-07-11 11:32:50 -07:00
9375c36c7b fix: remove hardcoded rotations now that vehicles orient correctly (#1132) 2023-07-03 11:58:49 -05:00
Raine
5cc7479f29 Update credits (#1133) 2023-07-01 15:40:34 -07:00
David Markowitz
c4135eac46 Revert playerflags functions to uint instead of int (#1130)
Prevents issue with negative numbers resulting in bugs.
2023-06-26 00:51:28 -07:00
41898bef86 foot race player flag fix (#1125)
and include fixes
2023-06-23 08:50:15 -05:00
David Markowitz
787dac7cd9 Update Dockerfile (#1126)
Fixes #1124
2023-06-23 08:49:58 -05:00
David Markowitz
fe23c7c5f7 Allow default scripts (#1117)
Fix an issue where vanity script overwrote always
2023-06-20 10:40:16 -05:00
David Markowitz
132d31d3ab Fix vehicle serialization during races (#1122)
* Fix vehicle serialization during races

- Add missing frame stats reading
- correct the inversion of rotation
- correct serialization order
- use proper dirty flags

Tested that racers are no longer sideways on certain vertical slopes and stay in sync throughout the whole race.

* Update ClientPackets.cpp

* Update ClientPackets.cpp

* Update VehiclePhysicsComponent.h
2023-06-20 09:19:21 -05:00
David Markowitz
2d31b7e4bb Fix incorrect serialization of SendTeleport (#1121)
* Fix incorrect serialization of SendTeleport

- Fixes all incorrect teleports in the game
- remove hacks in mast teleport
- ...
- ......

Update GameMessages.cpp

* Remove stupid argument

there got it all out

* remove extra true
2023-06-18 00:00:36 -07:00
David Markowitz
f46bc33dd4 Fix prereq bug (#1118) 2023-06-17 19:20:05 -05:00
David Markowitz
0d6bd33f9e Remove unused problematic code (#1115) 2023-06-16 23:30:28 -05:00
1a74c028c2 fix: make vanity npc's use default equipment if none is specified (#1116) 2023-06-16 16:09:46 -05:00
David Markowitz
2a0f63c0a1 Fix all smashables not playing animations (#1112)
Fixes an issue where most smashables did not explode into bricks upon death.  This included anything that was spawned or didnt have the flag is_smashable set.
Tested that in races, all objects smash into bricks
Tested that the player properly explodes in their car if they crash
Tested that Shooting Gallery plays the special smash animation when a ship is smashed
Tested that all spawned objects play smash animations

* Fix warning, Fix modular assembly not smashing

* Rename variable to correct name
2023-06-14 15:44:22 -07:00
David Markowitz
12d7ab9034 Remove null check in GetPosition (#1109)
Get ready for null pointer errors
2023-06-06 22:48:41 -07:00
David Markowitz
b589755655 Fix out of bounds access in dpGrid (#1106)
Fixes an issue where we would try to access an array out of the physics bounds
2023-06-03 16:28:27 -07:00
David Markowitz
8ae1e1bc6b Fix: remove ability to buy items from a vendor if they don't sell said item (#1105) 2023-06-03 00:40:46 -07:00
David Markowitz
9fabff16e4 Update AMFDeserialize (#1096)
Per ISO C++ standard 9.7.1 5.3,
"Otherwise the type of the enumerator is the same as that of the preceding enumerator unless the
incremented value is not representable in that type, in which case the type is an unspecified integral
type sufficient to contain the incremented value. If no such type exists, the program is ill-formed."
it is not undefined behavior to set a scoped enum to a value outside of its constant range because all values of the underlying type can represent the scoped enum
2023-06-02 06:44:49 -05:00
David Markowitz
e47169fec5 Fix: Some platforms not using the same RNG for every roll (#1103)
* Test changes

* Update ObjectIDManager.h

* Revert "Update ObjectIDManager.h"

This reverts commit 3e4d169718.

* Revert "Test changes"

This reverts commit 8e16573f93.

* Use random engine
2023-05-26 23:22:31 -05:00
David Markowitz
238751f14e Remove extra cout (#1101) 2023-05-25 15:29:46 -05:00
59387e5fe3 fix: update type in am blue x script (#1095)
Fixes #1094
2023-05-17 13:17:34 -05:00
Gie "Max" Vanommeslaeghe
f9b52ad01c Merge pull request #1025 from EmosewaMC/more-cdclient-cleanup
Implement animation table
2023-05-14 15:08:18 +02:00
David Markowitz
1f3df08730 Update GameMessages.cpp 2023-05-13 16:22:13 -07:00
9708ea28dc refactor: removed hardcoded ag laser logic (#1079)
* Removed hardcoded laser logic

* Address feedback
2023-05-13 18:21:17 -05:00
David Markowitz
8a065ad074 Merge remote-tracking branch 'upstream/main' into more-cdclient-cleanup 2023-05-13 16:16:58 -07:00
Jett
2117a18d62 Enable artifact uploading and replace upload parameters (#1091) 2023-05-13 17:23:09 -05:00
David Markowitz
4fe335cc66 Refactor: Amf3 implementation (#998)
* Update AMFDeserializeTests.cpp

Redo Amf3 functionality

Overhaul the whole thing due to it being outdated and clunky to use

Sometimes you want to keep the value

Update AMFDeserializeTests.cpp

* Fix enum and constructors

Correct enum to a class and simplify names.
Add a proper default constructor

* Update MasterServer.cpp

* Fix bugs and add more tests

* Refactor: AMF with templates in mind

- Remove hard coded bodge
- Use templates and generics to allow for much looser typing and strengthened implementation
- Move code into header only implementation for portability

Refactor: Convert AMF implementation to templates

- Rip out previous implementation
- Remove all extraneous terminology
- Add proper overloads for all types of inserts
- Fix up tests and codebase

* Fix compiler errors

* Check for null first

* Add specialization for const char*

* Update tests for new template specialization

* Switch BitStream to use references

* Rename files

* Check enum bounds on deserialize

I did this on a phone
2023-05-13 17:22:00 -05:00
9d105a287d fix: not everything attached to a path is a moving platform (#1090) 2023-05-13 13:47:28 -07:00
1af70161eb fix: orient player correctly when using pirate mast in FV (#1087)
* fix: frient player correctly when using pirate mast in FV

* only get mast name once
2023-05-13 09:31:13 -05:00
739eae5244 feature: Implement FallSpeedBehavior (#1084)
* Hacky FallSpeedBehavior

* Fixup

* Make it more robust like speedboost
add check for default
Fix error in GetActiveSpeedboosts

* simplify and address feedback
2023-05-13 09:30:59 -05:00
Gie "Max" Vanommeslaeghe
07803a7ca2 Merge pull request #1085 from DarkflameUniverse/issue-436
fix: not exiting shooting gallery when clicking activity close button
2023-05-13 14:11:16 +02:00
Gie "Max" Vanommeslaeghe
61ae619886 Merge pull request #1032 from EmosewaMC/FixWingreaper
Fix Wingreaper birds not moving
2023-05-13 14:04:37 +02:00
Gie "Max" Vanommeslaeghe
8a8006bee5 Merge pull request #1088 from EmosewaMC/movingPlatformsFix
Fix deserialization errors for MovingPlatforms
2023-05-13 14:03:24 +02:00
David Markowitz
c5afd7d4a3 Fix deserialization errors for MovingPlatforms
- Fixes deserialization errors for MovingPlatforms that did not have an attached_path, but had a MovingPlatform component >= id 0.
2023-05-13 04:04:15 -07:00
a809f36548 Address feedback 2023-05-11 09:23:48 -05:00
0e01948414 Define comp 103 as Gate Rush Control comp (#1078)
Fix typo in 115
2023-05-11 06:54:41 -05:00
6e6a05fc1d fix: prevent negative imagination (#1083)
* fix: prevent negative imagination
And fail switch if we don't have enough imagination

* Make better
2023-05-11 06:37:02 -05:00
5af5b0f1c1 fix: not exiting shooting gallery when clicking activity close button
Fixes #436
Fixes crash when replaying as well
2023-05-10 19:26:04 -05:00
bf0ae6f181 fix: add check for arg nums on handlepushobject (#1081) 2023-05-10 07:44:21 -05:00
b1cd2776fa fix: make exiting the race work (#1082) 2023-05-10 04:05:56 -05:00
4ff5afd9f7 Fix race exit dialogue always exiting (#1077)
Fixes #1048
Tested that closing the dialog via esc, the x in the top right, or the big red x doesn't exit the race
Tested that the green check button does exit the race
2023-05-09 00:40:00 -05:00
David Markowitz
ce931c2cfe Fix erroneous GM message ID (#1076) 2023-05-09 00:39:43 -05:00
David Markowitz
7aad6e4bc2 Make header skips more obvious (#1074)
* Make header skips more obvious

seeing inStream.Read(LWOOBJID) is much less clear than a macro which very clearly skips the header.

* Formatting pass
2023-05-08 06:31:10 -05:00
Gie "Max" Vanommeslaeghe
64a947e338 Merge pull request #1069 from EmosewaMC/NullChecks
Add more null checks and split out code
2023-05-08 12:10:58 +02:00
8ceabadcde Removed some hardcoded logic for racing (#1075)
Including return world and what activity ID to use for rewards
2023-05-08 04:38:08 -05:00
David Markowitz
7e61638595 Reinforce PacketUtils writing (#1073)
Ensure the correct size is written to the bitstream.  It is always supposed to write 64 bits.
2023-05-06 23:45:07 -07:00
David Markowitz
33c12f3bc5 Fix bounds check (#1071)
Fix Chat Crash

Update CMakeVariables.txt

Add checks for all servers
2023-05-06 13:32:53 -05:00
David Markowitz
7949907517 Fix bounds check (#1070) 2023-05-06 13:32:46 -05:00
David Markowitz
cffb1449d8 Add better logs to saving (#1068)
* Fix overread in projectile behavior

* Fix stuns

* Correctly read in bitStream

* Fix projectile behavior

* Address movement type issues

* Update shutdown time to be accurate

* Fix small issues

* Fix missing template

* Add note for compile jobs

* Add bounds check for speed division

* Add better logs
2023-05-06 13:32:38 -05:00
5479cf4428 Fix typing of some player flag variables (#1067)
Mainly on properties

Tested that the spider queen mission can now be progressed
2023-05-06 13:32:26 -05:00
David Markowitz
df3265c82e Add more null checks and split out code
Makes crash logs more apparent for what stage they crashed in for the engine updating.
2023-05-05 23:31:30 -07:00
e297aacc68 Breakout message identifiers (#1065)
and make them scope enums
2023-05-03 16:38:32 -05:00
c17b5fa586 prevent ressurecting with more than max stats (#1064)
for health and imagination
2023-05-03 01:31:50 -05:00
6aa90ad5b2 Breakout rest of the enums from dCommonVars and clean it up (#1061)
* Breakout rest of the enums from dcommonvars
so we don't have to deal with merge conflicts
ePlayerFlags is not a scoped enum, yet, due to it's complexity

* address feedback

* make player flag types consistent

* fix typo
2023-05-02 17:39:21 -05:00
David Markowitz
e8590a5853 Add tests for LDF parsing and serialization. Cleanup LDF (#1062)
* Add tests and cleanup LDF header

Also implements a speedup by using overloaded operators to put numbers directly to a stream as opposed to doing to_string first.

Stage 2 of re-write

Reduce scoping
Add further optimizations
Fix more edge cases
Split out tests to many smaller ones

Use EXPECT_NO_THROW

Add edge cases to test

Added these first with the before to confirm they failed, and now will be adding the remaining fixes needed to make the tests pass.

Add edge case testing for LDF strings

Add further tests

Use characters instead of char*

Update AMFDeserializeTests.cpp

Add null tests

* Add Test Fixture for dCommon

* Add speed test

* Convert to using string_view

* Add explanation on early return

* Remove "testing" code
2023-05-02 17:19:20 -05:00
2f919d101f Fix bad lot comparison in AG Jet Effect Server (#1063) 2023-05-02 03:27:16 -07:00
4976701f37 breakout object bits into scoped enum (#997)
* breakout object bits into enum class
tested that things still work as expected
use the inplace set bits where appropiate

* add inline
2023-04-25 13:17:40 -05:00
Gie "Max" Vanommeslaeghe
de1ddd3125 Merge pull request #1019 from EmosewaMC/inventoryTypeCorrections
Correct incorrect inventory types
2023-04-23 12:49:43 +02:00
David Markowitz
58951dced0 Remove all need for a local ugc server (#1054) 2023-04-22 12:32:32 -07:00
2e284eb2ce Implement Timer handlers in triggers and ontimerdone trigger event (#1031)
* Works, but AOE is broken

* Address Feedback

* fix typo
2023-04-18 12:48:03 -05:00
David Markowitz
da6ca82ae2 add missing overrides (#1060) 2023-04-18 01:40:33 -05:00
f60ea40acc Add random end of race behavior (#1056)
* randominze between 0 and 7 inclusive
for the different animation types

* Make the end behavior deterministic unpon loading
So that all players see the same animations for each other
2023-04-18 01:40:20 -05:00
David Markowitz
fbfa778d3d Patch ghosting exclusions (#1059) 2023-04-17 14:19:26 -05:00
David Markowitz
4734996c7c Resolve most compiler warnings (#1053) 2023-04-12 11:48:20 -05:00
ce51438bc8 Implement some scripts for alpha FV (#1049)
* Implement maelstrom fog for alpha FV
add OnOffCollisionPhantom call to cppscripts
Add physics shape for gas blocking volume

* Add Ninja Sensie Script for alpha FV
and migration

* Fix private var casing

* And ninja wild scripts
they keep making me add more things

* address feedback

---------

Co-authored-by: Gie "Max" Vanommeslaeghe <gievanom@hotmail.com>
2023-04-12 11:46:31 -05:00
Gie "Max" Vanommeslaeghe
9c721abebb Merge pull request #1050 from DarkflameUniverse/pickup-scripts
Implements all the pickup scripts
2023-04-12 16:19:13 +02:00
David Markowitz
308d56968a Use epsilon comparison 2023-04-11 22:25:02 -07:00
David Markowitz
268155fc98 Fix more invisible enemy issues (#1052) 2023-04-11 00:42:12 -07:00
d2d075ef52 remove debug log 2023-04-09 13:50:26 -05:00
09e9bb2c15 fix scripts
split speed out to use target as caster
fix armor skill
2023-04-09 13:21:57 -05:00
bed269ffbe Merge branch 'main' into pickup-scripts 2023-04-09 12:11:54 -05:00
2cf92a16d2 Add scripts for a few wild creatures (#1051)
ignore frog script
2023-04-09 10:17:05 -05:00
87e36aaf72 remove log 2023-04-09 09:40:57 -05:00
172b398b7b fix consolidation
add speed buff
2023-04-09 09:38:56 -05:00
5cdff8bcaf Simplify
tested that things still work as intended
2023-04-09 08:54:14 -05:00
9e4de544a6 fix 2023-04-09 01:10:23 -05:00
37fe935a3a Implements all the old pickup scripts
Testsed to make sure they work
Tested to make sure existing script works still
killing it immedialtely is live accurate, the timer was not accurate
2023-04-08 22:07:25 -05:00
David Markowitz
33f9e9c8cb Allow case insensitive commands (#1047) 2023-04-08 15:45:45 -05:00
David Markowitz
541250176c Resolve many issues with invisible enemies and End Behavior nodes not firing (#1044)
* Finall fix invisible enemies

* Add garbage collection

* Add comment

* Add constexpr for lagFrames
2023-04-05 08:57:47 -05:00
Gie "Max" Vanommeslaeghe
3202b5a36e Merge pull request #1042 from EmosewaMC/FixSkills
Fix SwitchMultiple incorrect handling
2023-04-03 20:52:22 +02:00
Gie "Max" Vanommeslaeghe
d25b7729b6 Merge pull request #1043 from DarkflameUniverse/update-change-orientation-behavior
Fix and fully implement ChangeOrientation behavior
2023-04-03 20:51:39 +02:00
930735860b use z axis 2023-04-03 13:10:51 -05:00
David Markowitz
426a84daf9 Update InterruptBehavior.cpp 2023-04-03 09:37:29 -07:00
dffcbcd4d4 cleanup 2023-04-03 08:29:39 -05:00
a5ff93351d remove empty line
remove undeeded header
2023-04-03 08:25:47 -05:00
1fb086ccbd Fully implement Change orientation
fix bug where you would always look at self
added to_angle handline
2023-04-03 08:21:23 -05:00
David Markowitz
b8251c06b8 Fix incorrect SwitchMultiple handling 2023-04-03 04:11:02 -07:00
David Markowitz
a26f29baf6 Fix some models not disassembling into bricks (#1041) 2023-04-02 23:26:44 -07:00
595afe42e5 fix the lookat 2023-04-02 22:37:24 -05:00
David Markowitz
54d8c45b52 Don't interrupt players 2023-04-02 18:05:42 -07:00
David Markowitz
801ca69778 Fix nameplate command (#1040) 2023-04-01 18:30:08 -07:00
David Markowitz
49d695a153 Remove extra bit in BasicAttackBehavior write (#1039) 2023-04-01 02:45:29 -07:00
David Markowitz
152c8ea712 Add npc (#1038) 2023-03-31 16:50:17 -05:00
David Markowitz
cbef4a140e Fix Spider Queen boss battle crash (#1034) 2023-03-30 06:01:15 -07:00
David Markowitz
47445ada54 Fix Wingreaper birds not moving
Fix an issue where the Wingreaper birds no longer moved.  The client seems to do the following:
Default speed set to 10.0f
Check the PhysicsComponent table for the column speed and if it exists set speed to that value and if the value was null set it to the default again.
2023-03-27 01:13:34 -07:00
David Markowitz
426bc963fe Add Animation Table logic 2023-03-26 05:18:45 -07:00
David Markowitz
1e4e1b914c Merge remote-tracking branch 'upstream/main' into more-cdclient-cleanup 2023-03-26 03:00:21 -07:00
David Markowitz
b432a3f5da Remove inlines
Clean up macros

more tomorrow

Cleanup and optimize CDActivities table

Remove unused include

Further work on CDActivityRewards

Update MasterServer.cpp

Further animations work

Activities still needs work for a better PK.

fix type

All of these replacements worked

Create internal interface for animations

Allows for user to just call GetAnimationTIme or PlayAnimation rather than passing in arbitrary true false statements
2023-03-26 02:59:46 -07:00
c415d0520a Implement some more trigger event calls and command handlers (#989)
* Implement some trigger event calls
and command handlers

* add zone summary dimissed GM

* break and remove log

* some cleanup in Gather Targets
and blocking out

* fix default value of unlock for play cinematic

* Log on errors
add enum for physics effect type
simplify nipoint3 logic
check arg count
add enum for End behavior

* tryparse for nipoint3

* totally didn't forget to include it

* bleh c++ is blah

* ???

* address feedback

* Fix for #1028
2023-03-25 05:26:39 -05:00
72ca0f13ff breakout gmlevel into a scoped enum (#996)
* breakout gmlevel enum and make it a class
tested that things still work
slash command,
chat restrictions,
packets and serializations

* fix GM level for some slash commands

* fix new use of this enum
2023-03-24 18:16:45 -05:00
David Markowitz
b967cc57d1 Allow name billboards to be toggled (#1026)
* Allow name billboards to be toggled

* Allow name billboards to be toggled

* Add comments

* Move logic to Character

* Use Entity in Character instead
2023-03-23 09:49:31 -05:00
David Markowitz
7671cc6865 CDClient cleanup and optimization (#1023)
* CDClient cleanup and optimization

- Use static function to get table name
- Remove unused GetName function
- Replace above function with a static GetTableName function
- Remove verbose comments
- Remove verbose initializers
- Remove need to specify table name when getting a table by name
- Remove unused typedef for mac and linux

* Re-add unused table

Convert tables to singletons

- Convert all CDClient tables to singletons
- Move Singleton.h to dCommon
- Reduce header clutter in CDClientManager
2023-03-17 07:36:21 -07:00
David Markowitz
bd79e9433c Increase Battle of Nimbus Station end of match timer to 60 seconds (#1018)
as per the live script
This is now the third time this has been updated lol
2023-03-17 02:48:47 -07:00
David Markowitz
2bcf862f93 Development inventory command improvements (#1022) 2023-03-14 05:50:12 -07:00
David Markowitz
c3723371cf Patch divide by zero when advancing waypoints (#1020) 2023-03-14 04:12:26 -07:00
David Markowitz
f0451616a4 Correct incorrect inventory types 2023-03-13 03:16:14 -07:00
David Markowitz
137a5e5c3d Players no longer respawn if they were alive at the end of Battle of Nimbus Station (#1017) 2023-03-12 07:21:27 -07:00
David Markowitz
a532bc15d8 Fix zombie bug (#1014) 2023-03-08 07:32:03 -06:00
ff0336793c add stun immunity script (#1015)
several summons use this script to be immune to stuns
2023-03-08 07:31:45 -06:00
David Markowitz
49047a267b Fix racing imagination loss on death (#1006)
* Fix imagination on death

* Fix defaults

* Fix visuals
2023-03-05 14:34:59 -06:00
9d65d871d0 fix compatibility with nexus dash (#1011)
* add some more utility to the masterserver -a command
fix compatability with nexus dash

* cleanup code some more
user logger where it makes sense
only take in password if it is needed
log a better error if account cannot be created

* update message

* return before success statement if catching error
2023-03-05 13:11:32 -06:00
e524b86e12 breakout the component types into a scoped enum (#1002)
* breakout the component types into a scoped enum

tested that things are the same as they were before

* fix missed rename

* fix brick-by-brick name to be crafting
because that's what it is
2023-03-04 01:16:37 -06:00
David Markowitz
2837f68f44 Fix stuns with mast teleport (#1003) 2023-03-03 22:59:37 -08:00
David Markowitz
a0c0a87956 Fix Trigger Missions (#1010) 2023-03-03 22:58:29 -08:00
David Markowitz
3e482602d4 Fix non-parallel timers in CombatAIComponent (#1008)
* Fix non-parelell timers
2023-03-03 18:45:01 -08:00
David Markowitz
b6fc959433 Fix shark stinky fish death animation (#1004) 2023-02-28 17:30:28 -06:00
6d989f37f1 Breakout ServerDisconnectIdentifiers into an enum (#995) 2023-02-19 04:29:14 -08:00
David Markowitz
d138b7b878 Make ControlBehavior messages far more modular (#991)
* Make case consistent

* How modular can you go?

Holy modular

* Add comments

* Initialize values
2023-02-16 11:30:33 -06:00
484488e47d add bounds check to prevent crashing (#992) 2023-02-16 11:14:23 -06:00
David Markowitz
72c93c8913 Further implement Property Behavior parsing (#936)
Further implements the ControlBehavior processing and adds preparations for cheat detection
2023-02-13 18:55:44 -08:00
3cd0d1ec3d Make wrapper for casting skills (#987)
* Make wrapper for casting skills
this is to reduce magic numbers in the code base

Only updated one use of this to demo that this works.
Will be do more in a sepearate PR.

Also, inadvertantly fix damage stacking and self-damage in the teslapack

* add skill<->behavior caching

* explicit by reference

* address emo's feedback
2023-02-10 02:30:17 -06:00
91c0c1fcfb Split out LUTriggers into it's own component (#986)
* Split out LUTriggers into it's own component

* some cleanup

* fix debug log

* use emplace and tryParse

* slight refactor to make the work on startup
rather than at runtime
Also TODO's for getting targets via all the possible methods

* address feedback
2023-02-10 02:29:53 -06:00
David Markowitz
d17f51183e Allow landing animation in Return to the Venture Explorer (#977) 2023-01-26 21:41:40 -05:00
Jett
6aa69de4fd Resolution of accidental shifting of eItemType enum (#976) 2023-01-25 16:21:12 -08:00
Gie "Max" Vanommeslaeghe
cdffd5ff30 Fix: 968 bug using lookup command with no parameters crashes instance (#970)
* Update SlashCommandHandler.cpp

* Update SlashCommandHandler.cpp
2023-01-24 17:09:32 -06:00
ac5f08f601 Merge pull request #963 from DarkflameUniverse/enum-cleanup
cleanup enums to make them more consistent style wise
2023-01-24 16:38:41 -06:00
Jett
90d184ba93 Remove Clang Tidy configurations. (#969) 2023-01-24 22:36:30 +00:00
bff14fd391 add blame ignore 2023-01-22 17:39:38 -06:00
faf42d2f8c cleanup enums to make them more consistent 2023-01-22 17:38:47 -06:00
David Markowitz
cff94b6c22 Fix hash collisions in achievements (#962) 2023-01-21 09:37:09 -06:00
David Markowitz
c8cd51ef63 Fix warning for overrides (#961) 2023-01-20 00:07:25 -08:00
6fd80e3117 Don't enable HC on minigame worlds (#959)
* Fix max's ouchi

* use smarter logic

* fix whitespace

* clone
2023-01-20 01:50:46 -06:00
David Markowitz
14085d09bd Add note for compiling with multiple jobs (#948)
* Fix overread in projectile behavior

* Fix stuns

* Correctly read in bitStream

* Fix projectile behavior

* Address movement type issues

* Update shutdown time to be accurate

* Fix small issues

* Fix missing template

* Add note for compile jobs
2023-01-17 13:26:50 -06:00
David Markowitz
7418e02365 Update AmTeapotServer.cpp (#949) 2023-01-17 06:07:34 -06:00
David Markowitz
fbaf1cbb25 Dont preemptively delete objects (#958)
Let finalizeShutdown take care of it
2023-01-17 06:06:09 -06:00
710 changed files with 10991 additions and 9032 deletions

View File

@@ -1,37 +0,0 @@
---
BraceWrapping:
AfterCaseLabel: false
AfterClass: false
AfterControlStatement: false
AfterEnum: false
AfterFunction: false
AfterNamespace: false
AfterObjCDeclaration: false
AfterStruct: false
AfterUnion: false
AfterExternBlock: false
BeforeCatch: false
BeforeElse: false
IndentBraces: false
SplitEmptyFunction: false
SplitEmptyRecord: false
SplitEmptyNamespace: false
BeforeLambdaBody: false
BeforeWhile: false
BreakBeforeBraces: Attach
ColumnLimit: 0
IndentWidth: 4
IndentCaseLabels: true
IncludeBlocks: Regroup
IncludeCategories:
- Regex: '<[[:alnum:].]+\.h>'
Priority: 1
- Regex: '<[[:alnum:].]+>'
Priority: 2
- Regex: '.*/.*'
Priority: 3
- Regex: '.*'
Priority: 4
DerivePointerAlignment: false
PointerAlignment: Left
...

View File

@@ -1,17 +0,0 @@
Checks: '-*,readability-*,performance-*,modernize-*,-modernize-use-trailing-return-type,bugprone-*'
WarningsAsErrors: true
HeaderFilterRegex: ''
FormatStyle: none
CheckOptions:
- key: readability-identifier-naming.ClassCase
value: CamelCase
- key: readability-identifier-naming.ClassMethodCase
value: CamelCase
- key: readability-identifier-naming.ClassMemberPrefix
value: m_
- key: readability-identifier-naming.ClassMemberCase
value: CamelCase
- key: readability-identifier-naming.ClassConstantCase
value: UPPER_CASE
- key: readability-identifier-naming.FunctionCase
value: CamelCase

View File

@@ -6,3 +6,6 @@
# convert to unix line endings
72477e01e2711e0f61cdb192ee266e5e21b8846f
# enum cleanup
faf42d2f8cf432df2993b031f079b0b8c6d7dbe7

View File

@@ -36,22 +36,16 @@ jobs:
testPreset: "ci-${{matrix.os}}"
- name: artifacts
uses: actions/upload-artifact@v3
if: ${{ github.ref == 'ref/head/main' }}
with:
name: build-${{matrix.os}}
path: |
build
!build/tests
!build/Testing
!build/CMakeFiles
!build/DartConfiguration.tcl
!build/CTestTestfile.cmake
!build/CMakeCache.txt
!build/build.ninja
!build/_deps
!build/cmake_install.cmake
!build/*.a
!build/*.lib
!build/*.dir
!build/*.vcxproj
!build/*.vcxproj.filters
build/*Server*
build/*.ini
build/*.so
build/*.dll
build/vanity/
build/navmeshes/
build/migrations/
build/*.dcf
!build/*.pdb
!build/d*/

View File

@@ -163,6 +163,7 @@ set(INCLUDED_DIRECTORIES
"dGame/dMission"
"dGame/dEntity"
"dGame/dPropertyBehaviors"
"dGame/dPropertyBehaviors/ControlBehaviorMessages"
"dGame/dUtilities"
"dPhysics"
"dNavigation"

View File

@@ -172,6 +172,10 @@ You can either run `build.sh` when in the root folder of the repository:
Or manually run the commands used in [build.sh](build.sh).
If you would like to build the server faster, append `-j<number>` where number is the number of simultaneous compile jobs to run at once. It is recommended that you have this number always be 1 less than your core count to prevent slowdowns. The command would look like this if you would build with 4 jobs at once:
```bash
./build.sh -j4
```
### Notes
Depending on your operating system, you may need to adjust some pre-processor defines in [CMakeVariables.txt](./CMakeVariables.txt) before building:
* If you are on MacOS, ensure OPENSSL_ROOT_DIR is pointing to the openssl root directory.
@@ -241,30 +245,11 @@ To connect to a server follow these steps:
* In the client directory, locate `boot.cfg`
* Open it in a text editor and locate where it says `AUTHSERVERIP=0:`
* Replace the contents after to `:` and the following `,` with what you configured as the server's public facing IP. For example `AUTHSERVERIP=0:localhost` for locally hosted servers
* Next locate the line `UGCUSE3DSERVICES=7:`
* Ensure the number after the 7 is a `0`
* Launch `legouniverse.exe`, through `wine` if on a Unix-like operating system
* Note that if you are on WSL2, you will need to configure the public IP in the server and client to be the IP of the WSL2 instance and not localhost, which can be found by running `ifconfig` in the terminal. Windows defaults to WSL1, so this will not apply to most users.
## Brick-By-Brick building
Should you choose to do any brick building, you will want to have some form of a http server that returns a 404 error since we are unable to emulate live User Generated Content at the moment. If you attempt to do any brick building without a 404 server running properly, you will be unable to load into your game. Python is the easiest way to do this, but any thing that returns a 404 should work fine.
* Note: the client hard codes this request on port 80.
<font size="4">**If you do not plan on doing any Brick Building, then you can skip this step.**</font>
The easiest way to do this is to install [python](https://www.python.org/downloads/).
### Allowing a user to build in Brick-by-Brick mode
Brick-By-Brick building requires `PATCHSERVERIP=0:` and `UGCSERVERIP=0:` in the `boot.cfg` to point to a HTTP server which always returns `HTTP 404 - Not Found` for all requests. This can be most easily achieved by pointing both of those variables to `localhost` while having running in the background.
Each client must have their own 404 server running if they are using a locally hosted 404 server.
```bash
# If on linux run this command. Because this is run on a port below 1024, binary network permissions are needed.
sudo python3 -m http.server 80
# If on windows one of the following will work when run through Powershell or Command Prompt assuming python is installed
python3 -m http.server 80
python http.server 80
py -m http.server 80
```
## Updating your server
To update your server to the latest version navigate to your cloned directory
```bash
@@ -353,7 +338,7 @@ This is a Work in Progress, but below are some quick links to documentaion for s
## Former Contributors
* TheMachine
* Matthew
* [Raine](https://github.com/Rainebannister)
* [Raine](https://github.com/uwainium)
* Bricknave
## Special Thanks

View File

@@ -9,5 +9,5 @@ cd build
cmake ..
# To build utilizing multiple cores, append `-j` and the amount of cores to utilize, for example `cmake --build . --config Release -j8'
cmake --build . --config Release
cmake --build . --config Release $1

View File

@@ -15,10 +15,13 @@
//RakNet includes:
#include "RakNetDefines.h"
#include <MessageIdentifiers.h>
//Auth includes:
#include "AuthPackets.h"
#include "dMessageIdentifiers.h"
#include "eConnectionType.h"
#include "eServerMessageType.h"
#include "eAuthMessageType.h"
#include "Game.h"
namespace Game {
@@ -168,13 +171,15 @@ dLogger* SetupLogger() {
}
void HandlePacket(Packet* packet) {
if (packet->length < 4) return;
if (packet->data[0] == ID_USER_PACKET_ENUM) {
if (packet->data[1] == SERVER) {
if (packet->data[3] == MSG_SERVER_VERSION_CONFIRM) {
if (static_cast<eConnectionType>(packet->data[1]) == eConnectionType::SERVER) {
if (static_cast<eServerMessageType>(packet->data[3]) == eServerMessageType::VERSION_CONFIRM) {
AuthPackets::HandleHandshake(Game::server, packet);
}
} else if (packet->data[1] == AUTH) {
if (packet->data[3] == MSG_AUTH_LOGIN_REQUEST) {
} else if (static_cast<eConnectionType>(packet->data[1]) == eConnectionType::AUTH) {
if (static_cast<eAuthMessageType>(packet->data[3]) == eAuthMessageType::LOGIN_REQUEST) {
AuthPackets::HandleLoginRequest(Game::server, packet);
}
}

View File

@@ -12,6 +12,7 @@
#include "dConfig.h"
#include "Database.h"
#include "Game.h"
#include "eGameMasterLevel.h"
using namespace dChatFilterDCF;
@@ -108,8 +109,8 @@ void dChatFilter::ExportWordlistToDCF(const std::string& filepath, bool whiteLis
}
}
std::vector<std::pair<uint8_t, uint8_t>> dChatFilter::IsSentenceOkay(const std::string& message, int gmLevel, bool whiteList) {
if (gmLevel > GAME_MASTER_LEVEL_FORUM_MODERATOR) return { }; //If anything but a forum mod, return true.
std::vector<std::pair<uint8_t, uint8_t>> dChatFilter::IsSentenceOkay(const std::string& message, eGameMasterLevel gmLevel, bool whiteList) {
if (gmLevel > eGameMasterLevel::FORUM_MODERATOR) return { }; //If anything but a forum mod, return true.
if (message.empty()) return { };
if (!whiteList && m_DeniedWords.empty()) return { { 0, message.length() } };

View File

@@ -4,6 +4,7 @@
#include "dCommonVars.h"
enum class eGameMasterLevel : uint8_t;
namespace dChatFilterDCF {
static const uint32_t header = ('D' + ('C' << 8) + ('F' << 16) + ('B' << 24));
static const uint32_t formatVersion = 2;
@@ -23,7 +24,7 @@ public:
void ReadWordlistPlaintext(const std::string& filepath, bool whiteList);
bool ReadWordlistDCF(const std::string& filepath, bool whiteList);
void ExportWordlistToDCF(const std::string& filepath, bool whiteList);
std::vector<std::pair<uint8_t, uint8_t>> IsSentenceOkay(const std::string& message, int gmLevel, bool whiteList = true);
std::vector<std::pair<uint8_t, uint8_t>> IsSentenceOkay(const std::string& message, eGameMasterLevel gmLevel, bool whiteList = true);
private:
bool m_DontGenerateDCF;

View File

@@ -3,24 +3,28 @@
#include "Database.h"
#include <vector>
#include "PacketUtils.h"
#include "dMessageIdentifiers.h"
#include "Game.h"
#include "dServer.h"
#include "GeneralUtils.h"
#include "dLogger.h"
#include "AddFriendResponseCode.h"
#include "AddFriendResponseType.h"
#include "eAddFriendResponseCode.h"
#include "eAddFriendResponseType.h"
#include "RakString.h"
#include "dConfig.h"
#include "eObjectBits.h"
#include "eConnectionType.h"
#include "eChatMessageType.h"
#include "eChatInternalMessageType.h"
#include "eClientMessageType.h"
#include "eGameMessageType.h"
extern PlayerContainer playerContainer;
void ChatPacketHandler::HandleFriendlistRequest(Packet* packet) {
//Get from the packet which player we want to do something with:
CINSTREAM;
CINSTREAM_SKIP_HEADER;
LWOOBJID playerID = 0;
inStream.Read(playerID);
inStream.Read(playerID);
auto player = playerContainer.GetPlayerData(playerID);
if (!player) return;
@@ -45,8 +49,8 @@ void ChatPacketHandler::HandleFriendlistRequest(Packet* packet) {
FriendData fd;
fd.isFTP = false; // not a thing in DLU
fd.friendID = res->getUInt(1);
GeneralUtils::SetBit(fd.friendID, static_cast<size_t>(eObjectBits::OBJECT_BIT_PERSISTENT));
GeneralUtils::SetBit(fd.friendID, static_cast<size_t>(eObjectBits::OBJECT_BIT_CHARACTER));
GeneralUtils::SetBit(fd.friendID, eObjectBits::PERSISTENT);
GeneralUtils::SetBit(fd.friendID, eObjectBits::CHARACTER);
fd.isBestFriend = res->getInt(2) == 3; //0 = friends, 1 = left_requested, 2 = right_requested, 3 = both_accepted - are now bffs
if (fd.isBestFriend) player->countOfBestFriends += 1;
@@ -71,11 +75,11 @@ void ChatPacketHandler::HandleFriendlistRequest(Packet* packet) {
//Now, we need to send the friendlist to the server they came from:
CBITSTREAM;
PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_ROUTE_TO_PLAYER);
PacketUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::ROUTE_TO_PLAYER);
bitStream.Write(playerID);
//portion that will get routed:
PacketUtils::WriteHeader(bitStream, CLIENT, MSG_CLIENT_GET_FRIENDS_LIST_RESPONSE);
PacketUtils::WriteHeader(bitStream, eConnectionType::CLIENT, eClientMessageType::GET_FRIENDS_LIST_RESPONSE);
bitStream.Write<uint8_t>(0);
bitStream.Write<uint16_t>(1); //Length of packet -- just writing one as it doesn't matter, client skips it.
bitStream.Write((uint16_t)friends.size());
@@ -94,10 +98,9 @@ void ChatPacketHandler::HandleFriendRequest(Packet* packet) {
auto maxNumberOfBestFriendsAsString = Game::config->GetValue("max_number_of_best_friends");
// If this config option doesn't exist, default to 5 which is what live used.
auto maxNumberOfBestFriends = maxNumberOfBestFriendsAsString != "" ? std::stoi(maxNumberOfBestFriendsAsString) : 5U;
CINSTREAM;
CINSTREAM_SKIP_HEADER;
LWOOBJID requestorPlayerID;
inStream.Read(requestorPlayerID);
inStream.Read(requestorPlayerID);
uint32_t spacing{};
inStream.Read(spacing);
std::string playerName = "";
@@ -115,7 +118,7 @@ void ChatPacketHandler::HandleFriendRequest(Packet* packet) {
auto requestor = playerContainer.GetPlayerData(requestorPlayerID);
if (requestor->playerName == playerName) {
SendFriendResponse(requestor, requestor, AddFriendResponseType::MYTHRAN);
SendFriendResponse(requestor, requestor, eAddFriendResponseType::MYTHRAN);
return;
};
std::unique_ptr<PlayerData> requestee(playerContainer.GetPlayerData(playerName));
@@ -153,7 +156,7 @@ void ChatPacketHandler::HandleFriendRequest(Packet* packet) {
requestee.reset(new PlayerData());
requestee->playerName = playerName;
SendFriendResponse(requestor, requestee.get(), result->next() ? AddFriendResponseType::NOTONLINE : AddFriendResponseType::INVALIDCHARACTER);
SendFriendResponse(requestor, requestee.get(), result->next() ? eAddFriendResponseType::NOTONLINE : eAddFriendResponseType::INVALIDCHARACTER);
return;
}
@@ -178,10 +181,10 @@ void ChatPacketHandler::HandleFriendRequest(Packet* packet) {
bestFriendStatus = oldBestFriendStatus;
// Set the bits
GeneralUtils::SetBit(queryPlayerID, static_cast<size_t>(eObjectBits::OBJECT_BIT_CHARACTER));
GeneralUtils::SetBit(queryPlayerID, static_cast<size_t>(eObjectBits::OBJECT_BIT_PERSISTENT));
GeneralUtils::SetBit(queryFriendID, static_cast<size_t>(eObjectBits::OBJECT_BIT_CHARACTER));
GeneralUtils::SetBit(queryFriendID, static_cast<size_t>(eObjectBits::OBJECT_BIT_PERSISTENT));
GeneralUtils::SetBit(queryPlayerID, eObjectBits::CHARACTER);
GeneralUtils::SetBit(queryPlayerID, eObjectBits::PERSISTENT);
GeneralUtils::SetBit(queryFriendID, eObjectBits::CHARACTER);
GeneralUtils::SetBit(queryFriendID, eObjectBits::PERSISTENT);
// Since this player can either be the friend of someone else or be friends with someone else
// their column in the database determines what bit gets set. When the value hits 3, they
@@ -197,10 +200,10 @@ void ChatPacketHandler::HandleFriendRequest(Packet* packet) {
if (oldBestFriendStatus != bestFriendStatus) {
if (requestee->countOfBestFriends >= maxNumberOfBestFriends || requestor->countOfBestFriends >= maxNumberOfBestFriends) {
if (requestee->countOfBestFriends >= maxNumberOfBestFriends) {
SendFriendResponse(requestor, requestee.get(), AddFriendResponseType::THEIRFRIENDLISTFULL, false);
SendFriendResponse(requestor, requestee.get(), eAddFriendResponseType::THEIRFRIENDLISTFULL, false);
}
if (requestor->countOfBestFriends >= maxNumberOfBestFriends) {
SendFriendResponse(requestor, requestee.get(), AddFriendResponseType::YOURFRIENDSLISTFULL, false);
SendFriendResponse(requestor, requestee.get(), eAddFriendResponseType::YOURFRIENDSLISTFULL, false);
}
} else {
// Then update the database with this new info.
@@ -215,8 +218,8 @@ void ChatPacketHandler::HandleFriendRequest(Packet* packet) {
if (bestFriendStatus == 3U) {
requestee->countOfBestFriends += 1;
requestor->countOfBestFriends += 1;
if (requestee->sysAddr != UNASSIGNED_SYSTEM_ADDRESS) SendFriendResponse(requestee.get(), requestor, AddFriendResponseType::ACCEPTED, false, true);
if (requestor->sysAddr != UNASSIGNED_SYSTEM_ADDRESS) SendFriendResponse(requestor, requestee.get(), AddFriendResponseType::ACCEPTED, false, true);
if (requestee->sysAddr != UNASSIGNED_SYSTEM_ADDRESS) SendFriendResponse(requestee.get(), requestor, eAddFriendResponseType::ACCEPTED, false, true);
if (requestor->sysAddr != UNASSIGNED_SYSTEM_ADDRESS) SendFriendResponse(requestor, requestee.get(), eAddFriendResponseType::ACCEPTED, false, true);
for (auto& friendData : requestor->friends) {
if (friendData.friendID == requestee->playerID) {
friendData.isBestFriend = true;
@@ -230,7 +233,7 @@ void ChatPacketHandler::HandleFriendRequest(Packet* packet) {
}
}
} else {
if (requestor->sysAddr != UNASSIGNED_SYSTEM_ADDRESS) SendFriendResponse(requestor, requestee.get(), AddFriendResponseType::WAITINGAPPROVAL, true, true);
if (requestor->sysAddr != UNASSIGNED_SYSTEM_ADDRESS) SendFriendResponse(requestor, requestee.get(), eAddFriendResponseType::WAITINGAPPROVAL, true, true);
}
} else {
// Do not send this if we are requesting to be a best friend.
@@ -242,12 +245,11 @@ void ChatPacketHandler::HandleFriendRequest(Packet* packet) {
}
void ChatPacketHandler::HandleFriendResponse(Packet* packet) {
CINSTREAM;
CINSTREAM_SKIP_HEADER;
LWOOBJID playerID;
inStream.Read(playerID);
inStream.Read(playerID);
AddFriendResponseCode clientResponseCode = static_cast<AddFriendResponseCode>(packet->data[0x14]);
eAddFriendResponseCode clientResponseCode = static_cast<eAddFriendResponseCode>(packet->data[0x14]);
std::string friendName = PacketUtils::ReadString(0x15, packet, true);
//Now to try and find both of these:
@@ -255,29 +257,29 @@ void ChatPacketHandler::HandleFriendResponse(Packet* packet) {
auto requestee = playerContainer.GetPlayerData(friendName);
if (!requestor || !requestee) return;
AddFriendResponseType serverResponseCode{};
eAddFriendResponseType serverResponseCode{};
uint8_t isAlreadyBestFriends = 0U;
// We need to convert this response code to one we can actually send back to the client.
switch (clientResponseCode) {
case AddFriendResponseCode::ACCEPTED:
serverResponseCode = AddFriendResponseType::ACCEPTED;
case eAddFriendResponseCode::ACCEPTED:
serverResponseCode = eAddFriendResponseType::ACCEPTED;
break;
case AddFriendResponseCode::BUSY:
serverResponseCode = AddFriendResponseType::BUSY;
case eAddFriendResponseCode::BUSY:
serverResponseCode = eAddFriendResponseType::BUSY;
break;
case AddFriendResponseCode::CANCELLED:
serverResponseCode = AddFriendResponseType::CANCELLED;
case eAddFriendResponseCode::CANCELLED:
serverResponseCode = eAddFriendResponseType::CANCELLED;
break;
case AddFriendResponseCode::REJECTED:
serverResponseCode = AddFriendResponseType::DECLINED;
case eAddFriendResponseCode::REJECTED:
serverResponseCode = eAddFriendResponseType::DECLINED;
break;
}
// Now that we have handled the base cases, we need to check the other cases.
if (serverResponseCode == AddFriendResponseType::ACCEPTED) {
if (serverResponseCode == eAddFriendResponseType::ACCEPTED) {
for (auto friendData : requestor->friends) {
if (friendData.friendID == requestee->playerID) {
serverResponseCode = AddFriendResponseType::ALREADYFRIEND;
serverResponseCode = eAddFriendResponseType::ALREADYFRIEND;
if (friendData.isBestFriend) {
isAlreadyBestFriends = 1U;
}
@@ -286,7 +288,7 @@ void ChatPacketHandler::HandleFriendResponse(Packet* packet) {
}
// This message is NOT sent for best friends and is handled differently for those requests.
if (serverResponseCode == AddFriendResponseType::ACCEPTED) {
if (serverResponseCode == eAddFriendResponseType::ACCEPTED) {
// Add the each player to the others friend list.
FriendData requestorData;
requestorData.zoneID = requestor->zoneID;
@@ -313,15 +315,14 @@ void ChatPacketHandler::HandleFriendResponse(Packet* packet) {
statement->execute();
}
if (serverResponseCode != AddFriendResponseType::DECLINED) SendFriendResponse(requestor, requestee, serverResponseCode, isAlreadyBestFriends);
if (serverResponseCode != AddFriendResponseType::ALREADYFRIEND) SendFriendResponse(requestee, requestor, serverResponseCode, isAlreadyBestFriends);
if (serverResponseCode != eAddFriendResponseType::DECLINED) SendFriendResponse(requestor, requestee, serverResponseCode, isAlreadyBestFriends);
if (serverResponseCode != eAddFriendResponseType::ALREADYFRIEND) SendFriendResponse(requestee, requestor, serverResponseCode, isAlreadyBestFriends);
}
void ChatPacketHandler::HandleRemoveFriend(Packet* packet) {
CINSTREAM;
CINSTREAM_SKIP_HEADER;
LWOOBJID playerID;
inStream.Read(playerID);
inStream.Read(playerID);
std::string friendName = PacketUtils::ReadString(0x14, packet, true);
//we'll have to query the db here to find the user, since you can delete them while they're offline.
@@ -336,8 +337,8 @@ void ChatPacketHandler::HandleRemoveFriend(Packet* packet) {
}
// Convert friendID to LWOOBJID
GeneralUtils::SetBit(friendID, static_cast<size_t>(eObjectBits::OBJECT_BIT_PERSISTENT));
GeneralUtils::SetBit(friendID, static_cast<size_t>(eObjectBits::OBJECT_BIT_CHARACTER));
GeneralUtils::SetBit(friendID, eObjectBits::PERSISTENT);
GeneralUtils::SetBit(friendID, eObjectBits::CHARACTER);
std::unique_ptr<sql::PreparedStatement> deletestmt(Database::CreatePreppedStmt("DELETE FROM friends WHERE (player_id = ? AND friend_id = ?) OR (player_id = ? AND friend_id = ?) LIMIT 1;"));
deletestmt->setUInt(1, static_cast<uint32_t>(playerID));
@@ -376,10 +377,9 @@ void ChatPacketHandler::HandleRemoveFriend(Packet* packet) {
}
void ChatPacketHandler::HandleChatMessage(Packet* packet) {
CINSTREAM;
CINSTREAM_SKIP_HEADER;
LWOOBJID playerID = LWOOBJID_EMPTY;
inStream.Read(playerID);
inStream.Read(playerID);
auto* sender = playerContainer.GetPlayerData(playerID);
@@ -412,10 +412,10 @@ void ChatPacketHandler::HandleChatMessage(Packet* packet) {
const auto otherName = std::string(otherMember->playerName.c_str());
CBITSTREAM;
PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_ROUTE_TO_PLAYER);
PacketUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::ROUTE_TO_PLAYER);
bitStream.Write(otherMember->playerID);
PacketUtils::WriteHeader(bitStream, CHAT, MSG_CHAT_PRIVATE_CHAT_MESSAGE);
PacketUtils::WriteHeader(bitStream, eConnectionType::CHAT, eChatMessageType::PRIVATE_CHAT_MESSAGE);
bitStream.Write(otherMember->playerID);
bitStream.Write<uint8_t>(8);
bitStream.Write<unsigned int>(69);
@@ -451,10 +451,10 @@ void ChatPacketHandler::HandlePrivateChatMessage(Packet* packet) {
//To the sender:
{
CBITSTREAM;
PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_ROUTE_TO_PLAYER);
PacketUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::ROUTE_TO_PLAYER);
bitStream.Write(goonA->playerID);
PacketUtils::WriteHeader(bitStream, CHAT, MSG_CHAT_PRIVATE_CHAT_MESSAGE);
PacketUtils::WriteHeader(bitStream, eConnectionType::CHAT, eChatMessageType::PRIVATE_CHAT_MESSAGE);
bitStream.Write(goonA->playerID);
bitStream.Write<uint8_t>(7);
bitStream.Write<unsigned int>(69);
@@ -474,10 +474,10 @@ void ChatPacketHandler::HandlePrivateChatMessage(Packet* packet) {
//To the receiver:
{
CBITSTREAM;
PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_ROUTE_TO_PLAYER);
PacketUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::ROUTE_TO_PLAYER);
bitStream.Write(goonB->playerID);
PacketUtils::WriteHeader(bitStream, CHAT, MSG_CHAT_PRIVATE_CHAT_MESSAGE);
PacketUtils::WriteHeader(bitStream, eConnectionType::CHAT, eChatMessageType::PRIVATE_CHAT_MESSAGE);
bitStream.Write(goonA->playerID);
bitStream.Write<uint8_t>(7);
bitStream.Write<unsigned int>(69);
@@ -496,10 +496,9 @@ void ChatPacketHandler::HandlePrivateChatMessage(Packet* packet) {
}
void ChatPacketHandler::HandleTeamInvite(Packet* packet) {
CINSTREAM;
CINSTREAM_SKIP_HEADER;
LWOOBJID playerID;
inStream.Read(playerID);
inStream.Read(playerID);
std::string invitedPlayer = PacketUtils::ReadString(0x14, packet, true);
auto* player = playerContainer.GetPlayerData(playerID);
@@ -537,10 +536,9 @@ void ChatPacketHandler::HandleTeamInvite(Packet* packet) {
}
void ChatPacketHandler::HandleTeamInviteResponse(Packet* packet) {
CINSTREAM;
CINSTREAM_SKIP_HEADER;
LWOOBJID playerID = LWOOBJID_EMPTY;
inStream.Read(playerID);
inStream.Read(playerID);
uint32_t size = 0;
inStream.Read(size);
char declined = 0;
@@ -571,10 +569,9 @@ void ChatPacketHandler::HandleTeamInviteResponse(Packet* packet) {
}
void ChatPacketHandler::HandleTeamLeave(Packet* packet) {
CINSTREAM;
CINSTREAM_SKIP_HEADER;
LWOOBJID playerID = LWOOBJID_EMPTY;
inStream.Read(playerID);
inStream.Read(playerID);
uint32_t size = 0;
inStream.Read(size);
@@ -588,10 +585,9 @@ void ChatPacketHandler::HandleTeamLeave(Packet* packet) {
}
void ChatPacketHandler::HandleTeamKick(Packet* packet) {
CINSTREAM;
CINSTREAM_SKIP_HEADER;
LWOOBJID playerID = LWOOBJID_EMPTY;
inStream.Read(playerID);
inStream.Read(playerID);
std::string kickedPlayer = PacketUtils::ReadString(0x14, packet, true);
@@ -619,10 +615,9 @@ void ChatPacketHandler::HandleTeamKick(Packet* packet) {
}
void ChatPacketHandler::HandleTeamPromote(Packet* packet) {
CINSTREAM;
CINSTREAM_SKIP_HEADER;
LWOOBJID playerID = LWOOBJID_EMPTY;
inStream.Read(playerID);
inStream.Read(playerID);
std::string promotedPlayer = PacketUtils::ReadString(0x14, packet, true);
@@ -642,10 +637,9 @@ void ChatPacketHandler::HandleTeamPromote(Packet* packet) {
}
void ChatPacketHandler::HandleTeamLootOption(Packet* packet) {
CINSTREAM;
CINSTREAM_SKIP_HEADER;
LWOOBJID playerID = LWOOBJID_EMPTY;
inStream.Read(playerID);
inStream.Read(playerID);
uint32_t size = 0;
inStream.Read(size);
@@ -666,10 +660,9 @@ void ChatPacketHandler::HandleTeamLootOption(Packet* packet) {
}
void ChatPacketHandler::HandleTeamStatusRequest(Packet* packet) {
CINSTREAM;
CINSTREAM_SKIP_HEADER;
LWOOBJID playerID = LWOOBJID_EMPTY;
inStream.Read(playerID);
inStream.Read(playerID);
auto* team = playerContainer.GetTeam(playerID);
auto* data = playerContainer.GetPlayerData(playerID);
@@ -716,11 +709,11 @@ void ChatPacketHandler::HandleTeamStatusRequest(Packet* packet) {
void ChatPacketHandler::SendTeamInvite(PlayerData* receiver, PlayerData* sender) {
CBITSTREAM;
PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_ROUTE_TO_PLAYER);
PacketUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::ROUTE_TO_PLAYER);
bitStream.Write(receiver->playerID);
//portion that will get routed:
PacketUtils::WriteHeader(bitStream, CLIENT, MSG_CLIENT_TEAM_INVITE);
PacketUtils::WriteHeader(bitStream, eConnectionType::CLIENT, eClientMessageType::TEAM_INVITE);
PacketUtils::WritePacketWString(sender->playerName.c_str(), 33, &bitStream);
bitStream.Write(sender->playerID);
@@ -731,14 +724,14 @@ void ChatPacketHandler::SendTeamInvite(PlayerData* receiver, PlayerData* sender)
void ChatPacketHandler::SendTeamInviteConfirm(PlayerData* receiver, bool bLeaderIsFreeTrial, LWOOBJID i64LeaderID, LWOZONEID i64LeaderZoneID, uint8_t ucLootFlag, uint8_t ucNumOfOtherPlayers, uint8_t ucResponseCode, std::u16string wsLeaderName) {
CBITSTREAM;
PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_ROUTE_TO_PLAYER);
PacketUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::ROUTE_TO_PLAYER);
bitStream.Write(receiver->playerID);
//portion that will get routed:
CMSGHEADER;
bitStream.Write(receiver->playerID);
bitStream.Write(GAME_MSG::GAME_MSG_TEAM_INVITE_CONFIRM);
bitStream.Write(eGameMessageType::TEAM_INVITE_CONFIRM);
bitStream.Write(bLeaderIsFreeTrial);
bitStream.Write(i64LeaderID);
@@ -758,14 +751,14 @@ void ChatPacketHandler::SendTeamInviteConfirm(PlayerData* receiver, bool bLeader
void ChatPacketHandler::SendTeamStatus(PlayerData* receiver, LWOOBJID i64LeaderID, LWOZONEID i64LeaderZoneID, uint8_t ucLootFlag, uint8_t ucNumOfOtherPlayers, std::u16string wsLeaderName) {
CBITSTREAM;
PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_ROUTE_TO_PLAYER);
PacketUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::ROUTE_TO_PLAYER);
bitStream.Write(receiver->playerID);
//portion that will get routed:
CMSGHEADER;
bitStream.Write(receiver->playerID);
bitStream.Write(GAME_MSG::GAME_MSG_TEAM_GET_STATUS_RESPONSE);
bitStream.Write(eGameMessageType::TEAM_GET_STATUS_RESPONSE);
bitStream.Write(i64LeaderID);
bitStream.Write(i64LeaderZoneID);
@@ -783,14 +776,14 @@ void ChatPacketHandler::SendTeamStatus(PlayerData* receiver, LWOOBJID i64LeaderI
void ChatPacketHandler::SendTeamSetLeader(PlayerData* receiver, LWOOBJID i64PlayerID) {
CBITSTREAM;
PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_ROUTE_TO_PLAYER);
PacketUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::ROUTE_TO_PLAYER);
bitStream.Write(receiver->playerID);
//portion that will get routed:
CMSGHEADER;
bitStream.Write(receiver->playerID);
bitStream.Write(GAME_MSG::GAME_MSG_TEAM_SET_LEADER);
bitStream.Write(eGameMessageType::TEAM_SET_LEADER);
bitStream.Write(i64PlayerID);
@@ -800,14 +793,14 @@ void ChatPacketHandler::SendTeamSetLeader(PlayerData* receiver, LWOOBJID i64Play
void ChatPacketHandler::SendTeamAddPlayer(PlayerData* receiver, bool bIsFreeTrial, bool bLocal, bool bNoLootOnDeath, LWOOBJID i64PlayerID, std::u16string wsPlayerName, LWOZONEID zoneID) {
CBITSTREAM;
PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_ROUTE_TO_PLAYER);
PacketUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::ROUTE_TO_PLAYER);
bitStream.Write(receiver->playerID);
//portion that will get routed:
CMSGHEADER;
bitStream.Write(receiver->playerID);
bitStream.Write(GAME_MSG::GAME_MSG_TEAM_ADD_PLAYER);
bitStream.Write(eGameMessageType::TEAM_ADD_PLAYER);
bitStream.Write(bIsFreeTrial);
bitStream.Write(bLocal);
@@ -829,14 +822,14 @@ void ChatPacketHandler::SendTeamAddPlayer(PlayerData* receiver, bool bIsFreeTria
void ChatPacketHandler::SendTeamRemovePlayer(PlayerData* receiver, bool bDisband, bool bIsKicked, bool bIsLeaving, bool bLocal, LWOOBJID i64LeaderID, LWOOBJID i64PlayerID, std::u16string wsPlayerName) {
CBITSTREAM;
PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_ROUTE_TO_PLAYER);
PacketUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::ROUTE_TO_PLAYER);
bitStream.Write(receiver->playerID);
//portion that will get routed:
CMSGHEADER;
bitStream.Write(receiver->playerID);
bitStream.Write(GAME_MSG::GAME_MSG_TEAM_REMOVE_PLAYER);
bitStream.Write(eGameMessageType::TEAM_REMOVE_PLAYER);
bitStream.Write(bDisband);
bitStream.Write(bIsKicked);
@@ -855,14 +848,14 @@ void ChatPacketHandler::SendTeamRemovePlayer(PlayerData* receiver, bool bDisband
void ChatPacketHandler::SendTeamSetOffWorldFlag(PlayerData* receiver, LWOOBJID i64PlayerID, LWOZONEID zoneID) {
CBITSTREAM;
PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_ROUTE_TO_PLAYER);
PacketUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::ROUTE_TO_PLAYER);
bitStream.Write(receiver->playerID);
//portion that will get routed:
CMSGHEADER;
bitStream.Write(receiver->playerID);
bitStream.Write(GAME_MSG::GAME_MSG_TEAM_SET_OFF_WORLD_FLAG);
bitStream.Write(eGameMessageType::TEAM_SET_OFF_WORLD_FLAG);
bitStream.Write(i64PlayerID);
if (receiver->zoneID.GetCloneID() == zoneID.GetCloneID()) {
@@ -889,11 +882,11 @@ void ChatPacketHandler::SendFriendUpdate(PlayerData* friendData, PlayerData* pla
[bool] - is FTP*/
CBITSTREAM;
PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_ROUTE_TO_PLAYER);
PacketUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::ROUTE_TO_PLAYER);
bitStream.Write(friendData->playerID);
//portion that will get routed:
PacketUtils::WriteHeader(bitStream, CLIENT, MSG_CLIENT_UPDATE_FRIEND_NOTIFY);
PacketUtils::WriteHeader(bitStream, eConnectionType::CLIENT, eClientMessageType::UPDATE_FRIEND_NOTIFY);
bitStream.Write<uint8_t>(notifyType);
std::string playerName = playerData->playerName.c_str();
@@ -922,17 +915,17 @@ void ChatPacketHandler::SendFriendRequest(PlayerData* receiver, PlayerData* send
//Make sure people aren't requesting people that they're already friends with:
for (auto fr : receiver->friends) {
if (fr.friendID == sender->playerID) {
SendFriendResponse(sender, receiver, AddFriendResponseType::ALREADYFRIEND, fr.isBestFriend);
SendFriendResponse(sender, receiver, eAddFriendResponseType::ALREADYFRIEND, fr.isBestFriend);
return; //we have this player as a friend, yeet this function so it doesn't send another request.
}
}
CBITSTREAM;
PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_ROUTE_TO_PLAYER);
PacketUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::ROUTE_TO_PLAYER);
bitStream.Write(receiver->playerID);
//portion that will get routed:
PacketUtils::WriteHeader(bitStream, CLIENT, MSG_CLIENT_ADD_FRIEND_REQUEST);
PacketUtils::WriteHeader(bitStream, eConnectionType::CLIENT, eClientMessageType::ADD_FRIEND_REQUEST);
PacketUtils::WritePacketWString(sender->playerName.c_str(), 33, &bitStream);
bitStream.Write<uint8_t>(0); // This is a BFF flag however this is unused in live and does not have an implementation client side.
@@ -940,22 +933,22 @@ void ChatPacketHandler::SendFriendRequest(PlayerData* receiver, PlayerData* send
SEND_PACKET;
}
void ChatPacketHandler::SendFriendResponse(PlayerData* receiver, PlayerData* sender, AddFriendResponseType responseCode, uint8_t isBestFriendsAlready, uint8_t isBestFriendRequest) {
void ChatPacketHandler::SendFriendResponse(PlayerData* receiver, PlayerData* sender, eAddFriendResponseType responseCode, uint8_t isBestFriendsAlready, uint8_t isBestFriendRequest) {
if (!receiver || !sender) return;
CBITSTREAM;
PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_ROUTE_TO_PLAYER);
PacketUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::ROUTE_TO_PLAYER);
bitStream.Write(receiver->playerID);
// Portion that will get routed:
PacketUtils::WriteHeader(bitStream, CLIENT, MSG_CLIENT_ADD_FRIEND_RESPONSE);
PacketUtils::WriteHeader(bitStream, eConnectionType::CLIENT, eClientMessageType::ADD_FRIEND_RESPONSE);
bitStream.Write(responseCode);
// For all requests besides accepted, write a flag that says whether or not we are already best friends with the receiver.
bitStream.Write<uint8_t>(responseCode != AddFriendResponseType::ACCEPTED ? isBestFriendsAlready : sender->sysAddr != UNASSIGNED_SYSTEM_ADDRESS);
bitStream.Write<uint8_t>(responseCode != eAddFriendResponseType::ACCEPTED ? isBestFriendsAlready : sender->sysAddr != UNASSIGNED_SYSTEM_ADDRESS);
// Then write the player name
PacketUtils::WritePacketWString(sender->playerName.c_str(), 33, &bitStream);
// Then if this is an acceptance code, write the following extra info.
if (responseCode == AddFriendResponseType::ACCEPTED) {
if (responseCode == eAddFriendResponseType::ACCEPTED) {
bitStream.Write(sender->playerID);
bitStream.Write(sender->zoneID);
bitStream.Write(isBestFriendRequest); //isBFF
@@ -969,11 +962,11 @@ void ChatPacketHandler::SendRemoveFriend(PlayerData* receiver, std::string& pers
if (!receiver) return;
CBITSTREAM;
PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_ROUTE_TO_PLAYER);
PacketUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::ROUTE_TO_PLAYER);
bitStream.Write(receiver->playerID);
//portion that will get routed:
PacketUtils::WriteHeader(bitStream, CLIENT, MSG_CLIENT_REMOVE_FRIEND_RESPONSE);
PacketUtils::WriteHeader(bitStream, eConnectionType::CLIENT, eClientMessageType::REMOVE_FRIEND_RESPONSE);
bitStream.Write<uint8_t>(isSuccessful); //isOnline
PacketUtils::WritePacketWString(personToRemove, 33, &bitStream);

View File

@@ -4,7 +4,7 @@
#include "BitStream.h"
struct PlayerData;
enum class AddFriendResponseType : uint8_t;
enum class eAddFriendResponseType : uint8_t;
namespace ChatPacketHandler {
void HandleFriendlistRequest(Packet* packet);
@@ -35,6 +35,6 @@ namespace ChatPacketHandler {
void SendFriendUpdate(PlayerData* friendData, PlayerData* playerData, uint8_t notifyType, uint8_t isBestFriend);
void SendFriendRequest(PlayerData* receiver, PlayerData* sender);
void SendFriendResponse(PlayerData* receiver, PlayerData* sender, AddFriendResponseType responseCode, uint8_t isBestFriendsAlready = 0U, uint8_t isBestFriendRequest = 0U);
void SendFriendResponse(PlayerData* receiver, PlayerData* sender, eAddFriendResponseType responseCode, uint8_t isBestFriendsAlready = 0U, uint8_t isBestFriendRequest = 0U);
void SendRemoveFriend(PlayerData* receiver, std::string& personToRemove, bool isSuccessful);
};

View File

@@ -9,19 +9,23 @@
#include "dLogger.h"
#include "Database.h"
#include "dConfig.h"
#include "dMessageIdentifiers.h"
#include "dChatFilter.h"
#include "Diagnostics.h"
#include "AssetManager.h"
#include "BinaryPathFinder.h"
#include "eConnectionType.h"
#include "PlayerContainer.h"
#include "ChatPacketHandler.h"
#include "eChatMessageType.h"
#include "eChatInternalMessageType.h"
#include "eWorldMessageType.h"
#include "Game.h"
//RakNet includes:
#include "RakNetDefines.h"
#include <MessageIdentifiers.h>
namespace Game {
dLogger* logger = nullptr;
dServer* server = nullptr;
@@ -68,7 +72,7 @@ int main(int argc, char** argv) {
Game::assetManager = new AssetManager(clientPath);
} catch (std::runtime_error& ex) {
Game::logger->Log("ChatServer", "Got an error while setting up assets: %s", ex.what());
return EXIT_FAILURE;
}
@@ -199,25 +203,27 @@ void HandlePacket(Packet* packet) {
Game::logger->Log("ChatServer", "A server is connecting, awaiting user list.");
}
if (packet->data[1] == CHAT_INTERNAL) {
switch (packet->data[3]) {
case MSG_CHAT_INTERNAL_PLAYER_ADDED_NOTIFICATION:
if (packet->length < 4) return; // Nothing left to process. Need 4 bytes to continue.
if (static_cast<eConnectionType>(packet->data[1]) == eConnectionType::CHAT_INTERNAL) {
switch (static_cast<eChatInternalMessageType>(packet->data[3])) {
case eChatInternalMessageType::PLAYER_ADDED_NOTIFICATION:
playerContainer.InsertPlayer(packet);
break;
case MSG_CHAT_INTERNAL_PLAYER_REMOVED_NOTIFICATION:
case eChatInternalMessageType::PLAYER_REMOVED_NOTIFICATION:
playerContainer.RemovePlayer(packet);
break;
case MSG_CHAT_INTERNAL_MUTE_UPDATE:
case eChatInternalMessageType::MUTE_UPDATE:
playerContainer.MuteUpdate(packet);
break;
case MSG_CHAT_INTERNAL_CREATE_TEAM:
case eChatInternalMessageType::CREATE_TEAM:
playerContainer.CreateTeamServer(packet);
break;
case MSG_CHAT_INTERNAL_ANNOUNCEMENT: {
case eChatInternalMessageType::ANNOUNCEMENT: {
//we just forward this packet to every connected server
CINSTREAM;
Game::server->Send(&inStream, packet->systemAddress, true); //send to everyone except origin
@@ -229,67 +235,67 @@ void HandlePacket(Packet* packet) {
}
}
if (packet->data[1] == CHAT) {
switch (packet->data[3]) {
case MSG_CHAT_GET_FRIENDS_LIST:
if (static_cast<eConnectionType>(packet->data[1]) == eConnectionType::CHAT) {
switch (static_cast<eChatMessageType>(packet->data[3])) {
case eChatMessageType::GET_FRIENDS_LIST:
ChatPacketHandler::HandleFriendlistRequest(packet);
break;
case MSG_CHAT_GET_IGNORE_LIST:
case eChatMessageType::GET_IGNORE_LIST:
Game::logger->Log("ChatServer", "Asked for ignore list, but is unimplemented right now.");
break;
case MSG_CHAT_TEAM_GET_STATUS:
case eChatMessageType::TEAM_GET_STATUS:
ChatPacketHandler::HandleTeamStatusRequest(packet);
break;
case MSG_CHAT_ADD_FRIEND_REQUEST:
case eChatMessageType::ADD_FRIEND_REQUEST:
//this involves someone sending the initial request, the response is below, response as in from the other player.
//We basically just check to see if this player is online or not and route the packet.
ChatPacketHandler::HandleFriendRequest(packet);
break;
case MSG_CHAT_ADD_FRIEND_RESPONSE:
case eChatMessageType::ADD_FRIEND_RESPONSE:
//This isn't the response a server sent, rather it is a player's response to a received request.
//Here, we'll actually have to add them to eachother's friend lists depending on the response code.
ChatPacketHandler::HandleFriendResponse(packet);
break;
case MSG_CHAT_REMOVE_FRIEND:
case eChatMessageType::REMOVE_FRIEND:
ChatPacketHandler::HandleRemoveFriend(packet);
break;
case MSG_CHAT_GENERAL_CHAT_MESSAGE:
case eChatMessageType::GENERAL_CHAT_MESSAGE:
ChatPacketHandler::HandleChatMessage(packet);
break;
case MSG_CHAT_PRIVATE_CHAT_MESSAGE:
case eChatMessageType::PRIVATE_CHAT_MESSAGE:
//This message is supposed to be echo'd to both the sender and the receiver
//BUT: they have to have different responseCodes, so we'll do some of the ol hacky wacky to fix that right up.
ChatPacketHandler::HandlePrivateChatMessage(packet);
break;
case MSG_CHAT_TEAM_INVITE:
case eChatMessageType::TEAM_INVITE:
ChatPacketHandler::HandleTeamInvite(packet);
break;
case MSG_CHAT_TEAM_INVITE_RESPONSE:
case eChatMessageType::TEAM_INVITE_RESPONSE:
ChatPacketHandler::HandleTeamInviteResponse(packet);
break;
case MSG_CHAT_TEAM_LEAVE:
case eChatMessageType::TEAM_LEAVE:
ChatPacketHandler::HandleTeamLeave(packet);
break;
case MSG_CHAT_TEAM_SET_LEADER:
case eChatMessageType::TEAM_SET_LEADER:
ChatPacketHandler::HandleTeamPromote(packet);
break;
case MSG_CHAT_TEAM_KICK:
case eChatMessageType::TEAM_KICK:
ChatPacketHandler::HandleTeamKick(packet);
break;
case MSG_CHAT_TEAM_SET_LOOT:
case eChatMessageType::TEAM_SET_LOOT:
ChatPacketHandler::HandleTeamLootOption(packet);
break;
@@ -298,9 +304,9 @@ void HandlePacket(Packet* packet) {
}
}
if (packet->data[1] == WORLD) {
switch (packet->data[3]) {
case MSG_WORLD_CLIENT_ROUTE_PACKET: {
if (static_cast<eConnectionType>(packet->data[1]) == eConnectionType::WORLD) {
switch (static_cast<eWorldMessageType>(packet->data[3])) {
case eWorldMessageType::ROUTE_PACKET: {
Game::logger->Log("ChatServer", "Routing packet from world");
break;
}

View File

@@ -6,9 +6,10 @@
#include "dLogger.h"
#include "ChatPacketHandler.h"
#include "GeneralUtils.h"
#include "dMessageIdentifiers.h"
#include "PacketUtils.h"
#include "Database.h"
#include "eConnectionType.h"
#include "eChatInternalMessageType.h"
PlayerContainer::PlayerContainer() {
}
@@ -18,9 +19,8 @@ PlayerContainer::~PlayerContainer() {
}
void PlayerContainer::InsertPlayer(Packet* packet) {
CINSTREAM;
CINSTREAM_SKIP_HEADER;
PlayerData* data = new PlayerData();
inStream.SetReadOffset(inStream.GetReadOffset() + 64);
inStream.Read(data->playerID);
uint32_t len;
@@ -51,9 +51,8 @@ void PlayerContainer::InsertPlayer(Packet* packet) {
}
void PlayerContainer::RemovePlayer(Packet* packet) {
CINSTREAM;
CINSTREAM_SKIP_HEADER;
LWOOBJID playerID;
inStream.Read(playerID); //skip header
inStream.Read(playerID);
//Before they get kicked, we need to also send a message to their friends saying that they disconnected.
@@ -96,9 +95,8 @@ void PlayerContainer::RemovePlayer(Packet* packet) {
}
void PlayerContainer::MuteUpdate(Packet* packet) {
CINSTREAM;
CINSTREAM_SKIP_HEADER;
LWOOBJID playerID;
inStream.Read(playerID); //skip header
inStream.Read(playerID);
time_t expire = 0;
inStream.Read(expire);
@@ -117,9 +115,8 @@ void PlayerContainer::MuteUpdate(Packet* packet) {
}
void PlayerContainer::CreateTeamServer(Packet* packet) {
CINSTREAM;
CINSTREAM_SKIP_HEADER;
LWOOBJID playerID;
inStream.Read(playerID); //skip header
inStream.Read(playerID);
size_t membersSize = 0;
inStream.Read(membersSize);
@@ -149,7 +146,7 @@ void PlayerContainer::CreateTeamServer(Packet* packet) {
void PlayerContainer::BroadcastMuteUpdate(LWOOBJID player, time_t time) {
CBITSTREAM;
PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_MUTE_UPDATE);
PacketUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::MUTE_UPDATE);
bitStream.Write(player);
bitStream.Write(time);
@@ -348,7 +345,7 @@ void PlayerContainer::TeamStatusUpdate(TeamData* team) {
void PlayerContainer::UpdateTeamsOnWorld(TeamData* team, bool deleteTeam) {
CBITSTREAM;
PacketUtils::WriteHeader(bitStream, CHAT_INTERNAL, MSG_CHAT_INTERNAL_TEAM_UPDATE);
PacketUtils::WriteHeader(bitStream, eConnectionType::CHAT_INTERNAL, eChatInternalMessageType::TEAM_UPDATE);
bitStream.Write(team->teamID);
bitStream.Write(deleteTeam);

View File

@@ -1,77 +1,79 @@
#include "AMFDeserialize.h"
#include "AMFFormat.h"
#include <stdexcept>
#include "Amf3.h"
/**
* AMF3 Reference document https://rtmp.veriskope.com/pdf/amf3-file-format-spec.pdf
* AMF3 Deserializer written by EmosewaMC
*/
AMFValue* AMFDeserialize::Read(RakNet::BitStream* inStream) {
AMFBaseValue* AMFDeserialize::Read(RakNet::BitStream* inStream) {
if (!inStream) return nullptr;
AMFValue* returnValue = nullptr;
AMFBaseValue* returnValue = nullptr;
// Read in the value type from the bitStream
int8_t marker;
eAmf marker;
inStream->Read(marker);
// Based on the typing, create the value associated with that and return the base value class
switch (marker) {
case AMFValueType::AMFUndefined: {
returnValue = new AMFUndefinedValue();
case eAmf::Undefined: {
returnValue = new AMFBaseValue();
break;
}
case AMFValueType::AMFNull: {
case eAmf::Null: {
returnValue = new AMFNullValue();
break;
}
case AMFValueType::AMFFalse: {
returnValue = new AMFFalseValue();
case eAmf::False: {
returnValue = new AMFBoolValue(false);
break;
}
case AMFValueType::AMFTrue: {
returnValue = new AMFTrueValue();
case eAmf::True: {
returnValue = new AMFBoolValue(true);
break;
}
case AMFValueType::AMFInteger: {
case eAmf::Integer: {
returnValue = ReadAmfInteger(inStream);
break;
}
case AMFValueType::AMFDouble: {
case eAmf::Double: {
returnValue = ReadAmfDouble(inStream);
break;
}
case AMFValueType::AMFString: {
case eAmf::String: {
returnValue = ReadAmfString(inStream);
break;
}
case AMFValueType::AMFArray: {
case eAmf::Array: {
returnValue = ReadAmfArray(inStream);
break;
}
// TODO We do not need these values, but if someone wants to implement them
// then please do so and add the corresponding unit tests.
case AMFValueType::AMFXMLDoc:
case AMFValueType::AMFDate:
case AMFValueType::AMFObject:
case AMFValueType::AMFXML:
case AMFValueType::AMFByteArray:
case AMFValueType::AMFVectorInt:
case AMFValueType::AMFVectorUInt:
case AMFValueType::AMFVectorDouble:
case AMFValueType::AMFVectorObject:
case AMFValueType::AMFDictionary: {
throw static_cast<AMFValueType>(marker);
// These values are unimplemented in the live client and will remain unimplemented
// unless someone modifies the client to allow serializing of these values.
case eAmf::XMLDoc:
case eAmf::Date:
case eAmf::Object:
case eAmf::XML:
case eAmf::ByteArray:
case eAmf::VectorInt:
case eAmf::VectorUInt:
case eAmf::VectorDouble:
case eAmf::VectorObject:
case eAmf::Dictionary: {
throw marker;
break;
}
default:
throw static_cast<AMFValueType>(marker);
throw std::invalid_argument("Invalid AMF3 marker" + std::to_string(static_cast<int32_t>(marker)));
break;
}
return returnValue;
@@ -99,7 +101,7 @@ uint32_t AMFDeserialize::ReadU29(RakNet::BitStream* inStream) {
return actualNumber;
}
std::string AMFDeserialize::ReadString(RakNet::BitStream* inStream) {
const std::string AMFDeserialize::ReadString(RakNet::BitStream* inStream) {
auto length = ReadU29(inStream);
// Check if this is a reference
bool isReference = length % 2 == 1;
@@ -113,48 +115,39 @@ std::string AMFDeserialize::ReadString(RakNet::BitStream* inStream) {
return value;
} else {
// Length is a reference to a previous index - use that as the read in value
return accessedElements[length];
return accessedElements.at(length);
}
}
AMFValue* AMFDeserialize::ReadAmfDouble(RakNet::BitStream* inStream) {
auto doubleValue = new AMFDoubleValue();
AMFBaseValue* AMFDeserialize::ReadAmfDouble(RakNet::BitStream* inStream) {
double value;
inStream->Read<double>(value);
doubleValue->SetDoubleValue(value);
return doubleValue;
return new AMFDoubleValue(value);
}
AMFValue* AMFDeserialize::ReadAmfArray(RakNet::BitStream* inStream) {
AMFBaseValue* AMFDeserialize::ReadAmfArray(RakNet::BitStream* inStream) {
auto arrayValue = new AMFArrayValue();
// Read size of dense array
auto sizeOfDenseArray = (ReadU29(inStream) >> 1);
// Then read Key'd portion
// Then read associative portion
while (true) {
auto key = ReadString(inStream);
// No more values when we encounter an empty string
// No more associative values when we encounter an empty string key
if (key.size() == 0) break;
arrayValue->InsertValue(key, Read(inStream));
arrayValue->Insert(key, Read(inStream));
}
// Finally read dense portion
for (uint32_t i = 0; i < sizeOfDenseArray; i++) {
arrayValue->PushBackValue(Read(inStream));
arrayValue->Insert(i, Read(inStream));
}
return arrayValue;
}
AMFValue* AMFDeserialize::ReadAmfString(RakNet::BitStream* inStream) {
auto stringValue = new AMFStringValue();
stringValue->SetStringValue(ReadString(inStream));
return stringValue;
AMFBaseValue* AMFDeserialize::ReadAmfString(RakNet::BitStream* inStream) {
return new AMFStringValue(ReadString(inStream));
}
AMFValue* AMFDeserialize::ReadAmfInteger(RakNet::BitStream* inStream) {
auto integerValue = new AMFIntegerValue();
integerValue->SetIntegerValue(ReadU29(inStream));
return integerValue;
AMFBaseValue* AMFDeserialize::ReadAmfInteger(RakNet::BitStream* inStream) {
return new AMFIntValue(ReadU29(inStream));
}

View File

@@ -5,7 +5,8 @@
#include <vector>
#include <string>
class AMFValue;
class AMFBaseValue;
class AMFDeserialize {
public:
/**
@@ -14,7 +15,7 @@ public:
* @param inStream inStream to read value from.
* @return Returns an AMFValue with all the information from the bitStream in it.
*/
AMFValue* Read(RakNet::BitStream* inStream);
AMFBaseValue* Read(RakNet::BitStream* inStream);
private:
/**
* @brief Private method to read a U29 integer from a bitstream
@@ -30,7 +31,7 @@ private:
* @param inStream bitStream to read data from
* @return The read string
*/
std::string ReadString(RakNet::BitStream* inStream);
const std::string ReadString(RakNet::BitStream* inStream);
/**
* @brief Read an AMFDouble value from a bitStream
@@ -38,7 +39,7 @@ private:
* @param inStream bitStream to read data from
* @return Double value represented as an AMFValue
*/
AMFValue* ReadAmfDouble(RakNet::BitStream* inStream);
AMFBaseValue* ReadAmfDouble(RakNet::BitStream* inStream);
/**
* @brief Read an AMFArray from a bitStream
@@ -46,7 +47,7 @@ private:
* @param inStream bitStream to read data from
* @return Array value represented as an AMFValue
*/
AMFValue* ReadAmfArray(RakNet::BitStream* inStream);
AMFBaseValue* ReadAmfArray(RakNet::BitStream* inStream);
/**
* @brief Read an AMFString from a bitStream
@@ -54,7 +55,7 @@ private:
* @param inStream bitStream to read data from
* @return String value represented as an AMFValue
*/
AMFValue* ReadAmfString(RakNet::BitStream* inStream);
AMFBaseValue* ReadAmfString(RakNet::BitStream* inStream);
/**
* @brief Read an AMFInteger from a bitStream
@@ -62,7 +63,7 @@ private:
* @param inStream bitStream to read data from
* @return Integer value represented as an AMFValue
*/
AMFValue* ReadAmfInteger(RakNet::BitStream* inStream);
AMFBaseValue* ReadAmfInteger(RakNet::BitStream* inStream);
/**
* List of strings read so far saved to be read by reference.

View File

@@ -1,156 +0,0 @@
#include "AMFFormat.h"
// AMFInteger
void AMFIntegerValue::SetIntegerValue(uint32_t value) {
this->value = value;
}
uint32_t AMFIntegerValue::GetIntegerValue() {
return this->value;
}
// AMFDouble
void AMFDoubleValue::SetDoubleValue(double value) {
this->value = value;
}
double AMFDoubleValue::GetDoubleValue() {
return this->value;
}
// AMFString
void AMFStringValue::SetStringValue(const std::string& value) {
this->value = value;
}
std::string AMFStringValue::GetStringValue() {
return this->value;
}
// AMFXMLDoc
void AMFXMLDocValue::SetXMLDocValue(const std::string& value) {
this->xmlData = value;
}
std::string AMFXMLDocValue::GetXMLDocValue() {
return this->xmlData;
}
// AMFDate
void AMFDateValue::SetDateValue(uint64_t value) {
this->millisecondTimestamp = value;
}
uint64_t AMFDateValue::GetDateValue() {
return this->millisecondTimestamp;
}
// AMFArray Insert Value
void AMFArrayValue::InsertValue(const std::string& key, AMFValue* value) {
this->associative.insert(std::make_pair(key, value));
}
// AMFArray Remove Value
void AMFArrayValue::RemoveValue(const std::string& key) {
_AMFArrayMap_::iterator it = this->associative.find(key);
if (it != this->associative.end()) {
this->associative.erase(it);
}
}
// AMFArray Get Associative Iterator Begin
_AMFArrayMap_::iterator AMFArrayValue::GetAssociativeIteratorValueBegin() {
return this->associative.begin();
}
// AMFArray Get Associative Iterator End
_AMFArrayMap_::iterator AMFArrayValue::GetAssociativeIteratorValueEnd() {
return this->associative.end();
}
// AMFArray Push Back Value
void AMFArrayValue::PushBackValue(AMFValue* value) {
this->dense.push_back(value);
}
// AMFArray Pop Back Value
void AMFArrayValue::PopBackValue() {
this->dense.pop_back();
}
// AMFArray Get Dense List Size
uint32_t AMFArrayValue::GetDenseValueSize() {
return (uint32_t)this->dense.size();
}
// AMFArray Get Dense Iterator Begin
_AMFArrayList_::iterator AMFArrayValue::GetDenseIteratorBegin() {
return this->dense.begin();
}
// AMFArray Get Dense Iterator End
_AMFArrayList_::iterator AMFArrayValue::GetDenseIteratorEnd() {
return this->dense.end();
}
AMFArrayValue::~AMFArrayValue() {
for (auto valueToDelete : GetDenseArray()) {
if (valueToDelete) delete valueToDelete;
}
for (auto valueToDelete : GetAssociativeMap()) {
if (valueToDelete.second) delete valueToDelete.second;
}
}
// AMFObject Constructor
AMFObjectValue::AMFObjectValue(std::vector<std::pair<std::string, AMFValueType>> traits) {
this->traits.reserve(traits.size());
std::vector<std::pair<std::string, AMFValueType>>::iterator it = traits.begin();
while (it != traits.end()) {
this->traits.insert(std::make_pair(it->first, std::make_pair(it->second, new AMFNullValue())));
it++;
}
}
// AMFObject Set Value
void AMFObjectValue::SetTraitValue(const std::string& trait, AMFValue* value) {
if (value) {
_AMFObjectTraits_::iterator it = this->traits.find(trait);
if (it != this->traits.end()) {
if (it->second.first == value->GetValueType()) {
it->second.second = value;
}
}
}
}
// AMFObject Get Value
AMFValue* AMFObjectValue::GetTraitValue(const std::string& trait) {
_AMFObjectTraits_::iterator it = this->traits.find(trait);
if (it != this->traits.end()) {
return it->second.second;
}
return nullptr;
}
// AMFObject Get Trait Iterator Begin
_AMFObjectTraits_::iterator AMFObjectValue::GetTraitsIteratorBegin() {
return this->traits.begin();
}
// AMFObject Get Trait Iterator End
_AMFObjectTraits_::iterator AMFObjectValue::GetTraitsIteratorEnd() {
return this->traits.end();
}
// AMFObject Get Trait Size
uint32_t AMFObjectValue::GetTraitArrayCount() {
return (uint32_t)this->traits.size();
}
AMFObjectValue::~AMFObjectValue() {
for (auto valueToDelete = GetTraitsIteratorBegin(); valueToDelete != GetTraitsIteratorEnd(); valueToDelete++) {
if (valueToDelete->second.second) delete valueToDelete->second.second;
}
}

View File

@@ -1,413 +0,0 @@
#pragma once
// Custom Classes
#include "dCommonVars.h"
// C++
#include <unordered_map>
#include <vector>
/*!
\file AMFFormat.hpp
\brief A class for managing AMF values
*/
class AMFValue; // Forward declaration
// Definitions
#define _AMFArrayMap_ std::unordered_map<std::string, AMFValue*>
#define _AMFArrayList_ std::vector<AMFValue*>
#define _AMFObjectTraits_ std::unordered_map<std::string, std::pair<AMFValueType, AMFValue*>>
#define _AMFObjectDynamicTraits_ std::unordered_map<std::string, AMFValue*>
//! An enum for each AMF value type
enum AMFValueType : unsigned char {
AMFUndefined = 0x00, //!< An undefined AMF Value
AMFNull = 0x01, //!< A null AMF value
AMFFalse = 0x02, //!< A false AMF value
AMFTrue = 0x03, //!< A true AMF value
AMFInteger = 0x04, //!< An integer AMF value
AMFDouble = 0x05, //!< A double AMF value
AMFString = 0x06, //!< A string AMF value
AMFXMLDoc = 0x07, //!< An XML Doc AMF value
AMFDate = 0x08, //!< A date AMF value
AMFArray = 0x09, //!< An array AMF value
AMFObject = 0x0A, //!< An object AMF value
AMFXML = 0x0B, //!< An XML AMF value
AMFByteArray = 0x0C, //!< A byte array AMF value
AMFVectorInt = 0x0D, //!< An integer vector AMF value
AMFVectorUInt = 0x0E, //!< An unsigned integer AMF value
AMFVectorDouble = 0x0F, //!< A double vector AMF value
AMFVectorObject = 0x10, //!< An object vector AMF value
AMFDictionary = 0x11 //!< A dictionary AMF value
};
//! An enum for the object value types
enum AMFObjectValueType : unsigned char {
AMFObjectAnonymous = 0x01,
AMFObjectTyped = 0x02,
AMFObjectDynamic = 0x03,
AMFObjectExternalizable = 0x04
};
//! The base AMF value class
class AMFValue {
public:
//! Returns the AMF value type
/*!
\return The AMF value type
*/
virtual AMFValueType GetValueType() = 0;
virtual ~AMFValue() {};
};
//! A typedef for a pointer to an AMF value
typedef AMFValue* NDGFxValue;
// The various AMF value types
//! The undefined value AMF type
class AMFUndefinedValue : public AMFValue {
private:
//! Returns the AMF value type
/*!
\return The AMF value type
*/
AMFValueType GetValueType() { return ValueType; }
public:
static const AMFValueType ValueType = AMFUndefined;
};
//! The null value AMF type
class AMFNullValue : public AMFValue {
private:
//! Returns the AMF value type
/*!
\return The AMF value type
*/
AMFValueType GetValueType() { return ValueType; }
public:
static const AMFValueType ValueType = AMFNull;
};
//! The false value AMF type
class AMFFalseValue : public AMFValue {
private:
//! Returns the AMF value type
/*!
\return The AMF value type
*/
AMFValueType GetValueType() { return ValueType; }
public:
static const AMFValueType ValueType = AMFFalse;
};
//! The true value AMF type
class AMFTrueValue : public AMFValue {
private:
//! Returns the AMF value type
/*!
\return The AMF value type
*/
AMFValueType GetValueType() { return ValueType; }
public:
static const AMFValueType ValueType = AMFTrue;
};
//! The integer value AMF type
class AMFIntegerValue : public AMFValue {
private:
uint32_t value; //!< The value of the AMF type
//! Returns the AMF value type
/*!
\return The AMF value type
*/
AMFValueType GetValueType() { return ValueType; }
public:
static const AMFValueType ValueType = AMFInteger;
//! Sets the integer value
/*!
\param value The value to set
*/
void SetIntegerValue(uint32_t value);
//! Gets the integer value
/*!
\return The integer value
*/
uint32_t GetIntegerValue();
};
//! The double value AMF type
class AMFDoubleValue : public AMFValue {
private:
double value; //!< The value of the AMF type
//! Returns the AMF value type
/*!
\return The AMF value type
*/
AMFValueType GetValueType() { return ValueType; }
public:
static const AMFValueType ValueType = AMFDouble;
//! Sets the double value
/*!
\param value The value to set to
*/
void SetDoubleValue(double value);
//! Gets the double value
/*!
\return The double value
*/
double GetDoubleValue();
};
//! The string value AMF type
class AMFStringValue : public AMFValue {
private:
std::string value; //!< The value of the AMF type
//! Returns the AMF value type
/*!
\return The AMF value type
*/
AMFValueType GetValueType() { return ValueType; }
public:
static const AMFValueType ValueType = AMFString;
//! Sets the string value
/*!
\param value The string value to set to
*/
void SetStringValue(const std::string& value);
//! Gets the string value
/*!
\return The string value
*/
std::string GetStringValue();
};
//! The XML doc value AMF type
class AMFXMLDocValue : public AMFValue {
private:
std::string xmlData; //!< The value of the AMF type
//! Returns the AMF value type
/*!
\return The AMF value type
*/
AMFValueType GetValueType() { return ValueType; }
public:
static const AMFValueType ValueType = AMFXMLDoc;
//! Sets the XML Doc value
/*!
\param value The value to set to
*/
void SetXMLDocValue(const std::string& value);
//! Gets the XML Doc value
/*!
\return The XML Doc value
*/
std::string GetXMLDocValue();
};
//! The date value AMF type
class AMFDateValue : public AMFValue {
private:
uint64_t millisecondTimestamp; //!< The time in milliseconds since the ephoch
//! Returns the AMF value type
/*!
\return The AMF value type
*/
AMFValueType GetValueType() { return ValueType; }
public:
static const AMFValueType ValueType = AMFDate;
//! Sets the date time
/*!
\param value The value to set to
*/
void SetDateValue(uint64_t value);
//! Gets the date value
/*!
\return The date value in milliseconds since the epoch
*/
uint64_t GetDateValue();
};
//! The array value AMF type
// This object will manage it's own memory map and list. Do not delete its values.
class AMFArrayValue : public AMFValue {
private:
_AMFArrayMap_ associative; //!< The array map (associative part)
_AMFArrayList_ dense; //!< The array list (dense part)
//! Returns the AMF value type
/*!
\return The AMF value type
*/
AMFValueType GetValueType() { return ValueType; }
public:
static const AMFValueType ValueType = AMFArray;
~AMFArrayValue() override;
//! Inserts an item into the array map for a specific key
/*!
\param key The key to set
\param value The value to add
*/
void InsertValue(const std::string& key, AMFValue* value);
//! Removes an item for a specific key
/*!
\param key The key to remove
*/
void RemoveValue(const std::string& key);
//! Finds an AMF value
/*!
\return The AMF value if found, nullptr otherwise
*/
template <typename T>
T* FindValue(const std::string& key) const {
_AMFArrayMap_::const_iterator it = this->associative.find(key);
if (it != this->associative.end() && T::ValueType == it->second->GetValueType()) {
return dynamic_cast<T*>(it->second);
}
return nullptr;
};
//! Returns where the associative iterator begins
/*!
\return Where the array map iterator begins
*/
_AMFArrayMap_::iterator GetAssociativeIteratorValueBegin();
//! Returns where the associative iterator ends
/*!
\return Where the array map iterator ends
*/
_AMFArrayMap_::iterator GetAssociativeIteratorValueEnd();
//! Pushes back a value into the array list
/*!
\param value The value to push back
*/
void PushBackValue(AMFValue* value);
//! Pops back the last value in the array list
void PopBackValue();
//! Gets the count of the dense list
/*!
\return The dense list size
*/
uint32_t GetDenseValueSize();
//! Gets a specific value from the list for the specified index
/*!
\param index The index to get
*/
template <typename T>
T* GetValueAt(uint32_t index) {
if (index >= this->dense.size()) return nullptr;
AMFValue* foundValue = this->dense.at(index);
return T::ValueType == foundValue->GetValueType() ? dynamic_cast<T*>(foundValue) : nullptr;
};
//! Returns where the dense iterator begins
/*!
\return Where the iterator begins
*/
_AMFArrayList_::iterator GetDenseIteratorBegin();
//! Returns where the dense iterator ends
/*!
\return Where the iterator ends
*/
_AMFArrayList_::iterator GetDenseIteratorEnd();
//! Returns the associative map
/*!
\return The associative map
*/
_AMFArrayMap_ GetAssociativeMap() { return this->associative; };
//! Returns the dense array
/*!
\return The dense array
*/
_AMFArrayList_ GetDenseArray() { return this->dense; };
};
//! The anonymous object value AMF type
class AMFObjectValue : public AMFValue {
private:
_AMFObjectTraits_ traits; //!< The object traits
//! Returns the AMF value type
/*!
\return The AMF value type
*/
AMFValueType GetValueType() { return ValueType; }
~AMFObjectValue() override;
public:
static const AMFValueType ValueType = AMFObject;
//! Constructor
/*!
\param traits The traits to set
*/
AMFObjectValue(std::vector<std::pair<std::string, AMFValueType>> traits);
//! Gets the object value type
/*!
\return The object value type
*/
virtual AMFObjectValueType GetObjectValueType() { return AMFObjectAnonymous; }
//! Sets the value of a trait
/*!
\param trait The trait to set the value for
\param value The AMF value to set
*/
void SetTraitValue(const std::string& trait, AMFValue* value);
//! Gets a trait value
/*!
\param trait The trait to get the value for
\return The trait value
*/
AMFValue* GetTraitValue(const std::string& trait);
//! Gets the beginning of the object traits iterator
/*!
\return The AMF trait array iterator begin
*/
_AMFObjectTraits_::iterator GetTraitsIteratorBegin();
//! Gets the end of the object traits iterator
/*!
\return The AMF trait array iterator begin
*/
_AMFObjectTraits_::iterator GetTraitsIteratorEnd();
//! Gets the amount of traits
/*!
\return The amount of traits
*/
uint32_t GetTraitArrayCount();
};

View File

@@ -1,250 +0,0 @@
#include "AMFFormat_BitStream.h"
// Writes an AMFValue pointer to a RakNet::BitStream
template<>
void RakNet::BitStream::Write<AMFValue*>(AMFValue* value) {
if (value != nullptr) {
AMFValueType type = value->GetValueType();
switch (type) {
case AMFUndefined: {
AMFUndefinedValue* v = (AMFUndefinedValue*)value;
this->Write(*v);
break;
}
case AMFNull: {
AMFNullValue* v = (AMFNullValue*)value;
this->Write(*v);
break;
}
case AMFFalse: {
AMFFalseValue* v = (AMFFalseValue*)value;
this->Write(*v);
break;
}
case AMFTrue: {
AMFTrueValue* v = (AMFTrueValue*)value;
this->Write(*v);
break;
}
case AMFInteger: {
AMFIntegerValue* v = (AMFIntegerValue*)value;
this->Write(*v);
break;
}
case AMFDouble: {
AMFDoubleValue* v = (AMFDoubleValue*)value;
this->Write(*v);
break;
}
case AMFString: {
AMFStringValue* v = (AMFStringValue*)value;
this->Write(*v);
break;
}
case AMFXMLDoc: {
AMFXMLDocValue* v = (AMFXMLDocValue*)value;
this->Write(*v);
break;
}
case AMFDate: {
AMFDateValue* v = (AMFDateValue*)value;
this->Write(*v);
break;
}
case AMFArray: {
this->Write((AMFArrayValue*)value);
break;
}
}
}
}
/**
* A private function to write an value to a RakNet::BitStream
* RakNet writes in the correct byte order - do not reverse this.
*/
void WriteUInt29(RakNet::BitStream* bs, uint32_t v) {
unsigned char b4 = (unsigned char)v;
if (v < 0x00200000) {
b4 = b4 & 0x7F;
if (v > 0x7F) {
unsigned char b3;
v = v >> 7;
b3 = ((unsigned char)(v)) | 0x80;
if (v > 0x7F) {
unsigned char b2;
v = v >> 7;
b2 = ((unsigned char)(v)) | 0x80;
bs->Write(b2);
}
bs->Write(b3);
}
} else {
unsigned char b1;
unsigned char b2;
unsigned char b3;
v = v >> 8;
b3 = ((unsigned char)(v)) | 0x80;
v = v >> 7;
b2 = ((unsigned char)(v)) | 0x80;
v = v >> 7;
b1 = ((unsigned char)(v)) | 0x80;
bs->Write(b1);
bs->Write(b2);
bs->Write(b3);
}
bs->Write(b4);
}
/**
* Writes a flag number to a RakNet::BitStream
* RakNet writes in the correct byte order - do not reverse this.
*/
void WriteFlagNumber(RakNet::BitStream* bs, uint32_t v) {
v = (v << 1) | 0x01;
WriteUInt29(bs, v);
}
/**
* Writes an AMFString to a RakNet::BitStream
*
* RakNet writes in the correct byte order - do not reverse this.
*/
void WriteAMFString(RakNet::BitStream* bs, const std::string& str) {
WriteFlagNumber(bs, (uint32_t)str.size());
bs->Write(str.c_str(), (uint32_t)str.size());
}
/**
* Writes an U16 to a bitstream
*
* RakNet writes in the correct byte order - do not reverse this.
*/
void WriteAMFU16(RakNet::BitStream* bs, uint16_t value) {
bs->Write(value);
}
/**
* Writes an U32 to a bitstream
*
* RakNet writes in the correct byte order - do not reverse this.
*/
void WriteAMFU32(RakNet::BitStream* bs, uint32_t value) {
bs->Write(value);
}
/**
* Writes an U64 to a bitstream
*
* RakNet writes in the correct byte order - do not reverse this.
*/
void WriteAMFU64(RakNet::BitStream* bs, uint64_t value) {
bs->Write(value);
}
// Writes an AMFUndefinedValue to BitStream
template<>
void RakNet::BitStream::Write<AMFUndefinedValue>(AMFUndefinedValue value) {
this->Write(AMFUndefined);
}
// Writes an AMFNullValue to BitStream
template<>
void RakNet::BitStream::Write<AMFNullValue>(AMFNullValue value) {
this->Write(AMFNull);
}
// Writes an AMFFalseValue to BitStream
template<>
void RakNet::BitStream::Write<AMFFalseValue>(AMFFalseValue value) {
this->Write(AMFFalse);
}
// Writes an AMFTrueValue to BitStream
template<>
void RakNet::BitStream::Write<AMFTrueValue>(AMFTrueValue value) {
this->Write(AMFTrue);
}
// Writes an AMFIntegerValue to BitStream
template<>
void RakNet::BitStream::Write<AMFIntegerValue>(AMFIntegerValue value) {
this->Write(AMFInteger);
WriteUInt29(this, value.GetIntegerValue());
}
// Writes an AMFDoubleValue to BitStream
template<>
void RakNet::BitStream::Write<AMFDoubleValue>(AMFDoubleValue value) {
this->Write(AMFDouble);
double d = value.GetDoubleValue();
WriteAMFU64(this, *((unsigned long long*) & d));
}
// Writes an AMFStringValue to BitStream
template<>
void RakNet::BitStream::Write<AMFStringValue>(AMFStringValue value) {
this->Write(AMFString);
std::string v = value.GetStringValue();
WriteAMFString(this, v);
}
// Writes an AMFXMLDocValue to BitStream
template<>
void RakNet::BitStream::Write<AMFXMLDocValue>(AMFXMLDocValue value) {
this->Write(AMFXMLDoc);
std::string v = value.GetXMLDocValue();
WriteAMFString(this, v);
}
// Writes an AMFDateValue to BitStream
template<>
void RakNet::BitStream::Write<AMFDateValue>(AMFDateValue value) {
this->Write(AMFDate);
uint64_t date = value.GetDateValue();
WriteAMFU64(this, date);
}
// Writes an AMFArrayValue to BitStream
template<>
void RakNet::BitStream::Write<AMFArrayValue*>(AMFArrayValue* value) {
this->Write(AMFArray);
uint32_t denseSize = value->GetDenseValueSize();
WriteFlagNumber(this, denseSize);
_AMFArrayMap_::iterator it = value->GetAssociativeIteratorValueBegin();
_AMFArrayMap_::iterator end = value->GetAssociativeIteratorValueEnd();
while (it != end) {
WriteAMFString(this, it->first);
this->Write(it->second);
it++;
}
this->Write(AMFNull);
if (denseSize > 0) {
_AMFArrayList_::iterator it2 = value->GetDenseIteratorBegin();
_AMFArrayList_::iterator end2 = value->GetDenseIteratorEnd();
while (it2 != end2) {
this->Write(*it2);
it2++;
}
}
}

View File

@@ -1,92 +0,0 @@
#pragma once
// Custom Classes
#include "AMFFormat.h"
// RakNet
#include <BitStream.h>
/*!
\file AMFFormat_BitStream.h
\brief A class that implements native writing of AMF values to RakNet::BitStream
*/
// We are using the RakNet namespace
namespace RakNet {
//! Writes an AMFValue pointer to a RakNet::BitStream
/*!
\param value The value to write
*/
template <>
void RakNet::BitStream::Write<AMFValue*>(AMFValue* value);
//! Writes an AMFUndefinedValue to a RakNet::BitStream
/*!
\param value The value to write
*/
template <>
void RakNet::BitStream::Write<AMFUndefinedValue>(AMFUndefinedValue value);
//! Writes an AMFNullValue to a RakNet::BitStream
/*!
\param value The value to write
*/
template <>
void RakNet::BitStream::Write<AMFNullValue>(AMFNullValue value);
//! Writes an AMFFalseValue to a RakNet::BitStream
/*!
\param value The value to write
*/
template <>
void RakNet::BitStream::Write<AMFFalseValue>(AMFFalseValue value);
//! Writes an AMFTrueValue to a RakNet::BitStream
/*!
\param value The value to write
*/
template <>
void RakNet::BitStream::Write<AMFTrueValue>(AMFTrueValue value);
//! Writes an AMFIntegerValue to a RakNet::BitStream
/*!
\param value The value to write
*/
template <>
void RakNet::BitStream::Write<AMFIntegerValue>(AMFIntegerValue value);
//! Writes an AMFDoubleValue to a RakNet::BitStream
/*!
\param value The value to write
*/
template <>
void RakNet::BitStream::Write<AMFDoubleValue>(AMFDoubleValue value);
//! Writes an AMFStringValue to a RakNet::BitStream
/*!
\param value The value to write
*/
template <>
void RakNet::BitStream::Write<AMFStringValue>(AMFStringValue value);
//! Writes an AMFXMLDocValue to a RakNet::BitStream
/*!
\param value The value to write
*/
template <>
void RakNet::BitStream::Write<AMFXMLDocValue>(AMFXMLDocValue value);
//! Writes an AMFDateValue to a RakNet::BitStream
/*!
\param value The value to write
*/
template <>
void RakNet::BitStream::Write<AMFDateValue>(AMFDateValue value);
//! Writes an AMFArrayValue to a RakNet::BitStream
/*!
\param value The value to write
*/
template <>
void RakNet::BitStream::Write<AMFArrayValue*>(AMFArrayValue* value);
} // namespace RakNet

367
dCommon/Amf3.h Normal file
View File

@@ -0,0 +1,367 @@
#ifndef __AMF3__H__
#define __AMF3__H__
#include "dCommonVars.h"
#include "dLogger.h"
#include "Game.h"
#include <unordered_map>
#include <vector>
enum class eAmf : uint8_t {
Undefined = 0x00, // An undefined AMF Value
Null = 0x01, // A null AMF value
False = 0x02, // A false AMF value
True = 0x03, // A true AMF value
Integer = 0x04, // An integer AMF value
Double = 0x05, // A double AMF value
String = 0x06, // A string AMF value
XMLDoc = 0x07, // Unused in the live client and cannot be serialized without modification. An XML Doc AMF value
Date = 0x08, // Unused in the live client and cannot be serialized without modification. A date AMF value
Array = 0x09, // An array AMF value
Object = 0x0A, // Unused in the live client and cannot be serialized without modification. An object AMF value
XML = 0x0B, // Unused in the live client and cannot be serialized without modification. An XML AMF value
ByteArray = 0x0C, // Unused in the live client and cannot be serialized without modification. A byte array AMF value
VectorInt = 0x0D, // Unused in the live client and cannot be serialized without modification. An integer vector AMF value
VectorUInt = 0x0E, // Unused in the live client and cannot be serialized without modification. An unsigned integer AMF value
VectorDouble = 0x0F, // Unused in the live client and cannot be serialized without modification. A double vector AMF value
VectorObject = 0x10, // Unused in the live client and cannot be serialized without modification. An object vector AMF value
Dictionary = 0x11 // Unused in the live client and cannot be serialized without modification. A dictionary AMF value
};
class AMFBaseValue {
public:
virtual eAmf GetValueType() { return eAmf::Undefined; };
AMFBaseValue() {};
virtual ~AMFBaseValue() {};
};
template<typename ValueType>
class AMFValue : public AMFBaseValue {
public:
AMFValue() {};
AMFValue(ValueType value) { SetValue(value); };
virtual ~AMFValue() override {};
eAmf GetValueType() override { return eAmf::Undefined; };
const ValueType& GetValue() { return data; };
void SetValue(ValueType value) { data = value; };
protected:
ValueType data;
};
// As a string this is much easier to write and read from a BitStream.
template<>
class AMFValue<const char*> : public AMFBaseValue {
public:
AMFValue() {};
AMFValue(const char* value) { SetValue(std::string(value)); };
virtual ~AMFValue() override {};
eAmf GetValueType() override { return eAmf::String; };
const std::string& GetValue() { return data; };
void SetValue(std::string value) { data = value; };
protected:
std::string data;
};
typedef AMFValue<std::nullptr_t> AMFNullValue;
typedef AMFValue<bool> AMFBoolValue;
typedef AMFValue<int32_t> AMFIntValue;
typedef AMFValue<std::string> AMFStringValue;
typedef AMFValue<double> AMFDoubleValue;
template<> inline eAmf AMFValue<std::nullptr_t>::GetValueType() { return eAmf::Null; };
template<> inline eAmf AMFValue<bool>::GetValueType() { return this->data ? eAmf::True : eAmf::False; };
template<> inline eAmf AMFValue<int32_t>::GetValueType() { return eAmf::Integer; };
template<> inline eAmf AMFValue<uint32_t>::GetValueType() { return eAmf::Integer; };
template<> inline eAmf AMFValue<std::string>::GetValueType() { return eAmf::String; };
template<> inline eAmf AMFValue<double>::GetValueType() { return eAmf::Double; };
/**
* The AMFArrayValue object holds 2 types of lists:
* An associative list where a key maps to a value
* A Dense list where elements are stored back to back
*
* Objects that are Registered are owned by this object
* and are not to be deleted by a caller.
*/
class AMFArrayValue : public AMFBaseValue {
typedef std::unordered_map<std::string, AMFBaseValue*> AMFAssociative;
typedef std::vector<AMFBaseValue*> AMFDense;
public:
eAmf GetValueType() override { return eAmf::Array; };
~AMFArrayValue() override {
for (auto valueToDelete : GetDense()) {
if (valueToDelete) {
delete valueToDelete;
valueToDelete = nullptr;
}
}
for (auto valueToDelete : GetAssociative()) {
if (valueToDelete.second) {
delete valueToDelete.second;
valueToDelete.second = nullptr;
}
}
};
/**
* Returns the Associative portion of the object
*/
inline AMFAssociative& GetAssociative() { return this->associative; };
/**
* Returns the dense portion of the object
*/
inline AMFDense& GetDense() { return this->dense; };
/**
* Inserts an AMFValue into the associative portion with the given key.
* If a duplicate is attempted to be inserted, it is ignored and the
* first value with that key is kept in the map.
*
* These objects are not to be deleted by the caller as they are owned by
* the AMFArray object which manages its own memory.
*
* @param key The key to associate with the value
* @param value The value to insert
*
* @return The inserted element if the type matched,
* or nullptr if a key existed and was not the same type
*/
template<typename ValueType>
std::pair<AMFValue<ValueType>*, bool> Insert(const std::string& key, ValueType value) {
auto element = associative.find(key);
AMFValue<ValueType>* val = nullptr;
bool found = true;
if (element == associative.end()) {
val = new AMFValue<ValueType>(value);
associative.insert(std::make_pair(key, val));
} else {
val = dynamic_cast<AMFValue<ValueType>*>(element->second);
found = false;
}
return std::make_pair(val, found);
};
// Associates an array with a string key
std::pair<AMFBaseValue*, bool> Insert(const std::string& key) {
auto element = associative.find(key);
AMFArrayValue* val = nullptr;
bool found = true;
if (element == associative.end()) {
val = new AMFArrayValue();
associative.insert(std::make_pair(key, val));
} else {
val = dynamic_cast<AMFArrayValue*>(element->second);
found = false;
}
return std::make_pair(val, found);
};
// Associates an array with an integer key
std::pair<AMFBaseValue*, bool> Insert(const uint32_t& index) {
AMFArrayValue* val = nullptr;
bool inserted = false;
if (index >= dense.size()) {
dense.resize(index + 1);
val = new AMFArrayValue();
dense.at(index) = val;
inserted = true;
}
return std::make_pair(dynamic_cast<AMFArrayValue*>(dense.at(index)), inserted);
};
/**
* @brief Inserts an AMFValue into the AMFArray key'd by index.
* Attempting to insert the same key to the same value twice overwrites
* the previous value with the new one.
*
* @param index The index to associate with the value
* @param value The value to insert
* @return The inserted element, or nullptr if the type did not match
* what was at the index.
*/
template<typename ValueType>
std::pair<AMFValue<ValueType>*, bool> Insert(const uint32_t& index, ValueType value) {
AMFValue<ValueType>* val = nullptr;
bool inserted = false;
if (index >= this->dense.size()) {
this->dense.resize(index + 1);
val = new AMFValue<ValueType>(value);
this->dense.at(index) = val;
inserted = true;
}
return std::make_pair(dynamic_cast<AMFValue<ValueType>*>(this->dense.at(index)), inserted);
};
/**
* Inserts an AMFValue into the associative portion with the given key.
* If a duplicate is attempted to be inserted, it replaces the original
*
* The inserted element is now owned by this object and is not to be deleted
*
* @param key The key to associate with the value
* @param value The value to insert
*/
void Insert(const std::string& key, AMFBaseValue* value) {
auto element = associative.find(key);
if (element != associative.end() && element->second) {
delete element->second;
element->second = value;
} else {
associative.insert(std::make_pair(key, value));
}
};
/**
* Inserts an AMFValue into the associative portion with the given index.
* If a duplicate is attempted to be inserted, it replaces the original
*
* The inserted element is now owned by this object and is not to be deleted
*
* @param key The key to associate with the value
* @param value The value to insert
*/
void Insert(const uint32_t index, AMFBaseValue* value) {
if (index < dense.size()) {
AMFDense::iterator itr = dense.begin() + index;
if (*itr) delete dense.at(index);
} else {
dense.resize(index + 1);
}
dense.at(index) = value;
};
/**
* Pushes an AMFValue into the back of the dense portion.
*
* These objects are not to be deleted by the caller as they are owned by
* the AMFArray object which manages its own memory.
*
* @param value The value to insert
*
* @return The inserted pointer, or nullptr should the key already be in use.
*/
template<typename ValueType>
inline AMFValue<ValueType>* Push(ValueType value) {
return Insert(this->dense.size(), value).first;
};
/**
* Removes the key from the associative portion
*
* The pointer removed is now no longer managed by this container
*
* @param key The key to remove from the associative portion
*/
void Remove(const std::string& key, bool deleteValue = true) {
AMFAssociative::iterator it = this->associative.find(key);
if (it != this->associative.end()) {
if (deleteValue) delete it->second;
this->associative.erase(it);
}
}
/**
* Pops the last element in the dense portion, deleting it in the process.
*/
void Remove(const uint32_t index) {
if (!this->dense.empty() && index < this->dense.size()) {
auto itr = this->dense.begin() + index;
if (*itr) delete (*itr);
this->dense.erase(itr);
}
}
void Pop() {
if (!this->dense.empty()) Remove(this->dense.size() - 1);
}
AMFArrayValue* GetArray(const std::string& key) {
AMFAssociative::const_iterator it = this->associative.find(key);
if (it != this->associative.end()) {
return dynamic_cast<AMFArrayValue*>(it->second);
}
return nullptr;
};
AMFArrayValue* GetArray(const uint32_t index) {
return index >= this->dense.size() ? nullptr : dynamic_cast<AMFArrayValue*>(this->dense.at(index));
};
inline AMFArrayValue* InsertArray(const std::string& key) {
return static_cast<AMFArrayValue*>(Insert(key).first);
};
inline AMFArrayValue* InsertArray(const uint32_t index) {
return static_cast<AMFArrayValue*>(Insert(index).first);
};
inline AMFArrayValue* PushArray() {
return static_cast<AMFArrayValue*>(Insert(this->dense.size()).first);
};
/**
* Gets an AMFValue by the key from the associative portion and converts it
* to the AmfValue template type. If the key did not exist, it is inserted.
*
* @tparam The target object type
* @param key The key to lookup
*
* @return The AMFValue
*/
template <typename AmfType>
AMFValue<AmfType>* Get(const std::string& key) const {
AMFAssociative::const_iterator it = this->associative.find(key);
return it != this->associative.end() ?
dynamic_cast<AMFValue<AmfType>*>(it->second) :
nullptr;
};
// Get from the array but dont cast it
AMFBaseValue* Get(const std::string& key) const {
AMFAssociative::const_iterator it = this->associative.find(key);
return it != this->associative.end() ? it->second : nullptr;
};
/**
* @brief Get an AMFValue object at a position in the dense portion.
* Gets an AMFValue by the index from the dense portion and converts it
* to the AmfValue template type. If the index did not exist, it is inserted.
*
* @tparam The target object type
* @param index The index to get
* @return The casted object, or nullptr.
*/
template <typename AmfType>
AMFValue<AmfType>* Get(uint32_t index) const {
return index < this->dense.size() ?
dynamic_cast<AMFValue<AmfType>*>(this->dense.at(index)) :
nullptr;
};
// Get from the dense but dont cast it
AMFBaseValue* Get(const uint32_t index) const {
return index < this->dense.size() ? this->dense.at(index) : nullptr;
};
private:
/**
* The associative portion. These values are key'd with strings to an AMFValue.
*/
AMFAssociative associative;
/**
* The dense portion. These AMFValue's are stored one after
* another with the most recent addition being at the back.
*/
AMFDense dense;
};
#endif //!__AMF3__H__

184
dCommon/AmfSerialize.cpp Normal file
View File

@@ -0,0 +1,184 @@
#include "AmfSerialize.h"
#include "Game.h"
#include "dLogger.h"
// Writes an AMFValue pointer to a RakNet::BitStream
template<>
void RakNet::BitStream::Write<AMFBaseValue&>(AMFBaseValue& value) {
eAmf type = value.GetValueType();
this->Write(type);
switch (type) {
case eAmf::Integer: {
this->Write<AMFIntValue&>(*static_cast<AMFIntValue*>(&value));
break;
}
case eAmf::Double: {
this->Write<AMFDoubleValue&>(*static_cast<AMFDoubleValue*>(&value));
break;
}
case eAmf::String: {
this->Write<AMFStringValue&>(*static_cast<AMFStringValue*>(&value));
break;
}
case eAmf::Array: {
this->Write<AMFArrayValue&>(*static_cast<AMFArrayValue*>(&value));
break;
}
default: {
Game::logger->Log("AmfSerialize", "Encountered unwritable AMFType %i!", type);
}
case eAmf::Undefined:
case eAmf::Null:
case eAmf::False:
case eAmf::True:
case eAmf::Date:
case eAmf::Object:
case eAmf::XML:
case eAmf::XMLDoc:
case eAmf::ByteArray:
case eAmf::VectorInt:
case eAmf::VectorUInt:
case eAmf::VectorDouble:
case eAmf::VectorObject:
case eAmf::Dictionary:
break;
}
}
/**
* A private function to write an value to a RakNet::BitStream
* RakNet writes in the correct byte order - do not reverse this.
*/
void WriteUInt29(RakNet::BitStream* bs, uint32_t v) {
unsigned char b4 = (unsigned char)v;
if (v < 0x00200000) {
b4 = b4 & 0x7F;
if (v > 0x7F) {
unsigned char b3;
v = v >> 7;
b3 = ((unsigned char)(v)) | 0x80;
if (v > 0x7F) {
unsigned char b2;
v = v >> 7;
b2 = ((unsigned char)(v)) | 0x80;
bs->Write(b2);
}
bs->Write(b3);
}
} else {
unsigned char b1;
unsigned char b2;
unsigned char b3;
v = v >> 8;
b3 = ((unsigned char)(v)) | 0x80;
v = v >> 7;
b2 = ((unsigned char)(v)) | 0x80;
v = v >> 7;
b1 = ((unsigned char)(v)) | 0x80;
bs->Write(b1);
bs->Write(b2);
bs->Write(b3);
}
bs->Write(b4);
}
/**
* Writes a flag number to a RakNet::BitStream
* RakNet writes in the correct byte order - do not reverse this.
*/
void WriteFlagNumber(RakNet::BitStream* bs, uint32_t v) {
v = (v << 1) | 0x01;
WriteUInt29(bs, v);
}
/**
* Writes an AMFString to a RakNet::BitStream
*
* RakNet writes in the correct byte order - do not reverse this.
*/
void WriteAMFString(RakNet::BitStream* bs, const std::string& str) {
WriteFlagNumber(bs, (uint32_t)str.size());
bs->Write(str.c_str(), (uint32_t)str.size());
}
/**
* Writes an U16 to a bitstream
*
* RakNet writes in the correct byte order - do not reverse this.
*/
void WriteAMFU16(RakNet::BitStream* bs, uint16_t value) {
bs->Write(value);
}
/**
* Writes an U32 to a bitstream
*
* RakNet writes in the correct byte order - do not reverse this.
*/
void WriteAMFU32(RakNet::BitStream* bs, uint32_t value) {
bs->Write(value);
}
/**
* Writes an U64 to a bitstream
*
* RakNet writes in the correct byte order - do not reverse this.
*/
void WriteAMFU64(RakNet::BitStream* bs, uint64_t value) {
bs->Write(value);
}
// Writes an AMFIntegerValue to BitStream
template<>
void RakNet::BitStream::Write<AMFIntValue&>(AMFIntValue& value) {
WriteUInt29(this, value.GetValue());
}
// Writes an AMFDoubleValue to BitStream
template<>
void RakNet::BitStream::Write<AMFDoubleValue&>(AMFDoubleValue& value) {
double d = value.GetValue();
WriteAMFU64(this, *reinterpret_cast<uint64_t*>(&d));
}
// Writes an AMFStringValue to BitStream
template<>
void RakNet::BitStream::Write<AMFStringValue&>(AMFStringValue& value) {
WriteAMFString(this, value.GetValue());
}
// Writes an AMFArrayValue to BitStream
template<>
void RakNet::BitStream::Write<AMFArrayValue&>(AMFArrayValue& value) {
uint32_t denseSize = value.GetDense().size();
WriteFlagNumber(this, denseSize);
auto it = value.GetAssociative().begin();
auto end = value.GetAssociative().end();
while (it != end) {
WriteAMFString(this, it->first);
this->Write<AMFBaseValue&>(*it->second);
it++;
}
this->Write(eAmf::Null);
if (denseSize > 0) {
auto it2 = value.GetDense().begin();
auto end2 = value.GetDense().end();
while (it2 != end2) {
this->Write<AMFBaseValue&>(**it2);
it2++;
}
}
}

50
dCommon/AmfSerialize.h Normal file
View File

@@ -0,0 +1,50 @@
#pragma once
// Custom Classes
#include "Amf3.h"
// RakNet
#include <BitStream.h>
/*!
\file AmfSerialize.h
\brief A class that implements native writing of AMF values to RakNet::BitStream
*/
// We are using the RakNet namespace
namespace RakNet {
//! Writes an AMFValue pointer to a RakNet::BitStream
/*!
\param value The value to write
*/
template <>
void RakNet::BitStream::Write<AMFBaseValue&>(AMFBaseValue& value);
//! Writes an AMFIntegerValue to a RakNet::BitStream
/*!
\param value The value to write
*/
template <>
void RakNet::BitStream::Write<AMFIntValue&>(AMFIntValue& value);
//! Writes an AMFDoubleValue to a RakNet::BitStream
/*!
\param value The value to write
*/
template <>
void RakNet::BitStream::Write<AMFDoubleValue&>(AMFDoubleValue& value);
//! Writes an AMFStringValue to a RakNet::BitStream
/*!
\param value The value to write
*/
template <>
void RakNet::BitStream::Write<AMFStringValue&>(AMFStringValue& value);
//! Writes an AMFArrayValue to a RakNet::BitStream
/*!
\param value The value to write
*/
template <>
void RakNet::BitStream::Write<AMFArrayValue&>(AMFArrayValue& value);
} // namespace RakNet

11
dCommon/Brick.h Normal file
View File

@@ -0,0 +1,11 @@
#ifndef __BRICK__H__
#define __BRICK__H__
#include <cstdint>
struct Brick {
uint32_t designerID;
uint32_t materialID;
};
#endif //!__BRICK__H__

View File

@@ -1,6 +1,6 @@
set(DCOMMON_SOURCES "AMFFormat.cpp"
set(DCOMMON_SOURCES
"AMFDeserialize.cpp"
"AMFFormat_BitStream.cpp"
"AmfSerialize.cpp"
"BinaryIO.cpp"
"dConfig.cpp"
"Diagnostics.cpp"

View File

@@ -111,7 +111,7 @@ static void ErrorCallback(void* data, const char* msg, int errnum) {
void GenerateDump() {
std::string cmd = "sudo gcore " + std::to_string(getpid());
system(cmd.c_str());
int ret = system(cmd.c_str()); // Saving a return just to prevent warning
}
void CatchUnhandled(int sig) {

12
dCommon/DluAssert.h Normal file
View File

@@ -0,0 +1,12 @@
#ifndef __DLUASSERT__H__
#define __DLUASSERT__H__
#include <assert.h>
#ifdef _DEBUG
# define DluAssert(expression) assert(expression)
#else
# define DluAssert(expression)
#endif
#endif //!__DLUASSERT__H__

View File

@@ -10,6 +10,7 @@ class dConfig;
class RakPeerInterface;
class AssetManager;
struct SystemAddress;
class EntityManager;
namespace Game {
extern dLogger* logger;
@@ -22,4 +23,5 @@ namespace Game {
extern AssetManager* assetManager;
extern SystemAddress chatSysAddr;
extern bool shouldShutdown;
extern EntityManager* entityManager;
}

View File

@@ -241,7 +241,7 @@ std::vector<std::wstring> GeneralUtils::SplitString(std::wstring& str, wchar_t d
return vector;
}
std::vector<std::u16string> GeneralUtils::SplitString(std::u16string& str, char16_t delimiter) {
std::vector<std::u16string> GeneralUtils::SplitString(const std::u16string& str, char16_t delimiter) {
std::vector<std::u16string> vector = std::vector<std::u16string>();
std::u16string current;
@@ -319,3 +319,7 @@ std::vector<std::string> GeneralUtils::GetSqlFileNamesFromFolder(const std::stri
return sortedFiles;
}
bool GeneralUtils::TryParse(const std::string& x, const std::string& y, const std::string& z, NiPoint3& dst) {
return TryParse<float>(x.c_str(), dst.x) && TryParse<float>(y.c_str(), dst.y) && TryParse<float>(z.c_str(), dst.z);
}

View File

@@ -10,11 +10,14 @@
#include <type_traits>
#include <stdexcept>
#include <BitStream.h>
#include "NiPoint3.h"
#include "Game.h"
#include "dLogger.h"
enum eInventoryType : uint32_t;
enum class eObjectBits : size_t;
enum class eReplicaComponentType : uint32_t;
/*!
\file GeneralUtils.hpp
@@ -64,9 +67,9 @@ namespace GeneralUtils {
//! Sets a bit on a numerical value
template <typename T>
void SetBit(T& value, size_t index) {
inline void SetBit(T& value, eObjectBits bits) {
static_assert(std::is_arithmetic<T>::value, "Not an arithmetic type");
auto index = static_cast<size_t>(bits);
if (index > (sizeof(T) * 8) - 1) {
return;
}
@@ -76,9 +79,9 @@ namespace GeneralUtils {
//! Clears a bit on a numerical value
template <typename T>
void ClearBit(T& value, size_t index) {
inline void ClearBit(T& value, eObjectBits bits) {
static_assert(std::is_arithmetic<T>::value, "Not an arithmetic type");
auto index = static_cast<size_t>(bits);
if (index > (sizeof(T) * 8 - 1)) {
return;
}
@@ -137,7 +140,7 @@ namespace GeneralUtils {
std::vector<std::wstring> SplitString(std::wstring& str, wchar_t delimiter);
std::vector<std::u16string> SplitString(std::u16string& str, char16_t delimiter);
std::vector<std::u16string> SplitString(const std::u16string& str, char16_t delimiter);
std::vector<std::string> SplitString(const std::string& str, char delimiter);
@@ -181,6 +184,11 @@ namespace GeneralUtils {
return static_cast<eInventoryType>(std::stoul(value));
}
template <>
inline eReplicaComponentType Parse(const char* value) {
return static_cast<eReplicaComponentType>(std::stoul(value));
}
template <typename T>
bool TryParse(const char* value, T& dst) {
try {
@@ -202,6 +210,8 @@ namespace GeneralUtils {
return TryParse<T>(value.c_str(), dst);
}
bool TryParse(const std::string& x, const std::string& y, const std::string& z, NiPoint3& dst);
template<typename T>
std::u16string to_u16string(T value) {
return GeneralUtils::ASCIIToUTF16(std::to_string(value));

View File

@@ -3,122 +3,174 @@
// Custom Classes
#include "GeneralUtils.h"
#include "Game.h"
#include "dLogger.h"
// C++
#include <sstream>
#include <string_view>
#include <vector>
using LDFKey = std::string_view;
using LDFTypeAndValue = std::string_view;
using LDFType = std::string_view;
using LDFValue = std::string_view;
//! Returns a pointer to a LDFData value based on string format
LDFBaseData* LDFBaseData::DataFromString(const std::string& format) {
LDFBaseData* LDFBaseData::DataFromString(const std::string_view& format) {
// A valid LDF must be at least 3 characters long (=0:) is the shortest valid LDF (empty UTF-16 key with no initial value)
if (format.empty() || format.length() <= 2) return nullptr;
auto equalsPosition = format.find('=');
// You can have an empty key, just make sure the type and value might exist
if (equalsPosition == std::string::npos || equalsPosition == (format.size() - 1)) return nullptr;
// First, check the format
std::istringstream ssFormat(format);
std::string token;
std::pair<LDFKey, LDFTypeAndValue> keyValue;
keyValue.first = format.substr(0, equalsPosition);
keyValue.second = format.substr(equalsPosition + 1, format.size());
std::vector<std::string> keyValueArray;
while (std::getline(ssFormat, token, '=')) {
keyValueArray.push_back(token);
std::u16string key = GeneralUtils::ASCIIToUTF16(keyValue.first);
auto colonPosition = keyValue.second.find(':');
// If : is the first thing after an =, then this is an invalid LDF since
// we dont have a type to use.
if (colonPosition == std::string::npos || colonPosition == 0) return nullptr;
std::pair<LDFType, LDFValue> ldfTypeAndValue;
ldfTypeAndValue.first = keyValue.second.substr(0, colonPosition);
ldfTypeAndValue.second = keyValue.second.substr(colonPosition + 1, keyValue.second.size());
// Only allow empty values for string values.
if (ldfTypeAndValue.second.size() == 0 && !(ldfTypeAndValue.first == "0" || ldfTypeAndValue.first == "13")) return nullptr;
eLDFType type;
char* storage;
try {
type = static_cast<eLDFType>(strtol(ldfTypeAndValue.first.data(), &storage, 10));
} catch (std::exception) {
Game::logger->Log("LDFFormat", "Attempted to process invalid ldf type (%s) from string (%s)", ldfTypeAndValue.first.data(), format.data());
return nullptr;
}
if (keyValueArray.size() == 2) {
std::u16string key = GeneralUtils::ASCIIToUTF16(keyValueArray[0]);
LDFBaseData* returnValue = nullptr;
switch (type) {
case LDF_TYPE_UTF_16: {
std::u16string data = GeneralUtils::UTF8ToUTF16(ldfTypeAndValue.second);
returnValue = new LDFData<std::u16string>(key, data);
break;
}
std::vector<std::string> dataArray;
std::istringstream ssData(keyValueArray[1]);
while (std::getline(ssData, token, ':')) {
dataArray.push_back(token);
case LDF_TYPE_S32: {
try {
int32_t data = static_cast<int32_t>(strtoul(ldfTypeAndValue.second.data(), &storage, 10));
returnValue = new LDFData<int32_t>(key, data);
} catch (std::exception) {
Game::logger->Log("LDFFormat", "Warning: Attempted to process invalid int32 value (%s) from string (%s)", ldfTypeAndValue.second.data(), format.data());
return nullptr;
}
break;
}
if (dataArray.size() > 2) { // hacky fix for strings with colons in them
std::vector<std::string> newDataArray;
newDataArray.push_back(dataArray[0]);
std::string value = "";
for (size_t i = 1; i < dataArray.size(); ++i) {
value += dataArray[i] + ':';
}
value.pop_back(); // remove last colon
newDataArray.push_back(value);
dataArray = newDataArray;
case LDF_TYPE_FLOAT: {
try {
float data = strtof(ldfTypeAndValue.second.data(), &storage);
returnValue = new LDFData<float>(key, data);
} catch (std::exception) {
Game::logger->Log("LDFFormat", "Warning: Attempted to process invalid float value (%s) from string (%s)", ldfTypeAndValue.second.data(), format.data());
return nullptr;
}
break;
}
if ((dataArray[0] == "0" || dataArray[0] == "13") && dataArray.size() == 1) {
dataArray.push_back("");
case LDF_TYPE_DOUBLE: {
try {
double data = strtod(ldfTypeAndValue.second.data(), &storage);
returnValue = new LDFData<double>(key, data);
} catch (std::exception) {
Game::logger->Log("LDFFormat", "Warning: Attempted to process invalid double value (%s) from string (%s)", ldfTypeAndValue.second.data(), format.data());
return nullptr;
}
break;
}
if (dataArray.size() == 2) {
eLDFType type = static_cast<eLDFType>(stoi(dataArray[0]));
case LDF_TYPE_U32:
{
uint32_t data;
switch (type) {
case LDF_TYPE_UTF_16: {
std::u16string data = GeneralUtils::UTF8ToUTF16(dataArray[1]);
return new LDFData<std::u16string>(key, data);
}
case LDF_TYPE_S32: {
int32_t data = static_cast<int32_t>(stoull(dataArray[1]));
return new LDFData<int32_t>(key, data);
}
case LDF_TYPE_FLOAT: {
float data = static_cast<float>(stof(dataArray[1]));
return new LDFData<float>(key, data);
}
case LDF_TYPE_DOUBLE: {
double data = static_cast<float>(stod(dataArray[1]));
return new LDFData<double>(key, data);
}
case LDF_TYPE_U32:
{
uint32_t data;
if (dataArray[1] == "true") {
data = 1;
} else if (dataArray[1] == "false") {
data = 0;
} else {
data = static_cast<uint32_t>(stoul(dataArray[1]));
}
return new LDFData<uint32_t>(key, data);
}
case LDF_TYPE_BOOLEAN: {
bool data;
if (dataArray[1] == "true") {
data = true;
} else if (dataArray[1] == "false") {
data = false;
} else {
data = static_cast<bool>(stoi(dataArray[1]));
}
return new LDFData<bool>(key, data);
}
case LDF_TYPE_U64: {
uint64_t data = static_cast<uint64_t>(stoull(dataArray[1]));
return new LDFData<uint64_t>(key, data);
}
case LDF_TYPE_OBJID: {
LWOOBJID data = static_cast<LWOOBJID>(stoll(dataArray[1]));
return new LDFData<LWOOBJID>(key, data);
}
case LDF_TYPE_UTF_8: {
std::string data = dataArray[1];
return new LDFData<std::string>(key, data);
}
case LDF_TYPE_UNKNOWN: {
if (ldfTypeAndValue.second == "true") {
data = 1;
} else if (ldfTypeAndValue.second == "false") {
data = 0;
} else {
try {
data = static_cast<uint32_t>(strtoul(ldfTypeAndValue.second.data(), &storage, 10));
} catch (std::exception) {
Game::logger->Log("LDFFormat", "Warning: Attempted to process invalid uint32 value (%s) from string (%s)", ldfTypeAndValue.second.data(), format.data());
return nullptr;
}
}
}
returnValue = new LDFData<uint32_t>(key, data);
break;
}
return nullptr;
case LDF_TYPE_BOOLEAN: {
bool data;
if (ldfTypeAndValue.second == "true") {
data = true;
} else if (ldfTypeAndValue.second == "false") {
data = false;
} else {
try {
data = static_cast<bool>(strtol(ldfTypeAndValue.second.data(), &storage, 10));
} catch (std::exception) {
Game::logger->Log("LDFFormat", "Warning: Attempted to process invalid bool value (%s) from string (%s)", ldfTypeAndValue.second.data(), format.data());
return nullptr;
}
}
returnValue = new LDFData<bool>(key, data);
break;
}
case LDF_TYPE_U64: {
try {
uint64_t data = static_cast<uint64_t>(strtoull(ldfTypeAndValue.second.data(), &storage, 10));
returnValue = new LDFData<uint64_t>(key, data);
} catch (std::exception) {
Game::logger->Log("LDFFormat", "Warning: Attempted to process invalid uint64 value (%s) from string (%s)", ldfTypeAndValue.second.data(), format.data());
return nullptr;
}
break;
}
case LDF_TYPE_OBJID: {
try {
LWOOBJID data = static_cast<LWOOBJID>(strtoll(ldfTypeAndValue.second.data(), &storage, 10));
returnValue = new LDFData<LWOOBJID>(key, data);
} catch (std::exception) {
Game::logger->Log("LDFFormat", "Warning: Attempted to process invalid LWOOBJID value (%s) from string (%s)", ldfTypeAndValue.second.data(), format.data());
return nullptr;
}
break;
}
case LDF_TYPE_UTF_8: {
std::string data = ldfTypeAndValue.second.data();
returnValue = new LDFData<std::string>(key, data);
break;
}
case LDF_TYPE_UNKNOWN: {
Game::logger->Log("LDFFormat", "Warning: Attempted to process invalid unknown value (%s) from string (%s)", ldfTypeAndValue.second.data(), format.data());
break;
}
default: {
Game::logger->Log("LDFFormat", "Warning: Attempted to process invalid LDF type (%d) from string (%s)", type, format.data());
break;
}
}
return returnValue;
}

View File

@@ -1,4 +1,5 @@
#pragma once
#ifndef __LDFFORMAT__H__
#define __LDFFORMAT__H__
// Custom Classes
#include "dCommonVars.h"
@@ -6,18 +7,12 @@
// C++
#include <string>
#include <string_view>
#include <sstream>
// RakNet
#include "BitStream.h"
#include "../thirdparty/raknet/Source/BitStream.h"
/*!
\file LDFFormat.hpp
\brief A collection of LDF format classes
*/
//! An enum for LDF Data Types
enum eLDFType {
LDF_TYPE_UNKNOWN = -1, //!< Unknown data type
LDF_TYPE_UTF_16 = 0, //!< UTF-16 wstring data type
@@ -31,36 +26,21 @@ enum eLDFType {
LDF_TYPE_UTF_8 = 13, //!< UTF-8 string data type
};
//! A base class for the LDF data
class LDFBaseData {
public:
//! Destructor
virtual ~LDFBaseData(void) {}
virtual ~LDFBaseData() {}
//! Writes the data to a packet
/*!
\param packet The packet
*/
virtual void WriteToPacket(RakNet::BitStream* packet) = 0;
//! Gets the key
/*!
\return The key
*/
virtual const std::u16string& GetKey(void) = 0;
virtual const std::u16string& GetKey() = 0;
//! Gets the value type
/*!
\return The value type
*/
virtual eLDFType GetValueType(void) = 0;
virtual eLDFType GetValueType() = 0;
//! Gets a string from the key/value pair
/*!
\param includeKey Whether or not to include the key in the data
\param includeTypeId Whether or not to include the type id in the data
\return The string representation of the data
/** Gets a string from the key/value pair
* @param includeKey Whether or not to include the key in the data
* @param includeTypeId Whether or not to include the type id in the data
* @return The string representation of the data
*/
virtual std::string GetString(bool includeKey = true, bool includeTypeId = true) = 0;
@@ -68,19 +48,15 @@ public:
virtual LDFBaseData* Copy() = 0;
// MARK: Functions
//! Returns a pointer to a LDFData value based on string format
/*!
\param format The format
/**
* Given an input string, return the data as a LDF key.
*/
static LDFBaseData* DataFromString(const std::string& format);
static LDFBaseData* DataFromString(const std::string_view& format);
};
//! A structure for an LDF key-value pair
template<typename T>
class LDFData : public LDFBaseData {
class LDFData: public LDFBaseData {
private:
std::u16string key;
T value;
@@ -164,15 +140,11 @@ public:
if (includeKey) {
const std::string& sKey = GeneralUtils::UTF16ToWTF8(this->key, this->key.size());
stream << sKey << "=";
stream << sKey << '=';
}
if (includeTypeId) {
const std::string& sType = std::to_string(this->GetValueType());
stream << sType << ":";
stream << this->GetValueType() << ':';
}
const std::string& sData = this->GetValueString();
@@ -234,20 +206,18 @@ inline void LDFData<std::string>::WriteValue(RakNet::BitStream* packet) {
}
}
// MARK: String Data
template<> inline std::string LDFData<std::u16string>::GetValueString(void) {
//std::string toReturn(this->value.begin(), this->value.end());
//return toReturn;
template<> inline std::string LDFData<std::u16string>::GetValueString() {
return GeneralUtils::UTF16ToWTF8(this->value, this->value.size());
}
template<> inline std::string LDFData<int32_t>::GetValueString(void) { return std::to_string(this->value); }
template<> inline std::string LDFData<float>::GetValueString(void) { return std::to_string(this->value); }
template<> inline std::string LDFData<double>::GetValueString(void) { return std::to_string(this->value); }
template<> inline std::string LDFData<uint32_t>::GetValueString(void) { return std::to_string(this->value); }
template<> inline std::string LDFData<bool>::GetValueString(void) { return std::to_string(this->value); }
template<> inline std::string LDFData<uint64_t>::GetValueString(void) { return std::to_string(this->value); }
template<> inline std::string LDFData<LWOOBJID>::GetValueString(void) { return std::to_string(this->value); }
template<> inline std::string LDFData<int32_t>::GetValueString() { return std::to_string(this->value); }
template<> inline std::string LDFData<float>::GetValueString() { return std::to_string(this->value); }
template<> inline std::string LDFData<double>::GetValueString() { return std::to_string(this->value); }
template<> inline std::string LDFData<uint32_t>::GetValueString() { return std::to_string(this->value); }
template<> inline std::string LDFData<bool>::GetValueString() { return std::to_string(this->value); }
template<> inline std::string LDFData<uint64_t>::GetValueString() { return std::to_string(this->value); }
template<> inline std::string LDFData<LWOOBJID>::GetValueString() { return std::to_string(this->value); }
template<> inline std::string LDFData<std::string>::GetValueString(void) { return this->value; }
template<> inline std::string LDFData<std::string>::GetValueString() { return this->value; }
#endif //!__LDFFORMAT__H__

View File

@@ -128,6 +128,12 @@ NiPoint3 NiPoint3::operator+(const NiPoint3& point) const {
return NiPoint3(this->x + point.x, this->y + point.y, this->z + point.z);
}
//! Operator for addition of vectors
NiPoint3 NiPoint3::operator+=(const NiPoint3& point) const {
return NiPoint3(this->x + point.x, this->y + point.y, this->z + point.z);
}
//! Operator for subtraction of vectors
NiPoint3 NiPoint3::operator-(const NiPoint3& point) const {
return NiPoint3(this->x - point.x, this->y - point.y, this->z - point.z);

View File

@@ -135,6 +135,9 @@ public:
//! Operator for addition of vectors
NiPoint3 operator+(const NiPoint3& point) const;
//! Operator for addition of vectors
NiPoint3 operator+=(const NiPoint3& point) const;
//! Operator for subtraction of vectors
NiPoint3 operator-(const NiPoint3& point) const;

View File

@@ -47,6 +47,10 @@ AssetManager::AssetManager(const std::filesystem::path& path) {
this->LoadPackIndex();
break;
}
case eAssetBundleType::None:
case eAssetBundleType::Unpacked: {
break;
}
}
}
@@ -111,7 +115,7 @@ bool AssetManager::GetFile(const char* name, char** data, uint32_t* len) {
*len = ftell(file);
*data = (char*)malloc(*len);
fseek(file, 0, SEEK_SET);
fread(*data, sizeof(uint8_t), *len, file);
int32_t readInData = fread(*data, sizeof(uint8_t), *len, file);
fclose(file);
return true;

View File

@@ -77,7 +77,7 @@ bool Pack::ReadFileFromPack(uint32_t crc, char** data, uint32_t* len) {
if (!isCompressed) {
char* tempData = (char*)malloc(pkRecord.m_UncompressedSize);
fread(tempData, sizeof(uint8_t), pkRecord.m_UncompressedSize, file);
int32_t readInData = fread(tempData, sizeof(uint8_t), pkRecord.m_UncompressedSize, file);
*data = tempData;
*len = pkRecord.m_UncompressedSize;
@@ -97,11 +97,11 @@ bool Pack::ReadFileFromPack(uint32_t crc, char** data, uint32_t* len) {
if (currentReadPos >= pkRecord.m_UncompressedSize) break;
uint32_t size;
fread(&size, sizeof(uint32_t), 1, file);
int32_t readInData = fread(&size, sizeof(uint32_t), 1, file);
pos += 4; // Move pointer position 4 to the right
char* chunk = (char*)malloc(size);
fread(chunk, sizeof(int8_t), size, file);
int32_t readInData2 = fread(chunk, sizeof(int8_t), size, file);
pos += size; // Move pointer position the amount of bytes read to the right
int32_t err;

View File

@@ -1,105 +0,0 @@
#pragma once
/**
2 Engineer (Rank 1) Item Set
3 Engineer (Rank 2) Item Set
4 Engineer (Rank 3) Item Set
7 Knight (Rank 1) Item Set
8 Knight (Rank 2) Item Set
9 Knight (Rank 3) Item Set
10 Space Ranger (Rank 1) Item Set
11 Space Ranger (Rank 2) Item Set
12 Space Ranger (Rank 3) Item Set
13 Samurai (Rank 1) Item Set
14 Samurai (Rank 2) Item Set
15 Samurai (Rank 3) Item Set
16 Sorcerer (Rank 1) Item Set
17 Sorcerer (Rank 2) Item Set
18 Sorcerer (Rank 3) Item Set
19 Space Marauder (Rank 1) Item Set
20 Space Marauder (Rank 2) Item Set
21 Space Marauder (Rank 3) Item Set
22 Shinobi (Rank 1) Item Set
23 Shinobi (Rank 2) Item Set
24 Shinobi (Rank 3) Item Set
25 Inventor (Rank 1) Item Set
26 Inventor (Rank 2) Item Set
27 Inventor (Rank 3) Item Set
28 Summoner (Rank 1) Item Set
29 Summoner (Rank 2) Item Set
30 Summoner (Rank 3) Item Set
31 Adventurer (Rank 1) Item Set
32 Adventurer (Rank 2) Item Set
33 Adventurer (Rank 3) Item Set
34 Daredevil (Rank 1) Item Set
35 Daredevil (Rank 2) Item Set
36 Daredevil (Rank 3) Item Set
37 Buccaneer (Rank 1) Item Set
38 Buccaneer (Rank 2) Item Set
39 Buccaneer (Rank 3) Item Set
40 Bone Suit Item Set
41 Imagination Spinjitzu Item Set
42 Bat Lord Item Set
43 Mosaic Jester Item Set
44 Explorien Bot Item Set
45 [Unnamed] Item Set
46 [Unnamed] Item Set
47 [Unnamed] Item Set
48 Earth Spinjitzu Item Set
49 [Unnamed] Item Set
50 Fire Spinjitzu Item Set
51 Ice Spinjitzu Item Set
52 Lightning Spinjitzu Item Set
*/
enum class ItemSetPassiveAbilityID
{
EngineerRank1 = 2,
EngineerRank2 = 3,
EngineerRank3 = 4,
KnightRank1 = 7,
KnightRank2 = 8,
KnightRank3 = 9,
SpaceRangerRank1 = 10,
SpaceRangerRank2 = 11,
SpaceRangerRank3 = 12,
SamuraiRank1 = 13,
SamuraiRank2 = 14,
SamuraiRank3 = 15,
SorcererRank1 = 16,
SorcererRank2 = 17,
SorcererRank3 = 18,
SpaceMarauderRank1 = 19,
SpaceMarauderRank2 = 20,
SpaceMarauderRank3 = 21,
ShinobiRank1 = 22,
ShinobiRank2 = 23,
ShinobiRank3 = 24,
InventorRank1 = 25,
InventorRank2 = 26,
InventorRank3 = 27,
SummonerRank1 = 28,
SummonerRank2 = 29,
SummonerRank3 = 30,
AdventurerRank1 = 31,
AdventurerRank2 = 32,
AdventurerRank3 = 33,
DaredevilRank1 = 34,
DaredevilRank2 = 35,
DaredevilRank3 = 36,
BuccaneerRank1 = 37,
BuccaneerRank2 = 38,
BuccaneerRank3 = 39,
BoneSuit = 40,
ImaginationSpinjitzu = 41,
BatLord = 42,
MosaicJester = 43,
ExplorienBot = 44,
Unnamed1 = 45,
Unnamed2 = 46,
Unnamed3 = 47,
EarthSpinjitzu = 48,
Unnamed4 = 49,
FireSpinjitzu = 50,
IceSpinjitzu = 51,
LightningSpinjitzu = 52
};

View File

@@ -1,13 +0,0 @@
#pragma once
#ifndef MISSIONLOCKSTATE_H
#define MISSIONLOCKSTATE_H
enum class MissionLockState : int
{
MISSION_LOCK_LOCKED,
MISSION_LOCK_NEW,
MISSION_LOCK_UNLOCKED,
};
#endif

View File

@@ -1,56 +0,0 @@
#pragma once
#ifndef __MISSIONSTATE__H__
#define __MISSIONSTATE__H__
/**
* Represents the possible states a mission can be in
*/
enum class MissionState : int32_t {
/**
* The mission state is unknown
*/
MISSION_STATE_UNKNOWN = -1,
/**
* The mission is yielding rewards
*/
MISSION_STATE_REWARDING = 0,
/**
* The mission can be accepted
*/
MISSION_STATE_AVAILABLE = 1,
/**
* The mission has been accepted but not yet completed
*/
MISSION_STATE_ACTIVE = 2,
/**
* All the tasks for the mission have been completed and the entity can turn the mission in to complete it
*/
MISSION_STATE_READY_TO_COMPLETE = 4, //!< The mission is ready to complete
/**
* The mission has been completed
*/
MISSION_STATE_COMPLETE = 8,
/**
* The mission is available again and has been completed before. Used for daily missions.
*/
MISSION_STATE_COMPLETE_AVAILABLE = 9,
/**
* The mission is active and has been completed before. Used for daily missions.
*/
MISSION_STATE_COMPLETE_ACTIVE = 10,
/**
* The mission has been completed before and has now been completed again. Used for daily missions.
*/
MISSION_STATE_COMPLETE_READY_TO_COMPLETE = 12
};
#endif //!__MISSIONSTATE__H__

View File

@@ -1,31 +0,0 @@
#pragma once
#ifndef MISSIONTASKTYPE_H
#define MISSIONTASKTYPE_H
//! An enum for mission task types
enum class MissionTaskType : int {
MISSION_TASK_TYPE_UNKNOWN = -1, //!< The task type is unknown
MISSION_TASK_TYPE_SMASH = 0, //!< A task for smashing something
MISSION_TASK_TYPE_SCRIPT = 1, //!< A task handled by a server LUA script
MISSION_TASK_TYPE_ACTIVITY = 2, //!< A task for completing a quickbuild
MISSION_TASK_TYPE_ENVIRONMENT = 3, //!< A task for something in the environment
MISSION_TASK_TYPE_MISSION_INTERACTION = 4, //!< A task for interacting with a mission
MISSION_TASK_TYPE_EMOTE = 5, //!< A task for playing an emote
MISSION_TASK_TYPE_FOOD = 9, //!< A task for eating food
MISSION_TASK_TYPE_SKILL = 10, //!< A task for performing a skill
MISSION_TASK_TYPE_ITEM_COLLECTION = 11, //!< A task for collecting an item
MISSION_TASK_TYPE_LOCATION = 12, //!< A task for finding a location
MISSION_TASK_TYPE_MINIGAME = 14, //!< A task for doing something in a minigame
MISSION_TASK_TYPE_NON_MISSION_INTERACTION = 15, //!< A task for interacting with a non-mission
MISSION_TASK_TYPE_MISSION_COMPLETE = 16, //!< A task for completing a mission
MISSION_TASK_TYPE_EARN_REPUTATION = 17, //!< A task for earning reputation
MISSION_TASK_TYPE_POWERUP = 21, //!< A task for collecting a powerup
MISSION_TASK_TYPE_PET_TAMING = 22, //!< A task for taming a pet
MISSION_TASK_TYPE_RACING = 23, //!< A task for racing
MISSION_TASK_TYPE_PLAYER_FLAG = 24, //!< A task for setting a player flag
MISSION_TASK_TYPE_PLACE_MODEL = 25, //!< A task for picking up a model
MISSION_TASK_TYPE_VISIT_PROPERTY = 30 //!< A task for visiting a property
};
#endif

View File

@@ -1,42 +0,0 @@
#pragma once
#include <cstdint>
/**
* Bitmap of permissions and restrictions for characters.
*/
enum class PermissionMap : uint64_t
{
/**
* Reserved for future use, bit 0-3.
*/
/**
* The character has restricted trade acccess, bit 4.
*/
RestrictedTradeAccess = 0x1 << 4,
/**
* The character has restricted mail access, bit 5.
*/
RestrictedMailAccess = 0x1 << 5,
/**
* The character has restricted chat access, bit 6.
*/
RestrictedChatAccess = 0x1 << 6,
//
// Combined permissions
//
/**
* The character is marked as 'old', restricted from trade and mail.
*/
Old = RestrictedTradeAccess | RestrictedMailAccess,
/**
* The character is soft banned, restricted from trade, mail, and chat.
*/
SoftBanned = RestrictedTradeAccess | RestrictedMailAccess | RestrictedChatAccess,
};

View File

@@ -1,20 +0,0 @@
#pragma once
#include <cstdint>
enum class RacingTaskParam : int32_t {
RACING_TASK_PARAM_FINISH_WITH_PLACEMENT = 1, //<! A task param for finishing with a specific placement.
RACING_TASK_PARAM_LAP_TIME = 2, //<! A task param for finishing with a specific lap time.
RACING_TASK_PARAM_TOTAL_TRACK_TIME = 3, //<! A task param for finishing with a specific track time.
RACING_TASK_PARAM_COMPLETE_ANY_RACING_TASK = 4, //<! A task param for completing a racing task.
RACING_TASK_PARAM_COMPLETE_TRACK_TASKS = 5, //<! A task param for completing a task for a specific track.
RACING_TASK_PARAM_MODULAR_BUILDING = 6, //<! A task param for modular building with racing builds.
RACING_TASK_PARAM_SAFE_DRIVER = 10, //<! A task param for completing a race without smashing.
RACING_TASK_PARAM_SMASHABLES = 11, //<! A task param for smashing entities during a race.
RACING_TASK_PARAM_COLLECT_IMAGINATION = 12, //<! A task param for collecting imagination during a race.
RACING_TASK_PARAM_COMPETED_IN_RACE = 13, //<! A task param for competing in a race.
RACING_TASK_PARAM_WIN_RACE_IN_WORLD = 14, //<! A task param for winning a race in a specific world.
RACING_TASK_PARAM_FIRST_PLACE_MULTIPLE_TRACKS = 15, //<! A task param for finishing in first place on multiple tracks.
RACING_TASK_PARAM_LAST_PLACE_FINISH = 16, //<! A task param for finishing in last place.
RACING_TASK_PARAM_SMASH_SPECIFIC_SMASHABLE = 17 //<! A task param for smashing dragon eggs during a race.
};

View File

@@ -7,11 +7,11 @@
#include <string>
#include <set>
#include "BitStream.h"
#include "eConnectionType.h"
#include "eClientMessageType.h"
#pragma warning (disable:4251) //Disables SQL warnings
typedef int RESTICKET;
// These are the same define, but they mean two different things in different contexts
// so a different define to distinguish what calculation is happening will help clarity.
#define FRAMES_TO_MS(x) 1000 / x
@@ -28,9 +28,11 @@ constexpr uint32_t lowFrameDelta = FRAMES_TO_MS(lowFramerate);
//========== MACROS ===========
#define HEADER_SIZE 8
#define CBITSTREAM RakNet::BitStream bitStream;
#define CINSTREAM RakNet::BitStream inStream(packet->data, packet->length, false);
#define CMSGHEADER PacketUtils::WriteHeader(bitStream, CLIENT, MSG_CLIENT_GAME_MSG);
#define CINSTREAM_SKIP_HEADER CINSTREAM if (inStream.GetNumberOfUnreadBits() >= BYTES_TO_BITS(HEADER_SIZE)) inStream.IgnoreBytes(HEADER_SIZE); else inStream.IgnoreBits(inStream.GetNumberOfUnreadBits());
#define CMSGHEADER PacketUtils::WriteHeader(bitStream, eConnectionType::CLIENT, eClientMessageType::GAME_MSG);
#define SEND_PACKET Game::server->Send(&bitStream, sysAddr, false);
#define SEND_PACKET_BROADCAST Game::server->Send(&bitStream, UNASSIGNED_SYSTEM_ADDRESS, true);
@@ -43,33 +45,20 @@ typedef uint32_t LWOCLONEID; //!< Used for Clone IDs
typedef uint16_t LWOMAPID; //!< Used for Map IDs
typedef uint16_t LWOINSTANCEID; //!< Used for Instance IDs
typedef uint32_t PROPERTYCLONELIST; //!< Used for Property Clone IDs
typedef uint32_t STRIPID;
typedef uint32_t BEHAVIORSTATE;
typedef int32_t PetTamingPiece; //!< Pet Taming Pieces
typedef uint32_t StripId;
const LWOOBJID LWOOBJID_EMPTY = 0; //!< An empty object ID
const LOT LOT_NULL = -1; //!< A null LOT
const int32_t LOOTTYPE_NONE = 0; //!< No loot type available
const float SECONDARY_PRIORITY = 1.0f; //!< Secondary Priority
const uint32_t INVENTORY_INVALID = -1; //!< Invalid Inventory
const uint32_t INVENTORY_DEFAULT = -1; //!< Default Inventory
const uint32_t StatusChangeInfo = 0; //!< Status Change Info (???)
const uint32_t INVENTORY_MAX = 9999999; //!< The Maximum Inventory Size
const uint32_t LWOCLONEID_INVALID = -1; //!< Invalid LWOCLONEID
const uint16_t LWOINSTANCEID_INVALID = -1; //!< Invalid LWOINSTANCEID
const uint16_t LWOMAPID_INVALID = -1; //!< Invalid LWOMAPID
const uint64_t LWOZONEID_INVALID = 0; //!< Invalid LWOZONEID
typedef std::set<LWOOBJID> TSetObjID;
const float PI = 3.14159f;
#if defined(__unix) || defined(__APPLE__)
//For Linux:
typedef __int64_t __int64;
#endif
//============ STRUCTS ==============
struct LWOSCENEID {
@@ -170,480 +159,4 @@ public:
}
};
struct Brick {
uint32_t designerID;
uint32_t materialID;
};
//This union is used by the behavior system
union suchar {
unsigned char usigned;
char svalue;
};
//=========== DLU ENUMS ============
enum eGameMasterLevel : int32_t {
GAME_MASTER_LEVEL_CIVILIAN = 0, // Normal player.
GAME_MASTER_LEVEL_FORUM_MODERATOR = 1, // No permissions on live servers.
GAME_MASTER_LEVEL_JUNIOR_MODERATOR = 2, // Can kick/mute and pull chat logs.
GAME_MASTER_LEVEL_MODERATOR = 3, // Can return lost items.
GAME_MASTER_LEVEL_SENIOR_MODERATOR = 4, // Can ban.
GAME_MASTER_LEVEL_LEAD_MODERATOR = 5, // Can approve properties.
GAME_MASTER_LEVEL_JUNIOR_DEVELOPER = 6, // Junior developer & future content team. Civilan on live.
GAME_MASTER_LEVEL_INACTIVE_DEVELOPER = 7, // Inactive developer, limited permissions.
GAME_MASTER_LEVEL_DEVELOPER = 8, // Active developer, full permissions on live.
GAME_MASTER_LEVEL_OPERATOR = 9 // Can shutdown server for restarts & updates.
};
//=========== LU ENUMS ============
//! An enum for object ID bits
enum eObjectBits : int32_t {
OBJECT_BIT_PERSISTENT = 32, //!< The 32 bit index
OBJECT_BIT_CLIENT = 46, //!< The 46 bit index
OBJECT_BIT_SPAWNED = 58, //!< The 58 bit index
OBJECT_BIT_CHARACTER = 60 //!< The 60 bit index
};
//! An enum for MatchUpdate types
enum eMatchUpdate : int {
MATCH_UPDATE_PLAYER_JOINED = 0,
MATCH_UPDATE_PLAYER_LEFT = 1,
MATCH_UPDATE_TIME = 3,
MATCH_UPDATE_TIME_START_DELAY = 4,
MATCH_UPDATE_PLAYER_READY = 5,
MATCH_UPDATE_PLAYER_UNREADY = 6
};
//! An enum for camera cycling modes
enum eCyclingMode : uint32_t {
ALLOW_CYCLE_TEAMMATES,
DISALLOW_CYCLING
};
enum eCinematicEvent : uint32_t {
STARTED,
WAYPOINT,
ENDED,
};
//! An enum for character creation responses
enum eCreationResponse : uint8_t {
CREATION_RESPONSE_SUCCESS = 0, //!< The creation was successful
CREATION_RESPONSE_OBJECT_ID_UNAVAILABLE, //!< The Object ID can't be used
CREATION_RESPONSE_NAME_NOT_ALLOWED, //!< The name is not allowed
CREATION_RESPONSE_PREDEFINED_NAME_IN_USE, //!< The predefined name is already in use
CREATION_RESPONSE_CUSTOM_NAME_IN_USE //!< The custom name is already in use
};
//! An enum for login responses
enum eLoginResponse : uint8_t {
LOGIN_RESPONSE_GENERAL_FAILED = 0,
LOGIN_RESPONSE_SUCCESS = 1,
LOGIN_RESPONSE_BANNED = 2,
LOGIN_RESPONSE_PERMISSIONS_NOT_HIGH_ENOUGH = 5,
LOGIN_RESPONSE_WRONG_PASS_OR_USER = 6,
LOGIN_RESPONSE_ACCOUNT_LOCKED = 7
};
//! An enum for character rename responses
enum eRenameResponse : uint8_t {
RENAME_RESPONSE_SUCCESS = 0, //!< The renaming was successful
RENAME_RESPONSE_UNKNOWN_ERROR, //!< There was an unknown error
RENAME_RESPONSE_NAME_UNAVAILABLE, //!< The name is unavailable
RENAME_RESPONSE_NAME_IN_USE //!< The name is already in use
};
//! A replica packet type
enum eReplicaPacketType {
PACKET_TYPE_CONSTRUCTION, //!< A construction packet
PACKET_TYPE_SERIALIZATION, //!< A serialization packet
PACKET_TYPE_DESTRUCTION //!< A destruction packet
};
enum ServerDisconnectIdentifiers {
SERVER_DISCON_UNKNOWN_SERVER_ERROR = 0, //!< Unknown server error
SERVER_DISCON_DUPLICATE_LOGIN = 4, //!< Used when another user with the same username is logged in (duplicate login)
SERVER_DISCON_SERVER_SHUTDOWN = 5, //!< Used when the server is shutdown
SERVER_DISCON_SERVER_MAP_LOAD_FAILURE = 6, //!< Used when the server cannot load a map
SERVER_DISCON_INVALID_SESSION_KEY = 7, //!< Used if the session is invalid
SERVER_DISCON_ACCOUNT_NOT_IN_PENDING_LIST = 8, //!< ???
SERVER_DISCON_CHARACTER_NOT_FOUND = 9, //!< Used if a character that the server has is not found (i.e, corruption with user-player data)
SERVER_DISCON_CHARACTER_CORRUPTED = 10, //!< Similar to abovce
SERVER_DISCON_KICK = 11, //!< Used if the user is kicked from the server
SERVER_DISCON_FREE_TRIAL_EXPIRED = 12, //!< Used if the user's free trial expired
SERVER_DISCON_PLAY_SCHEDULE_TIME_DONE = 13 //!< Used if the user's play time is used up
};
//! The Behavior Types for use with the AI system
enum eCombatBehaviorTypes : uint32_t {
PASSIVE = 0, //!< The object is passive
AGGRESSIVE = 1, //!< The object is aggressive
PASSIVE_TURRET = 2, //!< The object is a passive turret
AGGRESSIVE_TURRET = 3 //!< The object is an aggressive turret
};
//! The Combat Role Type for use with the AI system
enum eCombatRoleType : uint32_t {
MELEE = 0, //!< Used for melee attacks
RANGED = 1, //!< Used for range attacks
SUPPORT = 2 //!< Used for support
};
//! The kill types for the Die packet
enum eKillType : uint32_t {
VIOLENT,
SILENT
};
//! The various world states used throughout the server
enum eObjectWorldState {
WORLDSTATE_INWORLD, //!< Probably used when the object is in the world
WORLDSTATE_ATTACHED, //!< Probably used when the object is attached to another object
WORLDSTATE_INVENTORY //!< Probably used when the object is in an inventory
};
//! The trigger stats (???)
enum eTriggerStat {
INVALID_STAT, //!< ???
HEALTH, //!< Probably used for health
ARMOR, //!< Probably used for armor
IMAGINATION //!< Probably used for imagination
};
//! The trigger operations (???)
enum eTriggerOperator {
INVALID_OPER, //!< ???
EQUAL, //!< ???
NOT_EQUAL, //!< ???
GREATER, //!< ???
GREATER_EQUAL, //!< ???
LESS, //!< ???
LESS_EQUAL //!< ???
};
//! The various build types
enum eBuildType {
BUILD_NOWHERE, //!< Used if something can't be built anywhere
BUILD_IN_WORLD, //!< Used if something can be built in the world
BUILD_ON_PROPERTY //!< Used if something can be build on a property
};
//! Quickbuild fail reasons
enum eFailReason : uint32_t {
REASON_NOT_GIVEN,
REASON_OUT_OF_IMAGINATION,
REASON_CANCELED_EARLY,
REASON_BUILD_ENDED
};
//! Terminate interaction type
enum eTerminateType : uint32_t {
RANGE,
USER,
FROM_INTERACTION
};
//! The combat state
enum eCombatState {
IDLE, //!< The AI is in an idle state
AGGRO, //!< The AI is in an aggressive state
TETHER, //!< The AI is being redrawn back to tether point
SPAWN, //!< The AI is spawning
DEAD //!< The AI is dead
};
enum eControlSceme {
SCHEME_A,
SCHEME_D,
SCHEME_GAMEPAD,
SCHEME_E,
SCHEME_FPS,
SCHEME_DRIVING,
SCHEME_TAMING,
SCHEME_MODULAR_BUILD,
SCHEME_WEAR_A_ROBOT //== freecam?
};
enum class eStateChangeType : uint32_t {
PUSH,
POP
};
enum eNotifyType {
NOTIFY_TYPE_SUCCESS,
NOTIFY_TYPE_QUIT,
NOTIFY_TYPE_FAILED,
NOTIFY_TYPE_BEGIN,
NOTIFY_TYPE_READY,
NOTIFY_TYPE_NAMINGPET
};
enum eReplicaComponentType : int32_t {
COMPONENT_TYPE_CONTROLLABLE_PHYSICS = 1, //!< The ControllablePhysics Component
COMPONENT_TYPE_RENDER = 2, //!< The Render Component
COMPONENT_TYPE_SIMPLE_PHYSICS = 3, //!< The SimplePhysics Component
COMPONENT_TYPE_CHARACTER = 4, //!< The Character Component
COMPONENT_TYPE_SCRIPT = 5, //!< The Script Component
COMPONENT_TYPE_BOUNCER = 6, //!< The Bouncer Component
COMPONENT_TYPE_BUFF = 7, //!< The Buff Component
COMPONENT_TYPE_SKILL = 9, //!< The Skill Component
COMPONENT_TYPE_ITEM = 11, //!< The Item Component
COMPONENT_TYPE_VENDOR = 16, //!< The Vendor Component
COMPONENT_TYPE_INVENTORY = 17, //!< The Inventory Component
COMPONENT_TYPE_SHOOTING_GALLERY = 19, //!< The Shooting Gallery Component
COMPONENT_TYPE_RIGID_BODY_PHANTOM_PHYSICS = 20, //!< The RigidBodyPhantomPhysics Component
COMPONENT_TYPE_COLLECTIBLE = 23, //!< The Collectible Component
COMPONENT_TYPE_MOVING_PLATFORM = 25, //!< The MovingPlatform Component
COMPONENT_TYPE_PET = 26, //!< The Pet Component
COMPONENT_TYPE_VEHICLE_PHYSICS = 30, //!< The VehiclePhysics Component
COMPONENT_TYPE_MOVEMENT_AI = 31, //!< The MovementAI Component
COMPONENT_TYPE_PROPERTY = 36, //!< The Property Component
COMPONENT_TYPE_SCRIPTED_ACTIVITY = 39, //!< The ScriptedActivity Component
COMPONENT_TYPE_PHANTOM_PHYSICS = 40, //!< The PhantomPhysics Component
COMPONENT_TYPE_MODEL = 42, //!< The Model Component
COMPONENT_TYPE_PROPERTY_ENTRANCE = 43, //!< The PhantomPhysics Component
COMPONENT_TYPE_PROPERTY_MANAGEMENT = 45, //!< The PropertyManagement Component
COMPONENT_TYPE_REBUILD = 48, //!< The Rebuild Component
COMPONENT_TYPE_SWITCH = 49, //!< The Switch Component
COMPONENT_TYPE_ZONE_CONTROL = 50, //!< The ZoneControl Component
COMPONENT_TYPE_PACKAGE = 53, //!< The Package Component
COMPONENT_TYPE_PLAYER_FLAG = 58, //!< The PlayerFlag Component
COMPONENT_TYPE_BASE_COMBAT_AI = 60, //!< The BaseCombatAI Component
COMPONENT_TYPE_MODULE_ASSEMBLY = 61, //!< The ModuleAssembly Component
COMPONENT_TYPE_PROPERTY_VENDOR = 65, //!< The PropertyVendor Component
COMPONENT_TYPE_ROCKET_LAUNCH = 67, //!< The RocketLaunch Component
COMPONENT_TYPE_RACING_CONTROL = 71, //!< The RacingControl Component
COMPONENT_TYPE_MISSION_OFFER = 73, //!< The MissionOffer Component
COMPONENT_TYPE_EXHIBIT = 75, //!< The Exhibit Component
COMPONENT_TYPE_RACING_STATS = 74, //!< The Racing Stats Component
COMPONENT_TYPE_SOUND_TRIGGER = 77, //!< The Sound Trigger Component
COMPONENT_TYPE_PROXIMITY_MONITOR = 78, //!< The Proximity Monitor Component
COMPONENT_TYPE_MISSION = 84, //!< The Mission Component
COMPONENT_TYPE_ROCKET_LAUNCH_LUP = 97, //!< The LUP Launchpad Componen
COMPONENT_TYPE_RAIL_ACTIVATOR = 104, //!< The Rail Activator Component
COMPONENT_TYPE_PLAYER_FORCED_MOVEMENT = 106, //!< The Player Forced Movement Component
COMPONENT_TYPE_POSSESSABLE = 108, //!< The Possessable Component
COMPONENT_TYPE_LEVEL_PROGRESSION = 109, //!< The Level Progression Component
COMPONENT_TYPE_POSSESSOR = 110, //!< The Possessor Component
COMPONENT_TYPE_BUILD_BORDER = 114, //!< The Build Border Component
COMPONENT_TYPE_DESTROYABLE = 1000, //!< The Destroyable Component
};
enum class UseItemResponse : uint32_t {
NoImaginationForPet = 1,
FailedPrecondition,
MountsNotAllowed
};
enum eRebuildState : uint32_t {
REBUILD_OPEN,
REBUILD_COMPLETED = 2,
REBUILD_RESETTING = 4,
REBUILD_BUILDING,
REBUILD_INCOMPLETE
};
/**
* The loot source's type.
*/
enum eLootSourceType : int32_t {
LOOT_SOURCE_NONE = 0,
LOOT_SOURCE_CHEST,
LOOT_SOURCE_MISSION,
LOOT_SOURCE_MAIL,
LOOT_SOURCE_CURRENCY,
LOOT_SOURCE_ACHIEVEMENT,
LOOT_SOURCE_TRADE,
LOOT_SOURCE_QUICKBUILD,
LOOT_SOURCE_DELETION,
LOOT_SOURCE_VENDOR,
LOOT_SOURCE_ACTIVITY,
LOOT_SOURCE_PICKUP,
LOOT_SOURCE_BRICK,
LOOT_SOURCE_PROPERTY,
LOOT_SOURCE_MODERATION,
LOOT_SOURCE_EXHIBIT,
LOOT_SOURCE_INVENTORY,
LOOT_SOURCE_CLAIMCODE,
LOOT_SOURCE_CONSUMPTION,
LOOT_SOURCE_CRAFTING,
LOOT_SOURCE_LEVEL_REWARD,
LOOT_SOURCE_RELOCATE
};
enum eGameActivities : uint32_t {
ACTIVITY_NONE,
ACTIVITY_QUICKBUILDING,
ACTIVITY_SHOOTING_GALLERY,
ACTIVITY_RACING,
ACTIVITY_PINBALL,
ACTIVITY_PET_TAMING
};
enum ePlayerFlags {
BTARR_TESTING = 0,
PLAYER_HAS_ENTERED_PET_RANCH = 1,
MINIMAP_UNLOCKED = 2,
ACTIVITY_REBUILDING_FAIL_TIME = 3,
ACTIVITY_REBUILDING_FAIL_RANGE = 4,
ACTIVITY_SHOOTING_GALLERY_HELP = 5,
HELP_WALKING_CONTROLS = 6,
FIRST_SMASHABLE = 7,
FIRST_IMAGINATION_PICKUP = 8,
FIRST_DAMAGE = 9,
FIRST_ITEM = 10,
FIRST_BRICK = 11,
FIRST_CONSUMABLE = 12,
FIRST_EQUIPPABLE = 13,
CHAT_HELP = 14,
FIRST_PET_TAMING_MINIGAME = 15,
FIRST_PET_ON_SWITCH = 16,
FIRST_PET_JUMPED_ON_SWITCH = 17,
FIRST_PET_FOUND_TREASURE = 18,
FIRST_PET_DUG_TREASURE = 19,
FIRST_PET_OWNER_ON_PET_BOUNCER = 20,
FIRST_PET_DESPAWN_NO_IMAGINATION = 21,
FIRST_PET_SELECTED_ENOUGH_BRICKS = 22,
FIRST_EMOTE_UNLOCKED = 23,
GF_PIRATE_REP = 24,
AG_BOB_CINEMATIC_EVENT = 25,
HELP_JUMPING_CONTROLS = 26,
HELP_DOUBLE_JUMP_CONTROLS = 27,
HELP_CAMERA_CONTROLS = 28,
HELP_ROTATE_CONTROLS = 29,
HELP_SMASH = 30,
MONUMENT_INTRO_MUSIC_PLAYED = 31,
BEGINNING_ZONE_SUMMARY_DISPLAYED = 32,
AG_FINISH_LINE_BUILT = 33,
AG_BOSS_AREA_FOUND = 34,
AG_LANDED_IN_BATTLEFIELD = 35,
GF_PLAYER_HAS_BEEN_TO_THE_RAVINE = 36,
MODULAR_BUILD_STARTED = 37,
MODULAR_BUILD_FINISHED_CLICK_BUTTON = 38,
THINKING_HAT_RECEIVED_GO_TO_MODULAR_BUILD_AREA = 39,
BUILD_AREA_ENTERED_MOD_NOT_ACTIVATED_PUT_ON_HAT = 40,
HAT_ON_INSIDE_OF_MOD_BUILD_EQUIP_A_MODULE_FROM_LEG = 41,
MODULE_EQUIPPED_PLACE_ON_GLOWING_BLUE_SPOT = 42,
FIRST_MODULE_PLACED_CORRECTLY_NOW_DO_THE_REST = 43,
ROCKET_COMPLETE_NOW_LAUNCH_FROM_PAD = 44,
JOINED_A_FACTION = 45,
VENTURE_FACTION = 46,
ASSEMBLY_FACTION = 47,
PARADOX_FACTION = 48,
SENTINEL_FACTION = 49,
LUP_WORLD_ACCESS = 50,
AG_FIRST_FLAG_COLLECTED = 51,
TOOLTIP_TALK_TO_SKYLAND_TO_GET_HAT = 52,
MODULAR_BUILD_PLAYER_PLACES_FIRST_MODEL_IN_SCRATCH = 53,
MODULAR_BUILD_FIRST_ARROW_DISPLAY_FOR_MODULE = 54,
AG_BEACON_QB_SO_THE_PLAYER_CAN_ALWAYS_BUILD_THEM = 55,
GF_PET_DIG_FLAG_1 = 56,
GF_PET_DIG_FLAG_2 = 57,
GF_PET_DIG_FLAG_3 = 58,
SUPPRESS_SPACESHIP_CINEMATIC_FLYTHROUGH = 59,
GF_PLAYER_FALL_DEATH = 60,
GF_PLAYER_CAN_GET_FLAG_1 = 61,
GF_PLAYER_CAN_GET_FLAG_2 = 62,
GF_PLAYER_CAN_GET_FLAG_3 = 63,
ENTER_BBB_FROM_PROPERTY_EDIT_CONFIRMATION_DIALOG = 64,
AG_FIRST_COMBAT_COMPLETE = 65,
AG_COMPLETE_BOB_MISSION = 66,
IS_NEWS_SCREEN_VISIBLE = 114,
NJ_GARMADON_CINEMATIC_SEEN = 125,
ELEPHANT_PET_3050 = 801,
CAT_PET_3054 = 802,
TRICERATOPS_PET_3195 = 803,
TERRIER_PET_3254 = 804,
SKUNK_PET_3261 = 805,
LION_PET_3520 = 806,
BUNNY_PET_3672 = 807,
CROCODILE_PET_3994 = 808,
DOBERMAN_PET_5635 = 809,
BUFFALO_PET_5636 = 810,
ROBOT_DOG_PET_5637 = 811,
EUROPEAN_DRAGON_PET_5639 = 812,
TORTOISE_PET_5640 = 813,
ASIAN_DRAGON_PET_5641 = 814,
MANTIS_PET_5642 = 815,
PANDA_PET_5643 = 816,
WARTHOG_PET_6720 = 817,
GOAT_PET_7638 = 818,
CRAB_PET_7694 = 819,
AG_SPACE_SHIP_BINOC_AT_LAUNCH = 1001,
AG_SPACE_SHIP_BINOC_AT_LAUNCH_PLATFORM = 1002,
AG_SPACE_SHIP_BINOC_ON_PLATFORM_TO_LEFT_OF_START = 1003,
AG_SPACE_SHIP_BINOC_ON_PLATFORM_TO_RIGHT_OF_START = 1004,
AG_SPACE_SHIP_BINOC_AT_BOB = 1005,
AG_BATTLE_BINOC_FOR_TRICERETOPS = 1101,
AG_BATTLE_BINOC_AT_PARADOX = 1102,
AG_BATTLE_BINOC_AT_MISSION_GIVER = 1103,
AG_BATTLE_BINOC_AT_BECK = 1104,
AG_MONUMENT_BINOC_INTRO = 1105,
AG_MONUMENT_BINOC_OUTRO = 1106,
AG_LAUNCH_BINOC_INTRO = 1107,
AG_LAUNCH_BINOC_BISON = 1108,
AG_LAUNCH_BINOC_SHARK = 1109,
NS_BINOC_CONCERT_TRANSITION = 1201,
NS_BINOC_RACE_PLACE_TRANSITION = 1202,
NS_BINOC_BRICK_ANNEX_TRANSITION = 1203,
NS_BINOC_GF_LAUNCH = 1204,
NS_BINOC_FV_LAUNCH = 1205,
NS_BINOC_BRICK_ANNEX_WATER = 1206,
NS_BINOC_AG_LAUNCH_AT_RACE_PLACE = 1207,
NS_BINOC_AG_LAUNCH_AT_BRICK_ANNEX = 1208,
NS_BINOC_AG_LAUNCH_AT_PLAZA = 1209,
NS_BINOC_TBA = 1210,
NS_FLAG_COLLECTABLE_1_BY_JONNY_THUNDER = 1211,
NS_FLAG_COLLECTABLE_2_UNDER_CONCERT_BRIDGE = 1212,
NS_FLAG_COLLECTABLE_3_BY_FV_LAUNCH = 1213,
NS_FLAG_COLLECTABLE_4_IN_PLAZA_BEHIND_BUILDING = 1214,
NS_FLAG_COLLECTABLE_5_BY_GF_LAUNCH = 1215,
NS_FLAG_COLLECTABLE_6_BY_DUCK_SG = 1216,
NS_FLAG_COLLECTABLE_7_BY_LUP_LAUNCH = 1217,
NS_FLAG_COLLECTABLE_8_BY_NT_LUANCH = 1218,
NS_FLAG_COLLECTABLE_9_BY_RACE_BUILD = 1219,
NS_FLAG_COLLECTABLE_10_ON_AG_LAUNCH_PATH = 1220,
PR_BINOC_AT_LAUNCH_PAD = 1251,
PR_BINOC_AT_BEGINNING_OF_ISLAND_B = 1252,
PR_BINOC_AT_FIRST_PET_BOUNCER = 1253,
PR_BINOC_ON_BY_CROWS_NEST = 1254,
PR_PET_DIG_AT_BEGINNING_OF_ISLAND_B = 1261,
PR_PET_DIG_AT_THE_LOCATION_OF_OLD_BOUNCE_BACK = 1262,
PR_PET_DIG_UNDER_QB_BRIDGE = 1263,
PR_PET_DIG_BACK_SIDE_BY_PARTNER_BOUNCE = 1264,
PR_PET_DIG_BY_LAUNCH_PAD = 1265,
PR_PET_DIG_BY_FIRST_PET_BOUNCER = 1266,
GF_BINOC_ON_LANDING_PAD = 1301,
GF_BINOC_AT_RAVINE_START = 1302,
GF_BINOC_ON_TOP_OF_RAVINE_HEAD = 1303,
GF_BINOC_AT_TURTLE_AREA = 1304,
GF_BINOC_IN_TUNNEL_TO_ELEPHANTS = 1305,
GF_BINOC_IN_ELEPHANTS_AREA = 1306,
GF_BINOC_IN_RACING_AREA = 1307,
GF_BINOC_IN_CROC_AREA = 1308,
GF_BINOC_IN_JAIL_AREA = 1309,
GF_BINOC_TELESCOPE_NEXT_TO_CAPTAIN_JACK = 1310,
NT_PLINTH_REBUILD = 1919,
NT_FACTION_SPY_DUKE = 1974,
NT_FACTION_SPY_OVERBUILD = 1976,
NT_FACTION_SPY_HAEL = 1977,
NJ_EARTH_SPINJITZU = 2030,
NJ_LIGHTNING_SPINJITZU = 2031,
NJ_ICE_SPINJITZU = 2032,
NJ_FIRE_SPINJITZU = 2033,
NJ_WU_SHOW_DAILY_CHEST = 2099
};
//======== FUNC ===========
template<typename T>
inline T const& clamp(const T& val, const T& low, const T& high) {
if (val < low) return low;
else if (val > high) return high;
return val;
}
#endif //!__DCOMMONVARS__H__

View File

@@ -1,559 +0,0 @@
#pragma once
#include "MessageIdentifiers.h"
enum CONNECTION_TYPE {
SERVER = 0, //!< Means it is used throughout all servers
AUTH, //!< Means it is sent from the client authentication
CHAT, //!< Means it is sent from and to the chat server
CHAT_INTERNAL, //!< Unused - We can potentially use this in the future for various things
WORLD, //!< Means it is sent from the client world
CLIENT, //!< Means it is sent to the client from the world server
MASTER //!< Means it is sent to and from the master server
};
//! The Internal Server Packet Identifiers
enum SERVER {
MSG_SERVER_VERSION_CONFIRM = 0, /*!< Sent during a handshake to confirm the server/client version */
MSG_SERVER_DISCONNECT_NOTIFY, /*!< Sent when a user disconnected */
MSG_SERVER_GENERAL_NOTIFY /*!< A general notification */
};
//! The Internal Authentication Packet Identifiers
enum AUTH {
MSG_AUTH_LOGIN_REQUEST = 0, /*!< Sent from the client when a user logs in */
MSG_AUTH_LOGOUT_REQUEST, /*!< Sent from the client when a user logs out */
MSG_AUTH_CREATE_NEW_ACCOUNT_REQUEST, /*!< Sent from the client when a user creates a new account */
MSG_AUTH_LEGOINTERFACE_AUTH_RESPONSE, /*!< Unknown */
MSG_AUTH_SESSIONKEY_RECEIVED_CONFIRM, /*!< Sent when the server recieved the session key (?) */
MSG_AUTH_RUNTIME_CONFIG /*!< Unknown */
};
//! The Internal Chat Packet Identifiers
enum CHAT {
MSG_CHAT_LOGIN_SESSION_NOTIFY = 0, /*!< When a user logs in */
MSG_CHAT_GENERAL_CHAT_MESSAGE, /*!< Used for global chat messages */
MSG_CHAT_PRIVATE_CHAT_MESSAGE, /*!< Used for private chat messages */
MSG_CHAT_USER_CHANNEL_CHAT_MESSAGE, /*!< Unknown */
MSG_CHAT_WORLD_DISCONNECT_REQUEST, /*!< Unknown */
MSG_CHAT_WORLD_PROXIMITY_RESPONSE, /*!< Unknown */
MSG_CHAT_WORLD_PARCEL_RESPONSE, /*!< Unknown */
MSG_CHAT_ADD_FRIEND_REQUEST, /*!< When the client requests to add a friend */
MSG_CHAT_ADD_FRIEND_RESPONSE, /*!< Sent from the server when the client adds a friend */
MSG_CHAT_REMOVE_FRIEND, /*!< When the client removes a friend */
MSG_CHAT_GET_FRIENDS_LIST, /*!< Sent when the client requests a user's friends list */
MSG_CHAT_ADD_IGNORE, /*!< Sent when the client adds a friend to the "ignore" list */
MSG_CHAT_REMOVE_IGNORE, /*!< Sent when the client removes a friend from the "ignore" list */
MSG_CHAT_GET_IGNORE_LIST, /*!< Sent when the client requests a user's ignored list */
MSG_CHAT_TEAM_MISSED_INVITE_CHECK, /*!< Unknown (Something with an unresponded-to friend request probably) */
MSG_CHAT_TEAM_INVITE, /*!< When the client invites a user to a team */
MSG_CHAT_TEAM_INVITE_RESPONSE, /*!< Sent from the server when the client invites someone to the team */
MSG_CHAT_TEAM_KICK, /*!< Sent when the client kicks a member from a team */
MSG_CHAT_TEAM_LEAVE, /*!< Sent when the client leaves a team */
MSG_CHAT_TEAM_SET_LOOT, /*!< Unknown (Something to do with team loot) */
MSG_CHAT_TEAM_SET_LEADER, /*!< Unknown (Probably sets the team leader or something) */
MSG_CHAT_TEAM_GET_STATUS, /*!< Check to see if we are in a team or not, sent on world join */
MSG_CHAT_GUILD_CREATE, /*!< Guild Creation */
MSG_CHAT_GUILD_INVITE, /*!< Guild Invitation */
MSG_CHAT_GUILD_INVITE_RESPONSE, /*!< Guild Invite Response */
MSG_CHAT_GUILD_LEAVE, /*!< Guild Leave */
MSG_CHAT_GUILD_KICK, /*!< Guild Kick */
MSG_CHAT_GUILD_GET_STATUS, /*!< Guild Get Status */
MSG_CHAT_GUILD_GET_ALL, /*!< Guild Get All */
MSG_CHAT_SHOW_ALL,
MSG_CHAT_BLUEPRINT_MODERATED,
MSG_CHAT_BLUEPRINT_MODEL_READY,
MSG_CHAT_PROPERTY_READY_FOR_APPROVAL,
MSG_CHAT_PROPERTY_MODERATION_CHANGED,
MSG_CHAT_PROPERTY_BUILDMODE_CHANGED,
MSG_CHAT_PROPERTY_BUILDMODE_CHANGED_REPORT,
MSG_CHAT_MAIL,
MSG_CHAT_WORLD_INSTANCE_LOCATION_REQUEST,
MSG_CHAT_REPUTATION_UPDATE,
MSG_CHAT_SEND_CANNED_TEXT,
MSG_CHAT_GMLEVEL_UPDATE,
MSG_CHAT_CHARACTER_NAME_CHANGE_REQUEST,
MSG_CHAT_CSR_REQUEST,
MSG_CHAT_CSR_REPLY,
MSG_CHAT_GM_KICK,
MSG_CHAT_GM_ANNOUNCE,
MSG_CHAT_GM_MUTE,
MSG_CHAT_ACTIVITY_UPDATE,
MSG_CHAT_WORLD_ROUTE_PACKET,
MSG_CHAT_GET_ZONE_POPULATIONS,
MSG_CHAT_REQUEST_MINIMUM_CHAT_MODE,
MSG_CHAT_REQUEST_MINIMUM_CHAT_MODE_PRIVATE,
MSG_CHAT_MATCH_REQUEST,
MSG_CHAT_UGCMANIFEST_REPORT_MISSING_FILE,
MSG_CHAT_UGCMANIFEST_REPORT_DONE_FILE,
MSG_CHAT_UGCMANIFEST_REPORT_DONE_BLUEPRINT,
MSG_CHAT_UGCC_REQUEST,
MSG_CHAT_WHO,
MSG_CHAT_WORLD_PLAYERS_PET_MODERATED_ACKNOWLEDGE,
MSG_CHAT_ACHIEVEMENT_NOTIFY,
MSG_CHAT_GM_CLOSE_PRIVATE_CHAT_WINDOW,
MSG_CHAT_UNEXPECTED_DISCONNECT,
MSG_CHAT_PLAYER_READY,
MSG_CHAT_GET_DONATION_TOTAL,
MSG_CHAT_UPDATE_DONATION,
MSG_CHAT_PRG_CSR_COMMAND,
MSG_CHAT_HEARTBEAT_REQUEST_FROM_WORLD,
MSG_CHAT_UPDATE_FREE_TRIAL_STATUS
};
//! Used for packets related to chatting
enum CHAT_INTERNAL {
MSG_CHAT_INTERNAL_PLAYER_ADDED_NOTIFICATION = 0,
MSG_CHAT_INTERNAL_PLAYER_REMOVED_NOTIFICATION,
MSG_CHAT_INTERNAL_ADD_FRIEND,
MSG_CHAT_INTERNAL_ADD_BEST_FRIEND,
MSG_CHAT_INTERNAL_ADD_TO_TEAM,
MSG_CHAT_INTERNAL_ADD_BLOCK,
MSG_CHAT_INTERNAL_REMOVE_FRIEND,
MSG_CHAT_INTERNAL_REMOVE_BLOCK,
MSG_CHAT_INTERNAL_REMOVE_FROM_TEAM,
MSG_CHAT_INTERNAL_DELETE_TEAM,
MSG_CHAT_INTERNAL_REPORT,
MSG_CHAT_INTERNAL_PRIVATE_CHAT,
MSG_CHAT_INTERNAL_PRIVATE_CHAT_RESPONSE,
MSG_CHAT_INTERNAL_ANNOUNCEMENT,
MSG_CHAT_INTERNAL_MAIL_COUNT_UPDATE,
MSG_CHAT_INTERNAL_MAIL_SEND_NOTIFY,
MSG_CHAT_INTERNAL_REQUEST_USER_LIST,
MSG_CHAT_INTERNAL_FRIEND_LIST,
MSG_CHAT_INTERNAL_ROUTE_TO_PLAYER,
MSG_CHAT_INTERNAL_TEAM_UPDATE,
MSG_CHAT_INTERNAL_MUTE_UPDATE,
MSG_CHAT_INTERNAL_CREATE_TEAM,
};
//! Used for packets send to the world
enum WORLD {
MSG_WORLD_CLIENT_VALIDATION = 1, // Session info
MSG_WORLD_CLIENT_CHARACTER_LIST_REQUEST,
MSG_WORLD_CLIENT_CHARACTER_CREATE_REQUEST,
MSG_WORLD_CLIENT_LOGIN_REQUEST, // Character selected
MSG_WORLD_CLIENT_GAME_MSG,
MSG_WORLD_CLIENT_CHARACTER_DELETE_REQUEST,
MSG_WORLD_CLIENT_CHARACTER_RENAME_REQUEST,
MSG_WORLD_CLIENT_HAPPY_FLOWER_MODE_NOTIFY,
MSG_WORLD_CLIENT_SLASH_RELOAD_MAP, // Reload map cmp
MSG_WORLD_CLIENT_SLASH_PUSH_MAP_REQUEST, // Push map req cmd
MSG_WORLD_CLIENT_SLASH_PUSH_MAP, // Push map cmd
MSG_WORLD_CLIENT_SLASH_PULL_MAP, // Pull map cmd
MSG_WORLD_CLIENT_LOCK_MAP_REQUEST,
MSG_WORLD_CLIENT_GENERAL_CHAT_MESSAGE, // General chat message
MSG_WORLD_CLIENT_HTTP_MONITOR_INFO_REQUEST,
MSG_WORLD_CLIENT_SLASH_DEBUG_SCRIPTS, // Debug scripts cmd
MSG_WORLD_CLIENT_MODELS_CLEAR,
MSG_WORLD_CLIENT_EXHIBIT_INSERT_MODEL,
MSG_WORLD_CLIENT_LEVEL_LOAD_COMPLETE, // Character data request
MSG_WORLD_CLIENT_TMP_GUILD_CREATE,
MSG_WORLD_CLIENT_ROUTE_PACKET, // Social?
MSG_WORLD_CLIENT_POSITION_UPDATE,
MSG_WORLD_CLIENT_MAIL,
MSG_WORLD_CLIENT_WORD_CHECK, // Whitelist word check
MSG_WORLD_CLIENT_STRING_CHECK, // Whitelist string check
MSG_WORLD_CLIENT_GET_PLAYERS_IN_ZONE,
MSG_WORLD_CLIENT_REQUEST_UGC_MANIFEST_INFO,
MSG_WORLD_CLIENT_BLUEPRINT_GET_ALL_DATA_REQUEST,
MSG_WORLD_CLIENT_CANCEL_MAP_QUEUE,
MSG_WORLD_CLIENT_HANDLE_FUNNESS,
MSG_WORLD_CLIENT_FAKE_PRG_CSR_MESSAGE,
MSG_WORLD_CLIENT_REQUEST_FREE_TRIAL_REFRESH,
MSG_WORLD_CLIENT_GM_SET_FREE_TRIAL_STATUS
};
//! An enum for packets sent to the client
enum CLIENT {
MSG_CLIENT_LOGIN_RESPONSE = 0,
MSG_CLIENT_LOGOUT_RESPONSE,
MSG_CLIENT_LOAD_STATIC_ZONE,
MSG_CLIENT_CREATE_OBJECT,
MSG_CLIENT_CREATE_CHARACTER,
MSG_CLIENT_CREATE_CHARACTER_EXTENDED,
MSG_CLIENT_CHARACTER_LIST_RESPONSE,
MSG_CLIENT_CHARACTER_CREATE_RESPONSE,
MSG_CLIENT_CHARACTER_RENAME_RESPONSE,
MSG_CLIENT_CHAT_CONNECT_RESPONSE,
MSG_CLIENT_AUTH_ACCOUNT_CREATE_RESPONSE,
MSG_CLIENT_DELETE_CHARACTER_RESPONSE,
MSG_CLIENT_GAME_MSG,
MSG_CLIENT_CONNECT_CHAT,
MSG_CLIENT_TRANSFER_TO_WORLD,
MSG_CLIENT_IMPENDING_RELOAD_NOTIFY,
MSG_CLIENT_MAKE_GM_RESPONSE,
MSG_CLIENT_HTTP_MONITOR_INFO_RESPONSE,
MSG_CLIENT_SLASH_PUSH_MAP_RESPONSE,
MSG_CLIENT_SLASH_PULL_MAP_RESPONSE,
MSG_CLIENT_SLASH_LOCK_MAP_RESPONSE,
MSG_CLIENT_BLUEPRINT_SAVE_RESPONSE,
MSG_CLIENT_BLUEPRINT_LUP_SAVE_RESPONSE,
MSG_CLIENT_BLUEPRINT_LOAD_RESPONSE_ITEMID,
MSG_CLIENT_BLUEPRINT_GET_ALL_DATA_RESPONSE,
MSG_CLIENT_MODEL_INSTANTIATE_RESPONSE,
MSG_CLIENT_DEBUG_OUTPUT,
MSG_CLIENT_ADD_FRIEND_REQUEST,
MSG_CLIENT_ADD_FRIEND_RESPONSE,
MSG_CLIENT_REMOVE_FRIEND_RESPONSE,
MSG_CLIENT_GET_FRIENDS_LIST_RESPONSE,
MSG_CLIENT_UPDATE_FRIEND_NOTIFY,
MSG_CLIENT_ADD_IGNORE_RESPONSE,
MSG_CLIENT_REMOVE_IGNORE_RESPONSE,
MSG_CLIENT_GET_IGNORE_LIST_RESPONSE,
MSG_CLIENT_TEAM_INVITE,
MSG_CLIENT_TEAM_INVITE_INITIAL_RESPONSE,
MSG_CLIENT_GUILD_CREATE_RESPONSE,
MSG_CLIENT_GUILD_GET_STATUS_RESPONSE,
MSG_CLIENT_GUILD_INVITE,
MSG_CLIENT_GUILD_INVITE_INITIAL_RESPONSE,
MSG_CLIENT_GUILD_INVITE_FINAL_RESPONSE,
MSG_CLIENT_GUILD_INVITE_CONFIRM,
MSG_CLIENT_GUILD_ADD_PLAYER,
MSG_CLIENT_GUILD_REMOVE_PLAYER,
MSG_CLIENT_GUILD_LOGIN_LOGOUT,
MSG_CLIENT_GUILD_RANK_CHANGE,
MSG_CLIENT_GUILD_DATA,
MSG_CLIENT_GUILD_STATUS,
MSG_CLIENT_MAIL,
MSG_CLIENT_DB_PROXY_RESULT,
MSG_CLIENT_SHOW_ALL_RESPONSE,
MSG_CLIENT_WHO_RESPONSE,
MSG_CLIENT_SEND_CANNED_TEXT,
MSG_CLIENT_UPDATE_CHARACTER_NAME,
MSG_CLIENT_SET_NETWORK_SIMULATOR,
MSG_CLIENT_INVALID_CHAT_MESSAGE,
MSG_CLIENT_MINIMUM_CHAT_MODE_RESPONSE,
MSG_CLIENT_MINIMUM_CHAT_MODE_RESPONSE_PRIVATE,
MSG_CLIENT_CHAT_MODERATION_STRING,
MSG_CLIENT_UGC_MANIFEST_RESPONSE,
MSG_CLIENT_IN_LOGIN_QUEUE,
MSG_CLIENT_SERVER_STATES,
MSG_CLIENT_GM_CLOSE_TARGET_CHAT_WINDOW,
MSG_CLIENT_GENERAL_TEXT_FOR_LOCALIZATION,
MSG_CLIENT_UPDATE_FREE_TRIAL_STATUS,
MSG_CLIENT_UGC_DOWNLOAD_FAILED = 120
};
//! Used for packets sent to the master server
enum MASTER {
MSG_MASTER_REQUEST_PERSISTENT_ID = 1,
MSG_MASTER_REQUEST_PERSISTENT_ID_RESPONSE,
MSG_MASTER_REQUEST_ZONE_TRANSFER,
MSG_MASTER_REQUEST_ZONE_TRANSFER_RESPONSE,
MSG_MASTER_SERVER_INFO,
MSG_MASTER_REQUEST_SESSION_KEY,
MSG_MASTER_SET_SESSION_KEY,
MSG_MASTER_SESSION_KEY_RESPONSE,
MSG_MASTER_PLAYER_ADDED,
MSG_MASTER_PLAYER_REMOVED,
MSG_MASTER_CREATE_PRIVATE_ZONE,
MSG_MASTER_REQUEST_PRIVATE_ZONE,
MSG_MASTER_WORLD_READY,
MSG_MASTER_PREP_ZONE,
MSG_MASTER_SHUTDOWN,
MSG_MASTER_SHUTDOWN_RESPONSE,
MSG_MASTER_SHUTDOWN_IMMEDIATE,
MSG_MASTER_SHUTDOWN_UNIVERSE,
MSG_MASTER_AFFIRM_TRANSFER_REQUEST,
MSG_MASTER_AFFIRM_TRANSFER_RESPONSE,
MSG_MASTER_NEW_SESSION_ALERT
};
//! The Game messages
enum GAME_MSG : unsigned short {
GAME_MSG_TELEPORT = 19,
GAME_MSG_SET_PLAYER_CONTROL_SCHEME = 26,
GAME_MSG_DROP_CLIENT_LOOT = 30,
GAME_MSG_DIE = 37,
GAME_MSG_REQUEST_DIE = 38,
GAME_MSG_PLAY_EMOTE = 41,
GAME_MSG_PLAY_ANIMATION = 43,
GAME_MSG_CONTROL_BEHAVIOR = 48,
GAME_MSG_SET_NAME = 72,
GAME_MSG_ECHO_START_SKILL = 118,
GAME_MSG_START_SKILL = 119,
GAME_MSG_VERIFY_ACK = 121,
GAME_MSG_ADD_SKILL = 127,
GAME_MSG_REMOVE_SKILL = 128,
GAME_MSG_SET_CURRENCY = 133,
GAME_MSG_PICKUP_CURRENCY = 137,
GAME_MSG_PICKUP_ITEM = 139,
GAME_MSG_TEAM_PICKUP_ITEM = 140,
GAME_MSG_PLAY_FX_EFFECT = 154,
GAME_MSG_STOP_FX_EFFECT = 155,
GAME_MSG_REQUEST_RESURRECT = 159,
GAME_MSG_RESURRECT = 160,
GAME_MSG_PUSH_EQUIPPED_ITEMS_STATE = 191,
GAME_MSG_POP_EQUIPPED_ITEMS_STATE = 192,
GAME_MSG_SET_GM_LEVEL = 193,
GAME_MSG_SET_STUNNED = 198,
GAME_MSG_SET_STUN_IMMUNITY = 200,
GAME_MSG_KNOCKBACK = 202,
GAME_MSG_REBUILD_CANCEL = 209,
GAME_MSG_ENABLE_REBUILD = 213,
GAME_MSG_MOVE_ITEM_IN_INVENTORY = 224,
GAME_MSG_ADD_ITEM_TO_INVENTORY_CLIENT_SYNC = 227,
GAME_MSG_REMOVE_ITEM_FROM_INVENTORY = 230,
GAME_MSG_EQUIP_ITEM = 231,
GAME_MSG_UN_EQUIP_ITEM = 233,
GAME_MSG_OFFER_MISSION = 248,
GAME_MSG_RESPOND_TO_MISSION = 249,
GAME_MSG_NOTIFY_MISSION = 254,
GAME_MSG_NOTIFY_MISSION_TASK = 255,
GAME_MSG_REBUILD_NOTIFY_STATE = 336,
GAME_MSG_TERMINATE_INTERACTION = 357,
GAME_MSG_SERVER_TERMINATE_INTERACTION = 358,
GAME_MSG_REQUEST_USE = 364,
GAME_MSG_VENDOR_OPEN_WINDOW = 369,
GAME_MSG_BUY_FROM_VENDOR = 373,
GAME_MSG_SELL_TO_VENDOR = 374,
GAME_MSG_TEAM_SET_OFF_WORLD_FLAG = 383,
GAME_MSG_SET_INVENTORY_SIZE = 389,
GAME_MSG_ACKNOWLEDGE_POSSESSION = 391,
GAME_MSG_SET_SHOOTING_GALLERY_PARAMS = 400,
GAME_MSG_REQUEST_ACTIVITY_START_STOP = 402,
GAME_MSG_REQUEST_ACTIVITY_ENTER = 403,
GAME_MSG_REQUEST_ACTIVITY_EXIT = 404,
GAME_MSG_ACTIVITY_ENTER = 405,
GAME_MSG_ACTIVITY_EXIT = 406,
GAME_MSG_ACTIVITY_START = 407,
GAME_MSG_ACTIVITY_STOP = 408,
GAME_MSG_SHOOTING_GALLERY_CLIENT_AIM_UPDATE = 409,
GAME_MSG_SHOOTING_GALLERY_FIRE = 411,
GAME_MSG_REQUEST_VENDOR_STATUS_UPDATE = 416,
GAME_MSG_VENDOR_STATUS_UPDATE = 417,
GAME_MSG_NOTIFY_CLIENT_SHOOTING_GALLERY_SCORE = 425,
GAME_MSG_CONSUME_CLIENT_ITEM = 427,
GAME_MSG_CLIENT_ITEM_CONSUMED = 428,
GAME_MSG_UPDATE_SHOOTING_GALLERY_ROTATION = 448,
GAME_MSG_SET_FLAG = 471,
GAME_MSG_NOTIFY_CLIENT_FLAG_CHANGE = 472,
GAME_MSG_VENDOR_TRANSACTION_RESULT = 476,
GAME_MSG_HAS_BEEN_COLLECTED = 486,
GAME_MSG_DISPLAY_CHAT_BUBBLE = 495,
GAME_MSG_SPAWN_PET = 498,
GAME_MSG_DESPAWN_PET = 499,
GAME_MSG_PLAYER_LOADED = 505,
GAME_MSG_PLAYER_READY = 509,
GAME_MSG_REQUEST_LINKED_MISSION = 515,
GAME_MSG_INVALID_ZONE_TRANSFER_LIST = 519,
GAME_MSG_MISSION_DIALOGUE_OK = 520,
GAME_MSG_DISPLAY_MESSAGE_BOX = 529,
GAME_MSG_MESSAGE_BOX_RESPOND = 530,
GAME_MSG_CHOICE_BOX_RESPOND = 531,
GAME_MSG_SMASH = 537,
GAME_MSG_UNSMASH = 538,
GAME_MSG_SET_SHOOTING_GALLERY_RETICULE_EFFECT = 548,
GAME_MSG_PLACE_MODEL_RESPONSE = 0x223,
GAME_MSG_SET_JET_PACK_MODE = 561,
GAME_MSG_REGISTER_PET_ID = 565,
GAME_MSG_REGISTER_PET_DBID = 566,
GAME_MSG_SHOW_ACTIVITY_COUNTDOWN = 568,
GAME_MSG_START_ACTIVITY_TIME = 576,
GAME_MSG_ACTIVITY_PAUSE = 602,
GAME_MSG_USE_NON_EQUIPMENT_ITEM = 603,
GAME_MSG_USE_ITEM_RESULT = 607,
GAME_MSG_COMMAND_PET = 640,
GAME_MSG_PET_RESPONSE = 641,
GAME_MSG_REQUEST_ACTIVITY_SUMMARY_LEADERBOARD_DATA = 648,
GAME_MSG_SEND_ACTIVITY_SUMMARY_LEADERBOARD_DATA = 649,
GAME_MSG_NOTIFY_OBJECT = 656,
GAME_MSG_CLIENT_NOTIFY_PET = 659,
GAME_MSG_NOTIFY_PET = 660,
GAME_MSG_NOTIFY_PET_TAMING_MINIGAME = 661,
GAME_MSG_START_SERVER_PET_MINIGAME_TIMER = 662,
GAME_MSG_CLIENT_EXIT_TAMING_MINIGAME = 663,
GAME_MSG_PET_NAME_CHANGED = 686,
GAME_MSG_PET_TAMING_MINIGAME_RESULT = 667,
GAME_MSG_PET_TAMING_TRY_BUILD_RESULT = 668,
GAME_MSG_NOTIFY_TAMING_BUILD_SUCCESS = 673,
GAME_MSG_NOTIFY_TAMING_MODEL_LOADED_ON_SERVER = 674,
GAME_MSG_ACTIVATE_BUBBLE_BUFF = 678,
GAME_MSG_DEACTIVATE_BUBBLE_BUFF = 679,
GAME_MSG_ADD_PET_TO_PLAYER = 681,
GAME_MSG_REQUEST_SET_PET_NAME = 683,
GAME_MSG_SET_PET_NAME = 684,
GAME_MSG_NOTIFY_PET_TAMING_PUZZLE_SELECTED = 675,
GAME_MSG_SHOW_PET_ACTION_BUTTON = 692,
GAME_MSG_SET_EMOTE_LOCK_STATE = 693,
GAME_MSG_USE_ITEM_REQUIREMENTS_RESPONSE = 703,
GAME_MSG_PLAY_EMBEDDED_EFFECT_ON_ALL_CLIENTS_NEAR_OBJECT = 713,
GAME_MSG_DOWNLOAD_PROPERTY_DATA = 716,
GAME_MSG_QUERY_PROPERTY_DATA = 717,
GAME_MSG_PROPERTY_EDITOR_BEGIN = 724,
GAME_MSG_PROPERTY_EDITOR_END = 725,
GAME_MSG_IS_MINIFIG_IN_A_BUBBLE = 729,
GAME_MSG_START_PATHING = 733,
GAME_MSG_ACTIVATE_BUBBLE_BUFF_FROM_SERVER = 734,
GAME_MSG_DEACTIVATE_BUBBLE_BUFF_FROM_SERVER = 735,
GAME_MSG_NOTIFY_CLIENT_ZONE_OBJECT = 737,
GAME_MSG_UPDATE_REPUTATION = 746,
GAME_MSG_PROPERTY_RENTAL_RESPONSE = 750,
GAME_MSG_REQUEST_PLATFORM_RESYNC = 760,
GAME_MSG_PLATFORM_RESYNC = 761,
GAME_MSG_PLAY_CINEMATIC = 762,
GAME_MSG_END_CINEMATIC = 763,
GAME_MSG_CINEMATIC_UPDATE = 764,
GAME_MSG_TOGGLE_GHOST_REFERENCE_OVERRIDE = 767,
GAME_MSG_SET_GHOST_REFERENCE_POSITION = 768,
GAME_MSG_FIRE_EVENT_SERVER_SIDE = 770,
GAME_MSG_SET_NETWORK_SCRIPT_VAR = 781,
GAME_MSG_UPDATE_MODEL_FROM_CLIENT = 793,
GAME_MSG_DELETE_MODEL_FROM_CLIENT = 794,
GAME_MSG_PLAY_ND_AUDIO_EMITTER = 821,
GAME_MSG_PLAY2_DAMBIENT_SOUND = 831,
GAME_MSG_ENTER_PROPERTY1 = 840,
GAME_MSG_ENTER_PROPERTY2 = 841,
GAME_MSG_PROPERTY_ENTRANCE_SYNC = 842,
GAME_MSG_PROPERTY_SELECT_QUERY = 845,
GAME_MSG_PARSE_CHAT_MESSAGE = 850,
GAME_MSG_BROADCAST_TEXT_TO_CHATBOX = 858,
GAME_MSG_OPEN_PROPERTY_MANAGEMENT = 860,
GAME_MSG_OPEN_PROPERTY_VENDOR = 861,
GAME_MSG_UPDATE_PROPERTY_OR_MODEL_FOR_FILTER_CHECK = 863,
GAME_MSG_CLIENT_TRADE_REQUEST = 868,
GAME_MSG_SERVER_TRADE_REQUEST = 869,
GAME_MSG_SERVER_TRADE_INVITE = 870,
GAME_MSG_CLIENT_TRADE_REPLY = 871,
GAME_MSG_SERVER_TRADE_REPLY = 872,
GAME_MSG_SERVER_TRADE_INITIAL_REPLY = 873,
GAME_MSG_SERVER_TRADE_FINAL_REPLY = 874,
GAME_MSG_CLIENT_TRADE_UPDATE = 875,
GAME_MSG_SERVER_SIDE_TRADE_UPDATE = 876,
GAME_MSG_SERVER_TRADE_UPDATE = 877,
GAME_MSG_CLIENT_TRADE_CANCEL = 878,
GAME_MSG_CLIENT_SIDE_TRADE_CANCEL = 879,
GAME_MSG_CLIENT_TRADE_ACCEPT = 880,
GAME_MSG_SERVER_SIDE_TRADE_ACCEPT = 881,
GAME_MSG_SERVER_SIDE_TRADE_CANCEL = 882,
GAME_MSG_SERVER_TRADE_CANCEL = 883,
GAME_MSG_SERVER_TRADE_ACCEPT = 884,
GAME_MSG_READY_FOR_UPDATES = 888,
GAME_MSG_ORIENT_TO_OBJECT = 905,
GAME_MSG_ORIENT_TO_POSITION = 906,
GAME_MSG_ORIENT_TO_ANGLE = 907,
GAME_MSG_BOUNCER_ACTIVE_STATUS = 942,
GAME_MSG_UN_USE_BBB_MODEL = 999,
GAME_MSG_BBB_LOAD_ITEM_REQUEST = 1000,
GAME_MSG_BBB_SAVE_REQUEST = 1001,
GAME_MSG_BBB_SAVE_RESPONSE = 1006,
GAME_MSG_NOTIFY_CLIENT_OBJECT = 1042,
GAME_MSG_DISPLAY_ZONE_SUMMARY = 1043,
GAME_MSG_ACTIVITY_STATE_CHANGE_REQUEST = 1053,
GAME_MSG_MODIFY_PLAYER_ZONE_STATISTIC = 1046,
GAME_MSG_START_BUILDING_WITH_ITEM = 1057,
GAME_MSG_START_ARRANGING_WITH_ITEM = 1061,
GAME_MSG_FINISH_ARRANGING_WITH_ITEM = 1062,
GAME_MSG_DONE_ARRANGING_WITH_ITEM = 1063,
GAME_MSG_SET_BUILD_MODE = 1068,
GAME_MSG_BUILD_MODE_SET = 1069,
GAME_MSG_SET_BUILD_MODE_CONFIRMED = 1073,
GAME_MSG_NOTIFY_CLIENT_FAILED_PRECONDITION = 1081,
GAME_MSG_MOVE_ITEM_BETWEEN_INVENTORY_TYPES = 1093,
GAME_MSG_MODULAR_BUILD_BEGIN = 1094,
GAME_MSG_MODULAR_BUILD_END = 1095,
GAME_MSG_MODULAR_BUILD_MOVE_AND_EQUIP = 1096,
GAME_MSG_MODULAR_BUILD_FINISH = 1097,
GAME_MSG_REPORT_BUG = 1198,
GAME_MSG_MISSION_DIALOGUE_CANCELLED = 1129,
GAME_MSG_ECHO_SYNC_SKILL = 1144,
GAME_MSG_SYNC_SKILL = 1145,
GAME_MSG_REQUEST_SERVER_PROJECTILE_IMPACT = 1148,
GAME_MSG_DO_CLIENT_PROJECTILE_IMPACT = 1151,
GAME_MSG_MODULAR_BUILD_CONVERT_MODEL = 1155,
GAME_MSG_SET_PLAYER_ALLOWED_RESPAWN = 1165,
GAME_MSG_UI_MESSAGE_SERVER_TO_SINGLE_CLIENT = 1184,
GAME_MSG_UI_MESSAGE_SERVER_TO_ALL_CLIENTS = 1185,
GAME_MSG_PET_TAMING_TRY_BUILD = 1197,
GAME_MSG_REQUEST_SMASH_PLAYER = 1202,
GAME_MSG_FIRE_EVENT_CLIENT_SIDE = 1213,
GAME_MSG_TOGGLE_GM_INVIS = 1218,
GAME_MSG_CHANGE_OBJECT_WORLD_STATE = 1223,
GAME_MSG_VEHICLE_LOCK_INPUT = 1230,
GAME_MSG_VEHICLE_UNLOCK_INPUT = 1231,
GAME_MSG_RACING_RESET_PLAYER_TO_LAST_RESET = 1252,
GAME_MSG_RACING_SERVER_SET_PLAYER_LAP_AND_PLANE = 1253,
GAME_MSG_RACING_SET_PLAYER_RESET_INFO = 1254,
GAME_MSG_RACING_PLAYER_INFO_RESET_FINISHED = 1255,
GAME_MSG_LOCK_NODE_ROTATION = 1260,
GAME_MSG_VEHICLE_SET_WHEEL_LOCK_STATE = 1273,
GAME_MSG_NOTIFY_VEHICLE_OF_RACING_OBJECT = 1276,
GAME_MSG_PLAYER_REACHED_RESPAWN_CHECKPOINT = 1296,
GAME_MSG_HANDLE_UGC_EQUIP_POST_DELETE_BASED_ON_EDIT_MODE = 1300,
GAME_MSG_HANDLE_UGC_EQUIP_PRE_CREATE_BASED_ON_EDIT_MODE = 1301,
GAME_MSG_PROPERTY_CONTENTS_FROM_CLIENT = 1305,
GAME_MSG_GET_MODELS_ON_PROPERTY = 1306,
GAME_MSG_MATCH_REQUEST = 1308,
GAME_MSG_MATCH_RESPONSE = 1309,
GAME_MSG_MATCH_UPDATE = 1310,
GAME_MSG_MODULE_ASSEMBLY_DB_DATA_FOR_CLIENT = 1131,
GAME_MSG_MODULE_ASSEMBLY_QUERY_DATA = 1132,
GAME_MSG_CHANGE_IDLE_FLAGS = 1338,
GAME_MSG_VEHICLE_ADD_PASSIVE_BOOST_ACTION = 1340,
GAME_MSG_VEHICLE_REMOVE_PASSIVE_BOOST_ACTION = 1341,
GAME_MSG_VEHICLE_NOTIFY_SERVER_ADD_PASSIVE_BOOST_ACTION = 1342,
GAME_MSG_VEHICLE_NOTIFY_SERVER_REMOVE_PASSIVE_BOOST_ACTION = 1343,
GAME_MSG_VEHICLE_ADD_SLOWDOWN_ACTION = 1344,
GAME_MSG_VEHICLE_REMOVE_SLOWDOWN_ACTION = 1345,
GAME_MSG_VEHICLE_NOTIFY_SERVER_ADD_SLOWDOWN_ACTION = 1346,
GAME_MSG_VEHICLE_NOTIFY_SERVER_REMOVE_SLOWDOWN_ACTION = 1347,
GAME_MSG_BUYBACK_FROM_VENDOR = 1350,
GAME_MSG_SET_PROPERTY_ACCESS = 1366,
GAME_MSG_ZONE_PROPERTY_MODEL_PLACED = 1369,
GAME_MSG_ZONE_PROPERTY_MODEL_ROTATED = 1370,
GAME_MSG_ZONE_PROPERTY_MODEL_REMOVED_WHILE_EQUIPPED = 1371,
GAME_MSG_ZONE_PROPERTY_MODEL_EQUIPPED = 1372,
GAME_MSG_ZONE_PROPERTY_MODEL_PICKED_UP = 1373,
GAME_MSG_ZONE_PROPERTY_MODEL_REMOVED = 1374,
GAME_MSG_NOTIFY_RACING_CLIENT = 1390,
GAME_MSG_RACING_PLAYER_HACK_CAR = 1391,
GAME_MSG_RACING_PLAYER_LOADED = 1392,
GAME_MSG_RACING_CLIENT_READY = 1393,
GAME_MSG_UPDATE_CHAT_MODE = 1395,
GAME_MSG_VEHICLE_NOTIFY_FINISHED_RACE = 1396,
GAME_MSG_SET_CONSUMABLE_ITEM = 1409,
GAME_MSG_SET_STATUS_IMMUNITY = 1435,
GAME_MSG_SET_PET_NAME_MODERATED = 1448,
GAME_MSG_MODIFY_LEGO_SCORE = 1459,
GAME_MSG_RESTORE_TO_POST_LOAD_STATS = 1468,
GAME_MSG_SET_RAIL_MOVEMENT = 1471,
GAME_MSG_START_RAIL_MOVEMENT = 1472,
GAME_MSG_CANCEL_RAIL_MOVEMENT = 1474,
GAME_MSG_CLIENT_RAIL_MOVEMENT_READY = 1476,
GAME_MSG_PLAYER_RAIL_ARRIVED_NOTIFICATION = 1477,
GAME_MSG_UPDATE_PLAYER_STATISTIC = 1481,
GAME_MSG_MODULAR_ASSEMBLY_NIF_COMPLETED = 1498,
GAME_MSG_NOTIFY_NOT_ENOUGH_INV_SPACE = 1516,
GAME_MSG_TEAM_SET_LEADER = 0x0615,
GAME_MSG_TEAM_INVITE_CONFIRM = 0x0616,
GAME_MSG_TEAM_GET_STATUS_RESPONSE = 0x0617,
GAME_MSG_TEAM_ADD_PLAYER = 0x061a,
GAME_MSG_TEAM_REMOVE_PLAYER = 0x061b,
GAME_MSG_START_CELEBRATION_EFFECT = 1618,
GAME_MSG_ADD_BUFF = 1647,
GAME_MSG_SERVER_DONE_LOADING_ALL_OBJECTS = 1642,
GAME_MSG_PLACE_PROPERTY_MODEL = 1170,
GAME_MSG_VEHICLE_NOTIFY_HIT_IMAGINATION_SERVER = 1606,
GAME_MSG_ADD_RUN_SPEED_MODIFIER = 1505,
GAME_MSG_HANDLE_HOT_PROPERTY_DATA = 1511,
GAME_MSG_SEND_HOT_PROPERTY_DATA = 1510,
GAME_MSG_REMOVE_RUN_SPEED_MODIFIER = 1506,
GAME_MSG_UPDATE_PROPERTY_PERFORMANCE_COST = 1547,
GAME_MSG_PROPERTY_ENTRANCE_BEGIN = 1553,
GAME_MSG_REMOVE_BUFF = 1648,
GAME_MSG_REQUEST_MOVE_ITEM_BETWEEN_INVENTORY_TYPES = 1666,
GAME_MSG_RESPONSE_MOVE_ITEM_BETWEEN_INVENTORY_TYPES = 1667,
GAME_MSG_PLAYER_SET_CAMERA_CYCLING_MODE = 1676,
GAME_MSG_SET_MOUNT_INVENTORY_ID = 1726,
GAME_MSG_NOTIFY_SERVER_LEVEL_PROCESSING_COMPLETE = 1734,
GAME_MSG_NOTIFY_LEVEL_REWARDS = 1735,
GAME_MSG_DISMOUNT_COMPLETE = 1756,
GAME_MSG_MARK_INVENTORY_ITEM_AS_ACTIVE = 1767,
END
};

View File

@@ -1,11 +1,11 @@
#pragma once
#ifndef __ADDFRIENDRESPONSECODE__H__
#define __ADDFRIENDRESPONSECODE__H__
#ifndef __EADDFRIENDRESPONSECODE__H__
#define __EADDFRIENDRESPONSECODE__H__
#include <cstdint>
enum class AddFriendResponseCode : uint8_t {
enum class eAddFriendResponseCode : uint8_t {
ACCEPTED = 0,
REJECTED,
BUSY,

View File

@@ -1,11 +1,11 @@
#pragma once
#ifndef __ADDFRIENDRESPONSETYPE__H__
#define __ADDFRIENDRESPONSETYPE__H__
#ifndef __EADDFRIENDRESPONSETYPE__H__
#define __EADDFRIENDRESPONSETYPE__H__
#include <cstdint>
enum class AddFriendResponseType : uint8_t {
enum class eAddFriendResponseType : uint8_t {
ACCEPTED = 0,
ALREADYFRIEND,
INVALIDCHARACTER,
@@ -21,4 +21,4 @@ enum class AddFriendResponseType : uint8_t {
FRIENDISFREETRIAL
};
#endif //!__ADDFRIENDRESPONSETYPE__H__
#endif //!__EADDFRIENDRESPONSETYPE__H__

View File

@@ -0,0 +1,15 @@
#ifndef __EAUTHMESSAGETYPE__H__
#define __EAUTHMESSAGETYPE__H__
#include <cstdint>
enum class eAuthMessageType : uint32_t {
LOGIN_REQUEST = 0,
LOGOUT_REQUEST,
CREATE_NEW_ACCOUNT_REQUEST,
LEGOINTERFACE_AUTH_RESPONSE,
SESSIONKEY_RECEIVED_CONFIRM,
RUNTIME_CONFIG
};
#endif //!__EAUTHMESSAGETYPE__H__

View File

@@ -7,8 +7,8 @@
enum class eBubbleType : uint32_t {
DEFAULT = 0,
ENERGY = 1,
SKUNK = 2,
ENERGY,
SKUNK
};
#endif //!__EBUBBLETYPE__H__

View File

@@ -0,0 +1,12 @@
#ifndef __EBUILDTYPE__H__
#define __EBUILDTYPE__H__
#include <cstdint>
enum class eBuildType :uint32_t {
NOWHERE,
IN_WORLD,
ON_PROPERTY
};
#endif //!__EBUILDTYPE__H__

View File

@@ -0,0 +1,14 @@
#ifndef __ECHARACTERCREATIONRESPONSE__H__
#define __ECHARACTERCREATIONRESPONSE__H__
#include <cstdint>
enum class eCharacterCreationResponse : uint8_t {
SUCCESS = 0,
OBJECT_ID_UNAVAILABLE,
NAME_NOT_ALLOWED,
PREDEFINED_NAME_IN_USE,
CUSTOM_NAME_IN_USE
};
#endif //!__ECHARACTERCREATIONRESPONSE__H__

View File

@@ -0,0 +1,31 @@
#ifndef __ECHATINTERNALMESSAGETYPE__H__
#define __ECHATINTERNALMESSAGETYPE__H__
#include <cstdint>
enum eChatInternalMessageType : uint32_t {
PLAYER_ADDED_NOTIFICATION = 0,
PLAYER_REMOVED_NOTIFICATION,
ADD_FRIEND,
ADD_BEST_FRIEND,
ADD_TO_TEAM,
ADD_BLOCK,
REMOVE_FRIEND,
REMOVE_BLOCK,
REMOVE_FROM_TEAM,
DELETE_TEAM,
REPORT,
PRIVATE_CHAT,
PRIVATE_CHAT_RESPONSE,
ANNOUNCEMENT,
MAIL_COUNT_UPDATE,
MAIL_SEND_NOTIFY,
REQUEST_USER_LIST,
FRIEND_LIST,
ROUTE_TO_PLAYER,
TEAM_UPDATE,
MUTE_UPDATE,
CREATE_TEAM,
};
#endif //!__ECHATINTERNALMESSAGETYPE__H__

View File

@@ -0,0 +1,78 @@
#ifndef __ECHATMESSAGETYPE__H__
#define __ECHATMESSAGETYPE__H__
#include <cstdint>
//! The Internal Chat Packet Identifiers
enum class eChatMessageType :uint32_t {
LOGIN_SESSION_NOTIFY = 0,
GENERAL_CHAT_MESSAGE,
PRIVATE_CHAT_MESSAGE,
USER_CHANNEL_CHAT_MESSAGE,
WORLD_DISCONNECT_REQUEST,
WORLD_PROXIMITY_RESPONSE,
WORLD_PARCEL_RESPONSE,
ADD_FRIEND_REQUEST,
ADD_FRIEND_RESPONSE,
REMOVE_FRIEND,
GET_FRIENDS_LIST,
ADD_IGNORE,
REMOVE_IGNORE,
GET_IGNORE_LIST,
TEAM_MISSED_INVITE_CHECK,
TEAM_INVITE,
TEAM_INVITE_RESPONSE,
TEAM_KICK,
TEAM_LEAVE,
TEAM_SET_LOOT,
TEAM_SET_LEADER,
TEAM_GET_STATUS,
GUILD_CREATE,
GUILD_INVITE,
GUILD_INVITE_RESPONSE,
GUILD_LEAVE,
GUILD_KICK,
GUILD_GET_STATUS,
GUILD_GET_ALL,
SHOW_ALL,
BLUEPRINT_MODERATED,
BLUEPRINT_MODEL_READY,
PROPERTY_READY_FOR_APPROVAL,
PROPERTY_MODERATION_CHANGED,
PROPERTY_BUILDMODE_CHANGED,
PROPERTY_BUILDMODE_CHANGED_REPORT,
MAIL,
WORLD_INSTANCE_LOCATION_REQUEST,
REPUTATION_UPDATE,
SEND_CANNED_TEXT,
GMLEVEL_UPDATE,
CHARACTER_NAME_CHANGE_REQUEST,
CSR_REQUEST,
CSR_REPLY,
GM_KICK,
GM_ANNOUNCE,
GM_MUTE,
ACTIVITY_UPDATE,
WORLD_ROUTE_PACKET,
GET_ZONE_POPULATIONS,
REQUEST_MINIMUM_CHAT_MODE,
REQUEST_MINIMUM_CHAT_MODE_PRIVATE,
MATCH_REQUEST,
UGCMANIFEST_REPORT_MISSING_FILE,
UGCMANIFEST_REPORT_DONE_FILE,
UGCMANIFEST_REPORT_DONE_BLUEPRINT,
UGCC_REQUEST,
WHO,
WORLD_PLAYERS_PET_MODERATED_ACKNOWLEDGE,
ACHIEVEMENT_NOTIFY,
GM_CLOSE_PRIVATE_CHAT_WINDOW,
UNEXPECTED_DISCONNECT,
PLAYER_READY,
GET_DONATION_TOTAL,
UPDATE_DONATION,
PRG_CSR_COMMAND,
HEARTBEAT_REQUEST_FROM_WORLD,
UPDATE_FREE_TRIAL_STATUS
};
#endif //!__ECHATMESSAGETYPE__H__

View File

@@ -0,0 +1,12 @@
#ifndef __ECINEMATICEVENT__H__
#define __ECINEMATICEVENT__H__
#include <cstdint>
enum class eCinematicEvent : uint32_t {
STARTED,
WAYPOINT,
ENDED,
};
#endif //!__ECINEMATICEVENT__H__

View File

@@ -0,0 +1,76 @@
#ifndef __ECLIENTMESSAGETYPE__H__
#define __ECLIENTMESSAGETYPE__H__
#include <cstdint>
enum class eClientMessageType : uint32_t {
LOGIN_RESPONSE = 0,
LOGOUT_RESPONSE,
LOAD_STATIC_ZONE,
CREATE_OBJECT,
CREATE_CHARACTER,
CREATE_CHARACTER_EXTENDED,
CHARACTER_LIST_RESPONSE,
CHARACTER_CREATE_RESPONSE,
CHARACTER_RENAME_RESPONSE,
CHAT_CONNECT_RESPONSE,
AUTH_ACCOUNT_CREATE_RESPONSE,
DELETE_CHARACTER_RESPONSE,
GAME_MSG,
CONNECT_CHAT,
TRANSFER_TO_WORLD,
IMPENDING_RELOAD_NOTIFY,
MAKE_GM_RESPONSE,
HTTP_MONITOR_INFO_RESPONSE,
SLASH_PUSH_MAP_RESPONSE,
SLASH_PULL_MAP_RESPONSE,
SLASH_LOCK_MAP_RESPONSE,
BLUEPRINT_SAVE_RESPONSE,
BLUEPRINT_LUP_SAVE_RESPONSE,
BLUEPRINT_LOAD_RESPONSE_ITEMID,
BLUEPRINT_GET_ALL_DATA_RESPONSE,
MODEL_INSTANTIATE_RESPONSE,
DEBUG_OUTPUT,
ADD_FRIEND_REQUEST,
ADD_FRIEND_RESPONSE,
REMOVE_FRIEND_RESPONSE,
GET_FRIENDS_LIST_RESPONSE,
UPDATE_FRIEND_NOTIFY,
ADD_IGNORE_RESPONSE,
REMOVE_IGNORE_RESPONSE,
GET_IGNORE_LIST_RESPONSE,
TEAM_INVITE,
TEAM_INVITE_INITIAL_RESPONSE,
GUILD_CREATE_RESPONSE,
GUILD_GET_STATUS_RESPONSE,
GUILD_INVITE,
GUILD_INVITE_INITIAL_RESPONSE,
GUILD_INVITE_FINAL_RESPONSE,
GUILD_INVITE_CONFIRM,
GUILD_ADD_PLAYER,
GUILD_REMOVE_PLAYER,
GUILD_LOGIN_LOGOUT,
GUILD_RANK_CHANGE,
GUILD_DATA,
GUILD_STATUS,
MAIL,
DB_PROXY_RESULT,
SHOW_ALL_RESPONSE,
WHO_RESPONSE,
SEND_CANNED_TEXT,
UPDATE_CHARACTER_NAME,
SET_NETWORK_SIMULATOR,
INVALID_CHAT_MESSAGE,
MINIMUM_CHAT_MODE_RESPONSE,
MINIMUM_CHAT_MODE_RESPONSE_PRIVATE,
CHAT_MODERATION_STRING,
UGC_MANIFEST_RESPONSE,
IN_LOGIN_QUEUE,
SERVER_STATES,
GM_CLOSE_TARGET_CHAT_WINDOW,
GENERAL_TEXT_FOR_LOCALIZATION,
UPDATE_FREE_TRIAL_STATUS,
UGC_DOWNLOAD_FAILED = 120
};
#endif //!__ECLIENTMESSAGETYPE__H__

View File

@@ -0,0 +1,14 @@
#ifndef __ECONNECTIONTYPE__H__
#define __ECONNECTIONTYPE__H__
enum class eConnectionType : uint16_t {
SERVER = 0,
AUTH,
CHAT,
CHAT_INTERNAL,
WORLD,
CLIENT,
MASTER
};
#endif //!__ECONNECTIONTYPE__H__

View File

@@ -0,0 +1,18 @@
#ifndef __ECONTROLSCHEME__H__
#define __ECONTROLSCHEME__H__
#include <cstdint>
enum class eControlScheme : uint32_t {
SCHEME_A,
SCHEME_D,
SCHEME_GAMEPAD,
SCHEME_E,
SCHEME_FPS,
SCHEME_DRIVING,
SCHEME_TAMING,
SCHEME_MODULAR_BUILD,
SCHEME_WEAR_A_ROBOT //== freecam?
};
#endif //!__ECONTROLSCHEME__H__

View File

@@ -0,0 +1,11 @@
#ifndef __ECYCLINGMODE__H__
#define __ECYCLINGMODE__H__
#include <cstdint>
enum class eCyclingMode : uint32_t {
ALLOW_CYCLE_TEAMMATES,
DISALLOW_CYCLING
};
#endif //!__ECYCLINGMODE__H__

View File

@@ -0,0 +1,11 @@
#ifndef __EENDBEHAVIOR__H__
#define __EENDBEHAVIOR__H__
#include <cstdint>
enum class eEndBehavior : uint32_t {
RETURN,
WAIT
};
#endif //!__EENDBEHAVIOR__H__

View File

@@ -0,0 +1,15 @@
#ifndef __EGAMEACTIVITY__H__
#define __EGAMEACTIVITY__H__
#include <cstdint>
enum class eGameActivity : uint32_t {
NONE,
QUICKBUILDING,
SHOOTING_GALLERY,
RACING,
PINBALL,
PET_TAMING
};
#endif //!__EGAMEACTIVITY__H__

View File

@@ -0,0 +1,20 @@
#ifndef __EGAMEMASTERLEVEL__H__
#define __EGAMEMASTERLEVEL__H__
#include <cstdint>
enum class eGameMasterLevel : uint8_t {
CIVILIAN = 0, // Normal player.
FORUM_MODERATOR = 1, // No permissions on live servers.
JUNIOR_MODERATOR = 2, // Can kick/mute and pull chat logs.
MODERATOR = 3, // Can return lost items.
SENIOR_MODERATOR = 4, // Can ban.
LEAD_MODERATOR = 5, // Can approve properties.
JUNIOR_DEVELOPER = 6, // Junior developer & future content team. Civilan on live.
INACTIVE_DEVELOPER = 7, // Inactive developer, limited permissions.
DEVELOPER = 8, // Active developer, full permissions on live.
OPERATOR = 9 // Can shutdown server for restarts & updates.
};
#endif //!__EGAMEMASTERLEVEL__H__

View File

@@ -0,0 +1,303 @@
#ifndef __EGAMEMESSAGETYPE__H__
#define __EGAMEMESSAGETYPE__H__
#include <cstdint>
enum class eGameMessageType : uint16_t {
TELEPORT = 19,
SET_PLAYER_CONTROL_SCHEME = 26,
DROP_CLIENT_LOOT = 30,
DIE = 37,
REQUEST_DIE = 38,
PLAY_EMOTE = 41,
PLAY_ANIMATION = 43,
CONTROL_BEHAVIOR = 48,
SET_NAME = 72,
ECHO_START_SKILL = 118,
START_SKILL = 119,
VERIFY_ACK = 121,
ADD_SKILL = 127,
REMOVE_SKILL = 128,
SET_CURRENCY = 133,
PICKUP_CURRENCY = 137,
PICKUP_ITEM = 139,
TEAM_PICKUP_ITEM = 140,
PLAY_FX_EFFECT = 154,
STOP_FX_EFFECT = 155,
REQUEST_RESURRECT = 159,
RESURRECT = 160,
PUSH_EQUIPPED_ITEMS_STATE = 191,
POP_EQUIPPED_ITEMS_STATE = 192,
SET_GM_LEVEL = 193,
SET_STUNNED = 198,
SET_STUN_IMMUNITY = 200,
KNOCKBACK = 202,
REBUILD_CANCEL = 209,
ENABLE_REBUILD = 213,
MOVE_ITEM_IN_INVENTORY = 224,
ADD_ITEM_TO_INVENTORY_CLIENT_SYNC = 227,
REMOVE_ITEM_FROM_INVENTORY = 230,
EQUIP_ITEM = 231,
UN_EQUIP_ITEM = 233,
OFFER_MISSION = 248,
RESPOND_TO_MISSION = 249,
NOTIFY_MISSION = 254,
NOTIFY_MISSION_TASK = 255,
REBUILD_NOTIFY_STATE = 336,
TERMINATE_INTERACTION = 357,
SERVER_TERMINATE_INTERACTION = 358,
REQUEST_USE = 364,
VENDOR_OPEN_WINDOW = 369,
BUY_FROM_VENDOR = 373,
SELL_TO_VENDOR = 374,
TEAM_SET_OFF_WORLD_FLAG = 383,
SET_INVENTORY_SIZE = 389,
ACKNOWLEDGE_POSSESSION = 391,
SET_SHOOTING_GALLERY_PARAMS = 400,
REQUEST_ACTIVITY_START_STOP = 402,
REQUEST_ACTIVITY_ENTER = 403,
REQUEST_ACTIVITY_EXIT = 404,
ACTIVITY_ENTER = 405,
ACTIVITY_EXIT = 406,
ACTIVITY_START = 407,
ACTIVITY_STOP = 408,
SHOOTING_GALLERY_CLIENT_AIM_UPDATE = 409,
SHOOTING_GALLERY_FIRE = 411,
REQUEST_VENDOR_STATUS_UPDATE = 416,
VENDOR_STATUS_UPDATE = 417,
NOTIFY_CLIENT_SHOOTING_GALLERY_SCORE = 425,
CONSUME_CLIENT_ITEM = 427,
CLIENT_ITEM_CONSUMED = 428,
UPDATE_SHOOTING_GALLERY_ROTATION = 448,
SET_FLAG = 471,
NOTIFY_CLIENT_FLAG_CHANGE = 472,
VENDOR_TRANSACTION_RESULT = 476,
HAS_BEEN_COLLECTED = 486,
DISPLAY_CHAT_BUBBLE = 495,
SPAWN_PET = 498,
DESPAWN_PET = 499,
PLAYER_LOADED = 505,
PLAYER_READY = 509,
REQUEST_LINKED_MISSION = 515,
INVALID_ZONE_TRANSFER_LIST = 519,
MISSION_DIALOGUE_OK = 520,
DISPLAY_MESSAGE_BOX = 529,
MESSAGE_BOX_RESPOND = 530,
CHOICE_BOX_RESPOND = 531,
SMASH = 537,
UNSMASH = 538,
PLACE_MODEL_RESPONSE = 547,
SET_SHOOTING_GALLERY_RETICULE_EFFECT = 548,
SET_JET_PACK_MODE = 561,
REGISTER_PET_ID = 565,
REGISTER_PET_DBID = 566,
SHOW_ACTIVITY_COUNTDOWN = 568,
START_ACTIVITY_TIME = 576,
ACTIVITY_PAUSE = 602,
USE_NON_EQUIPMENT_ITEM = 603,
USE_ITEM_RESULT = 607,
COMMAND_PET = 640,
PET_RESPONSE = 641,
REQUEST_ACTIVITY_SUMMARY_LEADERBOARD_DATA = 648,
SEND_ACTIVITY_SUMMARY_LEADERBOARD_DATA = 649,
NOTIFY_OBJECT = 656,
CLIENT_NOTIFY_PET = 659,
NOTIFY_PET = 660,
NOTIFY_PET_TAMING_MINIGAME = 661,
START_SERVER_PET_MINIGAME_TIMER = 662,
CLIENT_EXIT_TAMING_MINIGAME = 663,
PET_NAME_CHANGED = 686,
PET_TAMING_MINIGAME_RESULT = 667,
PET_TAMING_TRY_BUILD_RESULT = 668,
NOTIFY_TAMING_BUILD_SUCCESS = 673,
NOTIFY_TAMING_MODEL_LOADED_ON_SERVER = 674,
ACTIVATE_BUBBLE_BUFF = 678,
DEACTIVATE_BUBBLE_BUFF = 679,
ADD_PET_TO_PLAYER = 681,
REQUEST_SET_PET_NAME = 683,
SET_PET_NAME = 684,
NOTIFY_PET_TAMING_PUZZLE_SELECTED = 675,
SHOW_PET_ACTION_BUTTON = 692,
SET_EMOTE_LOCK_STATE = 693,
USE_ITEM_REQUIREMENTS_RESPONSE = 703,
PLAY_EMBEDDED_EFFECT_ON_ALL_CLIENTS_NEAR_OBJECT = 713,
DOWNLOAD_PROPERTY_DATA = 716,
QUERY_PROPERTY_DATA = 717,
PROPERTY_EDITOR_BEGIN = 724,
PROPERTY_EDITOR_END = 725,
IS_MINIFIG_IN_A_BUBBLE = 729,
START_PATHING = 733,
ACTIVATE_BUBBLE_BUFF_FROM_SERVER = 734,
DEACTIVATE_BUBBLE_BUFF_FROM_SERVER = 735,
NOTIFY_CLIENT_ZONE_OBJECT = 737,
UPDATE_REPUTATION = 746,
PROPERTY_RENTAL_RESPONSE = 750,
REQUEST_PLATFORM_RESYNC = 760,
PLATFORM_RESYNC = 761,
PLAY_CINEMATIC = 762,
END_CINEMATIC = 763,
CINEMATIC_UPDATE = 764,
TOGGLE_GHOST_REFERENCE_OVERRIDE = 767,
SET_GHOST_REFERENCE_POSITION = 768,
FIRE_EVENT_SERVER_SIDE = 770,
SET_NETWORK_SCRIPT_VAR = 781,
UPDATE_MODEL_FROM_CLIENT = 793,
DELETE_MODEL_FROM_CLIENT = 794,
PLAY_ND_AUDIO_EMITTER = 821,
PLAY2_DAMBIENT_SOUND = 831,
ENTER_PROPERTY1 = 840,
ENTER_PROPERTY2 = 841,
PROPERTY_ENTRANCE_SYNC = 842,
PROPERTY_SELECT_QUERY = 845,
PARSE_CHAT_MESSAGE = 850,
BROADCAST_TEXT_TO_CHATBOX = 858,
OPEN_PROPERTY_MANAGEMENT = 860,
OPEN_PROPERTY_VENDOR = 861,
UPDATE_PROPERTY_OR_MODEL_FOR_FILTER_CHECK = 863,
CLIENT_TRADE_REQUEST = 868,
SERVER_TRADE_REQUEST = 869,
SERVER_TRADE_INVITE = 870,
CLIENT_TRADE_REPLY = 871,
SERVER_TRADE_REPLY = 872,
SERVER_TRADE_INITIAL_REPLY = 873,
SERVER_TRADE_FINAL_REPLY = 874,
CLIENT_TRADE_UPDATE = 875,
SERVER_SIDE_TRADE_UPDATE = 876,
SERVER_TRADE_UPDATE = 877,
CLIENT_TRADE_CANCEL = 878,
CLIENT_SIDE_TRADE_CANCEL = 879,
CLIENT_TRADE_ACCEPT = 880,
SERVER_SIDE_TRADE_ACCEPT = 881,
SERVER_SIDE_TRADE_CANCEL = 882,
SERVER_TRADE_CANCEL = 883,
SERVER_TRADE_ACCEPT = 884,
READY_FOR_UPDATES = 888,
ORIENT_TO_OBJECT = 905,
ORIENT_TO_POSITION = 906,
ORIENT_TO_ANGLE = 907,
BOUNCER_ACTIVE_STATUS = 942,
UN_USE_BBB_MODEL = 999,
BBB_LOAD_ITEM_REQUEST = 1000,
BBB_SAVE_REQUEST = 1001,
BBB_SAVE_RESPONSE = 1006,
NOTIFY_CLIENT_OBJECT = 1042,
DISPLAY_ZONE_SUMMARY = 1043,
ZONE_SUMMARY_DISMISSED = 1044,
ACTIVITY_STATE_CHANGE_REQUEST = 1053,
MODIFY_PLAYER_ZONE_STATISTIC = 1046,
START_BUILDING_WITH_ITEM = 1057,
START_ARRANGING_WITH_ITEM = 1061,
FINISH_ARRANGING_WITH_ITEM = 1062,
DONE_ARRANGING_WITH_ITEM = 1063,
SET_BUILD_MODE = 1068,
BUILD_MODE_SET = 1069,
SET_BUILD_MODE_CONFIRMED = 1073,
NOTIFY_CLIENT_FAILED_PRECONDITION = 1081,
MOVE_ITEM_BETWEEN_INVENTORY_TYPES = 1093,
MODULAR_BUILD_BEGIN = 1094,
MODULAR_BUILD_END = 1095,
MODULAR_BUILD_MOVE_AND_EQUIP = 1096,
MODULAR_BUILD_FINISH = 1097,
REPORT_BUG = 1198,
MISSION_DIALOGUE_CANCELLED = 1129,
ECHO_SYNC_SKILL = 1144,
SYNC_SKILL = 1145,
REQUEST_SERVER_PROJECTILE_IMPACT = 1148,
DO_CLIENT_PROJECTILE_IMPACT = 1151,
MODULAR_BUILD_CONVERT_MODEL = 1155,
SET_PLAYER_ALLOWED_RESPAWN = 1165,
UI_MESSAGE_SERVER_TO_SINGLE_CLIENT = 1184,
UI_MESSAGE_SERVER_TO_ALL_CLIENTS = 1185,
PET_TAMING_TRY_BUILD = 1197,
REQUEST_SMASH_PLAYER = 1202,
FIRE_EVENT_CLIENT_SIDE = 1213,
TOGGLE_GM_INVIS = 1218,
CHANGE_OBJECT_WORLD_STATE = 1223,
VEHICLE_LOCK_INPUT = 1230,
VEHICLE_UNLOCK_INPUT = 1231,
RACING_RESET_PLAYER_TO_LAST_RESET = 1252,
RACING_SERVER_SET_PLAYER_LAP_AND_PLANE = 1253,
RACING_SET_PLAYER_RESET_INFO = 1254,
RACING_PLAYER_INFO_RESET_FINISHED = 1255,
LOCK_NODE_ROTATION = 1260,
VEHICLE_SET_WHEEL_LOCK_STATE = 1273,
NOTIFY_VEHICLE_OF_RACING_OBJECT = 1276,
SET_NAME_BILLBOARD_STATE = 1284,
PLAYER_REACHED_RESPAWN_CHECKPOINT = 1296,
HANDLE_UGC_EQUIP_POST_DELETE_BASED_ON_EDIT_MODE = 1300,
HANDLE_UGC_EQUIP_PRE_CREATE_BASED_ON_EDIT_MODE = 1301,
PROPERTY_CONTENTS_FROM_CLIENT = 1305,
GET_MODELS_ON_PROPERTY = 1306,
MATCH_REQUEST = 1308,
MATCH_RESPONSE = 1309,
MATCH_UPDATE = 1310,
MODULE_ASSEMBLY_DB_DATA_FOR_CLIENT = 1131,
MODULE_ASSEMBLY_QUERY_DATA = 1132,
SHOW_BILLBOARD_INTERACT_ICON = 1337,
CHANGE_IDLE_FLAGS = 1338,
VEHICLE_ADD_PASSIVE_BOOST_ACTION = 1340,
VEHICLE_REMOVE_PASSIVE_BOOST_ACTION = 1341,
VEHICLE_NOTIFY_SERVER_ADD_PASSIVE_BOOST_ACTION = 1342,
VEHICLE_NOTIFY_SERVER_REMOVE_PASSIVE_BOOST_ACTION = 1343,
VEHICLE_ADD_SLOWDOWN_ACTION = 1344,
VEHICLE_REMOVE_SLOWDOWN_ACTION = 1345,
VEHICLE_NOTIFY_SERVER_ADD_SLOWDOWN_ACTION = 1346,
VEHICLE_NOTIFY_SERVER_REMOVE_SLOWDOWN_ACTION = 1347,
BUYBACK_FROM_VENDOR = 1350,
SET_PROPERTY_ACCESS = 1366,
ZONE_PROPERTY_MODEL_PLACED = 1369,
ZONE_PROPERTY_MODEL_ROTATED = 1370,
ZONE_PROPERTY_MODEL_REMOVED_WHILE_EQUIPPED = 1371,
ZONE_PROPERTY_MODEL_EQUIPPED = 1372,
ZONE_PROPERTY_MODEL_PICKED_UP = 1373,
ZONE_PROPERTY_MODEL_REMOVED = 1374,
NOTIFY_RACING_CLIENT = 1390,
RACING_PLAYER_HACK_CAR = 1391,
RACING_PLAYER_LOADED = 1392,
RACING_CLIENT_READY = 1393,
UPDATE_CHAT_MODE = 1395,
VEHICLE_NOTIFY_FINISHED_RACE = 1396,
SET_CONSUMABLE_ITEM = 1409,
SET_STATUS_IMMUNITY = 1435,
SET_PET_NAME_MODERATED = 1448,
MODIFY_LEGO_SCORE = 1459,
RESTORE_TO_POST_LOAD_STATS = 1468,
SET_RAIL_MOVEMENT = 1471,
START_RAIL_MOVEMENT = 1472,
CANCEL_RAIL_MOVEMENT = 1474,
CLIENT_RAIL_MOVEMENT_READY = 1476,
PLAYER_RAIL_ARRIVED_NOTIFICATION = 1477,
UPDATE_PLAYER_STATISTIC = 1481,
MODULAR_ASSEMBLY_NIF_COMPLETED = 1498,
NOTIFY_NOT_ENOUGH_INV_SPACE = 1516,
TEAM_SET_LEADER = 1557,
TEAM_INVITE_CONFIRM = 1558,
TEAM_GET_STATUS_RESPONSE = 1559,
TEAM_ADD_PLAYER = 1562,
TEAM_REMOVE_PLAYER = 1563,
START_CELEBRATION_EFFECT = 1618,
ADD_BUFF = 1647,
SERVER_DONE_LOADING_ALL_OBJECTS = 1642,
PLACE_PROPERTY_MODEL = 1170,
VEHICLE_NOTIFY_HIT_IMAGINATION_SERVER = 1606,
ADD_RUN_SPEED_MODIFIER = 1505,
HANDLE_HOT_PROPERTY_DATA = 1511,
SEND_HOT_PROPERTY_DATA = 1510,
REMOVE_RUN_SPEED_MODIFIER = 1506,
UPDATE_PROPERTY_PERFORMANCE_COST = 1547,
PROPERTY_ENTRANCE_BEGIN = 1553,
SET_RESURRECT_RESTORE_VALUES = 1591,
VEHICLE_STOP_BOOST = 1617,
REMOVE_BUFF = 1648,
REQUEST_MOVE_ITEM_BETWEEN_INVENTORY_TYPES = 1666,
RESPONSE_MOVE_ITEM_BETWEEN_INVENTORY_TYPES = 1667,
PLAYER_SET_CAMERA_CYCLING_MODE = 1676,
SET_MOUNT_INVENTORY_ID = 1726,
NOTIFY_SERVER_LEVEL_PROCESSING_COMPLETE = 1734,
NOTIFY_LEVEL_REWARDS = 1735,
DISMOUNT_COMPLETE = 1756,
MARK_INVENTORY_ITEM_AS_ACTIVE = 1767,
END
};
#endif //!__EGAMEMESSAGETYPE__H__

View File

@@ -0,0 +1,41 @@
#ifndef __EHELPTYPE__H__
#define __EHELPTYPE__H__
#include <cstdint>
enum class eHelpType : int32_t {
NONE = 0,
UNLOCK_MINIMAP = 2,
TOGGLETOOLTIP_OUTOFTIME_REBUILD = 3,
TOGGLETOOLTIP_LEAVELOSE_REBUILD = 4,
TOGGLECONTROLSTUTORIAL_WALKING = 6,
DISPLAYTUTORIAL_PASSPORT_1ST_SMASH = 7,
TOOLTIP_1ST_IMAGINATION_PICKUP = 8,
UNKNOWN9 = 9,
PETTAMINGMINIGAME_TUTORIAL_01 = 15,
PR_BOUNCER_TUTORIAL_03 = 16,
PR_TOOLTIP_1ST_PET_JUMPED_ON_SWITCH = 17,
PR_DIG_TUTORIAL_01 = 18,
PR_DIG_TUTORIAL_03 = 19,
PR_BOUNCER_TUTORIAL_01 = 20,
PR_NO_IMAGINATION_HIBERNATE = 21,
UNKNOWN22 = 22,
TOGGLECONTROLSTUTORIAL_JUMPING = 26,
TOGGLECONTROLSTUTORIAL_DOUBLEJUMPING = 27,
TOGGLECONTROLSTUTORIAL_CAMERA = 28,
TOGGLECONTROLSTUTORIAL_SMASH = 30,
UNKNOWN38 = 38,
UI_MOD_BUILD_PUT_ON_HAT = 40,
UI_MOD_BUILD_EQUIP_FIRST_MODULE = 41,
UNKNOWN42 = 42,
UNKNOWN43 = 43,
UI_MOD_BUILD_GO_LAUNCH_ROCKET = 44,
UI_MOD_BUILD_TALK_TO_SKYLANE = 45,
UNKNOWN53 = 53,
PET_DESPAWN_BY_OWNER_HIBERNATE = 69,
PET_DESPAWN_TAMING_NEW_PET = 70,
UI_INVENTORY_FULL_CANNOT_PICKUP_ITEM = 86
};
#endif //!__EHELPTYPE__H__

View File

@@ -0,0 +1,58 @@
#pragma once
#ifndef __EITEMSETPASSIVEABILITYID__H__
#define __EITEMSETPASSIVEABILITYID__H__
enum class eItemSetPassiveAbilityID {
EngineerRank1 = 2,
EngineerRank2 = 3,
EngineerRank3 = 4,
KnightRank1 = 7,
KnightRank2 = 8,
KnightRank3 = 9,
SpaceRangerRank1 = 10,
SpaceRangerRank2 = 11,
SpaceRangerRank3 = 12,
SamuraiRank1 = 13,
SamuraiRank2 = 14,
SamuraiRank3 = 15,
SorcererRank1 = 16,
SorcererRank2 = 17,
SorcererRank3 = 18,
SpaceMarauderRank1 = 19,
SpaceMarauderRank2 = 20,
SpaceMarauderRank3 = 21,
ShinobiRank1 = 22,
ShinobiRank2 = 23,
ShinobiRank3 = 24,
InventorRank1 = 25,
InventorRank2 = 26,
InventorRank3 = 27,
SummonerRank1 = 28,
SummonerRank2 = 29,
SummonerRank3 = 30,
AdventurerRank1 = 31,
AdventurerRank2 = 32,
AdventurerRank3 = 33,
DaredevilRank1 = 34,
DaredevilRank2 = 35,
DaredevilRank3 = 36,
BuccaneerRank1 = 37,
BuccaneerRank2 = 38,
BuccaneerRank3 = 39,
BoneSuit = 40,
ImaginationSpinjitzu = 41,
BatLord = 42,
MosaicJester = 43,
ExplorienBot = 44,
Unnamed1 = 45,
Unnamed2 = 46,
Unnamed3 = 47,
EarthSpinjitzu = 48,
Unnamed4 = 49,
FireSpinjitzu = 50,
IceSpinjitzu = 51,
LightningSpinjitzu = 52
};
#endif //!__EITEMSETPASSIVEABILITYID__H__

View File

@@ -6,31 +6,31 @@
#include <cstdint>
enum class eItemType : int32_t {
ITEM_TYPE_UNKNOWN = -1, //!< An unknown item type
ITEM_TYPE_BRICK = 1, //!< A brick
ITEM_TYPE_HAT = 2, //!< A hat / head item
ITEM_TYPE_HAIR = 3, //!< A hair item
ITEM_TYPE_NECK = 4, //!< A neck item
ITEM_TYPE_LEFT_HAND = 5, //!< A left handed item
ITEM_TYPE_RIGHT_HAND = 6, //!< A right handed item
ITEM_TYPE_LEGS = 7, //!< A pants item
ITEM_TYPE_LEFT_TRINKET = 8, //!< A left handled trinket item
ITEM_TYPE_RIGHT_TRINKET = 9, //!< A right handed trinket item
ITEM_TYPE_BEHAVIOR = 10, //!< A behavior
ITEM_TYPE_PROPERTY = 11, //!< A property
ITEM_TYPE_MODEL = 12, //!< A model
ITEM_TYPE_COLLECTIBLE = 13, //!< A collectible item
ITEM_TYPE_CONSUMABLE = 14, //!< A consumable item
ITEM_TYPE_CHEST = 15, //!< A chest item
ITEM_TYPE_EGG = 16, //!< An egg
ITEM_TYPE_PET_FOOD = 17, //!< A pet food item
ITEM_TYPE_QUEST_OBJECT = 18, //!< A quest item
ITEM_TYPE_PET_INVENTORY_ITEM = 19, //!< A pet inventory item
ITEM_TYPE_PACKAGE = 20, //!< A package
ITEM_TYPE_LOOT_MODEL = 21, //!< A loot model
ITEM_TYPE_VEHICLE = 22, //!< A vehicle
ITEM_TYPE_CURRENCY = 23, //!< Currency
ITEM_TYPE_MOUNT = 24 //!< A Mount
UNKNOWN = -1,
BRICK = 1,
HAT,
HAIR,
NECK,
LEFT_HAND,
RIGHT_HAND,
LEGS,
LEFT_TRINKET,
RIGHT_TRINKET,
BEHAVIOR,
PROPERTY,
MODEL,
COLLECTIBLE,
CONSUMABLE,
CHEST,
EGG,
PET_FOOD,
QUEST_OBJECT,
PET_INVENTORY_ITEM,
PACKAGE,
LOOT_MODEL,
VEHICLE,
LUP_MODEL,
MOUNT
};
#endif //!__EITEMTYPE__H__

View File

@@ -0,0 +1,11 @@
#ifndef __EKILLTYPE__H__
#define __EKILLTYPE__H__
#include <cstdint>
enum class eKillType : uint32_t {
VIOLENT,
SILENT
};
#endif //!__EKILLTYPE__H__

View File

@@ -0,0 +1,24 @@
#ifndef __ELOGINRESPONSE__H__
#define __ELOGINRESPONSE__H__
#include <cstdint>
enum class eLoginResponse : uint8_t {
GENERAL_FAILED = 0,
SUCCESS,
BANNED,
// Unused 3
// Unused 4
PERMISSIONS_NOT_HIGH_ENOUGH = 5,
INVALID_USER,
ACCOUNT_LOCKED,
WRONG_PASS,
ACCOUNT_ACTIVATION_PENDING,
ACCOUNT_DISABLED,
GAME_TIME_EXPIRED,
FREE_TRIAL_ENDED,
PLAY_SCHEDULE_TIME_UP,
ACCOUNT_NOT_ACTIVATED
};
#endif //!__ELOGINRESPONSE__H__

View File

@@ -0,0 +1,31 @@
#ifndef __ELOOTSOURCETYPE__H__
#define __ELOOTSOURCETYPE__H__
#include <cstdint>
enum class eLootSourceType : uint32_t {
NONE = 0,
CHEST,
MISSION,
MAIL,
CURRENCY,
ACHIEVEMENT,
TRADE,
QUICKBUILD,
DELETION,
VENDOR,
ACTIVITY,
PICKUP,
BRICK,
PROPERTY,
MODERATION,
EXHIBIT,
INVENTORY,
CLAIMCODE,
CONSUMPTION,
CRAFTING,
LEVEL_REWARD,
RELOCATE
};
#endif //!__ELOOTSOURCETYPE__H__

View File

@@ -0,0 +1,36 @@
#ifndef __EMASTERMESSAGETYPE__H__
#define __EMASTERMESSAGETYPE__H__
#include <cstdint>
enum class eMasterMessageType : uint32_t {
REQUEST_PERSISTENT_ID = 1,
REQUEST_PERSISTENT_ID_RESPONSE,
REQUEST_ZONE_TRANSFER,
REQUEST_ZONE_TRANSFER_RESPONSE,
SERVER_INFO,
REQUEST_SESSION_KEY,
SET_SESSION_KEY,
SESSION_KEY_RESPONSE,
PLAYER_ADDED,
PLAYER_REMOVED,
CREATE_PRIVATE_ZONE,
REQUEST_PRIVATE_ZONE,
WORLD_READY,
PREP_ZONE,
SHUTDOWN,
SHUTDOWN_RESPONSE,
SHUTDOWN_IMMEDIATE,
SHUTDOWN_UNIVERSE,
AFFIRM_TRANSFER_REQUEST,
AFFIRM_TRANSFER_RESPONSE,
NEW_SESSION_ALERT
};
#endif //!__EMASTERMESSAGETYPE__H__

View File

@@ -0,0 +1,17 @@
#ifndef __EMATCHUPDATE__H__
#define __EMATCHUPDATE__H__
#include <cstdint>
enum class eMatchUpdate : int32_t {
PLAYER_ADDED = 0,
PLAYER_REMOVED,
PHASE_CREATED,
PHASE_WAIT_READY,
PHASE_WAIT_START,
PLAYER_READY,
PLAYER_NOT_READY,
PLAYER_UPDATE
};
#endif //!__EMATCHUPDATE__H__

View File

@@ -0,0 +1,12 @@
#pragma once
#ifndef __EMISSIONLOCKSTATE__H__
#define __EMISSIONLOCKSTATE__H__
enum class eMissionLockState : int {
LOCKED,
NEW,
UNLOCKED,
};
#endif //!__EMISSIONLOCKSTATE__H__

View File

@@ -0,0 +1,56 @@
#pragma once
#ifndef __MISSIONSTATE__H__
#define __MISSIONSTATE__H__
/**
* Represents the possible states a mission can be in
*/
enum class eMissionState : int {
/**
* The mission state is unknown
*/
UNKNOWN = -1,
/**
* The mission is yielding rewards
*/
REWARDING = 0,
/**
* The mission can be accepted
*/
AVAILABLE = 1,
/**
* The mission has been accepted but not yet completed
*/
ACTIVE = 2,
/**
* All the tasks for the mission have been completed and the entity can turn the mission in to complete it
*/
READY_TO_COMPLETE = 4, //!< The mission is ready to complete
/**
* The mission has been completed
*/
COMPLETE = 8,
/**
* The mission is available again and has been completed before. Used for daily missions.
*/
COMPLETE_AVAILABLE = 9,
/**
* The mission is active and has been completed before. Used for daily missions.
*/
COMPLETE_ACTIVE = 10,
/**
* The mission has been completed before and has now been completed again. Used for daily missions.
*/
COMPLETE_READY_TO_COMPLETE = 12
};
#endif //!__MISSIONSTATE__H__

View File

@@ -0,0 +1,43 @@
#pragma once
#ifndef __EMISSIONTASKTYPE__H__
#define __EMISSIONTASKTYPE__H__
enum class eMissionTaskType : int {
UNKNOWN = -1,
SMASH,
SCRIPT,
ACTIVITY,
COLLECTION,
TALK_TO_NPC,
EMOTE,
SHASH_CHAIN,
BUY,
SELL,
USE_ITEM,
USE_SKILL,
GATHER,
EXPLORE,
DELIVERY,
PERFORM_ACTIVITY,
INTERACT,
META,
EARN_REPUTATION,
VOTING,
SHOWCASE_DELIVERY,
REVIECE_CAST,
POWERUP,
PET_TAMING,
RACING,
PLAYER_FLAG,
PLACE_MODEL,
REMOVE_MODEL,
ADD_BEHAVIOR,
REMOVE_BEHAVIOR,
CLAIM_PROPERTY,
VISIT_PROPERTY,
TIME_PLAYED,
DONATION
};
#endif //!__EMISSIONTASKTYPE__H__

View File

@@ -0,0 +1,13 @@
#ifndef __EOBJECTBITS__H__
#define __EOBJECTBITS__H__
#include <cstdint>
enum class eObjectBits : size_t {
PERSISTENT = 32,
CLIENT = 46,
SPAWNED = 58,
CHARACTER = 60
};
#endif //!__EOBJECTBITS__H__

View File

@@ -0,0 +1,12 @@
#ifndef __EOBJECTWORLDSTATE__H__
#define __EOBJECTWORLDSTATE__H__
#include <cstdint>
enum class eObjectWorldState : uint32_t {
INWORLD,
ATTACHED,
INVENTORY
};
#endif //!__EOBJECTWORLDSTATE__H__

View File

@@ -0,0 +1,13 @@
#ifndef __EPACKAGETYPE__H__
#define __EPACKAGETYPE__H__
enum class ePackageType {
INVALID = -1,
ITEM,
BRICKS,
MODELS,
CAR_MODELS
};
#endif //!__EPACKAGETYPE__H__

View File

@@ -0,0 +1,46 @@
#pragma once
#include <cstdint>
#ifndef __EPERMISSIONMAP__H__
#define __EPERMISSIONMAP__H__
/**
* Bitmap of permissions and restrictions for characters.
*/
enum class ePermissionMap : uint64_t {
/**
* Reserved for future use, bit 0-3.
*/
/**
* The character has restricted trade acccess, bit 4.
*/
RestrictedTradeAccess = 0x1 << 4,
/**
* The character has restricted mail access, bit 5.
*/
RestrictedMailAccess = 0x1 << 5,
/**
* The character has restricted chat access, bit 6.
*/
RestrictedChatAccess = 0x1 << 6,
//
// Combined permissions
//
/**
* The character is marked as 'old', restricted from trade and mail.
*/
Old = RestrictedTradeAccess | RestrictedMailAccess,
/**
* The character is soft banned, restricted from trade, mail, and chat.
*/
SoftBanned = RestrictedTradeAccess | RestrictedMailAccess | RestrictedChatAccess,
};
#endif //!__EPERMISSIONMAP__H__

View File

@@ -0,0 +1,15 @@
#ifndef __EPETTAMINGNOTIFYTYPE__H__
#define __EPETTAMINGNOTIFYTYPE__H__
#include <cstdint>
enum class ePetTamingNotifyType : uint32_t {
SUCCESS,
QUIT,
FAILED,
BEGIN,
READY,
NAMINGPET
};
#endif //!__EPETTAMINGNOTIFYTYPE__H__

View File

@@ -0,0 +1,15 @@
#ifndef __EPHYSICSEFFECTTYPE__H__
#define __EPHYSICSEFFECTTYPE__H__
#include <cstdint>
enum class ePhysicsEffectType : uint32_t {
PUSH,
ATTRACT,
REPULSE,
GRAVITY_SCALE,
FRICTION
};
#endif //!__EPHYSICSEFFECTTYPE__H__

View File

@@ -0,0 +1,172 @@
#ifndef __EPLAYERFLAG__H__
#define __EPLAYERFLAG__H__
#include <cstdint>
enum ePlayerFlag : int32_t {
BTARR_TESTING = 0,
PLAYER_HAS_ENTERED_PET_RANCH = 1,
MINIMAP_UNLOCKED = 2,
ACTIVITY_REBUILDING_FAIL_TIME = 3,
ACTIVITY_REBUILDING_FAIL_RANGE = 4,
ACTIVITY_SHOOTING_GALLERY_HELP = 5,
HELP_WALKING_CONTROLS = 6,
FIRST_SMASHABLE = 7,
FIRST_IMAGINATION_PICKUP = 8,
FIRST_DAMAGE = 9,
FIRST_ITEM = 10,
FIRST_BRICK = 11,
FIRST_CONSUMABLE = 12,
FIRST_EQUIPPABLE = 13,
CHAT_HELP = 14,
FIRST_PET_TAMING_MINIGAME = 15,
FIRST_PET_ON_SWITCH = 16,
FIRST_PET_JUMPED_ON_SWITCH = 17,
FIRST_PET_FOUND_TREASURE = 18,
FIRST_PET_DUG_TREASURE = 19,
FIRST_PET_OWNER_ON_PET_BOUNCER = 20,
FIRST_PET_DESPAWN_NO_IMAGINATION = 21,
FIRST_PET_SELECTED_ENOUGH_BRICKS = 22,
FIRST_EMOTE_UNLOCKED = 23,
GF_PIRATE_REP = 24,
AG_BOB_CINEMATIC_EVENT = 25,
HELP_JUMPING_CONTROLS = 26,
HELP_DOUBLE_JUMP_CONTROLS = 27,
HELP_CAMERA_CONTROLS = 28,
HELP_ROTATE_CONTROLS = 29,
HELP_SMASH = 30,
MONUMENT_INTRO_MUSIC_PLAYED = 31,
BEGINNING_ZONE_SUMMARY_DISPLAYED = 32,
AG_FINISH_LINE_BUILT = 33,
AG_BOSS_AREA_FOUND = 34,
AG_LANDED_IN_BATTLEFIELD = 35,
GF_PLAYER_HAS_BEEN_TO_THE_RAVINE = 36,
MODULAR_BUILD_STARTED = 37,
MODULAR_BUILD_FINISHED_CLICK_BUTTON = 38,
THINKING_HAT_RECEIVED_GO_TO_MODULAR_BUILD_AREA = 39,
BUILD_AREA_ENTERED_MOD_NOT_ACTIVATED_PUT_ON_HAT = 40,
HAT_ON_INSIDE_OF_MOD_BUILD_EQUIP_A_MODULE_FROM_LEG = 41,
MODULE_EQUIPPED_PLACE_ON_GLOWING_BLUE_SPOT = 42,
FIRST_MODULE_PLACED_CORRECTLY_NOW_DO_THE_REST = 43,
ROCKET_COMPLETE_NOW_LAUNCH_FROM_PAD = 44,
JOINED_A_FACTION = 45,
VENTURE_FACTION = 46,
ASSEMBLY_FACTION = 47,
PARADOX_FACTION = 48,
SENTINEL_FACTION = 49,
LUP_WORLD_ACCESS = 50,
AG_FIRST_FLAG_COLLECTED = 51,
TOOLTIP_TALK_TO_SKYLAND_TO_GET_HAT = 52,
MODULAR_BUILD_PLAYER_PLACES_FIRST_MODEL_IN_SCRATCH = 53,
MODULAR_BUILD_FIRST_ARROW_DISPLAY_FOR_MODULE = 54,
AG_BEACON_QB_SO_THE_PLAYER_CAN_ALWAYS_BUILD_THEM = 55,
GF_PET_DIG_FLAG_1 = 56,
GF_PET_DIG_FLAG_2 = 57,
GF_PET_DIG_FLAG_3 = 58,
SUPPRESS_SPACESHIP_CINEMATIC_FLYTHROUGH = 59,
GF_PLAYER_FALL_DEATH = 60,
GF_PLAYER_CAN_GET_FLAG_1 = 61,
GF_PLAYER_CAN_GET_FLAG_2 = 62,
GF_PLAYER_CAN_GET_FLAG_3 = 63,
ENTER_BBB_FROM_PROPERTY_EDIT_CONFIRMATION_DIALOG = 64,
AG_FIRST_COMBAT_COMPLETE = 65,
AG_COMPLETE_BOB_MISSION = 66,
FIRST_MANUAL_PET_HIBERNATE = 69,
CAGED_SPIDER = 74,
IS_NEWS_SCREEN_VISIBLE = 114,
NJ_GARMADON_CINEMATIC_SEEN = 125,
EQUPPED_TRIAL_FACTION_GEAR = 126,
ELEPHANT_PET_3050 = 801,
CAT_PET_3054 = 803,
TRICERATOPS_PET_3195 = 806,
TERRIER_PET_3254 = 807,
SKUNK_PET_3261 = 811,
BUNNY_PET_3672 = 813,
CROCODILE_PET_3994 = 814,
DOBERMAN_PET_5635 = 815,
BUFFALO_PET_5636 = 816,
ROBOT_DOG_PET_5637 = 818,
RED_DRAGON_PET_5639 = 819,
TORTOISE_PET_5640 = 820,
GREEN_DRAGON_PET_5641 = 821,
PANDA_PET_5643 = 822,
MANTIS_PET_5642 = 823,
WARTHOG_PET_6720 = 824,
LION_PET_3520 = 825,
GOAT_PET_7638 = 818,
CRAB_PET_7694 = 827,
REINDEER_PET_12294 = 829,
STEGOSAURUS_PET_12431 = 830,
SABER_CAT_PET_12432 = 831,
GRYPHON_PET_12433 = 832,
ALINE_PET_12334 = 833,
UNKNOWN_PET = 834,
EARTH_DRAGON_PET_16210 = 836,
SKELETON_DRAGON_PET_13067 = 838,
AG_SPACE_SHIP_BINOC_AT_LAUNCH = 1001,
AG_SPACE_SHIP_BINOC_AT_LAUNCH_PLATFORM = 1002,
AG_SPACE_SHIP_BINOC_ON_PLATFORM_TO_LEFT_OF_START = 1003,
AG_SPACE_SHIP_BINOC_ON_PLATFORM_TO_RIGHT_OF_START = 1004,
AG_SPACE_SHIP_BINOC_AT_BOB = 1005,
AG_BATTLE_BINOC_FOR_TRICERETOPS = 1101,
AG_BATTLE_BINOC_AT_PARADOX = 1102,
AG_BATTLE_BINOC_AT_MISSION_GIVER = 1103,
AG_BATTLE_BINOC_AT_BECK = 1104,
AG_MONUMENT_BINOC_INTRO = 1105,
AG_MONUMENT_BINOC_OUTRO = 1106,
AG_LAUNCH_BINOC_INTRO = 1107,
AG_LAUNCH_BINOC_BISON = 1108,
AG_LAUNCH_BINOC_SHARK = 1109,
NS_BINOC_CONCERT_TRANSITION = 1201,
NS_BINOC_RACE_PLACE_TRANSITION = 1202,
NS_BINOC_BRICK_ANNEX_TRANSITION = 1203,
NS_BINOC_GF_LAUNCH = 1204,
NS_BINOC_FV_LAUNCH = 1205,
NS_BINOC_BRICK_ANNEX_WATER = 1206,
NS_BINOC_AG_LAUNCH_AT_RACE_PLACE = 1207,
NS_BINOC_AG_LAUNCH_AT_BRICK_ANNEX = 1208,
NS_BINOC_AG_LAUNCH_AT_PLAZA = 1209,
NS_BINOC_TBA = 1210,
NS_FLAG_COLLECTABLE_1_BY_JONNY_THUNDER = 1211,
NS_FLAG_COLLECTABLE_2_UNDER_CONCERT_BRIDGE = 1212,
NS_FLAG_COLLECTABLE_3_BY_FV_LAUNCH = 1213,
NS_FLAG_COLLECTABLE_4_IN_PLAZA_BEHIND_BUILDING = 1214,
NS_FLAG_COLLECTABLE_5_BY_GF_LAUNCH = 1215,
NS_FLAG_COLLECTABLE_6_BY_DUCK_SG = 1216,
NS_FLAG_COLLECTABLE_7_BY_LUP_LAUNCH = 1217,
NS_FLAG_COLLECTABLE_8_BY_NT_LUANCH = 1218,
NS_FLAG_COLLECTABLE_9_BY_RACE_BUILD = 1219,
NS_FLAG_COLLECTABLE_10_ON_AG_LAUNCH_PATH = 1220,
PR_BINOC_AT_LAUNCH_PAD = 1251,
PR_BINOC_AT_BEGINNING_OF_ISLAND_B = 1252,
PR_BINOC_AT_FIRST_PET_BOUNCER = 1253,
PR_BINOC_ON_BY_CROWS_NEST = 1254,
PR_PET_DIG_AT_BEGINNING_OF_ISLAND_B = 1261,
PR_PET_DIG_AT_THE_LOCATION_OF_OLD_BOUNCE_BACK = 1262,
PR_PET_DIG_UNDER_QB_BRIDGE = 1263,
PR_PET_DIG_BACK_SIDE_BY_PARTNER_BOUNCE = 1264,
PR_PET_DIG_BY_LAUNCH_PAD = 1265,
PR_PET_DIG_BY_FIRST_PET_BOUNCER = 1266,
GF_BINOC_ON_LANDING_PAD = 1301,
GF_BINOC_AT_RAVINE_START = 1302,
GF_BINOC_ON_TOP_OF_RAVINE_HEAD = 1303,
GF_BINOC_AT_TURTLE_AREA = 1304,
GF_BINOC_IN_TUNNEL_TO_ELEPHANTS = 1305,
GF_BINOC_IN_ELEPHANTS_AREA = 1306,
GF_BINOC_IN_RACING_AREA = 1307,
GF_BINOC_IN_CROC_AREA = 1308,
GF_BINOC_IN_JAIL_AREA = 1309,
GF_BINOC_TELESCOPE_NEXT_TO_CAPTAIN_JACK = 1310,
NT_HEART_OF_DARKNESS = 1911,
NT_PLINTH_REBUILD = 1919,
NT_FACTION_SPY_DUKE = 1974,
NT_FACTION_SPY_OVERBUILD = 1976,
NT_FACTION_SPY_HAEL = 1977,
NJ_EARTH_SPINJITZU = 2030,
NJ_LIGHTNING_SPINJITZU = 2031,
NJ_ICE_SPINJITZU = 2032,
NJ_FIRE_SPINJITZU = 2033,
NJ_WU_SHOW_DAILY_CHEST = 2099
};
#endif //!__EPLAYERFLAG__H__

View File

@@ -0,0 +1,13 @@
#ifndef __EQUICKBUILDFAILREASON__H__
#define __EQUICKBUILDFAILREASON__H__
#include <cstdint>
enum class eQuickBuildFailReason : uint32_t {
NOT_GIVEN,
OUT_OF_IMAGINATION,
CANCELED_EARLY,
BUILD_ENDED
};
#endif //!__EQUICKBUILDFAILREASON__H__

View File

@@ -0,0 +1,25 @@
#pragma once
#ifndef __ERACINGTASKPARAM__H__
#define __ERACINGTASKPARAM__H__
#include <cstdint>
enum class eRacingTaskParam : int32_t {
FINISH_WITH_PLACEMENT = 1,
LAP_TIME,
TOTAL_TRACK_TIME,
COMPLETE_ANY_RACING_TASK,
COMPLETE_TRACK_TASKS,
MODULAR_BUILDING,
SAFE_DRIVER = 10,
SMASHABLES,
COLLECT_IMAGINATION,
COMPETED_IN_RACE,
WIN_RACE_IN_WORLD,
FIRST_PLACE_MULTIPLE_TRACKS,
LAST_PLACE_FINISH,
SMASH_SPECIFIC_SMASHABLE
};
#endif //!__ERACINGTASKPARAM__H__

View File

@@ -0,0 +1,15 @@
#ifndef __EREBUILDSTATE__H__
#define __EREBUILDSTATE__H__
#include <cstdint>
enum class eRebuildState : uint32_t {
OPEN,
COMPLETED = 2,
RESETTING = 4,
BUILDING,
INCOMPLETE
};
#endif //!__EREBUILDSTATE__H__

View File

@@ -0,0 +1,15 @@
#ifndef __ERENAMERESPONSE__H__
#define __ERENAMERESPONSE__H__
#include <cstdint>
//! An enum for character rename responses
enum class eRenameResponse : uint8_t {
SUCCESS = 0,
UNKNOWN_ERROR,
NAME_UNAVAILABLE,
NAME_IN_USE
};
#endif //!__ERENAMERESPONSE__H__

View File

@@ -0,0 +1,127 @@
#ifndef __EREPLICACOMPONENTTYPE__H__
#define __EREPLICACOMPONENTTYPE__H__
#include <cstdint>
enum class eReplicaComponentType : uint32_t {
INVALID = 0,
CONTROLLABLE_PHYSICS,
RENDER,
SIMPLE_PHYSICS,
CHARACTER,
SCRIPT,
BOUNCER,
BUFF, // buff is really 98, this is DESTROYABLE
GHOST,
SKILL,
SPAWNER,
ITEM,
REBUILD,
REBUILD_START,
REBUILD_ACTIVATOR,
ICON_ONLY,
VENDOR,
INVENTORY,
PROJECTILE_PHYSICS,
SHOOTING_GALLERY,
RIGID_BODY_PHANTOM_PHYSICS,
DROP_EFFECT,
CHEST,
COLLECTIBLE,
BLUEPRINT,
MOVING_PLATFORM,
PET,
PLATFORM_BOUNDARY,
MODULE,
ARCADE,
VEHICLE_PHYSICS, // Havok demo based
MOVEMENT_AI,
EXHIBIT,
OVERHEAD_ICON,
PET_CONTROL,
MINIFIG,
PROPERTY,
PET_CREATOR,
MODEL_BUILDER,
SCRIPTED_ACTIVITY,
PHANTOM_PHYSICS,
SPRINGPAD,
MODEL,
PROPERTY_ENTRANCE,
FX,
PROPERTY_MANAGEMENT,
VEHICLE_PHYSICS_NEW, // internal physics based on havok
PHYSICS_SYSTEM,
QUICK_BUILD,
SWITCH,
ZONE_CONTROL, // Minigame
CHANGLING,
CHOICE_BUILD,
PACKAGE,
SOUND_REPEATER,
SOUND_AMBIENT_2D,
SOUND_AMBIENT_3D,
PRECONDITION,
PLAYER_FLAG,
CUSTOM_BUILD_ASSEMBLY,
BASE_COMBAT_AI,
MODULE_ASSEMBLY,
SHOWCASE_MODEL_HANDLER,
RACING_MODULE,
GENERIC_ACTIVATOR,
PROPERTY_VENDOR,
HF_LIGHT_DIRECTION_GADGET,
ROCKET_LAUNCH,
ROCKET_LANDING,
TRIGGER,
DROPPED_LOOT,
RACING_CONTROL,
FACTION_TRIGGER,
MISSION_OFFER,
RACING_STATS,
LUP_EXHIBIT,
BBB,
SOUND_TRIGGER,
PROXIMITY_MONITOR,
RACING_SOUND_TRIGGER,
CHAT,
FRIENDS_LIST,
GUILD,
LOCAL_SYSTEM,
MISSION,
MUTABLE_MODEL_BEHAVIORS,
PATHFINDING,
PET_TAMING_CONTROL,
PROPERTY_EDITOR,
SKINNED_RENDER,
SLASH_COMMAND,
STATUS_EFFECT,
TEAMS,
TEXT_EFFECT,
TRADE,
USER_CONTROL,
IGNORE_LIST,
ROCKET_LAUNCH_LUP,
BUFF_REAL, // the real buff component, should just be name BUFF
INTERACTION_MANAGER,
DONATION_VENDOR,
COMBAT_MEDIATOR,
COMMENDATION_VENDOR,
GATE_RUSH_CONTROL,
RAIL_ACTIVATOR,
ROLLER,
PLAYER_FORCED_MOVEMENT,
CRAFTING,
POSSESSABLE,
LEVEL_PROGRESSION,
POSSESSOR,
MOUNT_CONTROL,
UNKNOWN_112,
PROPERTY_PLAQUE,
BUILD_BORDER,
UNKNOWN_115,
CULLING_PLANE,
DESTROYABLE = 1000 // Actually 7
};
#endif //!__EREPLICACOMPONENTTYPE__H__

View File

@@ -0,0 +1,12 @@
#ifndef __EREPLICAPACKETTYPE__H__
#define __EREPLICAPACKETTYPE__H__
#include <cstdint>
enum class eReplicaPacketType : uint8_t {
CONSTRUCTION,
SERIALIZATION,
DESTRUCTION
};
#endif //!__EREPLICAPACKETTYPE__H__

View File

@@ -0,0 +1,24 @@
#ifndef __ESERVERDISCONNECTIDENTIFIERS__H__
#define __ESERVERDISCONNECTIDENTIFIERS__H__
#include <cstdint>
enum class eServerDisconnectIdentifiers : uint32_t {
UNKNOWN_SERVER_ERROR = 0,
WRONG_GAME_VERSION,
WRONG_SERVER_VERSION,
CONNECTION_ON_INVALID_PORT,
DUPLICATE_LOGIN,
SERVER_SHUTDOWN,
SERVER_MAP_LOAD_FAILURE,
INVALID_SESSION_KEY,
ACCOUNT_NOT_IN_PENDING_LIST,
CHARACTER_NOT_FOUND,
CHARACTER_CORRUPTED,
KICK,
SAVE_FAILURE,
FREE_TRIAL_EXPIRED,
PLAY_SCHEDULE_TIME_DONE
};
#endif //!__ESERVERDISCONNECTIDENTIFIERS__H__

View File

@@ -0,0 +1,12 @@
#ifndef __ESERVERMESSAGETYPE__H__
#define __ESERVERMESSAGETYPE__H__
#include <cstdint>
//! The Internal Server Packet Identifiers
enum class eServerMessageType : uint32_t {
VERSION_CONFIRM = 0,
DISCONNECT_NOTIFY,
GENERAL_NOTIFY
};
#endif //!__ESERVERMESSAGETYPE__H__

View File

@@ -0,0 +1,11 @@
#ifndef __ESTATECHANGETYPE__H__
#define __ESTATECHANGETYPE__H__
#include <cstdint>
enum class eStateChangeType : uint32_t {
PUSH,
POP
};
#endif //!__ESTATECHANGETYPE__H__

View File

@@ -0,0 +1,12 @@
#ifndef __ETERMINATETYPE__H__
#define __ETERMINATETYPE__H__
#include <cstdint>
enum class eTerminateType : uint32_t {
RANGE,
USER,
FROM_INTERACTION
};
#endif //!__ETERMINATETYPE__H__

View File

@@ -0,0 +1,119 @@
#ifndef __ETRIGGERCOMMANDTYPE__H__
#define __ETRIGGERCOMMANDTYPE__H__
// For info about Trigger Command see:
// https://docs.lu-dev.net/en/latest/file-structures/lutriggers.html?highlight=trigger#possible-values-commands
enum class eTriggerCommandType {
INVALID,
ZONE_PLAYER,
FIRE_EVENT,
DESTROY_OBJ,
TOGGLE_TRIGGER,
RESET_REBUILD,
SET_PATH,
SET_PICK_TYPE,
MOVE_OBJECT,
ROTATE_OBJECT,
PUSH_OBJECT,
REPEL_OBJECT,
SET_TIMER,
CANCEL_TIMER,
PLAY_CINEMATIC,
TOGGLE_BBB,
UPDATE_MISSION,
SET_BOUNCER_STATE,
BOUNCE_ALL_ON_BOUNCER,
TURN_AROUND_ON_PATH,
GO_FORWARD_ON_PATH,
GO_BACKWARD_ON_PATH,
STOP_PATHING,
START_PATHING,
LOCK_OR_UNLOCK_CONTROLS,
PLAY_EFFECT,
STOP_EFFECT,
ACTIVATE_MUSIC_CUE,
DEACTIVATE_MUSIC_CUE,
FLASH_MUSIC_CUE,
SET_MUSIC_PARAMETER,
PLAY_2D_AMBIENT_SOUND,
STOP_2D_AMBIENT_SOUND,
PLAY_3D_AMBIENT_SOUND,
STOP_3D_AMBIENT_SOUND,
ACTIVATE_MIXER_PROGRAM,
DEACTIVATE_MIXER_PROGRAM,
CAST_SKILL,
DISPLAY_ZONE_SUMMARY,
SET_PHYSICS_VOLUME_EFFECT,
SET_PHYSICS_VOLUME_STATUS,
SET_MODEL_TO_BUILD,
SPAWN_MODEL_BRICKS,
ACTIVATE_SPAWNER_NETWORK,
DEACTIVATE_SPAWNER_NETWORK,
RESET_SPAWNER_NETWORK,
DESTROY_SPAWNER_NETWORK_OBJECTS,
GO_TO_WAYPOINT,
ACTIVATE_PHYSICS
};
class TriggerCommandType {
public:
static eTriggerCommandType StringToTriggerCommandType(std::string commandString) {
const std::map<std::string, eTriggerCommandType> TriggerCommandMap = {
{ "zonePlayer", eTriggerCommandType::ZONE_PLAYER},
{ "fireEvent", eTriggerCommandType::FIRE_EVENT},
{ "destroyObj", eTriggerCommandType::DESTROY_OBJ},
{ "toggleTrigger", eTriggerCommandType::TOGGLE_TRIGGER},
{ "resetRebuild", eTriggerCommandType::RESET_REBUILD},
{ "setPath", eTriggerCommandType::SET_PATH},
{ "setPickType", eTriggerCommandType::SET_PICK_TYPE},
{ "moveObject", eTriggerCommandType::MOVE_OBJECT},
{ "rotateObject", eTriggerCommandType::ROTATE_OBJECT},
{ "pushObject", eTriggerCommandType::PUSH_OBJECT},
{ "repelObject", eTriggerCommandType::REPEL_OBJECT},
{ "setTimer", eTriggerCommandType::SET_TIMER},
{ "cancelTimer", eTriggerCommandType::CANCEL_TIMER},
{ "playCinematic", eTriggerCommandType::PLAY_CINEMATIC},
{ "toggleBBB", eTriggerCommandType::TOGGLE_BBB},
{ "updateMission", eTriggerCommandType::UPDATE_MISSION},
{ "setBouncerState", eTriggerCommandType::SET_BOUNCER_STATE},
{ "bounceAllOnBouncer", eTriggerCommandType::BOUNCE_ALL_ON_BOUNCER},
{ "turnAroundOnPath", eTriggerCommandType::TURN_AROUND_ON_PATH},
{ "goForwardOnPath", eTriggerCommandType::GO_FORWARD_ON_PATH},
{ "goBackwardOnPath", eTriggerCommandType::GO_BACKWARD_ON_PATH},
{ "stopPathing", eTriggerCommandType::STOP_PATHING},
{ "startPathing", eTriggerCommandType::START_PATHING},
{ "LockOrUnlockControls", eTriggerCommandType::LOCK_OR_UNLOCK_CONTROLS},
{ "PlayEffect", eTriggerCommandType::PLAY_EFFECT},
{ "StopEffect", eTriggerCommandType::STOP_EFFECT},
{ "activateMusicCue", eTriggerCommandType::ACTIVATE_MUSIC_CUE},
{ "deactivateMusicCue", eTriggerCommandType::DEACTIVATE_MUSIC_CUE},
{ "flashMusicCue", eTriggerCommandType::FLASH_MUSIC_CUE},
{ "setMusicParameter", eTriggerCommandType::SET_MUSIC_PARAMETER},
{ "play2DAmbientSound", eTriggerCommandType::PLAY_2D_AMBIENT_SOUND},
{ "stop2DAmbientSound", eTriggerCommandType::STOP_2D_AMBIENT_SOUND},
{ "play3DAmbientSound", eTriggerCommandType::PLAY_3D_AMBIENT_SOUND},
{ "stop3DAmbientSound", eTriggerCommandType::STOP_3D_AMBIENT_SOUND},
{ "activateMixerProgram", eTriggerCommandType::ACTIVATE_MIXER_PROGRAM},
{ "deactivateMixerProgram", eTriggerCommandType::DEACTIVATE_MIXER_PROGRAM},
{ "CastSkill", eTriggerCommandType::CAST_SKILL},
{ "displayZoneSummary", eTriggerCommandType::DISPLAY_ZONE_SUMMARY},
{ "SetPhysicsVolumeEffect", eTriggerCommandType::SET_PHYSICS_VOLUME_EFFECT},
{ "SetPhysicsVolumeStatus", eTriggerCommandType::SET_PHYSICS_VOLUME_STATUS},
{ "setModelToBuild", eTriggerCommandType::SET_MODEL_TO_BUILD},
{ "spawnModelBricks", eTriggerCommandType::SPAWN_MODEL_BRICKS},
{ "ActivateSpawnerNetwork", eTriggerCommandType::ACTIVATE_SPAWNER_NETWORK},
{ "DeactivateSpawnerNetwork", eTriggerCommandType::DEACTIVATE_SPAWNER_NETWORK},
{ "ResetSpawnerNetwork", eTriggerCommandType::RESET_SPAWNER_NETWORK},
{ "DestroySpawnerNetworkObjects", eTriggerCommandType::DESTROY_SPAWNER_NETWORK_OBJECTS},
{ "Go_To_Waypoint", eTriggerCommandType::GO_TO_WAYPOINT},
{ "ActivatePhysics", eTriggerCommandType::ACTIVATE_PHYSICS}
};
auto intermed = TriggerCommandMap.find(commandString);
return (intermed != TriggerCommandMap.end()) ? intermed->second : eTriggerCommandType::INVALID;
};
};
#endif //!__ETRIGGERCOMMANDTYPE__H__

View File

@@ -0,0 +1,53 @@
#ifndef __ETRIGGEREVENTTYPE__H__
#define __ETRIGGEREVENTTYPE__H__
enum class eTriggerEventType {
INVALID,
DESTROY,
CUSTOM_EVENT,
ENTER,
EXIT,
CREATE,
HIT,
TIMER_DONE,
REBUILD_COMPLETE,
ACTIVATED,
DEACTIVATED,
ARRIVED,
ARRIVED_AT_END_OF_PATH,
ZONE_SUMMARY_DISMISSED,
ARRIVED_AT_DESIRED_WAYPOINT,
PET_ON_SWITCH,
PET_OFF_SWITCH,
INTERACT
};
class TriggerEventType {
public:
static eTriggerEventType StringToTriggerEventType(std::string commandString) {
const std::map<std::string, eTriggerEventType> TriggerEventMap = {
{"OnDestroy", eTriggerEventType::DESTROY},
{"OnCustomEvent", eTriggerEventType::CUSTOM_EVENT},
{"OnEnter", eTriggerEventType::ENTER},
{"OnExit", eTriggerEventType::EXIT},
{"OnCreate", eTriggerEventType::CREATE},
{"OnHit", eTriggerEventType::HIT},
{"OnTimerDone", eTriggerEventType::TIMER_DONE},
{"OnRebuildComplete", eTriggerEventType::REBUILD_COMPLETE},
{"OnActivated", eTriggerEventType::ACTIVATED},
{"OnDectivated", eTriggerEventType::DEACTIVATED}, // Dectivated vs Deactivated
{"OnArrived", eTriggerEventType::ARRIVED},
{"OnArrivedAtEndOfPath", eTriggerEventType::ARRIVED_AT_END_OF_PATH},
{"OnZoneSummaryDismissed", eTriggerEventType::ZONE_SUMMARY_DISMISSED},
{"OnArrivedAtDesiredWaypoint", eTriggerEventType::ARRIVED_AT_DESIRED_WAYPOINT},
{"OnPetOnSwitch", eTriggerEventType::PET_ON_SWITCH},
{"OnPetOffSwitch", eTriggerEventType::PET_OFF_SWITCH},
{"OnInteract", eTriggerEventType::INTERACT},
};
auto intermed = TriggerEventMap.find(commandString);
return (intermed != TriggerEventMap.end()) ? intermed->second : eTriggerEventType::INVALID;
};
};
#endif //!__ETRIGGEREVENTTYPE__H__

View File

@@ -0,0 +1,12 @@
#ifndef __EUSEITEMRESPONSE__H__
#define __EUSEITEMRESPONSE__H__
#include <cstdint>
enum class eUseItemResponse : uint32_t {
NoImaginationForPet = 1,
FailedPrecondition,
MountsNotAllowed
};
#endif //!__EUSEITEMRESPONSE__H__

View File

@@ -0,0 +1,42 @@
#ifndef __EWORLDMESSAGETYPE__H__
#define __EWORLDMESSAGETYPE__H__
#include <cstdint>
enum class eWorldMessageType : uint32_t {
VALIDATION = 1, // Session info
CHARACTER_LIST_REQUEST,
CHARACTER_CREATE_REQUEST,
LOGIN_REQUEST, // Character selected
GAME_MSG,
CHARACTER_DELETE_REQUEST,
CHARACTER_RENAME_REQUEST,
HAPPY_FLOWER_MODE_NOTIFY,
SLASH_RELOAD_MAP, // Reload map cmp
SLASH_PUSH_MAP_REQUEST, // Push map req cmd
SLASH_PUSH_MAP, // Push map cmd
SLASH_PULL_MAP, // Pull map cmd
LOCK_MAP_REQUEST,
GENERAL_CHAT_MESSAGE, // General chat message
HTTP_MONITOR_INFO_REQUEST,
SLASH_DEBUG_SCRIPTS, // Debug scripts cmd
MODELS_CLEAR,
EXHIBIT_INSERT_MODEL,
LEVEL_LOAD_COMPLETE, // Character data request
TMP_GUILD_CREATE,
ROUTE_PACKET, // Social?
POSITION_UPDATE,
MAIL,
WORD_CHECK, // Whitelist word check
STRING_CHECK, // Whitelist string check
GET_PLAYERS_IN_ZONE,
REQUEST_UGC_MANIFEST_INFO,
BLUEPRINT_GET_ALL_DATA_REQUEST,
CANCEL_MAP_QUEUE,
HANDLE_FUNNESS,
FAKE_PRG_CSR_MESSAGE,
REQUEST_FREE_TRIAL_REFRESH,
GM_SET_FREE_TRIAL_STATUS
};
#endif //!__EWORLDMESSAGETYPE__H__

View File

@@ -16,9 +16,6 @@
// Enable this to cache all entries in each table for fast access, comes with more memory cost
//#define CDCLIENT_CACHE_ALL
// Enable this to skip some unused columns in some tables
#define UNUSED(v)
/*!
\file CDClientDatabase.hpp
\brief An interface between the CDClient.sqlite file and the server

View File

@@ -1,46 +1,80 @@
#include "CDClientManager.h"
#include "CDActivityRewardsTable.h"
#include "CDAnimationsTable.h"
#include "CDBehaviorParameterTable.h"
#include "CDBehaviorTemplateTable.h"
#include "CDComponentsRegistryTable.h"
#include "CDCurrencyTableTable.h"
#include "CDDestructibleComponentTable.h"
#include "CDEmoteTable.h"
#include "CDInventoryComponentTable.h"
#include "CDItemComponentTable.h"
#include "CDItemSetsTable.h"
#include "CDItemSetSkillsTable.h"
#include "CDLevelProgressionLookupTable.h"
#include "CDLootMatrixTable.h"
#include "CDLootTableTable.h"
#include "CDMissionNPCComponentTable.h"
#include "CDMissionTasksTable.h"
#include "CDMissionsTable.h"
#include "CDObjectSkillsTable.h"
#include "CDObjectsTable.h"
#include "CDPhysicsComponentTable.h"
#include "CDRebuildComponentTable.h"
#include "CDScriptComponentTable.h"
#include "CDSkillBehaviorTable.h"
#include "CDZoneTableTable.h"
#include "CDVendorComponentTable.h"
#include "CDActivitiesTable.h"
#include "CDPackageComponentTable.h"
#include "CDProximityMonitorComponentTable.h"
#include "CDMovementAIComponentTable.h"
#include "CDBrickIDTableTable.h"
#include "CDRarityTableTable.h"
#include "CDMissionEmailTable.h"
#include "CDRewardsTable.h"
#include "CDPropertyEntranceComponentTable.h"
#include "CDPropertyTemplateTable.h"
#include "CDFeatureGatingTable.h"
#include "CDRailActivatorComponent.h"
// Static Variables
CDClientManager* CDClientManager::m_Address = nullptr;
//! Initializes the manager
void CDClientManager::Initialize(void) {
tables.insert(std::make_pair("ActivityRewards", new CDActivityRewardsTable()));
UNUSED(tables.insert(std::make_pair("Animations", new CDAnimationsTable())));
tables.insert(std::make_pair("BehaviorParameter", new CDBehaviorParameterTable()));
tables.insert(std::make_pair("BehaviorTemplate", new CDBehaviorTemplateTable()));
tables.insert(std::make_pair("ComponentsRegistry", new CDComponentsRegistryTable()));
tables.insert(std::make_pair("CurrencyTable", new CDCurrencyTableTable()));
tables.insert(std::make_pair("DestructibleComponent", new CDDestructibleComponentTable()));
tables.insert(std::make_pair("EmoteTable", new CDEmoteTableTable()));
tables.insert(std::make_pair("InventoryComponent", new CDInventoryComponentTable()));
tables.insert(std::make_pair("ItemComponent", new CDItemComponentTable()));
tables.insert(std::make_pair("ItemSets", new CDItemSetsTable()));
tables.insert(std::make_pair("ItemSetSkills", new CDItemSetSkillsTable()));
tables.insert(std::make_pair("LevelProgressionLookup", new CDLevelProgressionLookupTable()));
tables.insert(std::make_pair("LootMatrix", new CDLootMatrixTable()));
tables.insert(std::make_pair("LootTable", new CDLootTableTable()));
tables.insert(std::make_pair("MissionNPCComponent", new CDMissionNPCComponentTable()));
tables.insert(std::make_pair("MissionTasks", new CDMissionTasksTable()));
tables.insert(std::make_pair("Missions", new CDMissionsTable()));
tables.insert(std::make_pair("ObjectSkills", new CDObjectSkillsTable()));
tables.insert(std::make_pair("Objects", new CDObjectsTable()));
tables.insert(std::make_pair("PhysicsComponent", new CDPhysicsComponentTable()));
tables.insert(std::make_pair("RebuildComponent", new CDRebuildComponentTable()));
tables.insert(std::make_pair("ScriptComponent", new CDScriptComponentTable()));
tables.insert(std::make_pair("SkillBehavior", new CDSkillBehaviorTable()));
tables.insert(std::make_pair("ZoneTable", new CDZoneTableTable()));
tables.insert(std::make_pair("VendorComponent", new CDVendorComponentTable()));
tables.insert(std::make_pair("Activities", new CDActivitiesTable()));
tables.insert(std::make_pair("PackageComponent", new CDPackageComponentTable()));
tables.insert(std::make_pair("ProximityMonitorComponent", new CDProximityMonitorComponentTable()));
tables.insert(std::make_pair("MovementAIComponent", new CDMovementAIComponentTable()));
tables.insert(std::make_pair("BrickIDTable", new CDBrickIDTableTable()));
tables.insert(std::make_pair("RarityTable", new CDRarityTableTable()));
tables.insert(std::make_pair("MissionEmail", new CDMissionEmailTable()));
tables.insert(std::make_pair("Rewards", new CDRewardsTable()));
tables.insert(std::make_pair("PropertyEntranceComponent", new CDPropertyEntranceComponentTable()));
tables.insert(std::make_pair("PropertyTemplate", new CDPropertyTemplateTable()));
tables.insert(std::make_pair("FeatureGating", new CDFeatureGatingTable()));
tables.insert(std::make_pair("RailActivatorComponent", new CDRailActivatorComponentTable()));
CDClientManager::CDClientManager() {
CDActivityRewardsTable::Instance();
CDAnimationsTable::Instance();
CDBehaviorParameterTable::Instance();
CDBehaviorTemplateTable::Instance();
CDComponentsRegistryTable::Instance();
CDCurrencyTableTable::Instance();
CDDestructibleComponentTable::Instance();
CDEmoteTableTable::Instance();
CDInventoryComponentTable::Instance();
CDItemComponentTable::Instance();
CDItemSetsTable::Instance();
CDItemSetSkillsTable::Instance();
CDLevelProgressionLookupTable::Instance();
CDLootMatrixTable::Instance();
CDLootTableTable::Instance();
CDMissionNPCComponentTable::Instance();
CDMissionTasksTable::Instance();
CDMissionsTable::Instance();
CDObjectSkillsTable::Instance();
CDObjectsTable::Instance();
CDPhysicsComponentTable::Instance();
CDRebuildComponentTable::Instance();
CDScriptComponentTable::Instance();
CDSkillBehaviorTable::Instance();
CDZoneTableTable::Instance();
CDVendorComponentTable::Instance();
CDActivitiesTable::Instance();
CDPackageComponentTable::Instance();
CDProximityMonitorComponentTable::Instance();
CDMovementAIComponentTable::Instance();
CDBrickIDTableTable::Instance();
CDRarityTableTable::Instance();
CDMissionEmailTable::Instance();
CDRewardsTable::Instance();
CDPropertyEntranceComponentTable::Instance();
CDPropertyTemplateTable::Instance();
CDFeatureGatingTable::Instance();
CDRailActivatorComponentTable::Instance();
}

View File

@@ -1,96 +1,26 @@
#pragma once
// Custom Classes
#include "CDTable.h"
// Tables
#include "CDActivityRewardsTable.h"
#include "CDAnimationsTable.h"
#include "CDBehaviorParameterTable.h"
#include "CDBehaviorTemplateTable.h"
#include "CDComponentsRegistryTable.h"
#include "CDCurrencyTableTable.h"
#include "CDDestructibleComponentTable.h"
#include "CDEmoteTable.h"
#include "CDInventoryComponentTable.h"
#include "CDItemComponentTable.h"
#include "CDItemSetsTable.h"
#include "CDItemSetSkillsTable.h"
#include "CDLevelProgressionLookupTable.h"
#include "CDLootMatrixTable.h"
#include "CDLootTableTable.h"
#include "CDMissionNPCComponentTable.h"
#include "CDMissionTasksTable.h"
#include "CDMissionsTable.h"
#include "CDObjectSkillsTable.h"
#include "CDObjectsTable.h"
#include "CDPhysicsComponentTable.h"
#include "CDRebuildComponentTable.h"
#include "CDScriptComponentTable.h"
#include "CDSkillBehaviorTable.h"
#include "CDZoneTableTable.h"
#include "CDVendorComponentTable.h"
#include "CDActivitiesTable.h"
#include "CDPackageComponentTable.h"
#include "CDProximityMonitorComponentTable.h"
#include "CDMovementAIComponentTable.h"
#include "CDBrickIDTableTable.h"
#include "CDRarityTableTable.h"
#include "CDMissionEmailTable.h"
#include "CDRewardsTable.h"
#include "CDPropertyEntranceComponentTable.h"
#include "CDPropertyTemplateTable.h"
#include "CDFeatureGatingTable.h"
#include "CDRailActivatorComponent.h"
#include "Singleton.h"
// C++
#include <type_traits>
#include <unordered_map>
#define UNUSED_TABLE(v)
/*!
\file CDClientManager.hpp
\brief A manager for the CDClient tables
/**
* Initialize the CDClient tables so they are all loaded into memory.
*/
//! Manages all data from the CDClient
class CDClientManager {
private:
static CDClientManager* m_Address; //!< The singleton address
std::unordered_map<std::string, CDTable*> tables; //!< The tables
class CDClientManager : public Singleton<CDClientManager> {
public:
CDClientManager();
//! The singleton method
static CDClientManager* Instance() {
if (m_Address == 0) {
m_Address = new CDClientManager;
}
return m_Address;
}
//! Initializes the manager
void Initialize(void);
//! Fetches a CDClient table
/*!
This function uses typename T which must be a subclass of CDTable.
It returns the class that conforms to the class name
\param tableName The table name
\return The class or nullptr
/**
* Fetch a table from CDClient
*
* @tparam Table type to fetch
* @return A pointer to the requested table.
*/
template<typename T>
T* GetTable(const std::string& tableName) {
static_assert(std::is_base_of<CDTable, T>::value, "T should inherit from CDTable!");
for (auto itr = this->tables.begin(); itr != this->tables.end(); ++itr) {
if (itr->first == tableName) {
return dynamic_cast<T*>(itr->second);
}
}
return nullptr;
T* GetTable() {
return &T::Instance();
}
};

View File

@@ -1,6 +1,5 @@
#include "CDActivitiesTable.h"
//! Constructor
CDActivitiesTable::CDActivitiesTable(void) {
// First, get the size of the table
@@ -48,15 +47,6 @@ CDActivitiesTable::CDActivitiesTable(void) {
tableData.finalize();
}
//! Destructor
CDActivitiesTable::~CDActivitiesTable(void) {}
//! Returns the table's name
std::string CDActivitiesTable::GetName(void) const {
return "Activities";
}
//! Queries the table with a custom "where" clause
std::vector<CDActivities> CDActivitiesTable::Query(std::function<bool(CDActivities)> predicate) {
std::vector<CDActivities> data = cpplinq::from(this->entries)
@@ -66,7 +56,6 @@ std::vector<CDActivities> CDActivitiesTable::Query(std::function<bool(CDActiviti
return data;
}
//! Gets all the entries in the table
std::vector<CDActivities> CDActivitiesTable::GetEntries(void) const {
return this->entries;
}

View File

@@ -3,12 +3,6 @@
// Custom Classes
#include "CDTable.h"
/*!
\file CDActivitiesTable.hpp
\brief Contains data for the Activities table
*/
//! Activities Entry Struct
struct CDActivities {
unsigned int ActivityID;
unsigned int locStatus;
@@ -31,36 +25,14 @@ struct CDActivities {
float optionalPercentage;
};
//! Activities table
class CDActivitiesTable : public CDTable {
class CDActivitiesTable : public CDTable<CDActivitiesTable> {
private:
std::vector<CDActivities> entries;
public:
//! Constructor
CDActivitiesTable(void);
//! Destructor
~CDActivitiesTable(void);
//! Returns the table's name
/*!
\return The table name
*/
std::string GetName(void) const override;
//! Queries the table with a custom "where" clause
/*!
\param predicate The predicate
*/
CDActivitiesTable();
// Queries the table with a custom "where" clause
std::vector<CDActivities> Query(std::function<bool(CDActivities)> predicate);
//! Gets all the entries in the table
/*!
\return The entries
*/
std::vector<CDActivities> GetEntries(void) const;
};

View File

@@ -1,6 +1,5 @@
#include "CDActivityRewardsTable.h"
//! Constructor
CDActivityRewardsTable::CDActivityRewardsTable(void) {
// First, get the size of the table
@@ -36,15 +35,6 @@ CDActivityRewardsTable::CDActivityRewardsTable(void) {
tableData.finalize();
}
//! Destructor
CDActivityRewardsTable::~CDActivityRewardsTable(void) {}
//! Returns the table's name
std::string CDActivityRewardsTable::GetName(void) const {
return "ActivityRewards";
}
//! Queries the table with a custom "where" clause
std::vector<CDActivityRewards> CDActivityRewardsTable::Query(std::function<bool(CDActivityRewards)> predicate) {
std::vector<CDActivityRewards> data = cpplinq::from(this->entries)
@@ -54,7 +44,6 @@ std::vector<CDActivityRewards> CDActivityRewardsTable::Query(std::function<bool(
return data;
}
//! Gets all the entries in the table
std::vector<CDActivityRewards> CDActivityRewardsTable::GetEntries(void) const {
return this->entries;
}

Some files were not shown because too many files have changed in this diff Show More