Skip to content

Commit

Permalink
match related experiments
Browse files Browse the repository at this point in the history
  • Loading branch information
hex-agon committed Jul 6, 2023
1 parent 79944ae commit bd58cb0
Show file tree
Hide file tree
Showing 27 changed files with 1,234 additions and 46 deletions.
4 changes: 4 additions & 0 deletions common/src/main/kotlin/work/fking/pangya/common/Rand.kt
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@ class Rand private constructor() {
return builder.toString()
}

fun nextInt(): Int {
return RANDOM.nextInt()
}

fun nextLong(): Long {
return RANDOM.nextLong()
}
Expand Down
10 changes: 4 additions & 6 deletions game-server/src/main/kotlin/work/fking/pangya/game/GameServer.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import work.fking.pangya.common.server.ServerConfig
import work.fking.pangya.game.net.ServerChannelInitializer
import work.fking.pangya.game.player.Item
import work.fking.pangya.game.player.Player
import work.fking.pangya.game.player.luciaItems
import work.fking.pangya.networking.selectBestEventLoopAvailable
import work.fking.pangya.networking.selectBestServerChannelAvailable
import java.net.InetAddress
Expand Down Expand Up @@ -66,22 +67,19 @@ class GameServer(
characterRoster.unlockCharacter(67108872)

val caddieRoster = player.caddieRoster
caddieRoster.unlockCaddie(469762048)
caddieRoster.unlockCaddie(469762083)

val inventory = player.inventory
inventory.add(Item(iffId = 268435511)) // clubset
inventory.add(Item(iffId = 335544382, quantity = 100)) // comets
inventory.add(Item(iffId = 436207656, quantity = 100)) // papel shop coupons

// lucia items
inventory.add(Item(iffId = 136331265))
inventory.add(Item(iffId = 136423465))
inventory.add(Item(iffId = 136456205))
inventory.add(Item(iffId = 136456192))
luciaItems.forEach { inventory.add(Item(iffId = it)) }

val equipment = player.equipment
characterRoster.findByIffId(67108872)?.let(equipment::equipCharacter)
caddieRoster.findByIffId(469762048)?.let(equipment::equipCaddie)
caddieRoster.findByIffId(469762083)?.let(equipment::equipCaddie)
inventory.findByIffId(268435511)?.let(equipment::equipClubSet)
inventory.findByIffId(335544382)?.let(equipment::equipComet)

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
package work.fking.pangya.game.model

data class Coord(val x: Float, val z: Float)
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,14 @@ import work.fking.pangya.game.packet.handler.RareShopOpenPacketHandler
import work.fking.pangya.game.packet.handler.SelectChannelPacketHandler
import work.fking.pangya.game.packet.handler.UpdateChatMacrosPacketHandler
import work.fking.pangya.game.packet.handler.UserProfileRequestPacketHandler
import work.fking.pangya.game.packet.handler.match.MatchPlayerHoleFinishPacketHandler
import work.fking.pangya.game.packet.handler.match.MatchFinishPlayerPreviewPacketHandler
import work.fking.pangya.game.packet.handler.match.MatchHoleStartPacketHandler
import work.fking.pangya.game.packet.handler.match.MatchPlayerRotateAimPacketHandler
import work.fking.pangya.game.packet.handler.match.MatchPlayerShotCommitPacketHandler
import work.fking.pangya.game.packet.handler.match.MatchPlayerTurnEndPacketHandler
import work.fking.pangya.game.packet.handler.match.MatchPlayerShotStartPacketHandler
import work.fking.pangya.game.packet.handler.match.StartGamePacketHandler
import work.fking.pangya.game.packet.handler.room.CreateRoomPacketHandler
import work.fking.pangya.game.packet.handler.room.LeaveRoomPacketHandler
import work.fking.pangya.game.packet.handler.room.RoomSettingsUpdatePacketHandler
Expand All @@ -24,9 +32,26 @@ enum class ClientPacketType(
SELECT_CHANNEL(0x4, SelectChannelPacketHandler()),
ROOM_CREATE(0x8, CreateRoomPacketHandler()),
ROOM_SETTINGS_UPDATE(0xa, RoomSettingsUpdatePacketHandler()),
PLAYER_EQUIPMENT_CONFIRM(0xb),
PLAYER_EQUIPMENT_CONFIRM2(0xc),
START_MATCH(0xe, StartGamePacketHandler()),
ROOM_LEAVE(0xf, LeaveRoomPacketHandler()),
MATCH_HOLE_LOAD_FINISHED(0x11),
MATCH_PLAYER_SHOT_COMMIT(0x12, MatchPlayerShotCommitPacketHandler()),
MATCH_PLAYER_ROTATE_AIM(0x13, MatchPlayerRotateAimPacketHandler()),
MATCH_PLAYER_SHOT_START(0x14, MatchPlayerShotStartPacketHandler()),
MATCH_PLAYER_POWER_TOGGLE(0x15),
MATCH_PLAYER_CHANGE_CLUB(0x16),
MATCH_HOLE_START(0x1a, MatchHoleStartPacketHandler()),
MATCH_PLAYER_SHOT_SYNC(0x1b),
MATCH_PLAYER_SHOT_END(0x1c, MatchPlayerTurnEndPacketHandler()),
EQUIPMENT_UPDATE(0x20, EquipmentUpdatePacketHandler()),
MATCH_PLAYER_TURN_START(0x22),
USER_PROFILE_REQUEST(0x2f, UserProfileRequestPacketHandler()),
MATCH_PLAYER_HOLE_FINISH(0x31, MatchPlayerHoleFinishPacketHandler()),
MATCH_FINISH_PLAYER_PREVIEW(0x34, MatchFinishPlayerPreviewPacketHandler()),
MATCH_PLAYER_SHOT_ARROW(0x42),
PLAYER_LOAD_PROGRESS(0x48),
LOUNGE_USER_ACTION(0x63),
UPDATE_MACROS(0x69, UpdateChatMacrosPacketHandler()),
JOIN_LOBBY(0x81, JoinLobbyPacketHandler()),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@ class ProtocolDecoder(
override fun decode(ctx: ChannelHandlerContext, buffer: ByteBuf, out: MutableList<Any>) {
PangCrypt.decrypt(buffer, cryptKey)
val packetId = buffer.readShortLE().toInt()
LOGGER.trace("Incoming packetId=0x{}", Integer.toHexString(packetId))
val packetType = protocol.forId(packetId)
LOGGER.trace("Incoming packet {} (0x{})", packetType, Integer.toHexString(packetId))

if (packetType == null) {
LOGGER.warn("Unknown packetId=0x{}", Integer.toHexString(packetId))
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package work.fking.pangya.game.packet.handler.match

import io.netty.buffer.ByteBuf
import work.fking.pangya.game.GameServer
import work.fking.pangya.game.net.ClientPacketHandler
import work.fking.pangya.game.player.Player
import work.fking.pangya.game.room.match.PlayerFinishedPreviewEvent

class MatchFinishPlayerPreviewPacketHandler : ClientPacketHandler {
override fun handle(server: GameServer, player: Player, packet: ByteBuf) {
val room = player.currentRoom ?: throw IllegalStateException("Player ${player.nickname} started a hole but is not in a room")
val roomPlayer = room.findSelf(player)
room.handleMatchEvent(PlayerFinishedPreviewEvent(roomPlayer))
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package work.fking.pangya.game.packet.handler.match

import io.netty.buffer.ByteBuf
import work.fking.pangya.game.GameServer
import work.fking.pangya.game.model.Coord
import work.fking.pangya.game.net.ClientPacketHandler
import work.fking.pangya.game.player.Player
import work.fking.pangya.game.room.match.PlayerHoleStartEvent

class MatchHoleStartPacketHandler : ClientPacketHandler {
override fun handle(server: GameServer, player: Player, packet: ByteBuf) {
val room = player.currentRoom ?: throw IllegalStateException("Player ${player.nickname} started a hole but is not in a room")
val roomPlayer = room.findSelf(player)

val hole = packet.readUnsignedByte()
val unknown1 = packet.readIntLE()
val unknown2 = packet.readIntLE()
val par = packet.readByte()
val teeCoord = Coord(packet.readFloatLE(), packet.readFloatLE())
val holeCoord = Coord(packet.readFloatLE(), packet.readFloatLE())


room.handleMatchEvent(PlayerHoleStartEvent(
player = roomPlayer,
hole = hole.toInt(),
par = par.toInt(),
teeCoord = teeCoord,
holeCoord = holeCoord
))
// roomPlayer.finishedHole = false
// println("${player.nickname} hole start")
//
// player.write(MatchReplies.gameHoleWeather())
// player.write(MatchReplies.gameHoleWind())
// player.write(MatchReplies.gamePlayerStartHole(player))
// player.flush()
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package work.fking.pangya.game.packet.handler.match

import io.netty.buffer.ByteBuf
import work.fking.pangya.game.GameServer
import work.fking.pangya.game.net.ClientPacketHandler
import work.fking.pangya.game.player.Player
import work.fking.pangya.game.room.match.PlayerHoleFinishEvent

class MatchPlayerHoleFinishPacketHandler : ClientPacketHandler {
override fun handle(server: GameServer, player: Player, packet: ByteBuf) {
val room = player.currentRoom ?: throw IllegalStateException("Player ${player.nickname} finished a hole but is not in a room")
val roomPlayer = room.findSelf(player)
room.handleMatchEvent(PlayerHoleFinishEvent(roomPlayer))
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package work.fking.pangya.game.packet.handler.match

import io.netty.buffer.ByteBuf
import work.fking.pangya.game.GameServer
import work.fking.pangya.game.net.ClientPacketHandler
import work.fking.pangya.game.player.Player
import work.fking.pangya.game.room.match.PlayerRotateEvent

class MatchPlayerRotateAimPacketHandler : ClientPacketHandler {
override fun handle(server: GameServer, player: Player, packet: ByteBuf) {
val room = player.currentRoom ?: throw IllegalStateException("Player ${player.nickname} finished a hole but is not in a room")
val roomPlayer = room.findSelf(player)
val rotation = packet.readFloatLE()
room.handleMatchEvent(PlayerRotateEvent(roomPlayer, rotation))
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package work.fking.pangya.game.packet.handler.match

import io.netty.buffer.ByteBuf
import work.fking.pangya.game.GameServer
import work.fking.pangya.game.net.ClientPacketHandler
import work.fking.pangya.game.player.Player
import work.fking.pangya.game.room.match.PlayerShotCommitEvent
import work.fking.pangya.game.room.match.ShotData

class MatchPlayerShotCommitPacketHandler : ClientPacketHandler {
override fun handle(server: GameServer, player: Player, packet: ByteBuf) {
val room = player.currentRoom ?: throw IllegalStateException("Player ${player.nickname} finished a hole but is not in a room")
val roomPlayer = room.findSelf(player)

val shotType = packet.readShortLE().toInt()

if (shotType == 1) { // ??
val bytes = ByteArray(9)
packet.readBytes(bytes)
println(bytes.contentToString())
}
val shotData = ShotData(
maxClick = packet.readFloatLE(),
minClick = packet.readFloatLE(),
curve = packet.readFloatLE(),
spin = packet.readFloatLE(),
accuracy = packet.readUnsignedByte().toInt(),
special = packet.readIntLE(),
frame = packet.readIntLE(),
shotAngle = packet.readFloatLE(),
shotTime = packet.readIntLE(),
center = packet.readFloatLE(),
clubIndex = packet.readUnsignedByte().toInt(),
randomPower = packet.readFloatLE(),
randomAngle = packet.readFloatLE(),
impactWidth = packet.readFloatLE(),
windPower = packet.readFloatLE(),
windDirection = packet.readFloatLE()
)
room.handleMatchEvent(PlayerShotCommitEvent(roomPlayer, shotData))
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package work.fking.pangya.game.packet.handler.match

import io.netty.buffer.ByteBuf
import work.fking.pangya.game.GameServer
import work.fking.pangya.game.net.ClientPacketHandler
import work.fking.pangya.game.player.Player
import work.fking.pangya.game.room.match.PlayerShotStartEvent

class MatchPlayerShotStartPacketHandler : ClientPacketHandler {
override fun handle(server: GameServer, player: Player, packet: ByteBuf) {
val room = player.currentRoom ?: throw IllegalStateException("Player ${player.nickname} finished a hole but is not in a room")
val roomPlayer = room.findSelf(player)
// 0 = idle, 1 = going up, 2 = going down
val state = packet.readUnsignedByte()
val click = packet.readFloatLE()
room.handleMatchEvent(PlayerShotStartEvent(roomPlayer))
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package work.fking.pangya.game.packet.handler.match

import io.netty.buffer.ByteBuf
import work.fking.pangya.game.GameServer
import work.fking.pangya.game.net.ClientPacketHandler
import work.fking.pangya.game.player.Player
import work.fking.pangya.game.room.match.PlayerTurnEndEvent

class MatchPlayerTurnEndPacketHandler : ClientPacketHandler {
override fun handle(server: GameServer, player: Player, packet: ByteBuf) {
val room = player.currentRoom ?: throw IllegalStateException("Player ${player.nickname} finished it's turn but is not in a room")
val roomPlayer = room.findSelf(player)

room.handleMatchEvent(PlayerTurnEndEvent(roomPlayer))

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package work.fking.pangya.game.packet.handler.match

import io.netty.buffer.ByteBuf
import work.fking.pangya.game.GameServer
import work.fking.pangya.game.net.ClientPacketHandler
import work.fking.pangya.game.player.Player

class StartGamePacketHandler : ClientPacketHandler {
override fun handle(server: GameServer, player: Player, packet: ByteBuf) {
val room = player.currentRoom ?: throw IllegalStateException("Player ${player.nickname} tried to start a game without being in a room")
room.startGame()
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
package work.fking.pangya.game.packet.outbound

import work.fking.pangya.game.room.Course
import work.fking.pangya.game.model.CourseStatistics
import work.fking.pangya.game.player.Caddie
import work.fking.pangya.game.player.Player
import work.fking.pangya.game.player.PlayerBasicInfo
import work.fking.pangya.game.player.PlayerStatistic
import work.fking.pangya.game.player.PlayerTrophies
import work.fking.pangya.game.player.Player
import work.fking.pangya.game.room.Course
import work.fking.pangya.networking.protocol.OutboundPacket
import work.fking.pangya.networking.protocol.writeFixedSizeString
import work.fking.pangya.networking.protocol.writePString
Expand Down Expand Up @@ -64,31 +65,27 @@ object HandoverReplies {
player.equipment.encode(buffer)

// Season historical stats
for (i in 0..11) { // for each season...
for (j in 0..20) { // for each course...
repeat(12) { // for each season...
repeat(21) { // for each course...
CourseStatistics(Course.BLUE_LAGOON).serialize(buffer)
}
}

// Active Character
player.equippedCharacter().encode(buffer)

// Active Caddie
player.activeCaddie()!!.encode(buffer)
val caddie = player.activeCaddie() ?: Caddie.nullCaddie()
caddie.encode(buffer)

// Active Clubset
buffer.writeIntLE(2000) // item unique id
buffer.writeIntLE(player.inventory.findByIffId(268435511)!!.uid) // item unique id
buffer.writeIntLE(268435511) // item iff id
buffer.writeShortLE(5) // power slot
buffer.writeShortLE(4) // control slot
buffer.writeShortLE(3) // accuracy slot
buffer.writeShortLE(2) // spin slot
buffer.writeShortLE(1) // curve slot
buffer.writeShortLE(1) // power upgrades?
buffer.writeShortLE(2) // control upgrades?
buffer.writeShortLE(3) // accuracy upgrades?
buffer.writeShortLE(4) // spin upgrades?
buffer.writeShortLE(5) // curve upgrades?
buffer.writeZero(10)
buffer.writeShortLE(0) // power upgrades?
buffer.writeShortLE(0) // control upgrades?
buffer.writeShortLE(0) // accuracy upgrades?
buffer.writeShortLE(0) // spin upgrades?
buffer.writeShortLE(0) // curve upgrades?

// Active Mascot
buffer.writeIntLE(0) // item unique id
Expand All @@ -111,9 +108,9 @@ object HandoverReplies {
buffer.writeShortLE(0) // unknown

// Papel shop info?
buffer.writeShortLE(3)
buffer.writeShortLE(2)
buffer.writeShortLE(5)
buffer.writeShortLE(0)
buffer.writeShortLE(0)
buffer.writeShortLE(0)
buffer.writeIntLE(0) // unknown
buffer.writeLongLE((1 shl 2).toLong()) // disabled server features, 0x4 = disables mail
buffer.writeIntLE(0) // unknown, ss = login count
Expand Down
Loading

0 comments on commit bd58cb0

Please sign in to comment.