@@ -6,19 +6,43 @@ import world.gregs.voidps.engine.client.update.view.Viewport
66import world.gregs.voidps.engine.entity.character.player.Player
77import world.gregs.voidps.engine.entity.character.player.Players
88import world.gregs.voidps.network.login.protocol.encode.updatePlayers
9- import world.gregs.voidps.network.login.protocol.visual.PlayerVisuals
10- import world.gregs.voidps.network.login.protocol.visual.VisualEncoder
9+ import world.gregs.voidps.network.login.protocol.visual.VisualMask
1110import world.gregs.voidps.network.login.protocol.visual.VisualMask.APPEARANCE_MASK
11+ import world.gregs.voidps.network.login.protocol.visual.VisualMask.APPEARANCE_MASK_INV
12+ import world.gregs.voidps.network.login.protocol.visual.encode.SayEncoder
13+ import world.gregs.voidps.network.login.protocol.visual.encode.WatchEncoder
14+ import world.gregs.voidps.network.login.protocol.visual.encode.player.AppearanceEncoder
15+ import world.gregs.voidps.network.login.protocol.visual.encode.player.MovementTypeEncoder
16+ import world.gregs.voidps.network.login.protocol.visual.encode.player.PlayerAnimationEncoder
17+ import world.gregs.voidps.network.login.protocol.visual.encode.player.PlayerColourOverlayEncoder
18+ import world.gregs.voidps.network.login.protocol.visual.encode.player.PlayerExactMovementEncoder
19+ import world.gregs.voidps.network.login.protocol.visual.encode.player.PlayerFaceEncoder
20+ import world.gregs.voidps.network.login.protocol.visual.encode.player.PlayerHitsEncoder
21+ import world.gregs.voidps.network.login.protocol.visual.encode.player.PlayerPrimaryGraphicEncoder
22+ import world.gregs.voidps.network.login.protocol.visual.encode.player.PlayerSecondaryGraphicEncoder
23+ import world.gregs.voidps.network.login.protocol.visual.encode.player.PlayerTimeBarEncoder
24+ import world.gregs.voidps.network.login.protocol.visual.encode.player.TemporaryMoveTypeEncoder
1225import world.gregs.voidps.type.Delta
1326import kotlin.math.abs
1427
1528class PlayerUpdateTask (
1629 private val players : Players ,
17- private val encoders : List <VisualEncoder <PlayerVisuals >>,
1830) {
19-
20- private val initialEncoders = encoders.filter { it.initial }
21- private val initialFlag = initialEncoders.sumOf { it.mask }
31+ private val watchEncoder = WatchEncoder (VisualMask .PLAYER_WATCH_MASK )
32+ private val playerTimeBarEncoder = PlayerTimeBarEncoder ()
33+ private val sayEncoder = SayEncoder (VisualMask .PLAYER_SAY_MASK )
34+ private val playerHitsEncoder = PlayerHitsEncoder ()
35+ private val playerFaceEncoder = PlayerFaceEncoder ()
36+ private val playerExactMovementEncoder = PlayerExactMovementEncoder ()
37+ private val playerSecondaryGraphicEncoder = PlayerSecondaryGraphicEncoder ()
38+ private val playerColourOverlayEncoder = PlayerColourOverlayEncoder ()
39+ private val movementTypeEncoder = MovementTypeEncoder ()
40+ private val playerPrimaryGraphicEncoder = PlayerPrimaryGraphicEncoder ()
41+ private val playerAnimationEncoder = PlayerAnimationEncoder ()
42+ private val appearanceEncoder = AppearanceEncoder ()
43+ private val temporaryMoveTypeEncoder = TemporaryMoveTypeEncoder ()
44+
45+ private val initialFlag = VisualMask .PLAYER_FACE_MASK + VisualMask .MOVEMENT_TYPE_MASK + VisualMask .PLAYER_ANIMATION_MASK + VisualMask .APPEARANCE_MASK + VisualMask .TEMPORARY_MOVEMENT_TYPE_MASK
2246
2347 fun run (player : Player ) {
2448 val viewport = player.viewport ? : return
@@ -85,7 +109,7 @@ class PlayerUpdateTask(
85109 }
86110
87111 encodeMovement(updateType, sync, viewport, player)
88- encodeVisuals(updates, flag, player, client, set, encoders )
112+ encodeVisuals(updates, flag, player, client, set)
89113 }
90114
91115 if (skip > - 1 ) {
@@ -114,16 +138,49 @@ class PlayerUpdateTask(
114138 viewport.seen(player)
115139 }
116140
117- private fun encodeVisuals (updates : Writer , flag : Int , player : Player , client : Player , set : PlayerTrackingSet , encoders : List < VisualEncoder < PlayerVisuals >> ) {
141+ private fun encodeVisuals (updates : Writer , flag : Int , player : Player , client : Player , set : PlayerTrackingSet ) {
118142 if (flag == 0 ) {
119143 return
120144 }
121145 writeFlag(updates, flag)
122- for (encoder in encoders) {
123- if (flag and encoder.mask == 0 ) {
124- continue
125- }
126- encoder.encode(updates, player.visuals, client.index)
146+ if (flag and VisualMask .PLAYER_WATCH_MASK != 0 ) {
147+ watchEncoder.encode(updates, player.visuals, client.index)
148+ }
149+ if (flag and VisualMask .PLAYER_TIME_BAR_MASK != 0 ) {
150+ playerTimeBarEncoder.encode(updates, player.visuals, client.index)
151+ }
152+ if (flag and VisualMask .PLAYER_SAY_MASK != 0 ) {
153+ sayEncoder.encode(updates, player.visuals, client.index)
154+ }
155+ if (flag and VisualMask .PLAYER_HITS_MASK != 0 ) {
156+ playerHitsEncoder.encode(updates, player.visuals, client.index)
157+ }
158+ if (flag and VisualMask .PLAYER_FACE_MASK != 0 ) {
159+ playerFaceEncoder.encode(updates, player.visuals, client.index)
160+ }
161+ if (flag and VisualMask .PLAYER_EXACT_MOVEMENT_MASK != 0 ) {
162+ playerExactMovementEncoder.encode(updates, player.visuals, client.index)
163+ }
164+ if (flag and VisualMask .PLAYER_GRAPHIC_2_MASK != 0 ) {
165+ playerSecondaryGraphicEncoder.encode(updates, player.visuals, client.index)
166+ }
167+ if (flag and VisualMask .PLAYER_COLOUR_OVERLAY_MASK != 0 ) {
168+ playerColourOverlayEncoder.encode(updates, player.visuals, client.index)
169+ }
170+ if (flag and VisualMask .MOVEMENT_TYPE_MASK != 0 ) {
171+ movementTypeEncoder.encode(updates, player.visuals, client.index)
172+ }
173+ if (flag and VisualMask .PLAYER_GRAPHIC_1_MASK != 0 ) {
174+ playerPrimaryGraphicEncoder.encode(updates, player.visuals, client.index)
175+ }
176+ if (flag and VisualMask .PLAYER_ANIMATION_MASK != 0 ) {
177+ playerAnimationEncoder.encode(updates, player.visuals, client.index)
178+ }
179+ if (flag and APPEARANCE_MASK != 0 ) {
180+ appearanceEncoder.encode(updates, player.visuals, client.index)
181+ }
182+ if (flag and VisualMask .TEMPORARY_MOVEMENT_TYPE_MASK != 0 ) {
183+ temporaryMoveTypeEncoder.encode(updates, player.visuals, client.index)
127184 }
128185 if (flag and APPEARANCE_MASK != 0 ) {
129186 set.updateAppearance(player)
@@ -137,7 +194,7 @@ class PlayerUpdateTask(
137194 private fun updateFlag (updates : Writer , player : Player , set : PlayerTrackingSet ): Int {
138195 val visuals = player.visuals
139196 if (updates.position() + visuals.appearance.length >= MAX_UPDATE_SIZE ) {
140- return visuals.flag and APPEARANCE_MASK . inv ()
197+ return visuals.flag and APPEARANCE_MASK_INV
141198 }
142199 if (set.needsAppearanceUpdate(player)) {
143200 return visuals.flag or APPEARANCE_MASK
@@ -220,7 +277,7 @@ class PlayerUpdateTask(
220277 sync.writeBits(6 , player.tile.y and 0x3f )
221278 sync.writeBits(1 , appearance)
222279 if (appearance) {
223- encodeVisuals(updates, initialFlag, player, client, set, initialEncoders )
280+ encodeVisuals(updates, initialFlag, player, client, set)
224281 }
225282 }
226283 if (skip > - 1 ) {
@@ -234,9 +291,9 @@ class PlayerUpdateTask(
234291 * @return true when within [Viewport.radius] and packet has enough room
235292 */
236293 private fun add (player : Player , client : Player , viewport : Viewport , updates : Writer , sync : Writer ): Boolean = player.client?.disconnected != true &&
237- player.tile.within(client.tile, viewport.radius) &&
238- updates.position() < MAX_UPDATE_SIZE &&
239- sync.position() < MAX_SYNC_SIZE
294+ player.tile.within(client.tile, viewport.radius) &&
295+ updates.position() < MAX_UPDATE_SIZE &&
296+ sync.position() < MAX_SYNC_SIZE
240297
241298 fun writeSkip (sync : Writer , skip : Int ) {
242299 sync.writeBits(1 , 0 )
0 commit comments