├── .github └── workflows │ └── maven.yml ├── .gitignore ├── LICENSE.md ├── README.md ├── agent-server ├── pom.xml └── src │ ├── main │ ├── java │ │ └── pl │ │ │ └── cwanix │ │ │ └── opensun │ │ │ └── agentserver │ │ │ ├── AgentServerApplication.java │ │ │ ├── AgentServerConfiguration.java │ │ │ ├── controllers │ │ │ └── AuthController.java │ │ │ ├── engine │ │ │ ├── experimental │ │ │ │ └── maps │ │ │ │ │ ├── MapInfoLoader.java │ │ │ │ │ ├── ZoneType.java │ │ │ │ │ ├── objects │ │ │ │ │ ├── FieldInfo.java │ │ │ │ │ ├── MapInfo.java │ │ │ │ │ ├── MapObjectInfo.java │ │ │ │ │ ├── SectorInfo.java │ │ │ │ │ ├── TriggerGroupInfo.java │ │ │ │ │ └── WorldBase.java │ │ │ │ │ └── structures │ │ │ │ │ ├── FieldInfoStructure.java │ │ │ │ │ └── MapInfoStructure.java │ │ │ ├── maps │ │ │ │ ├── MapInfoManager.java │ │ │ │ ├── MapInfoParser.java │ │ │ │ ├── MapPortalInfoManager.java │ │ │ │ ├── MapPortalInfoParser.java │ │ │ │ └── structures │ │ │ │ │ ├── MapInfoStructure.java │ │ │ │ │ └── PortalInfoStructure.java │ │ │ └── npc │ │ │ │ ├── NpcInfoParser.java │ │ │ │ ├── ShopInfoParser.java │ │ │ │ └── structures │ │ │ │ ├── NpcInfoStructure.java │ │ │ │ ├── ShopInfoStructure.java │ │ │ │ ├── ShopItemStructure.java │ │ │ │ └── ShopTabStructure.java │ │ │ ├── packets │ │ │ ├── AgentServerPacketOPCode.java │ │ │ ├── c2s │ │ │ │ ├── character │ │ │ │ │ ├── C2SAskCreateCharPacket.java │ │ │ │ │ ├── C2SAskDeleteCharPacket.java │ │ │ │ │ └── C2SAskFreeCharNamePacket.java │ │ │ │ ├── connection │ │ │ │ │ ├── C2SAskEnterServerPacket.java │ │ │ │ │ ├── C2SAskEnterVillagePacket.java │ │ │ │ │ └── C2SAskWordConnectPacket.java │ │ │ │ ├── item │ │ │ │ │ └── C2SAskQuickLinkSkillPacket.java │ │ │ │ ├── skill │ │ │ │ │ └── C2SAskAddSkillPointPacket.java │ │ │ │ ├── status │ │ │ │ │ └── C2SAskStatSelectPacket.java │ │ │ │ ├── sync │ │ │ │ │ ├── C2SAskJumpMovePacket.java │ │ │ │ │ ├── C2SAskKeyboardMovePacket.java │ │ │ │ │ ├── C2SAskMouseMovePacket.java │ │ │ │ │ └── C2SAskPlayerEnterPacket.java │ │ │ │ ├── unknown │ │ │ │ │ └── C2SEA09Packet.java │ │ │ │ └── zone │ │ │ │ │ └── C2SAskVillageMovePacket.java │ │ │ ├── processors │ │ │ │ ├── character │ │ │ │ │ ├── C2SAskCreateCharProcessor.java │ │ │ │ │ ├── C2SAskDeleteCharProcessor.java │ │ │ │ │ └── C2SAskFreeCharNameProcessor.java │ │ │ │ ├── connection │ │ │ │ │ ├── C2SAskEnterServerProcessor.java │ │ │ │ │ ├── C2SAskEnterVillageProcessor.java │ │ │ │ │ └── C2SAskWorldConnectProcessor.java │ │ │ │ ├── item │ │ │ │ │ └── C2SAskQuickLinkSkillProcessor.java │ │ │ │ ├── skill │ │ │ │ │ └── C2SAskAddSkillPointProcessor.java │ │ │ │ ├── status │ │ │ │ │ └── C2SAskStatSelectProcessor.java │ │ │ │ ├── sync │ │ │ │ │ ├── C2SAskJumpMoveProcessor.java │ │ │ │ │ ├── C2SAskKeyboardMoveProcessor.java │ │ │ │ │ ├── C2SAskMouseMoveProcessor.java │ │ │ │ │ └── C2SAskPlayerEnterProcessor.java │ │ │ │ ├── unknown │ │ │ │ │ └── C2SEA09Processor.java │ │ │ │ └── zone │ │ │ │ │ └── C2SAskVillageMoveProcessor.java │ │ │ ├── s2c │ │ │ │ ├── character │ │ │ │ │ ├── S2CAnsCreateCharPacket.java │ │ │ │ │ ├── S2CAnsDeleteCharPacket.java │ │ │ │ │ ├── S2CAnsItemsPacket.java │ │ │ │ │ ├── S2CAnsQuickPacket.java │ │ │ │ │ ├── S2CAnsSkillsPacket.java │ │ │ │ │ ├── S2CAnsStatePacket.java │ │ │ │ │ ├── S2CAnsStylePacket.java │ │ │ │ │ ├── S2CErrCreateCharPacket.java │ │ │ │ │ └── S2CErrDeleteCharPacket.java │ │ │ │ ├── connection │ │ │ │ │ ├── S2CAnsEnterServerPacket.java │ │ │ │ │ ├── S2CAnsEnterVillagePacket.java │ │ │ │ │ └── S2CAnsWorldConnectPacket.java │ │ │ │ ├── item │ │ │ │ │ ├── S2CAnsQuickLinkSkillPacket.java │ │ │ │ │ └── S2CErrQuickLinkSkillPacket.java │ │ │ │ ├── status │ │ │ │ │ ├── S2CAnsRecoverAttrMpPacket.java │ │ │ │ │ ├── S2CAnsRecoverAttrPacket.java │ │ │ │ │ ├── S2CAnsStatSelectPacket.java │ │ │ │ │ └── S2CErrStatSelectPacket.java │ │ │ │ ├── sync │ │ │ │ │ ├── S2CAnsAllPlayersEquipInfoPacket.java │ │ │ │ │ ├── S2CAnsAllPlayersGuildInfoPacket.java │ │ │ │ │ └── S2CAnsPlayerEnterPacket.java │ │ │ │ └── zone │ │ │ │ │ ├── S2CAnsVillageMovePacket.java │ │ │ │ │ └── S2CErrVillageMovePacket.java │ │ │ └── structures │ │ │ │ ├── ClientCharacterPartPacketStructure.java │ │ │ │ ├── EquipItemInfoPacketStructure.java │ │ │ │ ├── InventoryTotalInfoPacketStructure.java │ │ │ │ ├── ItemPartPacketStructure.java │ │ │ │ ├── ItemSlotPacketStructure.java │ │ │ │ ├── OptionPartPacketStructure.java │ │ │ │ ├── PlayerInfoPacketStructure.java │ │ │ │ ├── RenderEquipInfoPacketStructure.java │ │ │ │ ├── RenderItemPartPacketStructure.java │ │ │ │ ├── RenderItemSlotPacketStructure.java │ │ │ │ └── StateSlotPacketStructure.java │ │ │ ├── properties │ │ │ └── AgentServerProperties.java │ │ │ └── server │ │ │ ├── AgentServerChannelHandler.java │ │ │ ├── AgentServerChannelHandlerFactory.java │ │ │ └── session │ │ │ ├── AgentServerSession.java │ │ │ └── AgentServerSessionManager.java │ └── resources │ │ ├── agent-server.properties_template │ │ ├── application.properties │ │ └── banner.txt │ └── test │ └── groovy │ └── pl │ └── cwanix │ └── opensun │ └── agentserver │ └── engine │ └── experimental │ └── maps │ └── objects │ └── FieldInfoTest.groovy ├── auth-server ├── pom.xml └── src │ └── main │ ├── java │ └── pl │ │ └── cwanix │ │ └── opensun │ │ └── authserver │ │ ├── AuthServerApplication.java │ │ ├── AuthServerConfiguration.java │ │ ├── communication │ │ └── DatabaseProxyConnector.java │ │ ├── packet │ │ ├── AuthServerPacketOPCode.java │ │ ├── c2s │ │ │ └── auth │ │ │ │ ├── C2SAskAuthPacket.java │ │ │ │ ├── C2SAskSrvListPacket.java │ │ │ │ ├── C2SAskSrvSelectPacket.java │ │ │ │ └── C2SAskVerifyPacket.java │ │ ├── processors │ │ │ └── auth │ │ │ │ ├── C2SAskAuthProcessor.java │ │ │ │ ├── C2SAskSrvListProcessor.java │ │ │ │ ├── C2SAskSrvSelectProcessor.java │ │ │ │ └── C2SAskVerifyProcessor.java │ │ ├── s2c │ │ │ └── auth │ │ │ │ ├── S2CAnsAuthPacket.java │ │ │ │ ├── S2CAnsHelloPacket.java │ │ │ │ ├── S2CAnsSrvListPacket.java │ │ │ │ ├── S2CAnsSrvSelectPacket.java │ │ │ │ ├── S2CAnsSrvStatePacket.java │ │ │ │ └── S2CAnsVerifyPacket.java │ │ └── structures │ │ │ ├── ChannelUnitStructure.java │ │ │ └── ServerUnitStructure.java │ │ ├── properties │ │ └── AuthServerProperties.java │ │ └── server │ │ ├── AuthServerChannelHandler.java │ │ ├── AuthServerChannelHandlerFactory.java │ │ └── session │ │ ├── AuthServerSession.java │ │ └── AuthServerSessionManager.java │ └── resources │ ├── application.properties │ ├── auth-server.properties_template │ └── banner.txt ├── checkstyle.xml ├── common-server ├── pom.xml └── src │ └── main │ ├── java │ └── pl │ │ └── cwanix │ │ └── opensun │ │ └── commonserver │ │ ├── SUNServerAutoConfiguration.java │ │ ├── configuration │ │ └── PacketTypeLoader.java │ │ ├── packets │ │ ├── Packet.java │ │ ├── PacketException.java │ │ ├── PacketStructure.java │ │ ├── SUNPacketProcessor.java │ │ ├── SUNPacketProcessorExecutor.java │ │ ├── annotations │ │ │ ├── IncomingPacket.java │ │ │ ├── OutgoingPacket.java │ │ │ └── PacketProcessor.java │ │ ├── c2s │ │ │ └── C2SAskUnknownPacket.java │ │ └── processors │ │ │ ├── C2SAskUnknownLoggingProcessor.java │ │ │ ├── C2SAskUnknownMockProcessor.java │ │ │ └── C2SAskUnknownProcessor.java │ │ ├── properties │ │ ├── SUNServerClientProperties.java │ │ ├── SUNServerExternalServerProperties.java │ │ └── SUNServerProperties.java │ │ ├── server │ │ ├── SUNServer.java │ │ ├── SUNServerChannelHandler.java │ │ ├── SUNServerChannelHandlerFactory.java │ │ ├── SUNServerChannelInitializer.java │ │ └── messages │ │ │ ├── PacketDecoder.java │ │ │ └── PacketEncoder.java │ │ └── session │ │ ├── SUNSession.java │ │ └── SUNSessionManager.java │ └── resources │ ├── META-INF │ └── spring.factories │ └── application.properties ├── db-direct-connector ├── pom.xml └── src │ └── main │ ├── java │ └── pl │ │ └── cwanix │ │ └── opensun │ │ └── db │ │ ├── SUNDBDirectConnectorAutoConfiguration.java │ │ ├── account │ │ ├── AccountDataSourceImpl.java │ │ ├── entity │ │ │ ├── AccountEntity.java │ │ │ └── UserEntity.java │ │ └── repository │ │ │ └── UserEntityRepository.java │ │ ├── character │ │ ├── CharacterDataSourceImpl.java │ │ ├── entity │ │ │ ├── CharacterEntity.java │ │ │ ├── CharacterPositionEntity.java │ │ │ └── InventoryEntity.java │ │ └── repository │ │ │ └── CharacterEntityRepository.java │ │ └── server │ │ ├── ServerDataSourceImpl.java │ │ ├── entity │ │ ├── ChannelEntity.java │ │ └── ServerEntity.java │ │ └── repository │ │ ├── ChannelEntityRepository.java │ │ └── ServerEntityRepository.java │ └── resources │ ├── META-INF │ └── spring.factories │ └── application.properties ├── db-server ├── pom.xml └── src │ └── main │ ├── java │ └── pl │ │ └── cwanix │ │ └── opensun │ │ └── db │ │ ├── DBServerApplication.java │ │ ├── DBServerConfiguration.java │ │ ├── controllers │ │ ├── ChannelController.java │ │ ├── CharacterController.java │ │ ├── ServerController.java │ │ └── UserController.java │ │ ├── entities │ │ ├── AccountEntity.java │ │ ├── ChannelEntity.java │ │ ├── CharacterEntity.java │ │ ├── CharacterPositionEntity.java │ │ ├── InventoryEntity.java │ │ ├── ServerEntity.java │ │ └── UserEntity.java │ │ └── repositories │ │ ├── ChannelEntityRepository.java │ │ ├── CharacterEntityRepository.java │ │ ├── ServerEntityRepository.java │ │ └── UserEntityRepository.java │ └── resources │ ├── application.properties │ ├── banner.txt │ ├── db-server.properties_template │ └── db │ ├── config │ ├── V0_0_1__server_list.sql │ └── V0_0_2__channel_list.sql │ └── public │ ├── V0_0_10__character_statistics.sql │ ├── V0_0_11__character_movement_angle.sql │ ├── V0_0_12__character_creation_angle_fix.sql │ ├── V0_0_13__character_change_region.sql │ ├── V0_0_1__user_account_and_character.sql │ ├── V0_0_2__character_functions.sql │ ├── V0_0_3__change_id_type_to_int.sql │ ├── V0_0_4__character_set_fix.sql │ ├── V0_0_5__character_functions_update.sql │ ├── V0_0_6__server_list.sql │ ├── V0_0_7__character_movement.sql │ ├── V0_0_8__cleaning_after_migration_to_separate_schema.sql │ └── V0_0_9__uppercase_login.sql ├── game-server ├── pom.xml └── src │ └── main │ ├── java │ └── pl │ │ └── cwanix │ │ └── opensun │ │ └── gameserver │ │ └── GameServerApplication.java │ └── resources │ ├── application.properties │ └── banner.txt ├── model ├── pom.xml └── src │ └── main │ └── java │ └── pl │ └── cwanix │ └── opensun │ └── model │ ├── account │ ├── AccountDataSource.java │ ├── AccountModel.java │ └── UserModel.java │ ├── character │ ├── CharacterDataSource.java │ ├── CharacterModel.java │ ├── CharacterPositionModel.java │ └── InventoryModel.java │ └── server │ ├── ChannelModel.java │ ├── ServerDataSource.java │ └── ServerModel.java ├── pom.xml ├── utils ├── pom.xml └── src │ ├── main │ └── java │ │ └── pl │ │ └── cwanix │ │ └── opensun │ │ └── utils │ │ ├── bytes │ │ ├── BitField.java │ │ ├── ByteRange.java │ │ └── BytesUtils.java │ │ ├── datatypes │ │ ├── FixedLengthField.java │ │ ├── PacketHeader.java │ │ ├── SUNAABB.java │ │ ├── SUNColor.java │ │ ├── SUNDataType.java │ │ ├── SUNId.java │ │ └── Vector.java │ │ ├── encryption │ │ └── TEA.java │ │ ├── files │ │ ├── SUNArchive.java │ │ ├── SUNArchiveChunkInfo.java │ │ ├── SUNFilePacker.java │ │ └── SUNFileReader.java │ │ └── functions │ │ └── ThrowingFunction.java │ └── test │ ├── java │ └── pl │ │ └── cwanix │ │ └── opensun │ │ └── utils │ │ ├── encryption │ │ └── TEATest.java │ │ └── files │ │ └── SUNFileReaderTest.java │ └── resources │ └── encryption │ ├── Dec1.dat │ ├── Dec2.dat │ ├── Enc1.dat │ └── Enc2.dat └── world-server ├── pom.xml └── src └── main ├── java └── pl │ └── cwanix │ └── opensun │ └── worldserver │ ├── WorldServerApplication.java │ ├── WorldServerConfiguration.java │ ├── communication │ └── DatabaseProxyConnector.java │ ├── packets │ ├── WorldServerPacketOPCode.java │ ├── c2s │ │ ├── connection │ │ │ ├── C2S483CPacket.java │ │ │ └── C2S4860Packet.java │ │ └── sync │ │ │ └── C2SFD60Packet.java │ ├── processors │ │ └── sync │ │ │ ├── C2S483CProcessor.java │ │ │ ├── C2S4860Processor.java │ │ │ └── C2SFD60Processor.java │ └── s2c │ │ └── connection │ │ └── S2C486CPacket.java │ ├── properties │ └── WorldServerProperties.java │ └── server │ ├── WorldServerChannelHandler.java │ └── WorldServerChannelHandlerFactory.java └── resources ├── application.properties ├── banner.txt └── world-server.properties_template /.github/workflows/maven.yml: -------------------------------------------------------------------------------- 1 | # This workflow will build a Java project with Maven 2 | # For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-maven 3 | 4 | name: Java CI with Maven 5 | 6 | on: 7 | push: 8 | branches: [ master ] 9 | pull_request: 10 | branches: [ master ] 11 | 12 | jobs: 13 | build: 14 | 15 | runs-on: ubuntu-latest 16 | 17 | steps: 18 | - uses: actions/checkout@v2 19 | - name: Set up JDK 1.8 20 | uses: actions/setup-java@v1 21 | with: 22 | java-version: 1.8 23 | - name: Build with Maven 24 | run: mvn -B package --file pom.xml 25 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.project 2 | *.classpath 3 | *.iml 4 | .idea/ 5 | .settings/ 6 | target/ 7 | auth-server/.settings/ 8 | auth-server/target/ 9 | auth-server/bin/ 10 | game-server/.settings/ 11 | game-server/target/ 12 | game-server/bin/ 13 | world-server/.settings/ 14 | world-server/target/ 15 | world-server/bin/ 16 | agent-server/.settings/ 17 | agent-server/target/ 18 | agent-server/bin/ 19 | common-server/.settings/ 20 | common-server/target/ 21 | common-server/bin/ 22 | db-server/.settings/ 23 | db-server/target/ 24 | db-server/bin/ 25 | console/.settings/ 26 | console/target/ 27 | console/bin/ 28 | console/src/main/webapp/dist/ 29 | console/src/main/webapp/node/ 30 | console/src/main/webapp/node-modules/ 31 | utils/target/ 32 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | Copyright 2019 CwaniX 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 4 | 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 | 7 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/AgentServerApplication.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | @SuppressWarnings("checkstyle:HideUtilityClassConstructor") 8 | public class AgentServerApplication { 9 | 10 | public static void main(final String[] args) { 11 | SpringApplication.run(AgentServerApplication.class, args); 12 | } 13 | 14 | } 15 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/AgentServerConfiguration.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver; 2 | 3 | import org.springframework.boot.context.properties.EnableConfigurationProperties; 4 | import org.springframework.context.annotation.Configuration; 5 | import org.springframework.context.annotation.PropertySource; 6 | 7 | import pl.cwanix.opensun.agentserver.properties.AgentServerProperties; 8 | 9 | @Configuration 10 | @PropertySource("file:${application.location}/config/agent-server.properties") 11 | @EnableConfigurationProperties(AgentServerProperties.class) 12 | public class AgentServerConfiguration { 13 | 14 | } 15 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/controllers/AuthController.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.controllers; 2 | 3 | import lombok.RequiredArgsConstructor; 4 | import lombok.extern.slf4j.Slf4j; 5 | import org.slf4j.Marker; 6 | import org.slf4j.MarkerFactory; 7 | import org.springframework.web.bind.annotation.PostMapping; 8 | import org.springframework.web.bind.annotation.RequestMapping; 9 | import org.springframework.web.bind.annotation.RequestParam; 10 | import org.springframework.web.bind.annotation.RestController; 11 | import pl.cwanix.opensun.agentserver.server.session.AgentServerSessionManager; 12 | import pl.cwanix.opensun.model.account.AccountDataSource; 13 | import pl.cwanix.opensun.model.account.UserModel; 14 | 15 | @Slf4j 16 | @RestController 17 | @RequestMapping("/session") 18 | @RequiredArgsConstructor 19 | public class AuthController { 20 | 21 | private static final Marker MARKER = MarkerFactory.getMarker("AUTH CONTROLLER"); 22 | 23 | private final AccountDataSource accountDataSource; 24 | private final AgentServerSessionManager sessionManager; 25 | 26 | @PostMapping(path = "/new", produces = "application/json") 27 | public Integer create(@RequestParam("userName") final String userName) { 28 | log.info(MARKER, "Starting new session for user with name: {}", userName); 29 | 30 | final UserModel user = accountDataSource.findUser(userName); 31 | 32 | if (user == null) { 33 | log.error(MARKER, "Unable to start session for user with name: {}", userName); 34 | return 1; 35 | } else { 36 | sessionManager.startNewSession(user); 37 | } 38 | 39 | return 0; 40 | } 41 | 42 | } 43 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/engine/experimental/maps/ZoneType.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.engine.experimental.maps; 2 | 3 | import lombok.AllArgsConstructor; 4 | 5 | @AllArgsConstructor 6 | public enum ZoneType { 7 | VILLAGE(1); 8 | 9 | private final int type; 10 | 11 | public byte getType() { 12 | return (byte) this.type; 13 | } 14 | 15 | public boolean equals(final int value) { 16 | return type == value; 17 | } 18 | 19 | public boolean equals(final ZoneType value) { 20 | return type == value.getType(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/engine/experimental/maps/objects/MapInfo.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.engine.experimental.maps.objects; 2 | 3 | import lombok.Getter; 4 | import lombok.RequiredArgsConstructor; 5 | import lombok.Setter; 6 | import pl.cwanix.opensun.agentserver.engine.experimental.maps.structures.MapInfoStructure; 7 | 8 | @Getter 9 | @Setter 10 | @RequiredArgsConstructor 11 | public class MapInfo { 12 | 13 | private final MapInfoStructure mapInfoStructure; 14 | private final FieldInfo fieldInfo; 15 | } 16 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/engine/experimental/maps/objects/MapObjectInfo.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.engine.experimental.maps.objects; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | import pl.cwanix.opensun.utils.datatypes.SUNId; 6 | import pl.cwanix.opensun.utils.datatypes.Vector; 7 | 8 | @Getter 9 | @Setter 10 | public class MapObjectInfo { 11 | 12 | private int mapObjectInfoId; 13 | private SUNId id; 14 | private int attribute; 15 | private Vector pos; 16 | private Vector rot; 17 | private Vector scale; 18 | //private BoundingVolume boundingVolume; 19 | 20 | } 21 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/engine/experimental/maps/objects/SectorInfo.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.engine.experimental.maps.objects; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | import java.util.List; 7 | 8 | @Getter 9 | @Setter 10 | public class SectorInfo { 11 | 12 | private static final int MAX_NEIGHBOR_SECTOR_NUM = 8; 13 | 14 | private int sectorIndex; 15 | private List neighborSectorInfoList; 16 | } 17 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/engine/experimental/maps/objects/TriggerGroupInfo.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.engine.experimental.maps.objects; 2 | 3 | public class TriggerGroupInfo { 4 | } 5 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/engine/experimental/maps/structures/FieldInfoStructure.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.engine.experimental.maps.structures; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | @Getter 7 | @Setter 8 | public class FieldInfoStructure { 9 | private int fieldCode; 10 | private String path; 11 | } 12 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/engine/experimental/maps/structures/MapInfoStructure.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.engine.experimental.maps.structures; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | @Getter 7 | @Setter 8 | public class MapInfoStructure { 9 | 10 | public static final int MAX_FIELD_NUMBER = 6; 11 | 12 | private int mapCode; 13 | private int mapKind; 14 | private String mName; 15 | private int nCode; 16 | private int fnCode; 17 | private int dCode; 18 | private int anCode; 19 | private int guildEnt; 20 | private int guildItem; 21 | private int timeLim; 22 | private int mKind; 23 | private int mType; 24 | private int minUser; 25 | private int maxUser; 26 | private int minLv; 27 | private int maxLv; 28 | private int freePassLv; 29 | private String startId; 30 | private String startId2; 31 | private int entCount; 32 | private int class1; 33 | private int fCount; 34 | private int completeQCode; 35 | private int completeMCode; 36 | private int continentCode; 37 | private byte[] mMap; 38 | private int[] pMap; 39 | private int[] cMap; 40 | } 41 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/engine/maps/MapPortalInfoManager.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.engine.maps; 2 | 3 | import lombok.RequiredArgsConstructor; 4 | import org.springframework.beans.factory.InitializingBean; 5 | import org.springframework.stereotype.Service; 6 | import pl.cwanix.opensun.agentserver.engine.maps.structures.PortalInfoStructure; 7 | import pl.cwanix.opensun.utils.bytes.BytesUtils; 8 | 9 | import java.util.Map; 10 | 11 | @SuppressWarnings("checkstyle:MagicNumber") 12 | @Service 13 | @RequiredArgsConstructor 14 | public class MapPortalInfoManager implements InitializingBean { 15 | 16 | private final MapPortalInfoParser mapPortalInfoParser; 17 | 18 | private Map portalInfoStructureMap; 19 | 20 | public PortalInfoStructure get(final byte v1, final byte from) { 21 | final int index = generateIndex(v1, from); 22 | 23 | return portalInfoStructureMap.get(index); 24 | } 25 | 26 | private int generateIndex(final byte v1, final byte from) { 27 | int key1 = BytesUtils.toUnsigned(v1); 28 | 29 | return (key1 / 64) + (from * 4); 30 | } 31 | 32 | @Override 33 | public void afterPropertiesSet() throws Exception { 34 | portalInfoStructureMap = mapPortalInfoParser.loadPortalInfo(); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/engine/maps/structures/MapInfoStructure.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.engine.maps.structures; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | import lombok.Setter; 6 | import pl.cwanix.opensun.utils.datatypes.Vector; 7 | 8 | @Getter 9 | @Setter 10 | @AllArgsConstructor 11 | public class MapInfoStructure { 12 | 13 | private int mapCode; 14 | private int mapKind; 15 | private Vector startingVector; 16 | } 17 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/engine/maps/structures/PortalInfoStructure.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.engine.maps.structures; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | @Getter 7 | @Setter 8 | public class PortalInfoStructure { 9 | 10 | private int id; 11 | private byte mapType; 12 | private byte moveType; 13 | private int mapFrom; 14 | private int fieldFrom; 15 | private String areaFrom; 16 | private int mapTo; 17 | private int fieldTo; 18 | private String areaTo; 19 | private int minLvl; 20 | private int maxLvl; 21 | private int missionCode; 22 | private int questCode; 23 | private int itemCode; 24 | private byte itemNum; 25 | private int wasteItem; 26 | private int heim; 27 | } 28 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/engine/npc/NpcInfoParser.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.engine.npc; 2 | 3 | import lombok.Getter; 4 | import lombok.RequiredArgsConstructor; 5 | import lombok.Setter; 6 | import lombok.extern.slf4j.Slf4j; 7 | import org.slf4j.Marker; 8 | import org.slf4j.MarkerFactory; 9 | import org.springframework.beans.factory.InitializingBean; 10 | import org.springframework.stereotype.Service; 11 | import pl.cwanix.opensun.agentserver.engine.npc.structures.NpcInfoStructure; 12 | import pl.cwanix.opensun.agentserver.properties.AgentServerProperties; 13 | import pl.cwanix.opensun.utils.files.SUNFileReader; 14 | 15 | import java.io.IOException; 16 | import java.util.HashMap; 17 | import java.util.Map; 18 | 19 | @Slf4j 20 | @Getter 21 | @Setter 22 | @Service 23 | @RequiredArgsConstructor 24 | public class NpcInfoParser implements InitializingBean { 25 | 26 | private static final Marker MARKER = MarkerFactory.getMarker("NPC INFO PARSER"); 27 | 28 | private static final String NPC_INFO_FILE_NAME = "npcinfo.txt"; 29 | 30 | private final AgentServerProperties properties; 31 | 32 | private Map npcInfoStructureMap; 33 | 34 | private void loadNpcInfo() throws IOException { 35 | npcInfoStructureMap = new HashMap<>(); 36 | 37 | try (SUNFileReader reader = new SUNFileReader(properties.getDataDirectory() + "/" + NPC_INFO_FILE_NAME)) { 38 | while (reader.readLine()) { 39 | NpcInfoStructure field = new NpcInfoStructure(); 40 | field.setMonsterCode(reader.readNextIntValue()); 41 | field.setName(reader.readNextStringValue()); 42 | field.setLevel(reader.readNextIntValue()); 43 | 44 | npcInfoStructureMap.put(field.getMonsterCode(), field); 45 | } 46 | } 47 | 48 | log.info(MARKER, "Loaded npc data: {}", npcInfoStructureMap.size()); 49 | } 50 | 51 | @Override 52 | public void afterPropertiesSet() throws Exception { 53 | loadNpcInfo(); 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/engine/npc/structures/NpcInfoStructure.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.engine.npc.structures; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | @Getter 7 | @Setter 8 | public class NpcInfoStructure { 9 | 10 | private int monsterCode; 11 | private String name; 12 | private int level; 13 | } 14 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/engine/npc/structures/ShopInfoStructure.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.engine.npc.structures; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | import java.util.Map; 7 | 8 | @Getter 9 | @Setter 10 | public class ShopInfoStructure { 11 | 12 | private int id; 13 | private String name; 14 | private int lottoRatio; 15 | private Map tabs; 16 | } 17 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/engine/npc/structures/ShopItemStructure.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.engine.npc.structures; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | @Getter 7 | @Setter 8 | public class ShopItemStructure { 9 | 10 | private int id; 11 | private int tabId; 12 | private int count; 13 | private int type; 14 | } 15 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/engine/npc/structures/ShopTabStructure.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.engine.npc.structures; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | import java.util.Map; 7 | 8 | @Getter 9 | @Setter 10 | public class ShopTabStructure { 11 | 12 | private int id; 13 | private int shopId; 14 | private Map items; 15 | } 16 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/packets/c2s/character/C2SAskCreateCharPacket.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.packets.c2s.character; 2 | 3 | import lombok.Getter; 4 | import lombok.extern.slf4j.Slf4j; 5 | import pl.cwanix.opensun.agentserver.packets.AgentServerPacketOPCode; 6 | import pl.cwanix.opensun.commonserver.packets.Packet; 7 | import pl.cwanix.opensun.commonserver.packets.annotations.IncomingPacket; 8 | import pl.cwanix.opensun.utils.datatypes.FixedLengthField; 9 | 10 | import java.util.Arrays; 11 | 12 | @SuppressWarnings("checkstyle:MagicNumber") 13 | @Slf4j 14 | @Getter 15 | @IncomingPacket(category = AgentServerPacketOPCode.Character.CATEGORY, operation = AgentServerPacketOPCode.Character.Ask.CREATE_CHAR) 16 | public class C2SAskCreateCharPacket implements Packet { 17 | 18 | private final FixedLengthField classCode; 19 | private final FixedLengthField charName; 20 | private final FixedLengthField heightCode; 21 | private final FixedLengthField faceCode; 22 | private final FixedLengthField hairCode; 23 | 24 | public C2SAskCreateCharPacket(final byte[] value) { 25 | this.classCode = new FixedLengthField(1, value[15]); 26 | this.charName = new FixedLengthField(16, Arrays.copyOfRange(value, 20, 37)); 27 | this.heightCode = new FixedLengthField(1, value[37]); 28 | this.faceCode = new FixedLengthField(1, value[38]); 29 | this.hairCode = new FixedLengthField(1, value[39]); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/packets/c2s/character/C2SAskDeleteCharPacket.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.packets.c2s.character; 2 | 3 | import lombok.Getter; 4 | import lombok.extern.slf4j.Slf4j; 5 | import pl.cwanix.opensun.agentserver.packets.AgentServerPacketOPCode; 6 | import pl.cwanix.opensun.commonserver.packets.Packet; 7 | import pl.cwanix.opensun.commonserver.packets.annotations.IncomingPacket; 8 | import pl.cwanix.opensun.utils.datatypes.FixedLengthField; 9 | 10 | import java.util.Arrays; 11 | 12 | @SuppressWarnings("checkstyle:MagicNumber") 13 | @Slf4j 14 | @Getter 15 | @IncomingPacket(category = AgentServerPacketOPCode.Character.CATEGORY, operation = AgentServerPacketOPCode.Character.Ask.DELETE_CHAR) 16 | public class C2SAskDeleteCharPacket implements Packet { 17 | 18 | private final FixedLengthField slotNumber; 19 | private final FixedLengthField deleteWord; 20 | 21 | public C2SAskDeleteCharPacket(final byte[] value) { 22 | this.slotNumber = new FixedLengthField(1, value[0]); 23 | this.deleteWord = new FixedLengthField(10, Arrays.copyOfRange(value, 1, value.length)); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/packets/c2s/character/C2SAskFreeCharNamePacket.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.packets.c2s.character; 2 | 3 | import pl.cwanix.opensun.agentserver.packets.AgentServerPacketOPCode; 4 | import pl.cwanix.opensun.commonserver.packets.Packet; 5 | import pl.cwanix.opensun.commonserver.packets.annotations.IncomingPacket; 6 | 7 | @IncomingPacket(category = AgentServerPacketOPCode.Character.CATEGORY, operation = AgentServerPacketOPCode.Character.Ask.FREE_CHAR_NAME) 8 | public class C2SAskFreeCharNamePacket implements Packet { 9 | 10 | public C2SAskFreeCharNamePacket(final byte[] value) { 11 | // TODO Auto-generated constructor stub 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/packets/c2s/connection/C2SAskEnterServerPacket.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.packets.c2s.connection; 2 | 3 | import lombok.Getter; 4 | import lombok.extern.slf4j.Slf4j; 5 | import pl.cwanix.opensun.agentserver.packets.AgentServerPacketOPCode; 6 | import pl.cwanix.opensun.commonserver.packets.Packet; 7 | import pl.cwanix.opensun.commonserver.packets.annotations.IncomingPacket; 8 | import pl.cwanix.opensun.utils.datatypes.FixedLengthField; 9 | 10 | import java.util.Arrays; 11 | 12 | @SuppressWarnings("checkstyle:MagicNumber") 13 | @Slf4j 14 | @Getter 15 | @IncomingPacket(category = AgentServerPacketOPCode.Connection.CATEGORY, operation = AgentServerPacketOPCode.Connection.Ask.ENTER_SERVER) 16 | public class C2SAskEnterServerPacket implements Packet { 17 | 18 | private final FixedLengthField userId; 19 | private final FixedLengthField userName; 20 | 21 | public C2SAskEnterServerPacket(final byte[] value) { 22 | this.userId = new FixedLengthField(4, Arrays.copyOfRange(value, 2, 6)); 23 | this.userName = new FixedLengthField(50, Arrays.copyOfRange(value, 7, 54)); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/packets/c2s/connection/C2SAskEnterVillagePacket.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.packets.c2s.connection; 2 | 3 | import lombok.Getter; 4 | import pl.cwanix.opensun.agentserver.packets.AgentServerPacketOPCode; 5 | import pl.cwanix.opensun.commonserver.packets.Packet; 6 | import pl.cwanix.opensun.commonserver.packets.annotations.IncomingPacket; 7 | import pl.cwanix.opensun.utils.datatypes.FixedLengthField; 8 | 9 | @SuppressWarnings("checkstyle:MagicNumber") 10 | @Getter 11 | @IncomingPacket(category = AgentServerPacketOPCode.Connection.CATEGORY, operation = AgentServerPacketOPCode.Connection.Ask.ENTER_VILLAGE) 12 | public class C2SAskEnterVillagePacket implements Packet { 13 | 14 | private final FixedLengthField selectedChar; 15 | 16 | public C2SAskEnterVillagePacket(final byte[] value) { 17 | selectedChar = new FixedLengthField(1, value[0]); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/packets/c2s/connection/C2SAskWordConnectPacket.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.packets.c2s.connection; 2 | 3 | import pl.cwanix.opensun.agentserver.packets.AgentServerPacketOPCode; 4 | import pl.cwanix.opensun.commonserver.packets.Packet; 5 | import pl.cwanix.opensun.commonserver.packets.annotations.IncomingPacket; 6 | 7 | @IncomingPacket(category = AgentServerPacketOPCode.Connection.CATEGORY, operation = AgentServerPacketOPCode.Connection.Ask.WORLD_CONNECT) 8 | public class C2SAskWordConnectPacket implements Packet { 9 | 10 | public C2SAskWordConnectPacket(final byte[] value) { 11 | // TODO Auto-generated constructor stub 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/packets/c2s/item/C2SAskQuickLinkSkillPacket.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.packets.c2s.item; 2 | 3 | import lombok.Getter; 4 | import pl.cwanix.opensun.agentserver.packets.AgentServerPacketOPCode; 5 | import pl.cwanix.opensun.commonserver.packets.Packet; 6 | import pl.cwanix.opensun.commonserver.packets.annotations.IncomingPacket; 7 | import pl.cwanix.opensun.utils.datatypes.FixedLengthField; 8 | 9 | @SuppressWarnings("checkstyle:MagicNumber") 10 | @Getter 11 | @IncomingPacket(category = AgentServerPacketOPCode.Item.CATEGORY, operation = AgentServerPacketOPCode.Item.Ask.QUICK_LINK_SKILL) 12 | public class C2SAskQuickLinkSkillPacket implements Packet { 13 | 14 | private final FixedLengthField slotCode; 15 | private final FixedLengthField position; 16 | 17 | public C2SAskQuickLinkSkillPacket(final byte[] value) { 18 | this.slotCode = new FixedLengthField(2, 0, 2, value); 19 | this.position = new FixedLengthField(1, 2, value); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/packets/c2s/skill/C2SAskAddSkillPointPacket.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.packets.c2s.skill; 2 | 3 | import lombok.extern.slf4j.Slf4j; 4 | import pl.cwanix.opensun.agentserver.packets.AgentServerPacketOPCode; 5 | import pl.cwanix.opensun.commonserver.packets.Packet; 6 | import pl.cwanix.opensun.commonserver.packets.annotations.IncomingPacket; 7 | 8 | @Slf4j 9 | @IncomingPacket(category = AgentServerPacketOPCode.Skill.CATEGORY, operation = AgentServerPacketOPCode.Skill.Ask.ADD_SKILL_POINT) 10 | public class C2SAskAddSkillPointPacket implements Packet { 11 | 12 | public C2SAskAddSkillPointPacket(final byte[] value) { 13 | 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/packets/c2s/status/C2SAskStatSelectPacket.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.packets.c2s.status; 2 | 3 | import lombok.Getter; 4 | import lombok.extern.slf4j.Slf4j; 5 | import pl.cwanix.opensun.agentserver.packets.AgentServerPacketOPCode; 6 | import pl.cwanix.opensun.commonserver.packets.Packet; 7 | import pl.cwanix.opensun.commonserver.packets.annotations.IncomingPacket; 8 | import pl.cwanix.opensun.utils.datatypes.FixedLengthField; 9 | 10 | @SuppressWarnings("checkstyle:MagicNumber") 11 | @Slf4j 12 | @Getter 13 | @IncomingPacket(category = AgentServerPacketOPCode.Status.CATEGORY, operation = AgentServerPacketOPCode.Status.Ask.STAT_SELECT) 14 | public class C2SAskStatSelectPacket implements Packet { 15 | 16 | private final FixedLengthField attributeCode; 17 | 18 | public C2SAskStatSelectPacket(final byte[] value) { 19 | this.attributeCode = new FixedLengthField(1, value); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/packets/c2s/sync/C2SAskJumpMovePacket.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.packets.c2s.sync; 2 | 3 | import pl.cwanix.opensun.agentserver.packets.AgentServerPacketOPCode; 4 | import pl.cwanix.opensun.commonserver.packets.Packet; 5 | import pl.cwanix.opensun.commonserver.packets.annotations.IncomingPacket; 6 | 7 | @IncomingPacket(category = AgentServerPacketOPCode.Sync.CATEGORY, operation = AgentServerPacketOPCode.Sync.Ask.JUMP_MOVE) 8 | public class C2SAskJumpMovePacket implements Packet { 9 | 10 | public C2SAskJumpMovePacket(final byte[] value) { 11 | // TODO Auto-generated constructor stub 12 | } 13 | 14 | } 15 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/packets/c2s/sync/C2SAskKeyboardMovePacket.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.packets.c2s.sync; 2 | 3 | import lombok.Getter; 4 | import lombok.extern.slf4j.Slf4j; 5 | import pl.cwanix.opensun.agentserver.packets.AgentServerPacketOPCode; 6 | import pl.cwanix.opensun.commonserver.packets.Packet; 7 | import pl.cwanix.opensun.commonserver.packets.annotations.IncomingPacket; 8 | import pl.cwanix.opensun.utils.datatypes.FixedLengthField; 9 | import pl.cwanix.opensun.utils.datatypes.Vector; 10 | 11 | @SuppressWarnings("checkstyle:MagicNumber") 12 | @Slf4j 13 | @Getter 14 | @IncomingPacket(category = AgentServerPacketOPCode.Sync.CATEGORY, operation = AgentServerPacketOPCode.Sync.Ask.KEYBOARD_MOVE) 15 | public class C2SAskKeyboardMovePacket implements Packet { 16 | 17 | private final Vector currentPosition; 18 | private final FixedLengthField angle; 19 | private final FixedLengthField tileIndex; 20 | private final FixedLengthField moveState; 21 | 22 | public C2SAskKeyboardMovePacket(final byte[] value) { 23 | currentPosition = new Vector(value); 24 | angle = new FixedLengthField(2, value[12], value[13]); 25 | tileIndex = new FixedLengthField(2, value[14], value[15]); 26 | moveState = new FixedLengthField(1, value[16]); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/packets/c2s/sync/C2SAskMouseMovePacket.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.packets.c2s.sync; 2 | 3 | import lombok.Getter; 4 | import lombok.extern.slf4j.Slf4j; 5 | import pl.cwanix.opensun.agentserver.packets.AgentServerPacketOPCode; 6 | import pl.cwanix.opensun.commonserver.packets.Packet; 7 | import pl.cwanix.opensun.commonserver.packets.annotations.IncomingPacket; 8 | import pl.cwanix.opensun.utils.datatypes.FixedLengthField; 9 | import pl.cwanix.opensun.utils.datatypes.Vector; 10 | 11 | import java.util.Arrays; 12 | 13 | @SuppressWarnings("checkstyle:MagicNumber") 14 | @Slf4j 15 | @Getter 16 | @IncomingPacket(category = AgentServerPacketOPCode.Sync.CATEGORY, operation = AgentServerPacketOPCode.Sync.Ask.MOUSE_MOVE) 17 | public class C2SAskMouseMovePacket implements Packet { 18 | 19 | private final FixedLengthField unknown; 20 | private final Vector currentPosition; 21 | private final Vector destinationPosition; 22 | 23 | public C2SAskMouseMovePacket(final byte[] value) { 24 | unknown = new FixedLengthField(2, value[0], value[1]); 25 | currentPosition = new Vector(Arrays.copyOfRange(value, 2, 14)); 26 | destinationPosition = new Vector(Arrays.copyOfRange(value, 14, value.length)); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/packets/c2s/sync/C2SAskPlayerEnterPacket.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.packets.c2s.sync; 2 | 3 | import pl.cwanix.opensun.agentserver.packets.AgentServerPacketOPCode; 4 | import pl.cwanix.opensun.commonserver.packets.Packet; 5 | import pl.cwanix.opensun.commonserver.packets.annotations.IncomingPacket; 6 | import pl.cwanix.opensun.utils.datatypes.FixedLengthField; 7 | 8 | @SuppressWarnings("checkstyle:MagicNumber") 9 | @IncomingPacket(category = AgentServerPacketOPCode.Sync.CATEGORY, operation = AgentServerPacketOPCode.Sync.Ask.PLAYER_ENTER) 10 | public class C2SAskPlayerEnterPacket implements Packet { 11 | 12 | private final FixedLengthField checkSum; 13 | 14 | public C2SAskPlayerEnterPacket(final byte[] value) { 15 | checkSum = new FixedLengthField(16, value); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/packets/c2s/unknown/C2SEA09Packet.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.packets.c2s.unknown; 2 | 3 | import pl.cwanix.opensun.agentserver.packets.AgentServerPacketOPCode; 4 | import pl.cwanix.opensun.commonserver.packets.Packet; 5 | import pl.cwanix.opensun.commonserver.packets.annotations.IncomingPacket; 6 | 7 | @IncomingPacket(category = AgentServerPacketOPCode.Unknown.CATEGORY, operation = AgentServerPacketOPCode.Unknown.Unk.UNK_EA09) 8 | public class C2SEA09Packet implements Packet { 9 | 10 | public C2SEA09Packet(final byte[] value) { 11 | // TODO Auto-generated constructor stub 12 | } 13 | 14 | } 15 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/packets/c2s/zone/C2SAskVillageMovePacket.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.packets.c2s.zone; 2 | 3 | import lombok.Getter; 4 | import lombok.extern.slf4j.Slf4j; 5 | import org.slf4j.Marker; 6 | import org.slf4j.MarkerFactory; 7 | import pl.cwanix.opensun.agentserver.packets.AgentServerPacketOPCode; 8 | import pl.cwanix.opensun.commonserver.packets.Packet; 9 | import pl.cwanix.opensun.commonserver.packets.annotations.IncomingPacket; 10 | import pl.cwanix.opensun.utils.datatypes.FixedLengthField; 11 | 12 | @SuppressWarnings("checkstyle:MagicNumber") 13 | @Slf4j 14 | @Getter 15 | @IncomingPacket(category = AgentServerPacketOPCode.Zone.CATEGORY, operation = AgentServerPacketOPCode.Zone.Ask.VILLAGE_MOVE) 16 | public class C2SAskVillageMovePacket implements Packet { 17 | 18 | private static final Marker MARKER = MarkerFactory.getMarker("C2S -> VILLAGE MOVE"); 19 | 20 | private final FixedLengthField unk1; 21 | private final FixedLengthField key1; 22 | private final FixedLengthField key2; 23 | 24 | public C2SAskVillageMovePacket(final byte[] value) { 25 | unk1 = new FixedLengthField(1, value[0]); 26 | key1 = new FixedLengthField(1, value[1]); 27 | key2 = new FixedLengthField(1, value[2]); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/packets/processors/character/C2SAskFreeCharNameProcessor.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.packets.processors.character; 2 | 3 | import io.netty.channel.ChannelHandlerContext; 4 | import lombok.RequiredArgsConstructor; 5 | import lombok.extern.slf4j.Slf4j; 6 | import pl.cwanix.opensun.agentserver.packets.c2s.character.C2SAskFreeCharNamePacket; 7 | import pl.cwanix.opensun.commonserver.packets.SUNPacketProcessor; 8 | import pl.cwanix.opensun.commonserver.packets.annotations.PacketProcessor; 9 | 10 | @Slf4j 11 | @RequiredArgsConstructor 12 | @PacketProcessor(packetClass = C2SAskFreeCharNamePacket.class) 13 | public class C2SAskFreeCharNameProcessor implements SUNPacketProcessor { 14 | 15 | @Override 16 | public void process(final ChannelHandlerContext ctx, final C2SAskFreeCharNamePacket packet) { 17 | //TODO: 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/packets/processors/connection/C2SAskWorldConnectProcessor.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.packets.processors.connection; 2 | 3 | import io.netty.channel.ChannelHandlerContext; 4 | import lombok.RequiredArgsConstructor; 5 | import lombok.extern.slf4j.Slf4j; 6 | import pl.cwanix.opensun.agentserver.packets.c2s.connection.C2SAskWordConnectPacket; 7 | import pl.cwanix.opensun.agentserver.packets.s2c.connection.S2CAnsWorldConnectPacket; 8 | import pl.cwanix.opensun.agentserver.properties.AgentServerProperties; 9 | import pl.cwanix.opensun.commonserver.packets.SUNPacketProcessor; 10 | import pl.cwanix.opensun.commonserver.packets.annotations.PacketProcessor; 11 | 12 | @Slf4j 13 | @RequiredArgsConstructor 14 | @PacketProcessor(packetClass = C2SAskWordConnectPacket.class) 15 | public class C2SAskWorldConnectProcessor implements SUNPacketProcessor { 16 | 17 | private final AgentServerProperties properties; 18 | 19 | @Override 20 | public void process(final ChannelHandlerContext ctx, final C2SAskWordConnectPacket packet) { 21 | ctx.writeAndFlush(new S2CAnsWorldConnectPacket(properties.getWorld().getIp(), properties.getWorld().getPort())); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/packets/processors/item/C2SAskQuickLinkSkillProcessor.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.packets.processors.item; 2 | 3 | import io.netty.channel.ChannelHandlerContext; 4 | import lombok.RequiredArgsConstructor; 5 | import lombok.extern.slf4j.Slf4j; 6 | import pl.cwanix.opensun.agentserver.packets.c2s.item.C2SAskQuickLinkSkillPacket; 7 | import pl.cwanix.opensun.agentserver.packets.s2c.item.S2CAnsQuickLinkSkillPacket; 8 | import pl.cwanix.opensun.commonserver.packets.SUNPacketProcessor; 9 | import pl.cwanix.opensun.commonserver.packets.annotations.PacketProcessor; 10 | 11 | @Slf4j 12 | @RequiredArgsConstructor 13 | @PacketProcessor(packetClass = C2SAskQuickLinkSkillPacket.class) 14 | public class C2SAskQuickLinkSkillProcessor implements SUNPacketProcessor { 15 | 16 | @Override 17 | public void process(final ChannelHandlerContext ctx, final C2SAskQuickLinkSkillPacket packet) { 18 | ctx.writeAndFlush(new S2CAnsQuickLinkSkillPacket(packet.getSlotCode().toShort(), packet.getPosition().toByte())); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/packets/processors/skill/C2SAskAddSkillPointProcessor.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.packets.processors.skill; 2 | 3 | import io.netty.channel.ChannelHandlerContext; 4 | import lombok.RequiredArgsConstructor; 5 | import lombok.extern.slf4j.Slf4j; 6 | import org.slf4j.Marker; 7 | import org.slf4j.MarkerFactory; 8 | import pl.cwanix.opensun.agentserver.packets.c2s.skill.C2SAskAddSkillPointPacket; 9 | import pl.cwanix.opensun.commonserver.packets.SUNPacketProcessor; 10 | import pl.cwanix.opensun.commonserver.packets.annotations.PacketProcessor; 11 | 12 | @Slf4j 13 | @RequiredArgsConstructor 14 | @PacketProcessor(packetClass = C2SAskAddSkillPointPacket.class) 15 | public class C2SAskAddSkillPointProcessor implements SUNPacketProcessor { 16 | 17 | private static final Marker MARKER = MarkerFactory.getMarker("C2S -> ADD SKILL POINT"); 18 | 19 | @Override 20 | public void process(final ChannelHandlerContext ctx, final C2SAskAddSkillPointPacket packet) { 21 | 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/packets/processors/sync/C2SAskJumpMoveProcessor.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.packets.processors.sync; 2 | 3 | import io.netty.channel.ChannelHandlerContext; 4 | import lombok.RequiredArgsConstructor; 5 | import lombok.extern.slf4j.Slf4j; 6 | import pl.cwanix.opensun.agentserver.packets.c2s.sync.C2SAskJumpMovePacket; 7 | import pl.cwanix.opensun.commonserver.packets.SUNPacketProcessor; 8 | import pl.cwanix.opensun.commonserver.packets.annotations.PacketProcessor; 9 | 10 | @Slf4j 11 | @RequiredArgsConstructor 12 | @PacketProcessor(packetClass = C2SAskJumpMovePacket.class) 13 | public class C2SAskJumpMoveProcessor implements SUNPacketProcessor { 14 | 15 | @Override 16 | public void process(final ChannelHandlerContext ctx, final C2SAskJumpMovePacket packet) { 17 | 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/packets/processors/sync/C2SAskKeyboardMoveProcessor.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.packets.processors.sync; 2 | 3 | import io.netty.channel.ChannelHandlerContext; 4 | import lombok.RequiredArgsConstructor; 5 | import lombok.extern.slf4j.Slf4j; 6 | import org.slf4j.Marker; 7 | import org.slf4j.MarkerFactory; 8 | import pl.cwanix.opensun.agentserver.packets.c2s.sync.C2SAskKeyboardMovePacket; 9 | import pl.cwanix.opensun.agentserver.server.AgentServerChannelHandler; 10 | import pl.cwanix.opensun.agentserver.server.session.AgentServerSession; 11 | import pl.cwanix.opensun.commonserver.packets.SUNPacketProcessor; 12 | import pl.cwanix.opensun.commonserver.packets.annotations.PacketProcessor; 13 | import pl.cwanix.opensun.model.character.CharacterDataSource; 14 | 15 | @Slf4j 16 | @RequiredArgsConstructor 17 | @PacketProcessor(packetClass = C2SAskKeyboardMovePacket.class) 18 | public class C2SAskKeyboardMoveProcessor implements SUNPacketProcessor { 19 | 20 | private static final Marker MARKER = MarkerFactory.getMarker("C2S -> KEYBOARD MOVE"); 21 | 22 | private final CharacterDataSource characterDataSource; 23 | 24 | @Override 25 | public void process(final ChannelHandlerContext ctx, final C2SAskKeyboardMovePacket packet) { 26 | AgentServerSession session = ctx.channel().attr(AgentServerChannelHandler.SESSION_ATTRIBUTE).get(); 27 | 28 | log.trace(MARKER, "Updating character position: {} {} {} {}", 29 | packet.getCurrentPosition().getX(), 30 | packet.getCurrentPosition().getY(), 31 | packet.getCurrentPosition().getZ(), 32 | packet.getAngle()); 33 | 34 | characterDataSource.updateCharacterPosition( 35 | session.getCharacter().getId(), 36 | packet.getCurrentPosition().getX(), 37 | packet.getCurrentPosition().getY(), 38 | packet.getCurrentPosition().getZ(), 39 | packet.getAngle().toShort()); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/packets/processors/sync/C2SAskMouseMoveProcessor.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.packets.processors.sync; 2 | 3 | import io.netty.channel.ChannelHandlerContext; 4 | import lombok.RequiredArgsConstructor; 5 | import lombok.extern.slf4j.Slf4j; 6 | import org.slf4j.Marker; 7 | import org.slf4j.MarkerFactory; 8 | import pl.cwanix.opensun.agentserver.packets.c2s.sync.C2SAskMouseMovePacket; 9 | import pl.cwanix.opensun.agentserver.server.AgentServerChannelHandler; 10 | import pl.cwanix.opensun.agentserver.server.session.AgentServerSession; 11 | import pl.cwanix.opensun.commonserver.packets.SUNPacketProcessor; 12 | import pl.cwanix.opensun.commonserver.packets.annotations.PacketProcessor; 13 | import pl.cwanix.opensun.model.character.CharacterDataSource; 14 | 15 | @Slf4j 16 | @RequiredArgsConstructor 17 | @PacketProcessor(packetClass = C2SAskMouseMovePacket.class) 18 | public class C2SAskMouseMoveProcessor implements SUNPacketProcessor { 19 | 20 | private static final Marker MARKER = MarkerFactory.getMarker("C2S -> MOUSE MOVE"); 21 | 22 | private final CharacterDataSource characterDataSource; 23 | 24 | @Override 25 | public void process(final ChannelHandlerContext ctx, final C2SAskMouseMovePacket packet) { 26 | AgentServerSession session = ctx.channel().attr(AgentServerChannelHandler.SESSION_ATTRIBUTE).get(); 27 | 28 | log.trace(MARKER, "Updating character position: {} {} {}", 29 | packet.getDestinationPosition().getX(), 30 | packet.getDestinationPosition().getY(), 31 | packet.getDestinationPosition().getZ()); 32 | 33 | characterDataSource.updateCharacterPosition( 34 | session.getCharacter().getId(), 35 | packet.getDestinationPosition().getX(), 36 | packet.getDestinationPosition().getY(), 37 | packet.getDestinationPosition().getZ(), 38 | 0); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/packets/processors/sync/C2SAskPlayerEnterProcessor.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.packets.processors.sync; 2 | 3 | import io.netty.channel.ChannelHandlerContext; 4 | import lombok.RequiredArgsConstructor; 5 | import lombok.extern.slf4j.Slf4j; 6 | import pl.cwanix.opensun.model.character.CharacterModel; 7 | import pl.cwanix.opensun.agentserver.packets.c2s.sync.C2SAskPlayerEnterPacket; 8 | import pl.cwanix.opensun.agentserver.packets.s2c.sync.S2CAnsAllPlayersEquipInfoPacket; 9 | import pl.cwanix.opensun.agentserver.packets.s2c.sync.S2CAnsAllPlayersGuildInfoPacket; 10 | import pl.cwanix.opensun.agentserver.packets.s2c.sync.S2CAnsPlayerEnterPacket; 11 | import pl.cwanix.opensun.agentserver.server.AgentServerChannelHandler; 12 | import pl.cwanix.opensun.agentserver.server.session.AgentServerSession; 13 | import pl.cwanix.opensun.commonserver.packets.SUNPacketProcessor; 14 | import pl.cwanix.opensun.commonserver.packets.annotations.PacketProcessor; 15 | 16 | @Slf4j 17 | @RequiredArgsConstructor 18 | @PacketProcessor(packetClass = C2SAskPlayerEnterPacket.class) 19 | public class C2SAskPlayerEnterProcessor implements SUNPacketProcessor { 20 | 21 | @Override 22 | public void process(final ChannelHandlerContext ctx, final C2SAskPlayerEnterPacket packet) { 23 | AgentServerSession session = ctx.channel().attr(AgentServerChannelHandler.SESSION_ATTRIBUTE).get(); 24 | 25 | CharacterModel character = session.getCharacter(); 26 | 27 | ctx.writeAndFlush(new S2CAnsPlayerEnterPacket(character)); 28 | ctx.writeAndFlush(new S2CAnsAllPlayersGuildInfoPacket()); 29 | ctx.writeAndFlush(new S2CAnsAllPlayersEquipInfoPacket()); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/packets/processors/unknown/C2SEA09Processor.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.packets.processors.unknown; 2 | 3 | import io.netty.channel.ChannelHandlerContext; 4 | import lombok.RequiredArgsConstructor; 5 | import lombok.extern.slf4j.Slf4j; 6 | import pl.cwanix.opensun.agentserver.packets.c2s.unknown.C2SEA09Packet; 7 | import pl.cwanix.opensun.commonserver.packets.SUNPacketProcessor; 8 | import pl.cwanix.opensun.commonserver.packets.annotations.PacketProcessor; 9 | 10 | @Slf4j 11 | @RequiredArgsConstructor 12 | @PacketProcessor(packetClass = C2SEA09Packet.class) 13 | public class C2SEA09Processor implements SUNPacketProcessor { 14 | 15 | @Override 16 | public void process(final ChannelHandlerContext ctx, final C2SEA09Packet packet) { 17 | 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/packets/s2c/character/S2CAnsCreateCharPacket.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.packets.s2c.character; 2 | 3 | import org.apache.commons.lang3.ArrayUtils; 4 | import pl.cwanix.opensun.agentserver.packets.AgentServerPacketOPCode; 5 | import pl.cwanix.opensun.model.character.CharacterModel; 6 | import pl.cwanix.opensun.agentserver.packets.structures.ClientCharacterPartPacketStructure; 7 | import pl.cwanix.opensun.commonserver.packets.Packet; 8 | import pl.cwanix.opensun.commonserver.packets.annotations.OutgoingPacket; 9 | 10 | @OutgoingPacket(category = AgentServerPacketOPCode.Character.CATEGORY, operation = AgentServerPacketOPCode.Character.Ans.CREATE_CHAR) 11 | public class S2CAnsCreateCharPacket implements Packet { 12 | 13 | private final ClientCharacterPartPacketStructure character; 14 | 15 | public S2CAnsCreateCharPacket(final CharacterModel characterModel) { 16 | this.character = new ClientCharacterPartPacketStructure(characterModel); 17 | } 18 | 19 | @Override 20 | public Object[] getOrderedFields() { 21 | return ArrayUtils.toArray(character); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/packets/s2c/character/S2CAnsDeleteCharPacket.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.packets.s2c.character; 2 | 3 | import pl.cwanix.opensun.agentserver.packets.AgentServerPacketOPCode; 4 | import pl.cwanix.opensun.commonserver.packets.Packet; 5 | import pl.cwanix.opensun.commonserver.packets.annotations.OutgoingPacket; 6 | 7 | @SuppressWarnings("checkstyle:MagicNumber") 8 | @OutgoingPacket(category = AgentServerPacketOPCode.Character.CATEGORY, operation = AgentServerPacketOPCode.Character.Ans.DELETE_CHAR) 9 | public class S2CAnsDeleteCharPacket implements Packet { 10 | 11 | @Override 12 | public Object[] getOrderedFields() { 13 | return null; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/packets/s2c/character/S2CAnsQuickPacket.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.packets.s2c.character; 2 | 3 | import org.apache.commons.lang3.ArrayUtils; 4 | import pl.cwanix.opensun.agentserver.packets.AgentServerPacketOPCode; 5 | import pl.cwanix.opensun.commonserver.packets.Packet; 6 | import pl.cwanix.opensun.commonserver.packets.annotations.OutgoingPacket; 7 | import pl.cwanix.opensun.utils.datatypes.FixedLengthField; 8 | 9 | @SuppressWarnings("checkstyle:MagicNumber") 10 | @OutgoingPacket(category = AgentServerPacketOPCode.Character.CATEGORY, operation = AgentServerPacketOPCode.Character.Ans.QUICK) 11 | public class S2CAnsQuickPacket implements Packet { 12 | 13 | private final FixedLengthField value; 14 | 15 | public S2CAnsQuickPacket() { 16 | value = new FixedLengthField(1); 17 | } 18 | 19 | @Override 20 | public Object[] getOrderedFields() { 21 | return ArrayUtils.toArray(value); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/packets/s2c/character/S2CAnsSkillsPacket.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.packets.s2c.character; 2 | 3 | import org.apache.commons.lang3.ArrayUtils; 4 | import pl.cwanix.opensun.agentserver.packets.AgentServerPacketOPCode; 5 | import pl.cwanix.opensun.commonserver.packets.Packet; 6 | import pl.cwanix.opensun.commonserver.packets.annotations.OutgoingPacket; 7 | import pl.cwanix.opensun.utils.datatypes.FixedLengthField; 8 | 9 | @SuppressWarnings("checkstyle:MagicNumber") 10 | @OutgoingPacket(category = AgentServerPacketOPCode.Character.CATEGORY, operation = AgentServerPacketOPCode.Character.Ans.SKILLS) 11 | public class S2CAnsSkillsPacket implements Packet { 12 | 13 | private final FixedLengthField value; 14 | 15 | public S2CAnsSkillsPacket() { 16 | value = new FixedLengthField(4, new byte[] {0x01, 0x00, (byte) 0xe1, 0x2e}); 17 | } 18 | 19 | @Override 20 | public Object[] getOrderedFields() { 21 | return ArrayUtils.toArray(value); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/packets/s2c/character/S2CAnsStatePacket.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.packets.s2c.character; 2 | 3 | import org.apache.commons.lang3.ArrayUtils; 4 | import pl.cwanix.opensun.agentserver.packets.AgentServerPacketOPCode; 5 | import pl.cwanix.opensun.agentserver.packets.structures.StateSlotPacketStructure; 6 | import pl.cwanix.opensun.commonserver.packets.Packet; 7 | import pl.cwanix.opensun.commonserver.packets.annotations.OutgoingPacket; 8 | import pl.cwanix.opensun.utils.datatypes.FixedLengthField; 9 | 10 | import java.util.ArrayList; 11 | import java.util.List; 12 | 13 | @SuppressWarnings("checkstyle:MagicNumber") 14 | @OutgoingPacket(category = AgentServerPacketOPCode.Character.CATEGORY, operation = AgentServerPacketOPCode.Character.Ans.STATE) 15 | public class S2CAnsStatePacket implements Packet { 16 | 17 | private final FixedLengthField count; 18 | private final List slot; 19 | 20 | public S2CAnsStatePacket() { 21 | this.count = new FixedLengthField(1, 0x02); 22 | this.slot = new ArrayList<>(); 23 | this.slot.add(new StateSlotPacketStructure(new byte[] {0x01, 0x00, (byte) 0xe8, 0x03, 0x00, 0x00})); 24 | this.slot.add(new StateSlotPacketStructure(new byte[] {0x02, 0x00, (byte) 0xe8, 0x03, 0x00, 0x00})); 25 | } 26 | 27 | @Override 28 | public Object[] getOrderedFields() { 29 | return ArrayUtils.toArray(count, slot); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/packets/s2c/character/S2CAnsStylePacket.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.packets.s2c.character; 2 | 3 | import pl.cwanix.opensun.agentserver.packets.AgentServerPacketOPCode; 4 | import pl.cwanix.opensun.commonserver.packets.Packet; 5 | import pl.cwanix.opensun.commonserver.packets.annotations.OutgoingPacket; 6 | import pl.cwanix.opensun.utils.bytes.BytesUtils; 7 | import pl.cwanix.opensun.utils.datatypes.PacketHeader; 8 | 9 | @SuppressWarnings("checkstyle:MagicNumber") 10 | @OutgoingPacket(category = AgentServerPacketOPCode.Character.CATEGORY, operation = AgentServerPacketOPCode.Character.Ans.STYLE) 11 | public class S2CAnsStylePacket implements Packet { 12 | 13 | public static final PacketHeader PACKET_ID = new PacketHeader((byte) 0xA5, (byte) 0xC1); 14 | 15 | private final byte[] value = {0x21, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00}; 16 | 17 | @Override 18 | public byte[] toByteArray() { 19 | // TODO Auto-generated method stub 20 | return BytesUtils.mergeArrays(PACKET_ID.getValue(), value); 21 | } 22 | 23 | @Override 24 | public Object[] getOrderedFields() { 25 | return null; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/packets/s2c/character/S2CErrCreateCharPacket.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.packets.s2c.character; 2 | 3 | import org.apache.commons.lang3.ArrayUtils; 4 | import pl.cwanix.opensun.agentserver.packets.AgentServerPacketOPCode; 5 | import pl.cwanix.opensun.commonserver.packets.Packet; 6 | import pl.cwanix.opensun.commonserver.packets.annotations.OutgoingPacket; 7 | import pl.cwanix.opensun.utils.datatypes.FixedLengthField; 8 | 9 | @SuppressWarnings("checkstyle:MagicNumber") 10 | @OutgoingPacket(category = AgentServerPacketOPCode.Character.CATEGORY, operation = AgentServerPacketOPCode.Character.Err.CREATE_CHAR) 11 | public class S2CErrCreateCharPacket implements Packet { 12 | 13 | private final FixedLengthField errorCode; 14 | 15 | public S2CErrCreateCharPacket() { 16 | errorCode = new FixedLengthField(4); 17 | } 18 | 19 | @Override 20 | public Object[] getOrderedFields() { 21 | return ArrayUtils.toArray(errorCode); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/packets/s2c/character/S2CErrDeleteCharPacket.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.packets.s2c.character; 2 | 3 | import org.apache.commons.lang3.ArrayUtils; 4 | import pl.cwanix.opensun.commonserver.packets.Packet; 5 | import pl.cwanix.opensun.utils.datatypes.FixedLengthField; 6 | 7 | @SuppressWarnings("checkstyle:MagicNumber") 8 | //@OutgoingPacket(category = PacketCategory.CHARACTER, type = 0x71) 9 | public class S2CErrDeleteCharPacket implements Packet { 10 | 11 | private final FixedLengthField errorCode; 12 | 13 | public S2CErrDeleteCharPacket(final int errorCode) { 14 | this.errorCode = new FixedLengthField(4, errorCode); 15 | } 16 | 17 | @Override 18 | public Object[] getOrderedFields() { 19 | return ArrayUtils.toArray(errorCode); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/packets/s2c/connection/S2CAnsEnterVillagePacket.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.packets.s2c.connection; 2 | 3 | import org.apache.commons.lang3.ArrayUtils; 4 | import pl.cwanix.opensun.agentserver.packets.AgentServerPacketOPCode; 5 | import pl.cwanix.opensun.commonserver.packets.Packet; 6 | import pl.cwanix.opensun.commonserver.packets.annotations.OutgoingPacket; 7 | import pl.cwanix.opensun.utils.datatypes.FixedLengthField; 8 | 9 | @SuppressWarnings("checkstyle:MagicNumber") 10 | @OutgoingPacket(category = AgentServerPacketOPCode.Connection.CATEGORY, operation = AgentServerPacketOPCode.Connection.Ans.ENTER_VILLAGE) 11 | public class S2CAnsEnterVillagePacket implements Packet { 12 | 13 | private final FixedLengthField playerKey; 14 | 15 | public S2CAnsEnterVillagePacket(final int playerKey) { 16 | this.playerKey = new FixedLengthField(4, playerKey); 17 | } 18 | 19 | @Override 20 | public Object[] getOrderedFields() { 21 | return ArrayUtils.toArray(playerKey); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/packets/s2c/connection/S2CAnsWorldConnectPacket.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.packets.s2c.connection; 2 | 3 | import org.apache.commons.lang3.ArrayUtils; 4 | import pl.cwanix.opensun.agentserver.packets.AgentServerPacketOPCode; 5 | import pl.cwanix.opensun.commonserver.packets.Packet; 6 | import pl.cwanix.opensun.commonserver.packets.annotations.OutgoingPacket; 7 | import pl.cwanix.opensun.utils.datatypes.FixedLengthField; 8 | 9 | @SuppressWarnings("checkstyle:MagicNumber") 10 | @OutgoingPacket(category = AgentServerPacketOPCode.Connection.CATEGORY, operation = AgentServerPacketOPCode.Connection.Ans.WORLD_CONNECT) 11 | public class S2CAnsWorldConnectPacket implements Packet { 12 | 13 | private final FixedLengthField worldServerIp; 14 | private final FixedLengthField worldServerPort; 15 | 16 | public S2CAnsWorldConnectPacket(final String ip, final int port) { 17 | this.worldServerIp = new FixedLengthField(32, ip); 18 | this.worldServerPort = new FixedLengthField(2, port); 19 | } 20 | 21 | @Override 22 | public Object[] getOrderedFields() { 23 | return ArrayUtils.toArray(worldServerIp, worldServerPort); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/packets/s2c/item/S2CAnsQuickLinkSkillPacket.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.packets.s2c.item; 2 | 3 | import org.apache.commons.lang3.ArrayUtils; 4 | import pl.cwanix.opensun.agentserver.packets.AgentServerPacketOPCode; 5 | import pl.cwanix.opensun.commonserver.packets.Packet; 6 | import pl.cwanix.opensun.commonserver.packets.annotations.OutgoingPacket; 7 | import pl.cwanix.opensun.utils.datatypes.FixedLengthField; 8 | 9 | @SuppressWarnings("checkstyle:MagicNumber") 10 | @OutgoingPacket(category = AgentServerPacketOPCode.Item.CATEGORY, operation = AgentServerPacketOPCode.Item.Ans.QUICK_LINK_SKILL) 11 | public class S2CAnsQuickLinkSkillPacket implements Packet { 12 | 13 | private final FixedLengthField slotCode; 14 | private final FixedLengthField position; 15 | 16 | public S2CAnsQuickLinkSkillPacket(final int slotCode, final byte position) { 17 | this.slotCode = new FixedLengthField(2, slotCode); 18 | this.position = new FixedLengthField(1, position); 19 | } 20 | 21 | @Override 22 | public Object[] getOrderedFields() { 23 | return ArrayUtils.toArray(slotCode, position); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/packets/s2c/item/S2CErrQuickLinkSkillPacket.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.packets.s2c.item; 2 | 3 | import org.apache.commons.lang3.ArrayUtils; 4 | import pl.cwanix.opensun.agentserver.packets.AgentServerPacketOPCode; 5 | import pl.cwanix.opensun.commonserver.packets.Packet; 6 | import pl.cwanix.opensun.commonserver.packets.annotations.OutgoingPacket; 7 | import pl.cwanix.opensun.utils.datatypes.FixedLengthField; 8 | 9 | @SuppressWarnings("checkstyle:MagicNumber") 10 | @OutgoingPacket(category = AgentServerPacketOPCode.Item.CATEGORY, operation = AgentServerPacketOPCode.Item.Err.QUICK_LINK_SKILL) 11 | public class S2CErrQuickLinkSkillPacket implements Packet { 12 | 13 | private final FixedLengthField errorCode; 14 | 15 | public S2CErrQuickLinkSkillPacket(final int errorCode) { 16 | this.errorCode = new FixedLengthField(4, errorCode); 17 | } 18 | 19 | @Override 20 | public Object[] getOrderedFields() { 21 | return ArrayUtils.toArray(errorCode); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/packets/s2c/status/S2CAnsRecoverAttrMpPacket.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.packets.s2c.status; 2 | 3 | import org.apache.commons.lang3.ArrayUtils; 4 | import pl.cwanix.opensun.agentserver.packets.AgentServerPacketOPCode; 5 | import pl.cwanix.opensun.commonserver.packets.Packet; 6 | import pl.cwanix.opensun.commonserver.packets.annotations.OutgoingPacket; 7 | import pl.cwanix.opensun.utils.datatypes.FixedLengthField; 8 | 9 | @SuppressWarnings("checkstyle:MagicNumber") 10 | @OutgoingPacket(category = AgentServerPacketOPCode.Status.CATEGORY, operation = AgentServerPacketOPCode.Status.Ans.RECOVER_ATTR_MP) 11 | public class S2CAnsRecoverAttrMpPacket implements Packet { 12 | 13 | private final FixedLengthField value; 14 | 15 | public S2CAnsRecoverAttrMpPacket() { 16 | value = new FixedLengthField(12, 17 | new byte[] {0x21, 0x00, 0x00, 0x00, (byte) 0x4e, 0x08, 0x00, 0x00, 18 | (byte) 0xc4, 0x03, 0x00, 0x00}); 19 | } 20 | 21 | @Override 22 | public Object[] getOrderedFields() { 23 | return ArrayUtils.toArray(value); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/packets/s2c/status/S2CAnsRecoverAttrPacket.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.packets.s2c.status; 2 | 3 | import org.apache.commons.lang3.ArrayUtils; 4 | import pl.cwanix.opensun.agentserver.packets.AgentServerPacketOPCode; 5 | import pl.cwanix.opensun.commonserver.packets.Packet; 6 | import pl.cwanix.opensun.commonserver.packets.annotations.OutgoingPacket; 7 | import pl.cwanix.opensun.utils.datatypes.FixedLengthField; 8 | 9 | @SuppressWarnings("checkstyle:MagicNumber") 10 | @OutgoingPacket(category = AgentServerPacketOPCode.Status.CATEGORY, operation = AgentServerPacketOPCode.Status.Ans.RECOVER_ATTR) 11 | public class S2CAnsRecoverAttrPacket implements Packet { 12 | 13 | private final FixedLengthField value; 14 | 15 | public S2CAnsRecoverAttrPacket() { 16 | value = new FixedLengthField(12, 17 | new byte[] {0x21, 0x00, 0x00, 0x00, (byte) 0x9e, 0x08, 0x00, 0x00, 18 | (byte) 0x9e, 0x08, 0x00, 0x00}); 19 | } 20 | 21 | @Override 22 | public Object[] getOrderedFields() { 23 | return ArrayUtils.toArray(value); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/packets/s2c/status/S2CAnsStatSelectPacket.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.packets.s2c.status; 2 | 3 | import org.apache.commons.lang3.ArrayUtils; 4 | import pl.cwanix.opensun.agentserver.packets.AgentServerPacketOPCode; 5 | import pl.cwanix.opensun.commonserver.packets.Packet; 6 | import pl.cwanix.opensun.commonserver.packets.annotations.OutgoingPacket; 7 | import pl.cwanix.opensun.utils.datatypes.FixedLengthField; 8 | 9 | @SuppressWarnings("checkstyle:MagicNumber") 10 | @OutgoingPacket(category = AgentServerPacketOPCode.Status.CATEGORY, operation = AgentServerPacketOPCode.Status.Ans.STAT_SELECT) 11 | public class S2CAnsStatSelectPacket implements Packet { 12 | 13 | private final FixedLengthField objectKey; 14 | private final FixedLengthField attributeCode; 15 | private final FixedLengthField value; 16 | 17 | public S2CAnsStatSelectPacket(final byte attributeCode, final int value) { 18 | this.objectKey = new FixedLengthField(4); 19 | this.attributeCode = new FixedLengthField(1, attributeCode); 20 | this.value = new FixedLengthField(4, value); 21 | } 22 | 23 | @Override 24 | public Object[] getOrderedFields() { 25 | return ArrayUtils.toArray(objectKey, attributeCode, value); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/packets/s2c/status/S2CErrStatSelectPacket.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.packets.s2c.status; 2 | 3 | import org.apache.commons.lang3.ArrayUtils; 4 | import pl.cwanix.opensun.agentserver.packets.AgentServerPacketOPCode; 5 | import pl.cwanix.opensun.commonserver.packets.Packet; 6 | import pl.cwanix.opensun.commonserver.packets.annotations.OutgoingPacket; 7 | import pl.cwanix.opensun.utils.datatypes.FixedLengthField; 8 | 9 | @SuppressWarnings("checkstyle:MagicNumber") 10 | @OutgoingPacket(category = AgentServerPacketOPCode.Status.CATEGORY, operation = AgentServerPacketOPCode.Status.Err.STAT_SELECT) 11 | public class S2CErrStatSelectPacket implements Packet { 12 | 13 | private final FixedLengthField attributeCode; 14 | private final FixedLengthField errorCode; 15 | 16 | public S2CErrStatSelectPacket(final byte attributeCode, final int errorCode) { 17 | this.attributeCode = new FixedLengthField(1, attributeCode); 18 | this.errorCode = new FixedLengthField(4, errorCode); 19 | } 20 | 21 | @Override 22 | public Object[] getOrderedFields() { 23 | return ArrayUtils.toArray(attributeCode, errorCode); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/packets/s2c/sync/S2CAnsAllPlayersEquipInfoPacket.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.packets.s2c.sync; 2 | 3 | import org.apache.commons.lang3.ArrayUtils; 4 | import pl.cwanix.opensun.agentserver.packets.AgentServerPacketOPCode; 5 | import pl.cwanix.opensun.commonserver.packets.Packet; 6 | import pl.cwanix.opensun.commonserver.packets.annotations.OutgoingPacket; 7 | import pl.cwanix.opensun.utils.datatypes.FixedLengthField; 8 | 9 | @SuppressWarnings("checkstyle:MagicNumber") 10 | @OutgoingPacket(category = AgentServerPacketOPCode.Sync.CATEGORY, operation = AgentServerPacketOPCode.Sync.Ans.ALL_PLAYERS_EQUIP_INFO) 11 | public class S2CAnsAllPlayersEquipInfoPacket implements Packet { 12 | 13 | //private FixedLengthField count; 14 | //private RenderEquipInfoPacketStructure equip; 15 | 16 | private final FixedLengthField value; 17 | 18 | public S2CAnsAllPlayersEquipInfoPacket() { 19 | value = new FixedLengthField(42, 20 | new byte[] {0x01, 21 | 0x04, 0x00, 0x00, 0x00, 22 | 0x09, 23 | 0x00, (byte) 0x89, 0x00, 0x0c, 24 | 0x00, 25 | 0x01, (byte) 0xb5, 26 | (byte) 0xe8, 0x0c, 0x00, 0x02, 27 | (byte) 0xb6, 28 | (byte) 0xe8, 0x0c, 0x00, 0x03, 29 | (byte) 0xb7, 30 | (byte) 0xe8, 0x0c, 0x00, 0x04, 31 | (byte) 0xb8, 32 | (byte) 0xe8, 0x0c, 0x00, 0x05, 33 | (byte) 0xb9, 34 | (byte) 0xe8, 0x0c, 0x00, 0x06, 35 | (byte) 0xba, 36 | (byte) 0xe8, 0x0c, 0x00, 0x07}); 37 | } 38 | 39 | @Override 40 | public Object[] getOrderedFields() { 41 | return ArrayUtils.toArray(value); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/packets/s2c/sync/S2CAnsAllPlayersGuildInfoPacket.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.packets.s2c.sync; 2 | 3 | import org.apache.commons.lang3.ArrayUtils; 4 | import pl.cwanix.opensun.agentserver.packets.AgentServerPacketOPCode; 5 | import pl.cwanix.opensun.commonserver.packets.Packet; 6 | import pl.cwanix.opensun.commonserver.packets.annotations.OutgoingPacket; 7 | import pl.cwanix.opensun.utils.datatypes.FixedLengthField; 8 | 9 | @SuppressWarnings("checkstyle:MagicNumber") 10 | @OutgoingPacket(category = AgentServerPacketOPCode.Sync.CATEGORY, operation = AgentServerPacketOPCode.Sync.Ans.ALL_PLAYERS_GUILD_INFO) 11 | public class S2CAnsAllPlayersGuildInfoPacket implements Packet { 12 | 13 | private final FixedLengthField value; 14 | 15 | public S2CAnsAllPlayersGuildInfoPacket() { 16 | value = new FixedLengthField(42, 17 | new byte[] {0x01, 0x03, 0x00, 0x00, 0x00, (byte) 0xb8, 0x5c, 0x00, 0x00, (byte) 0xbc, 18 | 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, (byte) 0xc7, (byte) 0xe9, 19 | (byte) 0xd2, (byte) 0xe5, (byte) 0xd3, (byte) 0xc0, (byte) 0xba, (byte) 0xe3, 0x00, 0x00, 0x00, 20 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00}); 21 | } 22 | 23 | @Override 24 | public Object[] getOrderedFields() { 25 | return ArrayUtils.toArray(value); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/packets/s2c/sync/S2CAnsPlayerEnterPacket.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.packets.s2c.sync; 2 | 3 | import org.apache.commons.lang3.ArrayUtils; 4 | import pl.cwanix.opensun.agentserver.packets.AgentServerPacketOPCode; 5 | import pl.cwanix.opensun.model.character.CharacterModel; 6 | import pl.cwanix.opensun.commonserver.packets.Packet; 7 | import pl.cwanix.opensun.commonserver.packets.annotations.OutgoingPacket; 8 | import pl.cwanix.opensun.utils.datatypes.FixedLengthField; 9 | import pl.cwanix.opensun.utils.datatypes.Vector; 10 | 11 | @SuppressWarnings("checkstyle:MagicNumber") 12 | @OutgoingPacket(category = AgentServerPacketOPCode.Sync.CATEGORY, operation = AgentServerPacketOPCode.Sync.Ans.PLAYER_ENTER) 13 | public class S2CAnsPlayerEnterPacket implements Packet { 14 | 15 | private final Vector currentPosition; 16 | private final FixedLengthField unknown; 17 | 18 | public S2CAnsPlayerEnterPacket(final CharacterModel character) { 19 | currentPosition = new Vector(character.getPosition().getLocationX(), character.getPosition().getLocationY(), character.getPosition().getLocationZ()); 20 | unknown = new FixedLengthField(2); 21 | } 22 | 23 | @Override 24 | public Object[] getOrderedFields() { 25 | return ArrayUtils.toArray(currentPosition, unknown); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/packets/s2c/zone/S2CAnsVillageMovePacket.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.packets.s2c.zone; 2 | 3 | import org.apache.commons.lang3.ArrayUtils; 4 | import pl.cwanix.opensun.agentserver.packets.AgentServerPacketOPCode; 5 | import pl.cwanix.opensun.commonserver.packets.Packet; 6 | import pl.cwanix.opensun.commonserver.packets.annotations.OutgoingPacket; 7 | import pl.cwanix.opensun.utils.datatypes.FixedLengthField; 8 | 9 | @SuppressWarnings("checkstyle:MagicNumber") 10 | @OutgoingPacket(category = AgentServerPacketOPCode.Zone.CATEGORY, operation = AgentServerPacketOPCode.Zone.Ans.VILLAGE_MOVE) 11 | public class S2CAnsVillageMovePacket implements Packet { 12 | 13 | private final FixedLengthField fieldCode; 14 | 15 | public S2CAnsVillageMovePacket(final int fieldCode) { 16 | this.fieldCode = new FixedLengthField(4, fieldCode); 17 | } 18 | 19 | @Override 20 | public Object[] getOrderedFields() { 21 | return ArrayUtils.toArray(fieldCode); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/packets/s2c/zone/S2CErrVillageMovePacket.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.packets.s2c.zone; 2 | 3 | import pl.cwanix.opensun.agentserver.packets.AgentServerPacketOPCode; 4 | import pl.cwanix.opensun.commonserver.packets.Packet; 5 | import pl.cwanix.opensun.commonserver.packets.annotations.OutgoingPacket; 6 | 7 | @SuppressWarnings("checkstyle:MagicNumber") 8 | @OutgoingPacket(category = AgentServerPacketOPCode.Zone.CATEGORY, operation = AgentServerPacketOPCode.Zone.Err.VILLAGE_MOVE) //TODO: ? 9 | public class S2CErrVillageMovePacket implements Packet { 10 | 11 | public S2CErrVillageMovePacket() { 12 | } 13 | 14 | @Override 15 | public Object[] getOrderedFields() { 16 | return null; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/packets/structures/EquipItemInfoPacketStructure.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.packets.structures; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Arrays; 5 | import java.util.List; 6 | 7 | import org.apache.commons.lang3.ArrayUtils; 8 | 9 | import pl.cwanix.opensun.commonserver.packets.PacketStructure; 10 | import pl.cwanix.opensun.utils.datatypes.FixedLengthField; 11 | 12 | @SuppressWarnings("checkstyle:MagicNumber") 13 | public class EquipItemInfoPacketStructure implements PacketStructure { 14 | 15 | private final FixedLengthField count; 16 | private final List slot; 17 | 18 | public EquipItemInfoPacketStructure(final byte[] value) { 19 | count = new FixedLengthField(1, value[0]); 20 | slot = new ArrayList<>(); 21 | 22 | for (int i = 0; i < value[0]; i++) { 23 | slot.add(new ItemSlotPacketStructure(Arrays.copyOfRange(value, 1 + i * 28, 29 + i * 28))); 24 | } 25 | } 26 | 27 | @Override 28 | public Object[] getOrderedFields() { 29 | return ArrayUtils.toArray(count, slot); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/packets/structures/InventoryTotalInfoPacketStructure.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.packets.structures; 2 | 3 | import lombok.RequiredArgsConstructor; 4 | import org.apache.commons.lang3.ArrayUtils; 5 | import pl.cwanix.opensun.commonserver.packets.PacketStructure; 6 | import pl.cwanix.opensun.utils.datatypes.FixedLengthField; 7 | 8 | import java.util.List; 9 | 10 | @RequiredArgsConstructor 11 | public class InventoryTotalInfoPacketStructure implements PacketStructure { 12 | 13 | private final FixedLengthField inventCount; //1 - max 75 14 | private final FixedLengthField tmpInventCount; //1 - max 20 15 | private final List invent; 16 | private final List tmpInvent; 17 | 18 | @Override 19 | public Object[] getOrderedFields() { 20 | return ArrayUtils.toArray(inventCount, tmpInventCount, invent, tmpInvent); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/packets/structures/ItemPartPacketStructure.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.packets.structures; 2 | 3 | import org.apache.commons.lang3.ArrayUtils; 4 | 5 | import pl.cwanix.opensun.commonserver.packets.PacketStructure; 6 | import pl.cwanix.opensun.utils.datatypes.FixedLengthField; 7 | 8 | @SuppressWarnings("checkstyle:MagicNumber") 9 | public class ItemPartPacketStructure implements PacketStructure { 10 | 11 | private final FixedLengthField code; 12 | private final FixedLengthField durability; 13 | private final FixedLengthField serial; 14 | 15 | public ItemPartPacketStructure(final byte[] value) { 16 | code = new FixedLengthField(2, value[0], value[1]); 17 | durability = new FixedLengthField(1, value[2]); 18 | serial = new FixedLengthField(4, value[3], value[4], value[5], value[6]); 19 | } 20 | 21 | @Override 22 | public Object[] getOrderedFields() { 23 | return ArrayUtils.toArray(code, durability, serial); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/packets/structures/ItemSlotPacketStructure.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.packets.structures; 2 | 3 | import java.util.Arrays; 4 | 5 | import org.apache.commons.lang3.ArrayUtils; 6 | 7 | import pl.cwanix.opensun.commonserver.packets.PacketStructure; 8 | import pl.cwanix.opensun.utils.datatypes.FixedLengthField; 9 | 10 | @SuppressWarnings("checkstyle:MagicNumber") 11 | public class ItemSlotPacketStructure implements PacketStructure { 12 | 13 | private final FixedLengthField position; 14 | private final ItemPartPacketStructure itemPart; 15 | private final OptionPartPacketStructure optionPart; 16 | 17 | public ItemSlotPacketStructure(final byte[] value) { 18 | position = new FixedLengthField(1, value[0]); 19 | itemPart = new ItemPartPacketStructure(Arrays.copyOfRange(value, 1, 8)); 20 | optionPart = new OptionPartPacketStructure(Arrays.copyOfRange(value, 8, value.length)); 21 | } 22 | 23 | @Override 24 | public Object[] getOrderedFields() { 25 | return ArrayUtils.toArray(position, itemPart, optionPart); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/packets/structures/RenderEquipInfoPacketStructure.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.packets.structures; 2 | 3 | import java.util.List; 4 | 5 | import org.apache.commons.lang3.ArrayUtils; 6 | 7 | import pl.cwanix.opensun.commonserver.packets.PacketStructure; 8 | import pl.cwanix.opensun.utils.datatypes.FixedLengthField; 9 | 10 | public class RenderEquipInfoPacketStructure implements PacketStructure { 11 | 12 | private FixedLengthField count; 13 | private FixedLengthField objectKey; 14 | private List slot; 15 | 16 | @Override 17 | public Object[] getOrderedFields() { 18 | return ArrayUtils.toArray(count, objectKey, slot); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/packets/structures/RenderItemPartPacketStructure.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.packets.structures; 2 | 3 | import org.apache.commons.lang3.ArrayUtils; 4 | 5 | import pl.cwanix.opensun.commonserver.packets.PacketStructure; 6 | import pl.cwanix.opensun.utils.datatypes.FixedLengthField; 7 | 8 | @SuppressWarnings("checkstyle:MagicNumber") 9 | public class RenderItemPartPacketStructure implements PacketStructure { 10 | 11 | private final FixedLengthField code; 12 | private final FixedLengthField enchant; 13 | private final FixedLengthField durability; 14 | 15 | public RenderItemPartPacketStructure(final byte[] value) { 16 | code = new FixedLengthField(2, value[0], value[1]); 17 | enchant = new FixedLengthField(1, value[2]); 18 | durability = new FixedLengthField(1, value[3]); 19 | } 20 | 21 | @Override 22 | public Object[] getOrderedFields() { 23 | return ArrayUtils.toArray(code, enchant, durability); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/packets/structures/RenderItemSlotPacketStructure.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.packets.structures; 2 | 3 | import java.util.Arrays; 4 | 5 | import org.apache.commons.lang3.ArrayUtils; 6 | 7 | import pl.cwanix.opensun.commonserver.packets.PacketStructure; 8 | import pl.cwanix.opensun.utils.datatypes.FixedLengthField; 9 | 10 | public class RenderItemSlotPacketStructure implements PacketStructure { 11 | 12 | private final FixedLengthField position; 13 | private final RenderItemPartPacketStructure itemPart; 14 | 15 | public RenderItemSlotPacketStructure(final byte[] value) { 16 | position = new FixedLengthField(1, value[0]); 17 | itemPart = new RenderItemPartPacketStructure(Arrays.copyOfRange(value, 1, value.length)); 18 | } 19 | 20 | @Override 21 | public Object[] getOrderedFields() { 22 | return ArrayUtils.toArray(position, itemPart); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/packets/structures/StateSlotPacketStructure.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.packets.structures; 2 | 3 | import java.util.Arrays; 4 | 5 | import org.apache.commons.lang3.ArrayUtils; 6 | 7 | import pl.cwanix.opensun.commonserver.packets.PacketStructure; 8 | import pl.cwanix.opensun.utils.datatypes.FixedLengthField; 9 | 10 | @SuppressWarnings("checkstyle:MagicNumber") 11 | public class StateSlotPacketStructure implements PacketStructure { 12 | 13 | private final FixedLengthField slotCode; 14 | private final FixedLengthField time; 15 | 16 | public StateSlotPacketStructure(final byte[] value) { 17 | this.slotCode = new FixedLengthField(2, Arrays.copyOfRange(value, 0, 2)); 18 | this.time = new FixedLengthField(4, Arrays.copyOfRange(value, 2, 6)); 19 | } 20 | 21 | @Override 22 | public Object[] getOrderedFields() { 23 | return ArrayUtils.toArray(slotCode, time); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/properties/AgentServerProperties.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.properties; 2 | 3 | import org.springframework.boot.context.properties.ConfigurationProperties; 4 | import org.springframework.boot.context.properties.NestedConfigurationProperty; 5 | 6 | import lombok.Getter; 7 | import lombok.Setter; 8 | import pl.cwanix.opensun.commonserver.properties.SUNServerExternalServerProperties; 9 | import pl.cwanix.opensun.commonserver.properties.SUNServerProperties; 10 | 11 | @Getter 12 | @Setter 13 | @ConfigurationProperties(prefix = "opensun") 14 | public class AgentServerProperties extends SUNServerProperties { 15 | 16 | @NestedConfigurationProperty 17 | private SUNServerExternalServerProperties db; 18 | 19 | @NestedConfigurationProperty 20 | private SUNServerExternalServerProperties world; 21 | 22 | private String dataDirectory; 23 | } 24 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/server/AgentServerChannelHandler.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.server; 2 | 3 | import io.netty.channel.ChannelHandlerContext; 4 | import io.netty.util.AttributeKey; 5 | import lombok.RequiredArgsConstructor; 6 | import pl.cwanix.opensun.agentserver.server.session.AgentServerSession; 7 | import pl.cwanix.opensun.commonserver.packets.Packet; 8 | import pl.cwanix.opensun.commonserver.packets.SUNPacketProcessorExecutor; 9 | import pl.cwanix.opensun.commonserver.server.SUNServerChannelHandler; 10 | 11 | @RequiredArgsConstructor 12 | public class AgentServerChannelHandler extends SUNServerChannelHandler { 13 | 14 | public static final AttributeKey SESSION_ATTRIBUTE = AttributeKey.valueOf("session"); 15 | 16 | private final SUNPacketProcessorExecutor processorExecutor; 17 | 18 | @Override 19 | public void channelRead(final ChannelHandlerContext ctx, final Object msg) { 20 | Packet packet = (Packet) msg; 21 | processorExecutor.process(ctx, packet); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/server/AgentServerChannelHandlerFactory.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.server; 2 | 3 | import lombok.RequiredArgsConstructor; 4 | import org.springframework.stereotype.Component; 5 | import pl.cwanix.opensun.commonserver.packets.SUNPacketProcessorExecutor; 6 | import pl.cwanix.opensun.commonserver.server.SUNServerChannelHandler; 7 | import pl.cwanix.opensun.commonserver.server.SUNServerChannelHandlerFactory; 8 | 9 | @Component 10 | @RequiredArgsConstructor 11 | public class AgentServerChannelHandlerFactory implements SUNServerChannelHandlerFactory { 12 | 13 | private final SUNPacketProcessorExecutor processorExecutor; 14 | 15 | @Override 16 | public SUNServerChannelHandler getChannelHandler() { 17 | return new AgentServerChannelHandler(processorExecutor); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/server/session/AgentServerSession.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.server.session; 2 | 3 | import lombok.Getter; 4 | import lombok.RequiredArgsConstructor; 5 | import lombok.Setter; 6 | import pl.cwanix.opensun.model.character.CharacterModel; 7 | import pl.cwanix.opensun.model.account.UserModel; 8 | import pl.cwanix.opensun.commonserver.session.SUNSession; 9 | 10 | @Getter 11 | @Setter 12 | @RequiredArgsConstructor 13 | public class AgentServerSession implements SUNSession { 14 | 15 | private final UserModel user; 16 | 17 | private CharacterModel character; 18 | 19 | public boolean isAuthenticated() { 20 | return user != null; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /agent-server/src/main/java/pl/cwanix/opensun/agentserver/server/session/AgentServerSessionManager.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.server.session; 2 | 3 | import java.util.HashMap; 4 | import java.util.Map; 5 | 6 | import org.springframework.stereotype.Component; 7 | 8 | import lombok.Getter; 9 | import lombok.Setter; 10 | import lombok.extern.slf4j.Slf4j; 11 | import pl.cwanix.opensun.model.account.UserModel; 12 | import pl.cwanix.opensun.commonserver.session.SUNSessionManager; 13 | 14 | @Slf4j 15 | @Getter 16 | @Setter 17 | @Component 18 | public class AgentServerSessionManager implements SUNSessionManager { 19 | 20 | private Map sessions; 21 | 22 | public AgentServerSessionManager() { 23 | sessions = new HashMap<>(); 24 | } 25 | 26 | @Override 27 | public AgentServerSession startNewSession(final UserModel user) { 28 | AgentServerSession newSession = new AgentServerSession(user); 29 | sessions.put(user, newSession); 30 | 31 | return newSession; 32 | } 33 | 34 | @Override 35 | public AgentServerSession getSession(final UserModel user) { 36 | return sessions.get(user); 37 | } 38 | 39 | } 40 | -------------------------------------------------------------------------------- /agent-server/src/main/resources/agent-server.properties_template: -------------------------------------------------------------------------------- 1 | opensun.server.port=9000 2 | 3 | opensun.client.port=44406 4 | opensun.client.max_queue_size=128 5 | opensun.client.max_thread_count=2 6 | opensun.client.epoll_mode=false 7 | 8 | opensun.db.ip=127.0.0.1 9 | opensun.db.port=7000 10 | 11 | opensun.world.ip=127.0.0.1 12 | opensun.world.port=7000 -------------------------------------------------------------------------------- /agent-server/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | info.version=@pom.version@ 2 | 3 | spring.application.name=@pom.artifactId@ 4 | spring.profiles.active=production 5 | 6 | logging.level.root=error 7 | logging.level.pl.cwanix=debug 8 | logging.level.io.netty=info 9 | logging.pattern.console=%clr(%d{${LOG_DATEFORMAT_PATTERN:yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %clr([%25marker]){faint} %clr([userId: %5mdc{userId}]){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:%wEx} 10 | 11 | server.port=${opensun.server.port} 12 | 13 | opensun.data_directory=${application.location}/data 14 | -------------------------------------------------------------------------------- /agent-server/src/main/resources/banner.txt: -------------------------------------------------------------------------------- 1 | _____ _____ _____ _____ _____ 2 | | |___ ___ ___| __| | | | | | __|_____ _ _ 3 | | | | . | -_| |__ | | | | | | | __| | | | 4 | |_____| _|___|_|_|_____|_____|_|___| |_____|_|_|_|___| 5 | |_| Agent Server (${info.version}) 6 | -------------------------------------------------------------------------------- /agent-server/src/test/groovy/pl/cwanix/opensun/agentserver/engine/experimental/maps/objects/FieldInfoTest.groovy: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.agentserver.engine.experimental.maps.objects 2 | 3 | import pl.cwanix.opensun.agentserver.engine.experimental.maps.structures.FieldInfoStructure 4 | import spock.lang.Specification 5 | 6 | class FieldInfoTest extends Specification { 7 | 8 | /*def "loader should find area chunk"() { 9 | given: 10 | def fieldInfoStructure = new FieldInfoStructure(fieldCode: 10001, path: 'Map\\Object\\Map_Tringel\\Map_Tringel.map') 11 | def fieldInfo = new FieldInfo(fieldInfoStructure) 12 | 13 | def result = false 14 | 15 | when: 16 | for (int i = 0; i < 230000 && !result; i++) { 17 | try { 18 | fieldInfo.load('c:/dev/data', i) 19 | result = true 20 | println 'znaleziono dla ' + i 21 | } catch (Exception e) { 22 | 23 | } 24 | } 25 | 26 | then: 27 | result 28 | }*/ 29 | } 30 | -------------------------------------------------------------------------------- /auth-server/src/main/java/pl/cwanix/opensun/authserver/AuthServerApplication.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.authserver; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | @SuppressWarnings("checkstyle:HideUtilityClassConstructor") 8 | public class AuthServerApplication { 9 | 10 | public static void main(final String[] args) { 11 | SpringApplication.run(AuthServerApplication.class, args); 12 | } 13 | 14 | } 15 | 16 | -------------------------------------------------------------------------------- /auth-server/src/main/java/pl/cwanix/opensun/authserver/AuthServerConfiguration.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.authserver; 2 | 3 | import org.springframework.boot.context.properties.EnableConfigurationProperties; 4 | import org.springframework.context.annotation.Configuration; 5 | import org.springframework.context.annotation.PropertySource; 6 | 7 | import pl.cwanix.opensun.authserver.properties.AuthServerProperties; 8 | 9 | @Configuration 10 | @PropertySource("file:${application.location}/config/auth-server.properties") 11 | @EnableConfigurationProperties(AuthServerProperties.class) 12 | public class AuthServerConfiguration { 13 | 14 | } 15 | -------------------------------------------------------------------------------- /auth-server/src/main/java/pl/cwanix/opensun/authserver/communication/DatabaseProxyConnector.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.authserver.communication; 2 | 3 | import lombok.RequiredArgsConstructor; 4 | import org.springframework.stereotype.Service; 5 | import org.springframework.web.client.RestTemplate; 6 | import pl.cwanix.opensun.authserver.properties.AuthServerProperties; 7 | 8 | @Service 9 | @RequiredArgsConstructor 10 | public class DatabaseProxyConnector { 11 | 12 | private final RestTemplate restTemplate; 13 | private final AuthServerProperties properties; 14 | 15 | public int startAgentServerSession(final String userName) { 16 | return restTemplate.postForObject(properties.getAgent().getServerUrl() + "/session/new?userName=" + userName, null, Integer.class); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /auth-server/src/main/java/pl/cwanix/opensun/authserver/packet/AuthServerPacketOPCode.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.authserver.packet; 2 | 3 | import lombok.AllArgsConstructor; 4 | 5 | @AllArgsConstructor 6 | public class AuthServerPacketOPCode { 7 | 8 | public static class Auth { 9 | public static final byte CATEGORY = 0x33; 10 | 11 | public static class Ask { 12 | public static final byte VERIFY = 0x01; 13 | public static final byte AUTH = 0x03; 14 | public static final byte SRV_LIST = 0x0F; 15 | public static final byte SRV_SELECT = 0x13; 16 | } 17 | 18 | public static class Ans { 19 | public static final byte HELLO = 0x00; 20 | public static final byte VERIFY = 0x02; 21 | public static final byte AUTH = 0x0E; 22 | public static final byte SRV_LIST = 0x11; 23 | public static final byte SRV_STATE = 0x12; 24 | public static final byte SRV_SELECT = 0x1A; 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /auth-server/src/main/java/pl/cwanix/opensun/authserver/packet/c2s/auth/C2SAskAuthPacket.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.authserver.packet.c2s.auth; 2 | 3 | import lombok.Getter; 4 | import pl.cwanix.opensun.authserver.packet.AuthServerPacketOPCode; 5 | import pl.cwanix.opensun.commonserver.packets.Packet; 6 | import pl.cwanix.opensun.commonserver.packets.annotations.IncomingPacket; 7 | import pl.cwanix.opensun.utils.bytes.ByteRange; 8 | import pl.cwanix.opensun.utils.datatypes.FixedLengthField; 9 | 10 | @Getter 11 | @IncomingPacket(category = AuthServerPacketOPCode.Auth.CATEGORY, operation = AuthServerPacketOPCode.Auth.Ask.AUTH) 12 | public class C2SAskAuthPacket implements Packet { 13 | 14 | public static final ByteRange UNKNOWN_1_RANGE = ByteRange.of(0, 4); 15 | public static final ByteRange NAME_RANGE = ByteRange.of(4, 54); 16 | public static final ByteRange UNKNOWN_2_RANGE = ByteRange.of(54); 17 | public static final ByteRange PASSWORD_RANGE = ByteRange.of(55, 71); 18 | public static final ByteRange UNKNOWN_3_RANGE = ByteRange.of(71, 79); 19 | 20 | private final FixedLengthField unknown1; 21 | private final FixedLengthField name; 22 | private final FixedLengthField unknown2; 23 | private final FixedLengthField password; 24 | private final FixedLengthField unknown3; 25 | 26 | public C2SAskAuthPacket(final byte[] value) { 27 | this.unknown1 = new FixedLengthField(UNKNOWN_1_RANGE, value); 28 | this.name = new FixedLengthField(NAME_RANGE, value); 29 | this.unknown2 = new FixedLengthField(UNKNOWN_2_RANGE, value); 30 | this.password = new FixedLengthField(PASSWORD_RANGE, value); 31 | this.unknown3 = new FixedLengthField(UNKNOWN_3_RANGE, value); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /auth-server/src/main/java/pl/cwanix/opensun/authserver/packet/c2s/auth/C2SAskSrvListPacket.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.authserver.packet.c2s.auth; 2 | 3 | import pl.cwanix.opensun.authserver.packet.AuthServerPacketOPCode; 4 | import pl.cwanix.opensun.commonserver.packets.Packet; 5 | import pl.cwanix.opensun.commonserver.packets.annotations.IncomingPacket; 6 | 7 | @IncomingPacket(category = AuthServerPacketOPCode.Auth.CATEGORY, operation = AuthServerPacketOPCode.Auth.Ask.SRV_LIST) 8 | public class C2SAskSrvListPacket implements Packet { 9 | 10 | public C2SAskSrvListPacket(final byte[] value) { 11 | 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /auth-server/src/main/java/pl/cwanix/opensun/authserver/packet/c2s/auth/C2SAskSrvSelectPacket.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.authserver.packet.c2s.auth; 2 | 3 | import lombok.Getter; 4 | import pl.cwanix.opensun.authserver.packet.AuthServerPacketOPCode; 5 | import pl.cwanix.opensun.commonserver.packets.Packet; 6 | import pl.cwanix.opensun.commonserver.packets.annotations.IncomingPacket; 7 | import pl.cwanix.opensun.utils.bytes.ByteRange; 8 | import pl.cwanix.opensun.utils.datatypes.FixedLengthField; 9 | 10 | @Getter 11 | @IncomingPacket(category = AuthServerPacketOPCode.Auth.CATEGORY, operation = AuthServerPacketOPCode.Auth.Ask.SRV_SELECT) 12 | public class C2SAskSrvSelectPacket implements Packet { 13 | 14 | private static final ByteRange SERVER_INDEX_RANGE = ByteRange.of(0); 15 | private static final ByteRange CHANNEL_INDEX_RANGE = ByteRange.of(1); 16 | 17 | private final FixedLengthField serverIndex; 18 | private final FixedLengthField channelIndex; 19 | 20 | public C2SAskSrvSelectPacket(final byte[] value) { 21 | this.serverIndex = new FixedLengthField(SERVER_INDEX_RANGE, value); 22 | this.channelIndex = new FixedLengthField(CHANNEL_INDEX_RANGE, value); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /auth-server/src/main/java/pl/cwanix/opensun/authserver/packet/c2s/auth/C2SAskVerifyPacket.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.authserver.packet.c2s.auth; 2 | 3 | import lombok.Getter; 4 | import pl.cwanix.opensun.authserver.packet.AuthServerPacketOPCode; 5 | import pl.cwanix.opensun.commonserver.packets.Packet; 6 | import pl.cwanix.opensun.commonserver.packets.annotations.IncomingPacket; 7 | import pl.cwanix.opensun.utils.bytes.ByteRange; 8 | import pl.cwanix.opensun.utils.datatypes.FixedLengthField; 9 | 10 | @Getter 11 | @IncomingPacket(category = AuthServerPacketOPCode.Auth.CATEGORY, operation = AuthServerPacketOPCode.Auth.Ask.VERIFY) 12 | public class C2SAskVerifyPacket implements Packet { 13 | 14 | private static final ByteRange CLIENT_VERSION_RANGE = ByteRange.of(0, 4); 15 | private static final ByteRange CLIENT_IP_ADDRESS_RANGE = ByteRange.of(4, 20); 16 | 17 | private final FixedLengthField clientVersion; 18 | private final FixedLengthField clientIpAddress; 19 | 20 | public C2SAskVerifyPacket(final byte[] value) { 21 | this.clientVersion = new FixedLengthField(CLIENT_VERSION_RANGE, value); 22 | this.clientIpAddress = new FixedLengthField(CLIENT_IP_ADDRESS_RANGE, value); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /auth-server/src/main/java/pl/cwanix/opensun/authserver/packet/processors/auth/C2SAskSrvListProcessor.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.authserver.packet.processors.auth; 2 | 3 | import io.netty.channel.ChannelHandlerContext; 4 | import lombok.RequiredArgsConstructor; 5 | import pl.cwanix.opensun.authserver.packet.c2s.auth.C2SAskSrvListPacket; 6 | import pl.cwanix.opensun.authserver.packet.s2c.auth.S2CAnsSrvListPacket; 7 | import pl.cwanix.opensun.authserver.packet.s2c.auth.S2CAnsSrvStatePacket; 8 | import pl.cwanix.opensun.authserver.packet.structures.ChannelUnitStructure; 9 | import pl.cwanix.opensun.authserver.packet.structures.ServerUnitStructure; 10 | import pl.cwanix.opensun.commonserver.packets.SUNPacketProcessor; 11 | import pl.cwanix.opensun.commonserver.packets.annotations.PacketProcessor; 12 | import pl.cwanix.opensun.model.server.ServerDataSource; 13 | 14 | import java.util.List; 15 | import java.util.stream.Collectors; 16 | 17 | @RequiredArgsConstructor 18 | @PacketProcessor(packetClass = C2SAskSrvListPacket.class) 19 | public class C2SAskSrvListProcessor implements SUNPacketProcessor { 20 | 21 | private final ServerDataSource serverDataSource; 22 | 23 | @Override 24 | public void process(final ChannelHandlerContext ctx, final C2SAskSrvListPacket packet) { 25 | List serversList = serverDataSource.findServers() 26 | .stream() 27 | .map(ServerUnitStructure::new) 28 | .collect(Collectors.toList()); 29 | 30 | List channelsList = serverDataSource.findChannels() 31 | .stream() 32 | .map(ChannelUnitStructure::new) 33 | .collect(Collectors.toList()); 34 | 35 | ctx.writeAndFlush(new S2CAnsSrvListPacket(serversList)); 36 | ctx.writeAndFlush(new S2CAnsSrvStatePacket(channelsList)); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /auth-server/src/main/java/pl/cwanix/opensun/authserver/packet/processors/auth/C2SAskSrvSelectProcessor.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.authserver.packet.processors.auth; 2 | 3 | import io.netty.channel.ChannelHandlerContext; 4 | import lombok.RequiredArgsConstructor; 5 | import pl.cwanix.opensun.authserver.packet.c2s.auth.C2SAskSrvSelectPacket; 6 | import pl.cwanix.opensun.authserver.packet.s2c.auth.S2CAnsSrvSelectPacket; 7 | import pl.cwanix.opensun.authserver.server.AuthServerChannelHandler; 8 | import pl.cwanix.opensun.authserver.server.session.AuthServerSession; 9 | import pl.cwanix.opensun.commonserver.packets.SUNPacketProcessor; 10 | import pl.cwanix.opensun.commonserver.packets.annotations.PacketProcessor; 11 | import pl.cwanix.opensun.model.server.ServerDataSource; 12 | import pl.cwanix.opensun.model.server.ServerModel; 13 | 14 | @RequiredArgsConstructor 15 | @PacketProcessor(packetClass = C2SAskSrvSelectPacket.class) 16 | public class C2SAskSrvSelectProcessor implements SUNPacketProcessor { 17 | 18 | private final ServerDataSource serverDataSource; 19 | 20 | @Override 21 | public void process(final ChannelHandlerContext ctx, final C2SAskSrvSelectPacket packet) { 22 | AuthServerSession session = ctx.channel().attr(AuthServerChannelHandler.SESSION_ATTRIBUTE).get(); 23 | ServerModel serverModel = serverDataSource.findServer(packet.getServerIndex().toByte()); 24 | 25 | ctx.writeAndFlush(new S2CAnsSrvSelectPacket(session.getUser().getId(), serverModel.getIp(), serverModel.getPort())); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /auth-server/src/main/java/pl/cwanix/opensun/authserver/packet/processors/auth/C2SAskVerifyProcessor.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.authserver.packet.processors.auth; 2 | 3 | import io.netty.channel.ChannelHandlerContext; 4 | import lombok.RequiredArgsConstructor; 5 | import pl.cwanix.opensun.authserver.packet.c2s.auth.C2SAskVerifyPacket; 6 | import pl.cwanix.opensun.authserver.packet.s2c.auth.S2CAnsVerifyPacket; 7 | import pl.cwanix.opensun.commonserver.packets.SUNPacketProcessor; 8 | import pl.cwanix.opensun.commonserver.packets.annotations.PacketProcessor; 9 | 10 | @RequiredArgsConstructor 11 | @PacketProcessor(packetClass = C2SAskVerifyPacket.class) 12 | public class C2SAskVerifyProcessor implements SUNPacketProcessor { 13 | 14 | @Override 15 | public void process(final ChannelHandlerContext ctx, final C2SAskVerifyPacket packet) { 16 | ctx.writeAndFlush(new S2CAnsVerifyPacket()); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /auth-server/src/main/java/pl/cwanix/opensun/authserver/packet/s2c/auth/S2CAnsAuthPacket.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.authserver.packet.s2c.auth; 2 | 3 | import org.apache.commons.lang3.ArrayUtils; 4 | import pl.cwanix.opensun.authserver.packet.AuthServerPacketOPCode; 5 | import pl.cwanix.opensun.commonserver.packets.Packet; 6 | import pl.cwanix.opensun.commonserver.packets.annotations.OutgoingPacket; 7 | import pl.cwanix.opensun.utils.datatypes.FixedLengthField; 8 | 9 | @SuppressWarnings("checkstyle:MagicNumber") 10 | @OutgoingPacket(category = AuthServerPacketOPCode.Auth.CATEGORY, operation = AuthServerPacketOPCode.Auth.Ans.AUTH) 11 | public class S2CAnsAuthPacket implements Packet { 12 | 13 | private final FixedLengthField result; 14 | private final FixedLengthField info; 15 | 16 | public S2CAnsAuthPacket(final int resultCode) { 17 | this.result = new FixedLengthField(1, resultCode); 18 | this.info = new FixedLengthField(64); 19 | } 20 | 21 | @Override 22 | public Object[] getOrderedFields() { 23 | return ArrayUtils.toArray(result, info); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /auth-server/src/main/java/pl/cwanix/opensun/authserver/packet/s2c/auth/S2CAnsHelloPacket.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.authserver.packet.s2c.auth; 2 | 3 | import org.apache.commons.lang3.ArrayUtils; 4 | import pl.cwanix.opensun.authserver.packet.AuthServerPacketOPCode; 5 | import pl.cwanix.opensun.commonserver.packets.Packet; 6 | import pl.cwanix.opensun.commonserver.packets.annotations.OutgoingPacket; 7 | import pl.cwanix.opensun.utils.datatypes.FixedLengthField; 8 | 9 | @SuppressWarnings("checkstyle:MagicNumber") 10 | @OutgoingPacket(category = AuthServerPacketOPCode.Auth.CATEGORY, operation = AuthServerPacketOPCode.Auth.Ans.HELLO) 11 | public class S2CAnsHelloPacket implements Packet { 12 | 13 | private final FixedLengthField serverInfo; 14 | private final FixedLengthField encKey; 15 | 16 | public S2CAnsHelloPacket(final byte[] encKey) { 17 | this.serverInfo = new FixedLengthField(64); 18 | this.encKey = new FixedLengthField(4, encKey); 19 | } 20 | 21 | @Override 22 | public Object[] getOrderedFields() { 23 | return ArrayUtils.toArray(serverInfo, encKey); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /auth-server/src/main/java/pl/cwanix/opensun/authserver/packet/s2c/auth/S2CAnsSrvListPacket.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.authserver.packet.s2c.auth; 2 | 3 | import org.apache.commons.lang3.ArrayUtils; 4 | import pl.cwanix.opensun.authserver.packet.AuthServerPacketOPCode; 5 | import pl.cwanix.opensun.authserver.packet.structures.ServerUnitStructure; 6 | import pl.cwanix.opensun.commonserver.packets.Packet; 7 | import pl.cwanix.opensun.commonserver.packets.annotations.OutgoingPacket; 8 | import pl.cwanix.opensun.utils.datatypes.FixedLengthField; 9 | 10 | import java.util.List; 11 | 12 | @SuppressWarnings("checkstyle:MagicNumber") 13 | @OutgoingPacket(category = AuthServerPacketOPCode.Auth.CATEGORY, operation = AuthServerPacketOPCode.Auth.Ans.SRV_LIST) 14 | public class S2CAnsSrvListPacket implements Packet { 15 | 16 | private final FixedLengthField serversCount; 17 | private final List serversList; 18 | 19 | public S2CAnsSrvListPacket(final List serversList) { 20 | this.serversCount = new FixedLengthField(1, serversList.size()); 21 | this.serversList = serversList; 22 | } 23 | 24 | @Override 25 | public Object[] getOrderedFields() { 26 | return ArrayUtils.toArray(serversCount, serversList); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /auth-server/src/main/java/pl/cwanix/opensun/authserver/packet/s2c/auth/S2CAnsSrvSelectPacket.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.authserver.packet.s2c.auth; 2 | 3 | import org.apache.commons.lang3.ArrayUtils; 4 | import pl.cwanix.opensun.authserver.packet.AuthServerPacketOPCode; 5 | import pl.cwanix.opensun.commonserver.packets.Packet; 6 | import pl.cwanix.opensun.commonserver.packets.annotations.OutgoingPacket; 7 | import pl.cwanix.opensun.utils.datatypes.FixedLengthField; 8 | 9 | @SuppressWarnings({"checkstyle:MagicNumber", "checkstyle:LineLength"}) 10 | @OutgoingPacket(category = AuthServerPacketOPCode.Auth.CATEGORY, operation = AuthServerPacketOPCode.Auth.Ans.SRV_SELECT) 11 | public class S2CAnsSrvSelectPacket implements Packet { 12 | 13 | private final FixedLengthField userId; 14 | private final FixedLengthField unknownString; 15 | private final FixedLengthField serverIp; 16 | private final FixedLengthField serverPort; 17 | 18 | public S2CAnsSrvSelectPacket(final int userId, final String serverIp, final int port) { 19 | this.userId = new FixedLengthField(4, userId); 20 | this.unknownString = new FixedLengthField(32, new byte[] {0x30, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, (byte) 0x81, 0x07, 0x20, 0x42, 0x00, 0x20, 0x0f, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x0e, 0x00, 0x20, 0x07, 0x08}); 21 | this.serverIp = new FixedLengthField(32, serverIp); 22 | this.serverPort = new FixedLengthField(5, port); 23 | } 24 | 25 | @Override 26 | public Object[] getOrderedFields() { 27 | return ArrayUtils.toArray(userId, unknownString, serverIp, serverPort); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /auth-server/src/main/java/pl/cwanix/opensun/authserver/packet/s2c/auth/S2CAnsSrvStatePacket.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.authserver.packet.s2c.auth; 2 | 3 | import org.apache.commons.lang3.ArrayUtils; 4 | import pl.cwanix.opensun.authserver.packet.AuthServerPacketOPCode; 5 | import pl.cwanix.opensun.authserver.packet.structures.ChannelUnitStructure; 6 | import pl.cwanix.opensun.commonserver.packets.Packet; 7 | import pl.cwanix.opensun.commonserver.packets.annotations.OutgoingPacket; 8 | import pl.cwanix.opensun.utils.datatypes.FixedLengthField; 9 | 10 | import java.util.List; 11 | 12 | @SuppressWarnings("checkstyle:MagicNumber") 13 | @OutgoingPacket(category = AuthServerPacketOPCode.Auth.CATEGORY, operation = AuthServerPacketOPCode.Auth.Ans.SRV_STATE) 14 | public class S2CAnsSrvStatePacket implements Packet { 15 | 16 | private final FixedLengthField channelsCount; 17 | private final List channelsList; 18 | 19 | public S2CAnsSrvStatePacket(final List channelsList) { 20 | this.channelsCount = new FixedLengthField(1, channelsList.size()); 21 | this.channelsList = channelsList; 22 | } 23 | 24 | @Override 25 | public Object[] getOrderedFields() { 26 | return ArrayUtils.toArray(channelsCount, channelsList); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /auth-server/src/main/java/pl/cwanix/opensun/authserver/packet/s2c/auth/S2CAnsVerifyPacket.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.authserver.packet.s2c.auth; 2 | 3 | import org.apache.commons.lang3.ArrayUtils; 4 | import pl.cwanix.opensun.authserver.packet.AuthServerPacketOPCode; 5 | import pl.cwanix.opensun.commonserver.packets.Packet; 6 | import pl.cwanix.opensun.commonserver.packets.annotations.OutgoingPacket; 7 | import pl.cwanix.opensun.utils.datatypes.FixedLengthField; 8 | 9 | @SuppressWarnings("checkstyle:MagicNumber") 10 | @OutgoingPacket(category = AuthServerPacketOPCode.Auth.CATEGORY, operation = AuthServerPacketOPCode.Auth.Ans.VERIFY) 11 | public class S2CAnsVerifyPacket implements Packet { 12 | 13 | private final FixedLengthField result; 14 | 15 | public S2CAnsVerifyPacket() { 16 | this.result = new FixedLengthField(1, (byte) 0x00); 17 | } 18 | 19 | @Override 20 | public Object[] getOrderedFields() { 21 | return ArrayUtils.toArray(result); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /auth-server/src/main/java/pl/cwanix/opensun/authserver/packet/structures/ChannelUnitStructure.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.authserver.packet.structures; 2 | 3 | import lombok.Getter; 4 | import org.apache.commons.lang3.ArrayUtils; 5 | import pl.cwanix.opensun.commonserver.packets.PacketStructure; 6 | import pl.cwanix.opensun.model.server.ChannelModel; 7 | import pl.cwanix.opensun.utils.datatypes.FixedLengthField; 8 | 9 | @SuppressWarnings("checkstyle:MagicNumber") 10 | @Getter 11 | public class ChannelUnitStructure implements PacketStructure { 12 | 13 | private final FixedLengthField channelName; 14 | private final FixedLengthField unknown1; 15 | private final FixedLengthField channelId; 16 | private final FixedLengthField serverId; 17 | private final FixedLengthField unknown2; 18 | private final FixedLengthField unknown3; 19 | 20 | public ChannelUnitStructure(final ChannelModel channel) { 21 | this.channelName = new FixedLengthField(32, channel.getName()); 22 | this.unknown1 = new FixedLengthField(1); 23 | this.serverId = new FixedLengthField(1, channel.getServer().getId()); 24 | this.channelId = new FixedLengthField(1, channel.getId()); 25 | this.unknown2 = new FixedLengthField(1, 0x01); 26 | this.unknown3 = new FixedLengthField(1); 27 | } 28 | 29 | @Override 30 | public Object[] getOrderedFields() { 31 | return ArrayUtils.toArray(channelName, unknown1, serverId, channelId, unknown2, unknown3); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /auth-server/src/main/java/pl/cwanix/opensun/authserver/packet/structures/ServerUnitStructure.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.authserver.packet.structures; 2 | 3 | import lombok.Getter; 4 | import org.apache.commons.lang3.ArrayUtils; 5 | import pl.cwanix.opensun.commonserver.packets.PacketStructure; 6 | import pl.cwanix.opensun.model.server.ServerModel; 7 | import pl.cwanix.opensun.utils.datatypes.FixedLengthField; 8 | 9 | @SuppressWarnings("checkstyle:MagicNumber") 10 | @Getter 11 | public class ServerUnitStructure implements PacketStructure { 12 | 13 | private final FixedLengthField serverName; 14 | private final FixedLengthField unknown1; 15 | private final FixedLengthField serverId; 16 | private final FixedLengthField unknown2; 17 | 18 | public ServerUnitStructure(final ServerModel server) { 19 | this.serverName = new FixedLengthField(32, server.getName()); 20 | this.unknown1 = new FixedLengthField(1); 21 | this.serverId = new FixedLengthField(1, server.getId()); 22 | this.unknown2 = new FixedLengthField(2); 23 | } 24 | 25 | @Override 26 | public Object[] getOrderedFields() { 27 | return ArrayUtils.toArray(serverName, unknown1, serverId, unknown2); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /auth-server/src/main/java/pl/cwanix/opensun/authserver/properties/AuthServerProperties.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.authserver.properties; 2 | 3 | import org.springframework.boot.context.properties.ConfigurationProperties; 4 | import org.springframework.boot.context.properties.NestedConfigurationProperty; 5 | 6 | import lombok.Getter; 7 | import lombok.Setter; 8 | import pl.cwanix.opensun.commonserver.properties.SUNServerExternalServerProperties; 9 | import pl.cwanix.opensun.commonserver.properties.SUNServerProperties; 10 | 11 | @Getter 12 | @Setter 13 | @ConfigurationProperties(prefix = "opensun") 14 | public class AuthServerProperties extends SUNServerProperties { 15 | 16 | @NestedConfigurationProperty 17 | private SUNServerExternalServerProperties db; 18 | @NestedConfigurationProperty 19 | private SUNServerExternalServerProperties agent; 20 | } 21 | -------------------------------------------------------------------------------- /auth-server/src/main/java/pl/cwanix/opensun/authserver/server/AuthServerChannelHandler.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.authserver.server; 2 | 3 | import io.netty.channel.ChannelHandlerContext; 4 | import io.netty.util.AttributeKey; 5 | import lombok.RequiredArgsConstructor; 6 | import pl.cwanix.opensun.authserver.packet.s2c.auth.S2CAnsHelloPacket; 7 | import pl.cwanix.opensun.authserver.server.session.AuthServerSession; 8 | import pl.cwanix.opensun.authserver.server.session.AuthServerSessionManager; 9 | import pl.cwanix.opensun.commonserver.packets.Packet; 10 | import pl.cwanix.opensun.commonserver.packets.SUNPacketProcessorExecutor; 11 | import pl.cwanix.opensun.commonserver.server.SUNServerChannelHandler; 12 | 13 | @RequiredArgsConstructor 14 | public class AuthServerChannelHandler extends SUNServerChannelHandler { 15 | 16 | public static final AttributeKey SESSION_ATTRIBUTE = AttributeKey.valueOf("session"); 17 | 18 | private final SUNPacketProcessorExecutor processorExecutor; 19 | private final AuthServerSessionManager sessionManager; 20 | 21 | @Override 22 | public void channelActive(final ChannelHandlerContext ctx) { 23 | AuthServerSession session = sessionManager.startNewSession(null); 24 | ctx.channel().attr(SESSION_ATTRIBUTE).set(session); 25 | 26 | S2CAnsHelloPacket packet = new S2CAnsHelloPacket(session.getEncKey()); 27 | 28 | ctx.writeAndFlush(packet); 29 | } 30 | 31 | @Override 32 | @SuppressWarnings("unchecked") 33 | public void channelRead(final ChannelHandlerContext ctx, final Object msg) { 34 | Packet packet = (Packet) msg; 35 | processorExecutor.process(ctx, packet); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /auth-server/src/main/java/pl/cwanix/opensun/authserver/server/AuthServerChannelHandlerFactory.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.authserver.server; 2 | 3 | import org.springframework.stereotype.Component; 4 | 5 | import lombok.RequiredArgsConstructor; 6 | import pl.cwanix.opensun.authserver.server.session.AuthServerSessionManager; 7 | import pl.cwanix.opensun.commonserver.packets.SUNPacketProcessorExecutor; 8 | import pl.cwanix.opensun.commonserver.server.SUNServerChannelHandler; 9 | import pl.cwanix.opensun.commonserver.server.SUNServerChannelHandlerFactory; 10 | 11 | @Component 12 | @RequiredArgsConstructor 13 | public class AuthServerChannelHandlerFactory implements SUNServerChannelHandlerFactory { 14 | 15 | private final SUNPacketProcessorExecutor packetProcessorExecutor; 16 | private final AuthServerSessionManager sessionManager; 17 | 18 | @Override 19 | public SUNServerChannelHandler getChannelHandler() { 20 | return new AuthServerChannelHandler(packetProcessorExecutor, sessionManager); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /auth-server/src/main/java/pl/cwanix/opensun/authserver/server/session/AuthServerSession.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.authserver.server.session; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | import pl.cwanix.opensun.commonserver.session.SUNSession; 6 | import pl.cwanix.opensun.model.account.UserModel; 7 | 8 | @Getter 9 | @Setter 10 | public class AuthServerSession implements SUNSession { 11 | 12 | private UserModel user; 13 | private byte[] encKey; 14 | 15 | public AuthServerSession() { 16 | //encKey = new byte[4]; 17 | 18 | encKey = new byte[] {0, 0, 0, 0}; 19 | 20 | //Random random = new Random(); 21 | //random.nextBytes(getEncKey()); 22 | } 23 | 24 | public boolean isAuthenticated() { 25 | return user != null; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /auth-server/src/main/java/pl/cwanix/opensun/authserver/server/session/AuthServerSessionManager.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.authserver.server.session; 2 | 3 | import java.util.HashMap; 4 | import java.util.Map; 5 | 6 | import org.springframework.stereotype.Component; 7 | 8 | import lombok.Getter; 9 | import lombok.Setter; 10 | import lombok.extern.slf4j.Slf4j; 11 | import pl.cwanix.opensun.commonserver.session.SUNSessionManager; 12 | import pl.cwanix.opensun.model.account.UserModel; 13 | 14 | @Slf4j 15 | @Getter 16 | @Setter 17 | @Component 18 | public class AuthServerSessionManager implements SUNSessionManager { 19 | 20 | private Map sessions; 21 | 22 | public AuthServerSessionManager() { 23 | sessions = new HashMap<>(); 24 | } 25 | 26 | @Override 27 | public AuthServerSession startNewSession(final UserModel user) { 28 | AuthServerSession newSession = new AuthServerSession(); 29 | sessions.put(user, newSession); 30 | 31 | return newSession; 32 | } 33 | 34 | @Override 35 | public AuthServerSession getSession(final UserModel user) { 36 | // TODO Auto-generated method stub 37 | return null; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /auth-server/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | info.version=@pom.version@ 2 | 3 | spring.application.name=@pom.artifactId@ 4 | spring.profiles.active=production 5 | 6 | logging.level.root=error 7 | logging.level.pl.cwanix=debug 8 | logging.level.io.netty=info 9 | logging.pattern.console=%clr(%d{${LOG_DATEFORMAT_PATTERN:yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %clr([%25marker]){faint} %clr([userId: %5mdc{userId}]){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:%wEx} 10 | 11 | server.port=${opensun.server.port} 12 | -------------------------------------------------------------------------------- /auth-server/src/main/resources/auth-server.properties_template: -------------------------------------------------------------------------------- 1 | opensun.server.port=8000 2 | 3 | opensun.client.port=44405 4 | opensun.client.max_queue_size=128 5 | opensun.client.max_thread_count=2 6 | opensun.client.epoll_mode=false 7 | 8 | opensun.db.ip=127.0.0.1 9 | opensun.db.port=7000 -------------------------------------------------------------------------------- /auth-server/src/main/resources/banner.txt: -------------------------------------------------------------------------------- 1 | _____ _____ _____ _____ _____ 2 | | |___ ___ ___| __| | | | | | __|_____ _ _ 3 | | | | . | -_| |__ | | | | | | | __| | | | 4 | |_____| _|___|_|_|_____|_____|_|___| |_____|_|_|_|___| 5 | |_| Authentication Server (${info.version}) 6 | -------------------------------------------------------------------------------- /common-server/src/main/java/pl/cwanix/opensun/commonserver/packets/Packet.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.commonserver.packets; 2 | 3 | import pl.cwanix.opensun.commonserver.packets.annotations.IncomingPacket; 4 | import pl.cwanix.opensun.commonserver.packets.annotations.OutgoingPacket; 5 | import pl.cwanix.opensun.utils.datatypes.PacketHeader; 6 | 7 | import java.io.ByteArrayOutputStream; 8 | 9 | public interface Packet extends PacketStructure { 10 | 11 | @Override 12 | default byte[] toByteArray() throws Exception { 13 | PacketHeader currentHeader; 14 | 15 | if (this.getClass().isAnnotationPresent(IncomingPacket.class)) { 16 | currentHeader = new PacketHeader( 17 | this.getClass().getAnnotation(IncomingPacket.class).category(), 18 | this.getClass().getAnnotation(IncomingPacket.class).operation() 19 | ); 20 | } else if (this.getClass().isAnnotationPresent(OutgoingPacket.class)) { 21 | currentHeader = new PacketHeader( 22 | this.getClass().getAnnotation(OutgoingPacket.class).category(), 23 | this.getClass().getAnnotation(OutgoingPacket.class).operation() 24 | ); 25 | } else { 26 | throw new PacketException("Wrong packet definition!"); 27 | } 28 | 29 | ByteArrayOutputStream baos = new ByteArrayOutputStream(); 30 | baos.write(currentHeader.getValue()); 31 | writeFieldValuesToStream(baos); 32 | 33 | return baos.toByteArray(); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /common-server/src/main/java/pl/cwanix/opensun/commonserver/packets/PacketException.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.commonserver.packets; 2 | 3 | public class PacketException extends RuntimeException { 4 | 5 | private static final long serialVersionUID = -3420602846775021832L; 6 | 7 | public PacketException(final String message) { 8 | super(message); 9 | } 10 | 11 | public PacketException(final String message, final Throwable cause) { 12 | super(message, cause); 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /common-server/src/main/java/pl/cwanix/opensun/commonserver/packets/PacketStructure.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.commonserver.packets; 2 | 3 | import java.io.ByteArrayOutputStream; 4 | import java.io.OutputStream; 5 | import java.util.List; 6 | 7 | import org.apache.commons.lang3.ClassUtils; 8 | 9 | import pl.cwanix.opensun.utils.datatypes.SUNDataType; 10 | 11 | public interface PacketStructure extends SUNDataType { 12 | 13 | default byte[] toByteArray() throws Exception { 14 | ByteArrayOutputStream baos = new ByteArrayOutputStream(); 15 | writeFieldValuesToStream(baos); 16 | 17 | return baos.toByteArray(); 18 | } 19 | 20 | @SuppressWarnings("unchecked") 21 | default void writeFieldValuesToStream(OutputStream os) throws Exception { 22 | for (Object object : getOrderedFields()) { 23 | List> interfaces = ClassUtils.getAllInterfaces(object.getClass()); 24 | 25 | if (interfaces.contains(SUNDataType.class)) { 26 | SUNDataType fieldValue = (SUNDataType) object; 27 | 28 | os.write(fieldValue.toByteArray()); 29 | } else if (interfaces.contains(List.class)) { 30 | List fieldValue = (List) object; 31 | 32 | for (PacketStructure value : fieldValue) { 33 | os.write(value.toByteArray()); 34 | } 35 | } 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /common-server/src/main/java/pl/cwanix/opensun/commonserver/packets/SUNPacketProcessor.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.commonserver.packets; 2 | 3 | import io.netty.channel.ChannelHandlerContext; 4 | 5 | public interface SUNPacketProcessor { 6 | 7 | void process(ChannelHandlerContext ctx, T packet); 8 | } 9 | -------------------------------------------------------------------------------- /common-server/src/main/java/pl/cwanix/opensun/commonserver/packets/SUNPacketProcessorExecutor.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.commonserver.packets; 2 | 3 | import io.netty.channel.ChannelHandlerContext; 4 | import lombok.extern.slf4j.Slf4j; 5 | import org.slf4j.Marker; 6 | import org.slf4j.MarkerFactory; 7 | import org.springframework.stereotype.Component; 8 | import pl.cwanix.opensun.commonserver.packets.annotations.PacketProcessor; 9 | import pl.cwanix.opensun.commonserver.packets.processors.C2SAskUnknownProcessor; 10 | 11 | import java.util.List; 12 | import java.util.Map; 13 | import java.util.function.Function; 14 | import java.util.stream.Collectors; 15 | 16 | @Slf4j 17 | @Component 18 | public class SUNPacketProcessorExecutor { 19 | 20 | private static final Marker MARKER = MarkerFactory.getMarker("PACKET PROCESSOR EXECUTOR"); 21 | 22 | private final Map packetProcessorMap; 23 | private final C2SAskUnknownProcessor unknownProcessor; 24 | 25 | public SUNPacketProcessorExecutor(final List packetProcessors, C2SAskUnknownProcessor unknownProcessor) { 26 | this.unknownProcessor = unknownProcessor; 27 | this.packetProcessorMap = packetProcessors 28 | .stream() 29 | .filter(p -> p.getClass().isAnnotationPresent(PacketProcessor.class)) 30 | .collect(Collectors.toMap(p -> p.getClass().getAnnotation(PacketProcessor.class).packetClass(), Function.identity())); 31 | 32 | packetProcessors.stream().forEach(p -> log.debug(MARKER, "Loaded packet processor: {}", p.getClass().getSimpleName())); 33 | } 34 | 35 | public void process(final ChannelHandlerContext ctx, final Packet packet) { 36 | Class packetClass = packet.getClass(); 37 | SUNPacketProcessor processor = packetProcessorMap.getOrDefault(packetClass, unknownProcessor); 38 | 39 | processor.process(ctx, packet); 40 | } 41 | 42 | public SUNPacketProcessor getProcessor(final Class packetClass) { 43 | return packetProcessorMap.get(packetClass); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /common-server/src/main/java/pl/cwanix/opensun/commonserver/packets/annotations/IncomingPacket.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.commonserver.packets.annotations; 2 | 3 | import java.lang.annotation.Retention; 4 | import java.lang.annotation.RetentionPolicy; 5 | 6 | @Retention(RetentionPolicy.RUNTIME) 7 | public @interface IncomingPacket { 8 | 9 | byte category(); 10 | byte operation(); 11 | } 12 | -------------------------------------------------------------------------------- /common-server/src/main/java/pl/cwanix/opensun/commonserver/packets/annotations/OutgoingPacket.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.commonserver.packets.annotations; 2 | 3 | import java.lang.annotation.Retention; 4 | import java.lang.annotation.RetentionPolicy; 5 | 6 | @Retention(RetentionPolicy.RUNTIME) 7 | public @interface OutgoingPacket { 8 | 9 | byte category(); 10 | byte operation(); 11 | } 12 | -------------------------------------------------------------------------------- /common-server/src/main/java/pl/cwanix/opensun/commonserver/packets/annotations/PacketProcessor.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.commonserver.packets.annotations; 2 | 3 | import org.springframework.stereotype.Component; 4 | import pl.cwanix.opensun.commonserver.packets.Packet; 5 | 6 | import java.lang.annotation.Retention; 7 | import java.lang.annotation.RetentionPolicy; 8 | 9 | @Retention(RetentionPolicy.RUNTIME) 10 | @Component 11 | public @interface PacketProcessor { 12 | 13 | Class packetClass(); 14 | } 15 | -------------------------------------------------------------------------------- /common-server/src/main/java/pl/cwanix/opensun/commonserver/packets/c2s/C2SAskUnknownPacket.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.commonserver.packets.c2s; 2 | 3 | import lombok.Getter; 4 | import pl.cwanix.opensun.commonserver.packets.Packet; 5 | import pl.cwanix.opensun.utils.datatypes.PacketHeader; 6 | 7 | @Getter 8 | public class C2SAskUnknownPacket implements Packet { 9 | 10 | private final PacketHeader id; 11 | private final byte[] value; 12 | 13 | public C2SAskUnknownPacket(final PacketHeader id, final byte[] value) { 14 | this.id = id; 15 | this.value = value; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /common-server/src/main/java/pl/cwanix/opensun/commonserver/packets/processors/C2SAskUnknownLoggingProcessor.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.commonserver.packets.processors; 2 | 3 | import io.netty.channel.ChannelHandlerContext; 4 | import lombok.extern.slf4j.Slf4j; 5 | import org.slf4j.Marker; 6 | import org.slf4j.MarkerFactory; 7 | import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; 8 | import org.springframework.stereotype.Component; 9 | import pl.cwanix.opensun.commonserver.packets.c2s.C2SAskUnknownPacket; 10 | import pl.cwanix.opensun.utils.bytes.BytesUtils; 11 | 12 | @Slf4j 13 | @Component 14 | @ConditionalOnProperty(name="processors.unknown", havingValue="log", matchIfMissing = true) 15 | public class C2SAskUnknownLoggingProcessor implements C2SAskUnknownProcessor { 16 | 17 | private static final Marker MARKER = MarkerFactory.getMarker("C2S -> UNKNOWN"); 18 | 19 | @Override 20 | public void process(ChannelHandlerContext ctx, C2SAskUnknownPacket packet) { 21 | log.error(MARKER, "Unknown packet: {}", BytesUtils.byteArrayToHexString(packet.getId().getValue())); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /common-server/src/main/java/pl/cwanix/opensun/commonserver/packets/processors/C2SAskUnknownMockProcessor.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.commonserver.packets.processors; 2 | 3 | import io.netty.channel.ChannelHandlerContext; 4 | import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; 5 | import org.springframework.stereotype.Component; 6 | import pl.cwanix.opensun.commonserver.packets.c2s.C2SAskUnknownPacket; 7 | 8 | @Component 9 | @ConditionalOnProperty(name="processors.unknown", havingValue="mock") 10 | public class C2SAskUnknownMockProcessor implements C2SAskUnknownProcessor { 11 | 12 | @Override 13 | public void process(ChannelHandlerContext ctx, C2SAskUnknownPacket packet) { 14 | 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /common-server/src/main/java/pl/cwanix/opensun/commonserver/packets/processors/C2SAskUnknownProcessor.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.commonserver.packets.processors; 2 | 3 | import pl.cwanix.opensun.commonserver.packets.SUNPacketProcessor; 4 | import pl.cwanix.opensun.commonserver.packets.c2s.C2SAskUnknownPacket; 5 | 6 | public interface C2SAskUnknownProcessor extends SUNPacketProcessor { 7 | } 8 | -------------------------------------------------------------------------------- /common-server/src/main/java/pl/cwanix/opensun/commonserver/properties/SUNServerClientProperties.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.commonserver.properties; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | @Getter 7 | @Setter 8 | @SuppressWarnings("checkstyle:MagicNumber") 9 | public class SUNServerClientProperties { 10 | 11 | private int port; 12 | private int maxQueueSize = 128; 13 | private int maxThreadCount = 2; 14 | private boolean epollMode = false; 15 | } 16 | -------------------------------------------------------------------------------- /common-server/src/main/java/pl/cwanix/opensun/commonserver/properties/SUNServerExternalServerProperties.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.commonserver.properties; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | @Getter 7 | @Setter 8 | public class SUNServerExternalServerProperties { 9 | 10 | private String ip; 11 | private int port; 12 | 13 | public String getServerUrl() { 14 | return "http://" + ip + ":" + port; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /common-server/src/main/java/pl/cwanix/opensun/commonserver/properties/SUNServerProperties.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.commonserver.properties; 2 | 3 | import org.springframework.boot.context.properties.ConfigurationProperties; 4 | import org.springframework.boot.context.properties.NestedConfigurationProperty; 5 | 6 | import lombok.Getter; 7 | import lombok.Setter; 8 | 9 | @Getter 10 | @Setter 11 | @ConfigurationProperties(prefix = "opensun") 12 | public class SUNServerProperties { 13 | 14 | @NestedConfigurationProperty 15 | private SUNServerClientProperties client; 16 | } 17 | -------------------------------------------------------------------------------- /common-server/src/main/java/pl/cwanix/opensun/commonserver/server/SUNServerChannelHandler.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.commonserver.server; 2 | 3 | import org.slf4j.Marker; 4 | import org.slf4j.MarkerFactory; 5 | 6 | import io.netty.channel.ChannelHandlerContext; 7 | import io.netty.channel.ChannelInboundHandlerAdapter; 8 | import lombok.extern.slf4j.Slf4j; 9 | 10 | @Slf4j 11 | public class SUNServerChannelHandler extends ChannelInboundHandlerAdapter { 12 | 13 | private static final Marker MARKER = MarkerFactory.getMarker("SUN SERVER"); 14 | 15 | /** 16 | * Close the connection when an exception is raised. 17 | */ 18 | @Override 19 | public void exceptionCaught(final ChannelHandlerContext ctx, final Throwable cause) { 20 | log.error(MARKER, "An error occured", cause); 21 | ctx.close(); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /common-server/src/main/java/pl/cwanix/opensun/commonserver/server/SUNServerChannelHandlerFactory.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.commonserver.server; 2 | 3 | public interface SUNServerChannelHandlerFactory { 4 | 5 | SUNServerChannelHandler getChannelHandler(); 6 | } 7 | -------------------------------------------------------------------------------- /common-server/src/main/java/pl/cwanix/opensun/commonserver/server/messages/PacketDecoder.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.commonserver.server.messages; 2 | 3 | import java.util.Arrays; 4 | import java.util.List; 5 | import java.util.Map; 6 | 7 | import org.slf4j.Marker; 8 | import org.slf4j.MarkerFactory; 9 | 10 | import io.netty.channel.ChannelHandler; 11 | import io.netty.channel.ChannelHandlerContext; 12 | import io.netty.handler.codec.MessageToMessageDecoder; 13 | import lombok.RequiredArgsConstructor; 14 | import lombok.extern.slf4j.Slf4j; 15 | import pl.cwanix.opensun.commonserver.packets.Packet; 16 | import pl.cwanix.opensun.commonserver.packets.c2s.C2SAskUnknownPacket; 17 | import pl.cwanix.opensun.utils.bytes.BytesUtils; 18 | import pl.cwanix.opensun.utils.datatypes.PacketHeader; 19 | import pl.cwanix.opensun.utils.functions.ThrowingFunction; 20 | 21 | @Slf4j 22 | @ChannelHandler.Sharable 23 | @RequiredArgsConstructor 24 | public class PacketDecoder extends MessageToMessageDecoder { 25 | 26 | private static final Marker MARKER = MarkerFactory.getMarker("PACKET DECODER"); 27 | 28 | private final Map> clientPacketDefinitions; 29 | 30 | @Override 31 | protected void decode(final ChannelHandlerContext ctx, final byte[] msg, final List out) throws Exception { 32 | log.debug(MARKER, "Incoming data: {}", BytesUtils.byteArrayToHexString(msg)); 33 | 34 | PacketHeader id = new PacketHeader(msg[0], msg[1]); 35 | byte[] value = Arrays.copyOfRange(msg, 2, msg.length); 36 | 37 | ThrowingFunction packetCreationFunction = clientPacketDefinitions.get(id); 38 | 39 | if (packetCreationFunction == null) { 40 | out.add(new C2SAskUnknownPacket(id, value)); 41 | } else { 42 | out.add(packetCreationFunction.apply(value)); 43 | } 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /common-server/src/main/java/pl/cwanix/opensun/commonserver/server/messages/PacketEncoder.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.commonserver.server.messages; 2 | 3 | import io.netty.channel.ChannelHandler; 4 | import io.netty.channel.ChannelHandlerContext; 5 | import io.netty.handler.codec.MessageToMessageEncoder; 6 | import lombok.RequiredArgsConstructor; 7 | import lombok.extern.slf4j.Slf4j; 8 | import org.slf4j.Marker; 9 | import org.slf4j.MarkerFactory; 10 | import pl.cwanix.opensun.commonserver.packets.Packet; 11 | import pl.cwanix.opensun.utils.bytes.BytesUtils; 12 | 13 | import java.util.List; 14 | 15 | @Slf4j 16 | @ChannelHandler.Sharable 17 | @RequiredArgsConstructor 18 | public class PacketEncoder extends MessageToMessageEncoder { 19 | 20 | private static final Marker MARKER = MarkerFactory.getMarker("PACKET ENCODER"); 21 | 22 | @Override 23 | protected void encode(final ChannelHandlerContext ctx, final Packet msg, final List out) throws Exception { 24 | byte[] result = msg.toByteArray(); 25 | 26 | log.debug(MARKER, "Outgoing data: {}", BytesUtils.byteArrayToHexString(result)); 27 | 28 | out.add(result); 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /common-server/src/main/java/pl/cwanix/opensun/commonserver/session/SUNSession.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.commonserver.session; 2 | 3 | public interface SUNSession { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /common-server/src/main/java/pl/cwanix/opensun/commonserver/session/SUNSessionManager.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.commonserver.session; 2 | 3 | public interface SUNSessionManager { 4 | 5 | SUNSession startNewSession(T object); 6 | SUNSession getSession(T object); 7 | } 8 | -------------------------------------------------------------------------------- /common-server/src/main/resources/META-INF/spring.factories: -------------------------------------------------------------------------------- 1 | org.springframework.boot.autoconfigure.EnableAutoConfiguration=pl.cwanix.opensun.commonserver.SUNServerAutoConfiguration -------------------------------------------------------------------------------- /common-server/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /db-direct-connector/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 4.0.0 7 | 8 | pl.cwanix.opensun 9 | opensun-parent 10 | 0.0.2 11 | 12 | db-direct-connector 13 | 0.0.1-SNAPSHOT 14 | db-direct-connector 15 | Demo project for Spring Boot 16 | 17 | 18 | 19 | pl.cwanix.opensun 20 | model 21 | 22 | 23 | 24 | org.springframework.boot 25 | spring-boot-starter-data-jpa 26 | 27 | 28 | org.springframework.boot 29 | spring-boot-configuration-processor 30 | true 31 | 32 | 33 | org.springframework.boot 34 | spring-boot-starter-test 35 | test 36 | 37 | 38 | 39 | org.modelmapper 40 | modelmapper 41 | 2.4.0 42 | 43 | 44 | org.postgresql 45 | postgresql 46 | runtime 47 | 48 | 49 | 50 | 51 | 52 | 53 | org.apache.maven.plugins 54 | maven-source-plugin 55 | 56 | 57 | attach-sources 58 | 59 | jar 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | -------------------------------------------------------------------------------- /db-direct-connector/src/main/java/pl/cwanix/opensun/db/SUNDBDirectConnectorAutoConfiguration.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.db; 2 | 3 | import org.modelmapper.ModelMapper; 4 | import org.springframework.boot.autoconfigure.domain.EntityScan; 5 | import org.springframework.context.annotation.Bean; 6 | import org.springframework.context.annotation.ComponentScan; 7 | import org.springframework.context.annotation.Configuration; 8 | import org.springframework.data.jpa.repository.config.EnableJpaRepositories; 9 | 10 | @Configuration 11 | @ComponentScan 12 | @EntityScan("pl.cwanix.opensun.db") 13 | @EnableJpaRepositories("pl.cwanix.opensun.db") 14 | public class SUNDBDirectConnectorAutoConfiguration { 15 | 16 | @Bean 17 | public ModelMapper modelMapper() { 18 | return new ModelMapper(); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /db-direct-connector/src/main/java/pl/cwanix/opensun/db/account/AccountDataSourceImpl.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.db.account; 2 | 3 | import lombok.RequiredArgsConstructor; 4 | import org.modelmapper.ModelMapper; 5 | import org.springframework.stereotype.Service; 6 | import pl.cwanix.opensun.db.account.entity.UserEntity; 7 | import pl.cwanix.opensun.db.account.repository.UserEntityRepository; 8 | import pl.cwanix.opensun.model.account.AccountDataSource; 9 | import pl.cwanix.opensun.model.account.UserModel; 10 | 11 | @Service 12 | @RequiredArgsConstructor 13 | public class AccountDataSourceImpl implements AccountDataSource { 14 | 15 | private final ModelMapper modelMapper; 16 | private final UserEntityRepository userEntityRepository; 17 | 18 | @Override 19 | public UserModel findUser(final String name) { 20 | final UserEntity entity = userEntityRepository.findByName(name); 21 | 22 | return modelMapper.map(entity, UserModel.class); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /db-direct-connector/src/main/java/pl/cwanix/opensun/db/account/entity/AccountEntity.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.db.account.entity; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | import pl.cwanix.opensun.db.character.entity.CharacterEntity; 6 | 7 | import javax.persistence.Entity; 8 | import javax.persistence.FetchType; 9 | import javax.persistence.GeneratedValue; 10 | import javax.persistence.GenerationType; 11 | import javax.persistence.Id; 12 | import javax.persistence.OneToMany; 13 | import javax.persistence.SequenceGenerator; 14 | import javax.persistence.Table; 15 | import java.util.List; 16 | 17 | @Getter 18 | @Setter 19 | @Entity 20 | @Table(name = "account", schema = "public") 21 | public class AccountEntity { 22 | 23 | @Id 24 | @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_account_generator") 25 | @SequenceGenerator(name = "seq_account_generator", sequenceName = "seq_account") 26 | private int id; 27 | @OneToMany(mappedBy = "account", fetch = FetchType.EAGER) 28 | private List characters; 29 | } 30 | -------------------------------------------------------------------------------- /db-direct-connector/src/main/java/pl/cwanix/opensun/db/account/entity/UserEntity.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.db.account.entity; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | import javax.persistence.Entity; 7 | import javax.persistence.FetchType; 8 | import javax.persistence.GeneratedValue; 9 | import javax.persistence.GenerationType; 10 | import javax.persistence.Id; 11 | import javax.persistence.OneToOne; 12 | import javax.persistence.SequenceGenerator; 13 | import javax.persistence.Table; 14 | import java.time.LocalDateTime; 15 | 16 | @Getter 17 | @Setter 18 | @Entity 19 | @Table(name = "user", schema = "public") 20 | public class UserEntity { 21 | 22 | @Id 23 | @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_user_generator") 24 | @SequenceGenerator(name = "seq_user_generator", sequenceName = "seq_user") 25 | private int id; 26 | @OneToOne(fetch = FetchType.EAGER) 27 | private AccountEntity account; 28 | private String name; 29 | private String password; 30 | private LocalDateTime creationDate; 31 | private LocalDateTime modificationDate; 32 | private LocalDateTime lastLoginDate; 33 | } 34 | -------------------------------------------------------------------------------- /db-direct-connector/src/main/java/pl/cwanix/opensun/db/account/repository/UserEntityRepository.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.db.account.repository; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | import org.springframework.data.jpa.repository.query.Procedure; 5 | import pl.cwanix.opensun.db.account.entity.UserEntity; 6 | 7 | import javax.transaction.Transactional; 8 | 9 | public interface UserEntityRepository extends JpaRepository { 10 | 11 | UserEntity findByName(String name); 12 | 13 | @Transactional 14 | @Procedure(procedureName = "func_create_user_and_account") 15 | Integer create(String name, String password); 16 | } 17 | -------------------------------------------------------------------------------- /db-direct-connector/src/main/java/pl/cwanix/opensun/db/character/entity/CharacterPositionEntity.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.db.character.entity; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | import javax.persistence.Entity; 7 | import javax.persistence.GeneratedValue; 8 | import javax.persistence.GenerationType; 9 | import javax.persistence.Id; 10 | import javax.persistence.SequenceGenerator; 11 | import javax.persistence.Table; 12 | 13 | @Getter 14 | @Setter 15 | @Entity 16 | @Table(name = "character_position", schema = "public") 17 | public class CharacterPositionEntity { 18 | 19 | @Id 20 | @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_character_position_generator") 21 | @SequenceGenerator(name = "seq_character_position_generator", sequenceName = "seq_character_position") 22 | private int id; 23 | private int region; 24 | private int angle; 25 | private float locationX; 26 | private float locationY; 27 | private float locationZ; 28 | } 29 | -------------------------------------------------------------------------------- /db-direct-connector/src/main/java/pl/cwanix/opensun/db/character/entity/InventoryEntity.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.db.character.entity; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | import javax.persistence.Entity; 7 | import javax.persistence.GeneratedValue; 8 | import javax.persistence.GenerationType; 9 | import javax.persistence.Id; 10 | import javax.persistence.SequenceGenerator; 11 | import javax.persistence.Table; 12 | 13 | @Getter 14 | @Setter 15 | @Entity 16 | @Table(name = "inventory", schema = "public") 17 | public class InventoryEntity { 18 | 19 | @Id 20 | @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_inventory_generator") 21 | @SequenceGenerator(name = "seq_inventory_generator", sequenceName = "seq_inventory") 22 | private int id; 23 | private int money; 24 | private int inventoryLock; 25 | private byte[] inventoryItem; 26 | private byte[] tmpInventoryItem; 27 | private byte[] equipItem; 28 | } 29 | -------------------------------------------------------------------------------- /db-direct-connector/src/main/java/pl/cwanix/opensun/db/character/repository/CharacterEntityRepository.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.db.character.repository; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | import org.springframework.data.jpa.repository.query.Procedure; 5 | import pl.cwanix.opensun.db.character.entity.CharacterEntity; 6 | 7 | import javax.transaction.Transactional; 8 | import java.util.List; 9 | 10 | public interface CharacterEntityRepository extends JpaRepository { 11 | 12 | CharacterEntity findByIdAndDeletedFalse(int id); 13 | CharacterEntity findByAccountIdAndSlotAndDeletedFalse(int id, int slot); 14 | List findByAccountIdAndDeletedFalse(int accountId); 15 | 16 | @Transactional 17 | @Procedure(procedureName = "func_create_character") 18 | Integer create(int accountId, String name, int classCode, int heightCode, int faceCode, int hairCode, int slot); 19 | 20 | @Procedure(procedureName = "func_delete_character") 21 | Integer delete(int accountId, int slot); 22 | 23 | @Procedure(procedureName = "func_find_free_slot") 24 | Integer findFreeSlot(int accountId); 25 | 26 | @Procedure(procedureName = "func_update_character_position") 27 | Integer updatePosition(int id, float x, float y, float z, int angle); 28 | 29 | @Procedure(procedureName = "func_update_character_region") 30 | Integer updateRegion(int id, float x, float y, float z, int angle, int region); 31 | 32 | @Procedure(procedureName = "func_update_character_statistics") 33 | Integer updateStatistics(int id, byte attributeCode); 34 | } 35 | -------------------------------------------------------------------------------- /db-direct-connector/src/main/java/pl/cwanix/opensun/db/server/ServerDataSourceImpl.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.db.server; 2 | 3 | import lombok.RequiredArgsConstructor; 4 | import org.modelmapper.ModelMapper; 5 | import org.springframework.stereotype.Service; 6 | import pl.cwanix.opensun.db.server.entity.ChannelEntity; 7 | import pl.cwanix.opensun.db.server.entity.ServerEntity; 8 | import pl.cwanix.opensun.db.server.repository.ChannelEntityRepository; 9 | import pl.cwanix.opensun.db.server.repository.ServerEntityRepository; 10 | import pl.cwanix.opensun.model.server.ChannelModel; 11 | import pl.cwanix.opensun.model.server.ServerDataSource; 12 | import pl.cwanix.opensun.model.server.ServerModel; 13 | 14 | import java.util.List; 15 | import java.util.stream.Collectors; 16 | 17 | @Service 18 | @RequiredArgsConstructor 19 | public class ServerDataSourceImpl implements ServerDataSource { 20 | 21 | private final ServerEntityRepository serverEntityRepository; 22 | private final ChannelEntityRepository channelEntityRepository; 23 | private final ModelMapper modelMapper; 24 | 25 | @Override 26 | public List findServers() { 27 | final List entities = serverEntityRepository.findAll(); 28 | 29 | return entities.stream() 30 | .map(entity -> modelMapper.map(entity, ServerModel.class)) 31 | .collect(Collectors.toList()); 32 | } 33 | 34 | @Override 35 | public List findChannels() { 36 | final List entities = channelEntityRepository.findAll(); 37 | 38 | return entities.stream() 39 | .map(entity -> modelMapper.map(entity, ChannelModel.class)) 40 | .collect(Collectors.toList()); 41 | } 42 | 43 | @Override 44 | public ServerModel findServer(final int id) { 45 | final ServerEntity entity = serverEntityRepository.findById(id).orElseThrow(() -> new RuntimeException("wrong server")); //TODO 46 | 47 | return modelMapper.map(entity, ServerModel.class); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /db-direct-connector/src/main/java/pl/cwanix/opensun/db/server/entity/ChannelEntity.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.db.server.entity; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | import javax.persistence.Entity; 7 | import javax.persistence.GeneratedValue; 8 | import javax.persistence.GenerationType; 9 | import javax.persistence.Id; 10 | import javax.persistence.JoinColumn; 11 | import javax.persistence.ManyToOne; 12 | import javax.persistence.SequenceGenerator; 13 | import javax.persistence.Table; 14 | 15 | @Getter 16 | @Setter 17 | @Entity 18 | @Table(name = "channel_instance", schema = "config") 19 | public class ChannelEntity { 20 | 21 | @Id 22 | @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_channel_instance_generator") 23 | @SequenceGenerator(name = "seq_channel_instance_generator", sequenceName = "seq_channel_instance") 24 | private int id; 25 | private String name; 26 | @ManyToOne 27 | @JoinColumn(name = "server_instance_id") 28 | private ServerEntity server; 29 | } 30 | -------------------------------------------------------------------------------- /db-direct-connector/src/main/java/pl/cwanix/opensun/db/server/entity/ServerEntity.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.db.server.entity; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | import javax.persistence.Entity; 7 | import javax.persistence.GeneratedValue; 8 | import javax.persistence.GenerationType; 9 | import javax.persistence.Id; 10 | import javax.persistence.SequenceGenerator; 11 | import javax.persistence.Table; 12 | 13 | @Getter 14 | @Setter 15 | @Entity 16 | @Table(name = "server_instance", schema = "config") 17 | public class ServerEntity { 18 | 19 | @Id 20 | @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_server_instance_generator") 21 | @SequenceGenerator(name = "seq_server_instance_generator", sequenceName = "seq_server_instance") 22 | private int id; 23 | private int port; 24 | private String ip; 25 | private String name; 26 | } 27 | -------------------------------------------------------------------------------- /db-direct-connector/src/main/java/pl/cwanix/opensun/db/server/repository/ChannelEntityRepository.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.db.server.repository; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | import pl.cwanix.opensun.db.server.entity.ChannelEntity; 5 | 6 | public interface ChannelEntityRepository extends JpaRepository { 7 | } 8 | -------------------------------------------------------------------------------- /db-direct-connector/src/main/java/pl/cwanix/opensun/db/server/repository/ServerEntityRepository.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.db.server.repository; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | import pl.cwanix.opensun.db.server.entity.ServerEntity; 5 | 6 | public interface ServerEntityRepository extends JpaRepository { 7 | 8 | } 9 | -------------------------------------------------------------------------------- /db-direct-connector/src/main/resources/META-INF/spring.factories: -------------------------------------------------------------------------------- 1 | org.springframework.boot.autoconfigure.EnableAutoConfiguration=pl.cwanix.opensun.db.SUNDBDirectConnectorAutoConfiguration -------------------------------------------------------------------------------- /db-direct-connector/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | spring.datasource.url=jdbc:postgresql://${opensun.database.ip}:${opensun.database.port}/${opensun.database.name} 2 | spring.datasource.username=${opensun.database.user} 3 | spring.datasource.password=${opensun.database.password} 4 | spring.datasource.driver-class-name=org.postgresql.Driver 5 | 6 | spring.jpa.hibernate.ddl-auto=none 7 | spring.jpa.database-platform=org.hibernate.dialect.PostgreSQL9Dialect 8 | spring.jpa.properties.hibernate.globally_quoted_identifiers=true 9 | spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true 10 | -------------------------------------------------------------------------------- /db-server/src/main/java/pl/cwanix/opensun/db/DBServerApplication.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.db; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | @SuppressWarnings("checkstyle:HideUtilityClassConstructor") 8 | public class DBServerApplication { 9 | 10 | public static void main(final String[] args) { 11 | SpringApplication.run(DBServerApplication.class, args); 12 | } 13 | 14 | } 15 | -------------------------------------------------------------------------------- /db-server/src/main/java/pl/cwanix/opensun/db/DBServerConfiguration.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.db; 2 | 3 | import javax.annotation.PostConstruct; 4 | import javax.sql.DataSource; 5 | 6 | import org.flywaydb.core.Flyway; 7 | import org.springframework.context.annotation.Configuration; 8 | import org.springframework.context.annotation.PropertySource; 9 | 10 | import lombok.RequiredArgsConstructor; 11 | 12 | @Configuration 13 | @RequiredArgsConstructor 14 | @PropertySource("file:${application.location}/config/db-server.properties") 15 | public class DBServerConfiguration { 16 | 17 | private final DataSource dataSource; 18 | 19 | @PostConstruct 20 | public void initializeDatabase() { 21 | Flyway.configure().dataSource(dataSource).schemas("public").locations("classpath:db/public").table("schema_history").load().migrate(); 22 | Flyway.configure().dataSource(dataSource).schemas("config").locations("classpath:db/config").table("schema_history").load().migrate(); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /db-server/src/main/java/pl/cwanix/opensun/db/controllers/ChannelController.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.db.controllers; 2 | 3 | import lombok.RequiredArgsConstructor; 4 | import org.springframework.web.bind.annotation.GetMapping; 5 | import org.springframework.web.bind.annotation.RequestMapping; 6 | import org.springframework.web.bind.annotation.RestController; 7 | import pl.cwanix.opensun.db.entities.ChannelEntity; 8 | import pl.cwanix.opensun.db.repositories.ChannelEntityRepository; 9 | 10 | import java.util.List; 11 | 12 | @RestController 13 | @RequestMapping("/channel") 14 | @RequiredArgsConstructor 15 | public class ChannelController { 16 | 17 | private final ChannelEntityRepository channelRepository; 18 | 19 | @GetMapping(path = "/findAll", produces = "application/json") 20 | public List findAll() { 21 | return channelRepository.findAll(); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /db-server/src/main/java/pl/cwanix/opensun/db/controllers/ServerController.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.db.controllers; 2 | 3 | import java.util.List; 4 | 5 | import org.springframework.web.bind.annotation.GetMapping; 6 | import org.springframework.web.bind.annotation.RequestMapping; 7 | import org.springframework.web.bind.annotation.RequestParam; 8 | import org.springframework.web.bind.annotation.RestController; 9 | 10 | import lombok.RequiredArgsConstructor; 11 | import pl.cwanix.opensun.db.entities.ServerEntity; 12 | import pl.cwanix.opensun.db.repositories.ServerEntityRepository; 13 | 14 | @RestController 15 | @RequestMapping("/server") 16 | @RequiredArgsConstructor 17 | public class ServerController { 18 | 19 | private final ServerEntityRepository serverRepository; 20 | 21 | @GetMapping(path = "/findAll", produces = "application/json") 22 | public List findAll() { 23 | return serverRepository.findAll(); 24 | } 25 | 26 | @GetMapping(path = "/findById", produces = "application/json") 27 | public ServerEntity findById(@RequestParam("id") final int id) { 28 | return serverRepository.findById(id).orElse(null); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /db-server/src/main/java/pl/cwanix/opensun/db/controllers/UserController.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.db.controllers; 2 | 3 | import java.util.List; 4 | 5 | import org.springframework.web.bind.annotation.GetMapping; 6 | import org.springframework.web.bind.annotation.PostMapping; 7 | import org.springframework.web.bind.annotation.RequestMapping; 8 | import org.springframework.web.bind.annotation.RequestParam; 9 | import org.springframework.web.bind.annotation.RestController; 10 | 11 | import lombok.RequiredArgsConstructor; 12 | import pl.cwanix.opensun.db.entities.UserEntity; 13 | import pl.cwanix.opensun.db.repositories.UserEntityRepository; 14 | 15 | @RestController 16 | @RequestMapping("/user") 17 | @RequiredArgsConstructor 18 | public class UserController { 19 | 20 | private final UserEntityRepository userEntityRepository; 21 | 22 | @PostMapping(path = "/create", produces = "application/json") 23 | public Integer create(@RequestParam("name") final String name, @RequestParam("password") final String password) { 24 | return userEntityRepository.create("test", "test"); 25 | } 26 | 27 | @GetMapping(path = "/findAll", produces = "application/json") 28 | public List findAll() { 29 | return userEntityRepository.findAll(); 30 | } 31 | 32 | @GetMapping(path = "/findById", produces = "application/json") 33 | public UserEntity findById(@RequestParam("id") final int id) { 34 | return userEntityRepository.findById(id).orElse(null); 35 | } 36 | 37 | @GetMapping(path = "/findByName", produces = "application/json") 38 | public UserEntity findByName(@RequestParam("name") final String name) { 39 | return userEntityRepository.findByName(name); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /db-server/src/main/java/pl/cwanix/opensun/db/entities/AccountEntity.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.db.entities; 2 | 3 | import java.util.List; 4 | 5 | import javax.persistence.Entity; 6 | import javax.persistence.GeneratedValue; 7 | import javax.persistence.GenerationType; 8 | import javax.persistence.Id; 9 | import javax.persistence.OneToMany; 10 | import javax.persistence.SequenceGenerator; 11 | import javax.persistence.Table; 12 | 13 | import com.fasterxml.jackson.annotation.JsonBackReference; 14 | 15 | import lombok.Getter; 16 | import lombok.Setter; 17 | 18 | @Getter 19 | @Setter 20 | @Entity 21 | @Table(name = "account", schema = "public") 22 | public class AccountEntity { 23 | 24 | @Id 25 | @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_account_generator") 26 | @SequenceGenerator(name = "seq_account_generator", sequenceName = "seq_account") 27 | private int id; 28 | @JsonBackReference 29 | @OneToMany(mappedBy = "account") 30 | private List characters; 31 | } 32 | -------------------------------------------------------------------------------- /db-server/src/main/java/pl/cwanix/opensun/db/entities/ChannelEntity.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.db.entities; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | import javax.persistence.Entity; 7 | import javax.persistence.GeneratedValue; 8 | import javax.persistence.GenerationType; 9 | import javax.persistence.Id; 10 | import javax.persistence.JoinColumn; 11 | import javax.persistence.ManyToOne; 12 | import javax.persistence.SequenceGenerator; 13 | import javax.persistence.Table; 14 | 15 | @Getter 16 | @Setter 17 | @Entity 18 | @Table(name = "channel_instance", schema = "config") 19 | public class ChannelEntity { 20 | 21 | @Id 22 | @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_channel_instance_generator") 23 | @SequenceGenerator(name = "seq_channel_instance_generator", sequenceName = "seq_channel_instance") 24 | private int id; 25 | private String name; 26 | @ManyToOne 27 | @JoinColumn(name = "server_instance_id") 28 | private ServerEntity server; 29 | } 30 | -------------------------------------------------------------------------------- /db-server/src/main/java/pl/cwanix/opensun/db/entities/CharacterPositionEntity.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.db.entities; 2 | 3 | import javax.persistence.Entity; 4 | import javax.persistence.GeneratedValue; 5 | import javax.persistence.GenerationType; 6 | import javax.persistence.Id; 7 | import javax.persistence.SequenceGenerator; 8 | import javax.persistence.Table; 9 | 10 | import lombok.Getter; 11 | import lombok.Setter; 12 | 13 | @Getter 14 | @Setter 15 | @Entity 16 | @Table(name = "character_position", schema = "public") 17 | public class CharacterPositionEntity { 18 | 19 | @Id 20 | @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_character_position_generator") 21 | @SequenceGenerator(name = "seq_character_position_generator", sequenceName = "seq_character_position") 22 | private int id; 23 | private int region; 24 | private int angle; 25 | private float locationX; 26 | private float locationY; 27 | private float locationZ; 28 | } 29 | -------------------------------------------------------------------------------- /db-server/src/main/java/pl/cwanix/opensun/db/entities/InventoryEntity.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.db.entities; 2 | 3 | import javax.persistence.Entity; 4 | import javax.persistence.GeneratedValue; 5 | import javax.persistence.GenerationType; 6 | import javax.persistence.Id; 7 | import javax.persistence.SequenceGenerator; 8 | import javax.persistence.Table; 9 | 10 | import lombok.Getter; 11 | import lombok.Setter; 12 | 13 | @Getter 14 | @Setter 15 | @Entity 16 | @Table(name = "inventory", schema = "public") 17 | public class InventoryEntity { 18 | 19 | @Id 20 | @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_inventory_generator") 21 | @SequenceGenerator(name = "seq_inventory_generator", sequenceName = "seq_inventory") 22 | private int id; 23 | private int money; 24 | private int inventoryLock; 25 | private byte[] inventoryItem; 26 | private byte[] tmpInventoryItem; 27 | private byte[] equipItem; 28 | } 29 | -------------------------------------------------------------------------------- /db-server/src/main/java/pl/cwanix/opensun/db/entities/ServerEntity.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.db.entities; 2 | 3 | import javax.persistence.Entity; 4 | import javax.persistence.GeneratedValue; 5 | import javax.persistence.GenerationType; 6 | import javax.persistence.Id; 7 | import javax.persistence.SequenceGenerator; 8 | import javax.persistence.Table; 9 | 10 | import lombok.Getter; 11 | import lombok.Setter; 12 | 13 | @Getter 14 | @Setter 15 | @Entity 16 | @Table(name = "server_instance", schema = "config") 17 | public class ServerEntity { 18 | 19 | @Id 20 | @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_server_instance_generator") 21 | @SequenceGenerator(name = "seq_server_instance_generator", sequenceName = "seq_server_instance") 22 | private int id; 23 | private int port; 24 | private String ip; 25 | private String name; 26 | } 27 | -------------------------------------------------------------------------------- /db-server/src/main/java/pl/cwanix/opensun/db/entities/UserEntity.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.db.entities; 2 | 3 | import java.time.LocalDateTime; 4 | 5 | import javax.persistence.Entity; 6 | import javax.persistence.GeneratedValue; 7 | import javax.persistence.GenerationType; 8 | import javax.persistence.Id; 9 | import javax.persistence.OneToOne; 10 | import javax.persistence.SequenceGenerator; 11 | import javax.persistence.Table; 12 | 13 | import lombok.Getter; 14 | import lombok.Setter; 15 | 16 | @Getter 17 | @Setter 18 | @Entity 19 | @Table(name = "user", schema = "public") 20 | public class UserEntity { 21 | 22 | @Id 23 | @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_user_generator") 24 | @SequenceGenerator(name = "seq_user_generator", sequenceName = "seq_user") 25 | private int id; 26 | @OneToOne 27 | private AccountEntity account; 28 | private String name; 29 | private String password; 30 | private LocalDateTime creationDate; 31 | private LocalDateTime modificationDate; 32 | private LocalDateTime lastLoginDate; 33 | } 34 | -------------------------------------------------------------------------------- /db-server/src/main/java/pl/cwanix/opensun/db/repositories/ChannelEntityRepository.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.db.repositories; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | import pl.cwanix.opensun.db.entities.ChannelEntity; 5 | 6 | public interface ChannelEntityRepository extends JpaRepository { 7 | } 8 | -------------------------------------------------------------------------------- /db-server/src/main/java/pl/cwanix/opensun/db/repositories/CharacterEntityRepository.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.db.repositories; 2 | 3 | import java.util.List; 4 | 5 | import javax.transaction.Transactional; 6 | 7 | import org.springframework.data.jpa.repository.JpaRepository; 8 | import org.springframework.data.jpa.repository.query.Procedure; 9 | 10 | import pl.cwanix.opensun.db.entities.CharacterEntity; 11 | 12 | public interface CharacterEntityRepository extends JpaRepository { 13 | 14 | CharacterEntity findByIdAndDeletedFalse(int id); 15 | CharacterEntity findByAccountIdAndSlotAndDeletedFalse(int id, int slot); 16 | List findByAccountIdAndDeletedFalse(int accountId); 17 | 18 | @Transactional 19 | @Procedure(procedureName = "func_create_character") 20 | Integer create(int accountId, String name, int classCode, int heightCode, int faceCode, int hairCode, int slot); 21 | 22 | @Procedure(procedureName = "func_delete_character") 23 | Integer delete(int accountId, int slot); 24 | 25 | @Procedure(procedureName = "func_find_free_slot") 26 | Integer findFreeSlot(int accountId); 27 | 28 | @Procedure(procedureName = "func_update_character_position") 29 | Integer updatePosition(int id, float x, float y, float z, int angle); 30 | 31 | @Procedure(procedureName = "func_update_character_statistics") 32 | Integer updateStatistics(int id, byte attributeCode); 33 | } 34 | -------------------------------------------------------------------------------- /db-server/src/main/java/pl/cwanix/opensun/db/repositories/ServerEntityRepository.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.db.repositories; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | 5 | import pl.cwanix.opensun.db.entities.ServerEntity; 6 | 7 | public interface ServerEntityRepository extends JpaRepository { 8 | 9 | } 10 | -------------------------------------------------------------------------------- /db-server/src/main/java/pl/cwanix/opensun/db/repositories/UserEntityRepository.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.db.repositories; 2 | 3 | import javax.transaction.Transactional; 4 | 5 | import org.springframework.data.jpa.repository.JpaRepository; 6 | import org.springframework.data.jpa.repository.query.Procedure; 7 | 8 | import pl.cwanix.opensun.db.entities.UserEntity; 9 | 10 | public interface UserEntityRepository extends JpaRepository { 11 | 12 | UserEntity findByName(String name); 13 | 14 | @Transactional 15 | @Procedure(procedureName = "func_create_user_and_account") 16 | Integer create(String name, String password); 17 | } 18 | -------------------------------------------------------------------------------- /db-server/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | info.version=@pom.version@ 2 | 3 | spring.application.name=@pom.artifactId@ 4 | spring.profiles.active=production 5 | 6 | logging.level.root=error 7 | logging.level.pl.cwanix=debug 8 | logging.level.io.netty=info 9 | logging.pattern.console=%clr(%d{${LOG_DATEFORMAT_PATTERN:yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %clr([%25marker]){faint} %clr([userId: %5mdc{userId}]){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:%wEx} 10 | 11 | 12 | server.port=${opensun.server.port} 13 | 14 | spring.datasource.url=jdbc:postgresql://${opensun.database.ip}:${opensun.database.port}/${opensun.database.name} 15 | spring.datasource.username=${opensun.database.user} 16 | spring.datasource.password=${opensun.database.password} 17 | spring.datasource.driver-class-name=org.postgresql.Driver 18 | 19 | spring.jpa.hibernate.ddl-auto=none 20 | spring.jpa.database-platform=org.hibernate.dialect.PostgreSQL9Dialect 21 | spring.jpa.properties.hibernate.globally_quoted_identifiers=true 22 | spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true 23 | 24 | spring.flyway.enabled=false 25 | -------------------------------------------------------------------------------- /db-server/src/main/resources/banner.txt: -------------------------------------------------------------------------------- 1 | _____ _____ _____ _____ _____ 2 | | |___ ___ ___| __| | | | | | __|_____ _ _ 3 | | | | . | -_| |__ | | | | | | | __| | | | 4 | |_____| _|___|_|_|_____|_____|_|___| |_____|_|_|_|___| 5 | |_| DB Server (${info.version}) 6 | -------------------------------------------------------------------------------- /db-server/src/main/resources/db-server.properties_template: -------------------------------------------------------------------------------- 1 | opensun.server.port=7000 2 | 3 | opensun.database.ip=localhost 4 | opensun.database.port=5432 5 | opensun.database.name=test 6 | opensun.database.user=test 7 | opensun.database.password=test -------------------------------------------------------------------------------- /db-server/src/main/resources/db/config/V0_0_1__server_list.sql: -------------------------------------------------------------------------------- 1 | ------------------------------------------------------------------ 2 | -- SEQUENCE seq_server_instance 3 | ------------------------------------------------------------------ 4 | CREATE SEQUENCE seq_server_instance INCREMENT BY 50 5 | MINVALUE 1 6 | MAXVALUE 2147483647 7 | START 1 8 | CACHE 1; 9 | 10 | ------------------------------------------------------------------ 11 | -- TABLE server_instance 12 | ------------------------------------------------------------------ 13 | CREATE TABLE "server_instance" ( 14 | id integer NOT NULL, 15 | port integer NOT NULL, 16 | ip character varying(255), 17 | name character varying(255), 18 | CONSTRAINT server_pkey PRIMARY KEY (id) 19 | ); -------------------------------------------------------------------------------- /db-server/src/main/resources/db/config/V0_0_2__channel_list.sql: -------------------------------------------------------------------------------- 1 | ------------------------------------------------------------------ 2 | -- SEQUENCE seq_channel_instance 3 | ------------------------------------------------------------------ 4 | CREATE SEQUENCE seq_channel_instance INCREMENT BY 50 5 | MINVALUE 1 6 | MAXVALUE 2147483647 7 | START 1 8 | CACHE 1; 9 | 10 | ------------------------------------------------------------------ 11 | -- TABLE channel_instance 12 | ------------------------------------------------------------------ 13 | CREATE TABLE "channel_instance" ( 14 | id integer NOT NULL, 15 | server_instance_id integer NOT NULL, 16 | name character varying(255), 17 | CONSTRAINT channel_instance_pkey PRIMARY KEY (id), 18 | CONSTRAINT channel_instance_server_instance_fkey FOREIGN KEY (server_instance_id) 19 | REFERENCES server_instance (id) MATCH SIMPLE 20 | ON UPDATE NO ACTION ON DELETE NO ACTION 21 | ); -------------------------------------------------------------------------------- /db-server/src/main/resources/db/public/V0_0_10__character_statistics.sql: -------------------------------------------------------------------------------- 1 | ------------------------------------------------------------------ 2 | -- FUNCTION func_update_character_statistics 3 | ------------------------------------------------------------------ 4 | CREATE OR REPLACE FUNCTION func_update_character_statistics( 5 | in_id integer, 6 | in_attribute_code integer 7 | ) RETURNS integer LANGUAGE 'plpgsql' 8 | 9 | AS $BODY$ 10 | BEGIN 11 | IF (SELECT remain_stat FROM "character" WHERE id = in_id) <= 0 THEN 12 | RETURN 1; 13 | END IF; 14 | 15 | CASE in_attribute_code 16 | WHEN 1 THEN 17 | UPDATE "character" SET 18 | strength = strength + 1, 19 | remain_stat = remain_stat - 1 20 | WHERE id = in_id; 21 | WHEN 2 THEN 22 | UPDATE "character" SET 23 | dexterity = dexterity + 1, 24 | remain_stat = remain_stat - 1 25 | WHERE id = in_id; 26 | WHEN 3 THEN 27 | UPDATE "character" SET 28 | vitality = vitality + 1, 29 | remain_stat = remain_stat - 1 30 | WHERE id = in_id; 31 | WHEN 4 THEN 32 | UPDATE "character" SET 33 | inteligence = inteligence + 1, 34 | remain_stat = remain_stat - 1 35 | WHERE id = in_id; 36 | WHEN 5 THEN 37 | UPDATE "character" SET 38 | spirit = spirit + 1, 39 | remain_stat = remain_stat - 1 40 | WHERE id = in_id; 41 | WHEN 6 THEN 42 | UPDATE "character" SET 43 | skill_stat1 = skill_stat1 + 1, 44 | remain_stat = remain_stat - 1 45 | WHERE id = in_id; 46 | WHEN 7 THEN 47 | UPDATE "character" SET 48 | skill_stat2 = skill_stat2 + 1, 49 | remain_stat = remain_stat - 1 50 | WHERE id = in_id; 51 | ELSE RETURN 2; 52 | END CASE; 53 | 54 | RETURN 0; 55 | END; 56 | $BODY$; -------------------------------------------------------------------------------- /db-server/src/main/resources/db/public/V0_0_11__character_movement_angle.sql: -------------------------------------------------------------------------------- 1 | ------------------------------------------------------------------ 2 | -- TABLE character_position 3 | ------------------------------------------------------------------ 4 | ALTER TABLE "character_position" 5 | ADD COLUMN angle integer; 6 | 7 | UPDATE "character_position" SET angle = 0; 8 | 9 | ALTER TABLE "character_position" 10 | ALTER COLUMN angle SET NOT NULL; 11 | 12 | ------------------------------------------------------------------ 13 | -- TABLE character 14 | ------------------------------------------------------------------ 15 | ALTER TABLE "character" 16 | RENAME COLUMN inteligence TO intelligence; 17 | 18 | ------------------------------------------------------------------ 19 | -- FUNCTION func_update_character_position 20 | ------------------------------------------------------------------ 21 | DROP FUNCTION func_update_character_position(integer, real, real, real); 22 | 23 | CREATE OR REPLACE FUNCTION func_update_character_position( 24 | in_id integer, 25 | in_x real, 26 | in_y real, 27 | in_z real, 28 | in_angle integer 29 | ) RETURNS integer LANGUAGE 'plpgsql' 30 | 31 | AS $BODY$ 32 | BEGIN 33 | UPDATE "character_position" SET 34 | locationx = in_x, 35 | locationy = in_y, 36 | locationz = in_z, 37 | angle = in_angle 38 | WHERE id = (SELECT position_id FROM character WHERE id = in_id); 39 | 40 | RETURN 0; 41 | END; 42 | $BODY$; -------------------------------------------------------------------------------- /db-server/src/main/resources/db/public/V0_0_13__character_change_region.sql: -------------------------------------------------------------------------------- 1 | ------------------------------------------------------------------ 2 | -- FUNCTION func_update_character_region 3 | ------------------------------------------------------------------ 4 | CREATE OR REPLACE FUNCTION func_update_character_region( 5 | in_id integer, 6 | in_x real, 7 | in_y real, 8 | in_z real, 9 | in_angle integer, 10 | in_region integer 11 | ) RETURNS integer LANGUAGE 'plpgsql' 12 | 13 | AS $BODY$ 14 | BEGIN 15 | UPDATE "character_position" SET 16 | locationx = in_x, 17 | locationy = in_y, 18 | locationz = in_z, 19 | angle = in_angle, 20 | region = in_region 21 | WHERE id = (SELECT position_id FROM character WHERE id = in_id); 22 | 23 | RETURN 0; 24 | END; 25 | $BODY$; -------------------------------------------------------------------------------- /db-server/src/main/resources/db/public/V0_0_4__character_set_fix.sql: -------------------------------------------------------------------------------- 1 | ------------------------------------------------------------------ 2 | -- TABLE character_set 3 | ------------------------------------------------------------------ 4 | UPDATE "character_set" SET 5 | equip_item = decode('00', 'hex'), 6 | inventory_item = decode('00', 'hex'), 7 | mission = decode('00', 'hex'), 8 | quest = decode('00', 'hex'), 9 | quick = decode('00', 'hex'), 10 | style = decode('00', 'hex'), 11 | tmp_inventory_item = decode('00', 'hex'); 12 | 13 | UPDATE "character_set" SET 14 | skill = decode('0200FD0301E507', 'hex') 15 | WHERE class_code = 1; 16 | 17 | UPDATE "character_set" SET 18 | skill = decode('0200A10F018913', 'hex') 19 | WHERE class_code = 2; 20 | 21 | UPDATE "character_set" SET 22 | skill = decode('0100E12E', 'hex') 23 | WHERE class_code = 3; 24 | 25 | UPDATE "character_set" SET 26 | skill = decode('0100591B', 'hex') 27 | WHERE class_code = 4; 28 | 29 | UPDATE "character_set" SET 30 | skill = decode('03001127012527029D2C', 'hex') 31 | WHERE class_code = 5; -------------------------------------------------------------------------------- /db-server/src/main/resources/db/public/V0_0_6__server_list.sql: -------------------------------------------------------------------------------- 1 | ------------------------------------------------------------------ 2 | -- SEQUENCE seq_server 3 | ------------------------------------------------------------------ 4 | CREATE SEQUENCE seq_server INCREMENT BY 50 5 | MINVALUE 1 6 | MAXVALUE 2147483647 7 | START 1 8 | CACHE 1; 9 | 10 | ------------------------------------------------------------------ 11 | -- TABLE server 12 | ------------------------------------------------------------------ 13 | CREATE TABLE "server" ( 14 | id integer NOT NULL, 15 | port integer NOT NULL, 16 | ip character varying(255), 17 | name character varying(255), 18 | CONSTRAINT server_pkey PRIMARY KEY (id) 19 | ); -------------------------------------------------------------------------------- /db-server/src/main/resources/db/public/V0_0_7__character_movement.sql: -------------------------------------------------------------------------------- 1 | ------------------------------------------------------------------ 2 | -- TABLE character_position 3 | ------------------------------------------------------------------ 4 | ALTER TABLE "character_position" 5 | ALTER COLUMN locationx TYPE real, 6 | ALTER COLUMN locationy TYPE real, 7 | ALTER COLUMN locationz TYPE real; 8 | 9 | ------------------------------------------------------------------ 10 | -- TABLE character_set 11 | ------------------------------------------------------------------ 12 | ALTER TABLE "character_set" 13 | ALTER COLUMN locationx TYPE real, 14 | ALTER COLUMN locationy TYPE real, 15 | ALTER COLUMN locationz TYPE real; 16 | 17 | ------------------------------------------------------------------ 18 | -- FUNCTION func_update_character_position 19 | ------------------------------------------------------------------ 20 | CREATE OR REPLACE FUNCTION func_update_character_position( 21 | in_id integer, 22 | in_x real, 23 | in_y real, 24 | in_z real 25 | ) RETURNS integer LANGUAGE 'plpgsql' 26 | 27 | AS $BODY$ 28 | BEGIN 29 | UPDATE "character_position" SET 30 | locationx = in_x, 31 | locationy = in_y, 32 | locationz = in_z 33 | WHERE id = (SELECT position_id FROM character WHERE id = in_id); 34 | 35 | RETURN 0; 36 | END; 37 | $BODY$; -------------------------------------------------------------------------------- /db-server/src/main/resources/db/public/V0_0_8__cleaning_after_migration_to_separate_schema.sql: -------------------------------------------------------------------------------- 1 | ------------------------------------------------------------------ 2 | -- TABLE server 3 | ------------------------------------------------------------------ 4 | DROP TABLE "server"; 5 | 6 | 7 | ------------------------------------------------------------------ 8 | -- SEQUENCE seq_server 9 | ------------------------------------------------------------------ 10 | DROP SEQUENCE "seq_server"; -------------------------------------------------------------------------------- /db-server/src/main/resources/db/public/V0_0_9__uppercase_login.sql: -------------------------------------------------------------------------------- 1 | ------------------------------------------------------------------ 2 | -- FUNCTION func_create_user_and_account 3 | ------------------------------------------------------------------ 4 | CREATE OR REPLACE FUNCTION func_create_user_and_account( 5 | in_name character varying, 6 | in_password character varying 7 | ) RETURNS integer LANGUAGE 'plpgsql' 8 | 9 | AS $BODY$ 10 | DECLARE 11 | acc_id integer; 12 | 13 | BEGIN 14 | INSERT INTO "account" ( 15 | id 16 | ) VALUES ( 17 | nextval('seq_account') 18 | ) RETURNING id INTO acc_id; 19 | 20 | INSERT INTO "user" ( 21 | id, 22 | name, 23 | password, 24 | account_id 25 | ) VALUES ( 26 | nextval('seq_user'), 27 | upper(in_name), 28 | in_password, 29 | acc_id 30 | ); 31 | 32 | RETURN 0; 33 | END; 34 | $BODY$; -------------------------------------------------------------------------------- /game-server/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 4.0.0 7 | 8 | pl.cwanix.opensun 9 | opensun-parent 10 | 0.0.2 11 | 12 | game-server 13 | 0.0.1-SNAPSHOT 14 | game-server 15 | Demo project for Spring Boot 16 | 17 | 18 | 19 | org.springframework.boot 20 | spring-boot-starter-web 21 | 22 | 23 | org.springframework.boot 24 | spring-boot-configuration-processor 25 | true 26 | 27 | 28 | org.springframework.boot 29 | spring-boot-starter-test 30 | test 31 | 32 | 33 | 34 | org.springframework.boot 35 | spring-boot-devtools 36 | runtime 37 | true 38 | 39 | 40 | 41 | 42 | 43 | 44 | org.springframework.boot 45 | spring-boot-maven-plugin 46 | 47 | 48 | 49 | repackage 50 | 51 | 52 | 53 | 54 | true 55 | 56 | 57 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /game-server/src/main/java/pl/cwanix/opensun/gameserver/GameServerApplication.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.gameserver; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | @SuppressWarnings("checkstyle:HideUtilityClassConstructor") 8 | public class GameServerApplication { 9 | 10 | public static void main(final String[] args) { 11 | SpringApplication.run(GameServerApplication.class, args); 12 | } 13 | 14 | } 15 | -------------------------------------------------------------------------------- /game-server/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /game-server/src/main/resources/banner.txt: -------------------------------------------------------------------------------- 1 | _____ _____ _____ _____ _____ 2 | | |___ ___ ___| __| | | | | | __|_____ _ _ 3 | | | | . | -_| |__ | | | | | | | __| | | | 4 | |_____| _|___|_|_|_____|_____|_|___| |_____|_|_|_|___| 5 | |_| Game Server (${info.version}) 6 | -------------------------------------------------------------------------------- /model/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 4.0.0 8 | 9 | pl.cwanix.opensun 10 | opensun-parent 11 | 0.0.2 12 | 13 | model 14 | 0.0.1-SNAPSHOT 15 | domain 16 | 17 | 18 | 19 | org.apache.commons 20 | commons-lang3 21 | 22 | 23 | org.slf4j 24 | slf4j-api 25 | 26 | 27 | 28 | 29 | 30 | 31 | org.apache.maven.plugins 32 | maven-source-plugin 33 | 34 | 35 | attach-sources 36 | 37 | jar 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /model/src/main/java/pl/cwanix/opensun/model/account/AccountDataSource.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.model.account; 2 | 3 | public interface AccountDataSource { 4 | 5 | UserModel findUser(String userName); 6 | } 7 | -------------------------------------------------------------------------------- /model/src/main/java/pl/cwanix/opensun/model/account/AccountModel.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.model.account; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | import pl.cwanix.opensun.model.character.CharacterModel; 6 | 7 | import java.util.List; 8 | 9 | @Getter 10 | @Setter 11 | public class AccountModel { 12 | 13 | private int id; 14 | private List characters; 15 | } 16 | -------------------------------------------------------------------------------- /model/src/main/java/pl/cwanix/opensun/model/account/UserModel.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.model.account; 2 | 3 | import lombok.EqualsAndHashCode; 4 | import lombok.Getter; 5 | import lombok.Setter; 6 | 7 | import java.time.LocalDateTime; 8 | 9 | @Getter 10 | @Setter 11 | @EqualsAndHashCode(of = { "id", "name" }) 12 | public class UserModel { 13 | 14 | private int id; 15 | private AccountModel account; 16 | private String name; 17 | private String password; 18 | private LocalDateTime creationDate; 19 | private LocalDateTime modificationDate; 20 | private LocalDateTime lastLoginDate; 21 | } 22 | -------------------------------------------------------------------------------- /model/src/main/java/pl/cwanix/opensun/model/character/CharacterDataSource.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.model.character; 2 | 3 | import java.util.List; 4 | 5 | public interface CharacterDataSource { 6 | 7 | int create(int accountId, String name, int classCode, int heightCode, int faceCode, int hairCode, int slot); 8 | int delete(int accountId, int slot); 9 | CharacterModel findCharacter(int accountId, int slot); 10 | List findCharactersList(int accountId); 11 | int findFreeSlot(int accountId); 12 | int updateCharacterPosition(int characterId, float x, float y, float z, int angle); 13 | int updateCharacterRegion(int characterId, float x, float y, float z, int angle, int field); 14 | int updateCharacterStatistics(int characterId, byte attributeCode); 15 | } 16 | -------------------------------------------------------------------------------- /model/src/main/java/pl/cwanix/opensun/model/character/CharacterPositionModel.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.model.character; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | @Getter 7 | @Setter 8 | public class CharacterPositionModel { 9 | 10 | private int id; 11 | private int region; 12 | private int angle; 13 | private float locationX; 14 | private float locationY; 15 | private float locationZ; 16 | } 17 | -------------------------------------------------------------------------------- /model/src/main/java/pl/cwanix/opensun/model/character/InventoryModel.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.model.character; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | @Getter 7 | @Setter 8 | public class InventoryModel { 9 | 10 | private int id; 11 | private int money; 12 | private int inventoryLock; 13 | private byte[] inventoryItem; 14 | private byte[] tmpInventoryItem; 15 | private byte[] equipItem; 16 | } 17 | -------------------------------------------------------------------------------- /model/src/main/java/pl/cwanix/opensun/model/server/ChannelModel.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.model.server; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | @Getter 7 | @Setter 8 | public class ChannelModel { 9 | 10 | private int id; 11 | private ServerModel server; 12 | private String name; 13 | } 14 | -------------------------------------------------------------------------------- /model/src/main/java/pl/cwanix/opensun/model/server/ServerDataSource.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.model.server; 2 | 3 | import java.util.List; 4 | 5 | public interface ServerDataSource { 6 | 7 | List findServers(); 8 | List findChannels(); 9 | ServerModel findServer(int id); 10 | } 11 | -------------------------------------------------------------------------------- /model/src/main/java/pl/cwanix/opensun/model/server/ServerModel.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.model.server; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | @Getter 7 | @Setter 8 | public class ServerModel { 9 | 10 | private int id; 11 | private int port; 12 | private String ip; 13 | private String name; 14 | } 15 | -------------------------------------------------------------------------------- /utils/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 4.0.0 8 | 9 | pl.cwanix.opensun 10 | opensun-parent 11 | 0.0.2 12 | 13 | utils 14 | 0.0.1-SNAPSHOT 15 | utils 16 | 17 | 18 | 19 | org.apache.commons 20 | commons-lang3 21 | 22 | 23 | org.slf4j 24 | slf4j-api 25 | 26 | 27 | 28 | 29 | 30 | 31 | org.apache.maven.plugins 32 | maven-source-plugin 33 | 34 | 35 | attach-sources 36 | 37 | jar 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /utils/src/main/java/pl/cwanix/opensun/utils/bytes/BitField.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.utils.bytes; 2 | 3 | public class BitField { 4 | 5 | private final long mask; 6 | private final long shift; 7 | 8 | public BitField(final long mask) { 9 | this.mask = mask; 10 | this.shift = mask == 0 ? 0 : Long.numberOfTrailingZeros(mask); 11 | } 12 | 13 | public long getValue(final long data) { 14 | return (data & mask) >> shift; 15 | } 16 | 17 | public long setValue(final long data, final long value) { 18 | return (data & ~mask) | ((value << shift) & mask); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /utils/src/main/java/pl/cwanix/opensun/utils/bytes/ByteRange.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.utils.bytes; 2 | 3 | import lombok.Value; 4 | 5 | import java.util.Arrays; 6 | 7 | @Value(staticConstructor = "of") 8 | public class ByteRange { 9 | 10 | private int start; 11 | private int end; 12 | 13 | public static ByteRange of(final int start) { 14 | return new ByteRange(start, start + 1); 15 | } 16 | 17 | public byte[] getFromArray(final byte... value) { 18 | return Arrays.copyOfRange(value, start, end); 19 | } 20 | 21 | public int getLength() { 22 | return end - start; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /utils/src/main/java/pl/cwanix/opensun/utils/datatypes/PacketHeader.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.utils.datatypes; 2 | 3 | import lombok.EqualsAndHashCode; 4 | import lombok.Getter; 5 | import lombok.RequiredArgsConstructor; 6 | 7 | @Getter 8 | @EqualsAndHashCode 9 | @RequiredArgsConstructor 10 | public class PacketHeader { 11 | 12 | private final byte idA; 13 | private final byte idB; 14 | 15 | public byte[] getValue() { 16 | return new byte[] {idA, idB}; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /utils/src/main/java/pl/cwanix/opensun/utils/datatypes/SUNAABB.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.utils.datatypes; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | import java.util.Arrays; 7 | 8 | @Getter 9 | @Setter 10 | @SuppressWarnings("checkstyle:MagicNumber") 11 | public class SUNAABB implements SUNDataType { 12 | 13 | private Vector min; 14 | private Vector max; 15 | 16 | public SUNAABB(final byte[] value) { 17 | this.min = new Vector(Arrays.copyOfRange(value, 0, 12)); 18 | this.max = new Vector(Arrays.copyOfRange(value, 12, 24)); 19 | } 20 | 21 | @Override 22 | public byte[] toByteArray() throws Exception { 23 | return new byte[0]; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /utils/src/main/java/pl/cwanix/opensun/utils/datatypes/SUNColor.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.utils.datatypes; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | import lombok.Setter; 6 | 7 | @Getter 8 | @Setter 9 | @AllArgsConstructor 10 | public class SUNColor implements SUNDataType { 11 | 12 | private byte r; 13 | private byte g; 14 | private byte b; 15 | 16 | public SUNColor() { 17 | this.r = 0; 18 | this.g = 0; 19 | this.b = 0; 20 | } 21 | 22 | public SUNColor(final byte[] value) { 23 | this.r = value[0]; 24 | this.g = value[1]; 25 | this.b = value[2]; 26 | } 27 | 28 | @Override 29 | public byte[] toByteArray() throws Exception { 30 | return new byte[0]; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /utils/src/main/java/pl/cwanix/opensun/utils/datatypes/SUNDataType.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.utils.datatypes; 2 | 3 | public interface SUNDataType { 4 | 5 | byte[] toByteArray() throws Exception; 6 | 7 | default Object[] getOrderedFields() { 8 | return new Object[0]; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /utils/src/main/java/pl/cwanix/opensun/utils/datatypes/SUNId.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.utils.datatypes; 2 | 3 | import lombok.Getter; 4 | import lombok.RequiredArgsConstructor; 5 | import lombok.Setter; 6 | 7 | @Getter 8 | @Setter 9 | @RequiredArgsConstructor 10 | public class SUNId implements SUNDataType { 11 | 12 | private final int id; 13 | 14 | @Override 15 | public byte[] toByteArray() throws Exception { 16 | return new byte[0]; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /utils/src/main/java/pl/cwanix/opensun/utils/datatypes/Vector.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.utils.datatypes; 2 | 3 | import java.nio.ByteBuffer; 4 | import java.nio.ByteOrder; 5 | 6 | import lombok.AllArgsConstructor; 7 | import lombok.Getter; 8 | import lombok.Setter; 9 | 10 | @Getter 11 | @Setter 12 | @AllArgsConstructor 13 | public class Vector implements SUNDataType { 14 | 15 | private static final int X_VALUE_POSITION = 0; 16 | private static final int Y_VALUE_POSITION = 4; 17 | private static final int Z_VALUE_POSITION = 8; 18 | private static final int DATA_ARRAY_SIZE = 12; 19 | 20 | 21 | private float x; 22 | private float y; 23 | private float z; 24 | 25 | public Vector() { 26 | x = 0; 27 | y = 0; 28 | z = 0; 29 | } 30 | 31 | public Vector(final byte[] value) { 32 | ByteBuffer buffer = ByteBuffer.wrap(value).order(ByteOrder.LITTLE_ENDIAN); 33 | 34 | x = buffer.getFloat(X_VALUE_POSITION); 35 | y = buffer.getFloat(Y_VALUE_POSITION); 36 | z = buffer.getFloat(Z_VALUE_POSITION); 37 | } 38 | 39 | @Override 40 | public byte[] toByteArray() { 41 | return ByteBuffer.allocate(DATA_ARRAY_SIZE).order(ByteOrder.LITTLE_ENDIAN).putFloat(x).putFloat(y).putFloat(z).array(); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /utils/src/main/java/pl/cwanix/opensun/utils/files/SUNArchiveChunkInfo.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.utils.files; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import lombok.Setter; 7 | 8 | @Getter 9 | @Setter 10 | @NoArgsConstructor 11 | @AllArgsConstructor 12 | public class SUNArchiveChunkInfo { 13 | 14 | public static final int CHUNK_INFO_SIZE = 6; 15 | 16 | private int id; 17 | private long size; 18 | } 19 | -------------------------------------------------------------------------------- /utils/src/main/java/pl/cwanix/opensun/utils/files/SUNFilePacker.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.utils.files; 2 | 3 | public class SUNFilePacker { 4 | 5 | 6 | } 7 | -------------------------------------------------------------------------------- /utils/src/main/java/pl/cwanix/opensun/utils/functions/ThrowingFunction.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.utils.functions; 2 | 3 | @FunctionalInterface 4 | public interface ThrowingFunction { 5 | R apply(T t) throws E; 6 | } 7 | -------------------------------------------------------------------------------- /utils/src/test/java/pl/cwanix/opensun/utils/encryption/TEATest.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.utils.encryption; 2 | 3 | import static org.junit.jupiter.api.Assertions.assertArrayEquals; 4 | 5 | import java.util.stream.Stream; 6 | 7 | import org.junit.jupiter.api.DisplayName; 8 | import org.junit.jupiter.params.ParameterizedTest; 9 | import org.junit.jupiter.params.provider.Arguments; 10 | import org.junit.jupiter.params.provider.MethodSource; 11 | 12 | public class TEATest { 13 | 14 | @DisplayName("TEA Encoding") 15 | @ParameterizedTest(name = "Encoding password: {0}") 16 | @MethodSource("encDecDataSource") 17 | public void shouldEncryptData(String input, byte[] expected, byte[] key) { 18 | byte[] result = TEA.encode(input.getBytes(), key); 19 | 20 | assertArrayEquals(expected, result); 21 | } 22 | 23 | @DisplayName("TEA Decoding") 24 | @ParameterizedTest(name = "Decoding password: {0}") 25 | @MethodSource("encDecDataSource") 26 | public void shouldDecryptData(String expected, byte[] input, byte[] key) { 27 | byte[] result = TEA.decode(input, key); 28 | 29 | assertArrayEquals(expected.getBytes(), result); 30 | } 31 | 32 | @SuppressWarnings("unused") 33 | private static Stream encDecDataSource() { 34 | return Stream.of( 35 | Arguments.of("aaaaaaaa", new byte[] { (byte) 0xfb, 0x4e, 0x4a, (byte) 0xef, 0x1e, 0x4f, 0x5b, 0x6a }, new byte[] { 0x00, 0x01, 0x02, 0x03 }), 36 | Arguments.of("ssssssss", new byte[] { 0x66, (byte) 0xe6, 0x32, 0x12, 0x0a, (byte) 0xc9, (byte) 0xe5, (byte) 0xa8 }, new byte[] { 0x00, 0x01, 0x02, 0x03 }) 37 | ); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /utils/src/test/java/pl/cwanix/opensun/utils/files/SUNFileReaderTest.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.utils.files; 2 | 3 | public class SUNFileReaderTest { 4 | 5 | 6 | } 7 | -------------------------------------------------------------------------------- /utils/src/test/resources/encryption/Dec1.dat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CwaniX/OpenSUN-Server/00eea3963795fead3ec1de7e977a63ff6a4ce8e2/utils/src/test/resources/encryption/Dec1.dat -------------------------------------------------------------------------------- /utils/src/test/resources/encryption/Dec2.dat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CwaniX/OpenSUN-Server/00eea3963795fead3ec1de7e977a63ff6a4ce8e2/utils/src/test/resources/encryption/Dec2.dat -------------------------------------------------------------------------------- /utils/src/test/resources/encryption/Enc1.dat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CwaniX/OpenSUN-Server/00eea3963795fead3ec1de7e977a63ff6a4ce8e2/utils/src/test/resources/encryption/Enc1.dat -------------------------------------------------------------------------------- /utils/src/test/resources/encryption/Enc2.dat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CwaniX/OpenSUN-Server/00eea3963795fead3ec1de7e977a63ff6a4ce8e2/utils/src/test/resources/encryption/Enc2.dat -------------------------------------------------------------------------------- /world-server/src/main/java/pl/cwanix/opensun/worldserver/WorldServerApplication.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.worldserver; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | @SuppressWarnings("checkstyle:HideUtilityClassConstructor") 8 | public class WorldServerApplication { 9 | 10 | public static void main(final String[] args) { 11 | SpringApplication.run(WorldServerApplication.class, args); 12 | } 13 | 14 | } 15 | -------------------------------------------------------------------------------- /world-server/src/main/java/pl/cwanix/opensun/worldserver/WorldServerConfiguration.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.worldserver; 2 | 3 | import org.springframework.boot.context.properties.EnableConfigurationProperties; 4 | import org.springframework.context.annotation.Configuration; 5 | import org.springframework.context.annotation.PropertySource; 6 | 7 | import pl.cwanix.opensun.worldserver.properties.WorldServerProperties; 8 | 9 | @Configuration 10 | @PropertySource("file:${application.location}/config/world-server.properties") 11 | @EnableConfigurationProperties(WorldServerProperties.class) 12 | public class WorldServerConfiguration { 13 | 14 | } 15 | -------------------------------------------------------------------------------- /world-server/src/main/java/pl/cwanix/opensun/worldserver/communication/DatabaseProxyConnector.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.worldserver.communication; 2 | 3 | import org.springframework.stereotype.Service; 4 | 5 | @Service 6 | public class DatabaseProxyConnector { 7 | 8 | } 9 | -------------------------------------------------------------------------------- /world-server/src/main/java/pl/cwanix/opensun/worldserver/packets/WorldServerPacketOPCode.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.worldserver.packets; 2 | 3 | import lombok.AllArgsConstructor; 4 | 5 | @AllArgsConstructor 6 | public class WorldServerPacketOPCode { 7 | 8 | public static class Connection { 9 | public static final byte CATEGORY = 0x48; 10 | 11 | public static class Unk { 12 | public static final byte UNK_483C = 0X3C; 13 | public static final byte UNK_4860 = 0x60; 14 | public static final byte UNK_486C = 0x6C; 15 | } 16 | } 17 | 18 | public static class Sync { 19 | public static final byte CATEGORY = (byte) 0xFD; 20 | 21 | public static class Unk { 22 | public static final byte UNK_FD60 = 0x60; 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /world-server/src/main/java/pl/cwanix/opensun/worldserver/packets/c2s/connection/C2S483CPacket.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.worldserver.packets.c2s.connection; 2 | 3 | import pl.cwanix.opensun.commonserver.packets.Packet; 4 | import pl.cwanix.opensun.commonserver.packets.annotations.IncomingPacket; 5 | import pl.cwanix.opensun.worldserver.packets.WorldServerPacketOPCode; 6 | 7 | @IncomingPacket(category = WorldServerPacketOPCode.Connection.CATEGORY, operation = WorldServerPacketOPCode.Connection.Unk.UNK_483C) 8 | public class C2S483CPacket implements Packet { 9 | 10 | public C2S483CPacket(final byte[] value) { 11 | // TODO Auto-generated constructor stub 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /world-server/src/main/java/pl/cwanix/opensun/worldserver/packets/c2s/connection/C2S4860Packet.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.worldserver.packets.c2s.connection; 2 | 3 | import pl.cwanix.opensun.commonserver.packets.Packet; 4 | import pl.cwanix.opensun.commonserver.packets.annotations.IncomingPacket; 5 | import pl.cwanix.opensun.worldserver.packets.WorldServerPacketOPCode; 6 | 7 | @IncomingPacket(category = WorldServerPacketOPCode.Connection.CATEGORY, operation = WorldServerPacketOPCode.Connection.Unk.UNK_4860) 8 | public class C2S4860Packet implements Packet { 9 | 10 | public C2S4860Packet(final byte[] value) { 11 | // TODO Auto-generated constructor stub 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /world-server/src/main/java/pl/cwanix/opensun/worldserver/packets/c2s/sync/C2SFD60Packet.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.worldserver.packets.c2s.sync; 2 | 3 | import pl.cwanix.opensun.commonserver.packets.Packet; 4 | import pl.cwanix.opensun.commonserver.packets.annotations.IncomingPacket; 5 | import pl.cwanix.opensun.worldserver.packets.WorldServerPacketOPCode; 6 | 7 | @IncomingPacket(category = WorldServerPacketOPCode.Sync.CATEGORY, operation = WorldServerPacketOPCode.Sync.Unk.UNK_FD60) 8 | public class C2SFD60Packet implements Packet { 9 | 10 | public C2SFD60Packet(final byte[] value) { 11 | // TODO Auto-generated constructor stub 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /world-server/src/main/java/pl/cwanix/opensun/worldserver/packets/processors/sync/C2S483CProcessor.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.worldserver.packets.processors.sync; 2 | 3 | import io.netty.channel.ChannelHandlerContext; 4 | import lombok.RequiredArgsConstructor; 5 | import pl.cwanix.opensun.commonserver.packets.SUNPacketProcessor; 6 | import pl.cwanix.opensun.commonserver.packets.annotations.PacketProcessor; 7 | import pl.cwanix.opensun.worldserver.packets.c2s.connection.C2S483CPacket; 8 | 9 | @RequiredArgsConstructor 10 | @PacketProcessor(packetClass = C2S483CPacket.class) 11 | public class C2S483CProcessor implements SUNPacketProcessor { 12 | 13 | @Override 14 | public void process(final ChannelHandlerContext ctx, final C2S483CPacket packet) { 15 | 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /world-server/src/main/java/pl/cwanix/opensun/worldserver/packets/processors/sync/C2S4860Processor.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.worldserver.packets.processors.sync; 2 | 3 | import io.netty.channel.ChannelHandlerContext; 4 | import lombok.RequiredArgsConstructor; 5 | import pl.cwanix.opensun.commonserver.packets.SUNPacketProcessor; 6 | import pl.cwanix.opensun.commonserver.packets.annotations.PacketProcessor; 7 | import pl.cwanix.opensun.worldserver.packets.c2s.connection.C2S4860Packet; 8 | 9 | @RequiredArgsConstructor 10 | @PacketProcessor(packetClass = C2S4860Packet.class) 11 | public class C2S4860Processor implements SUNPacketProcessor { 12 | 13 | @Override 14 | public void process(final ChannelHandlerContext ctx, final C2S4860Packet packet) { 15 | 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /world-server/src/main/java/pl/cwanix/opensun/worldserver/packets/processors/sync/C2SFD60Processor.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.worldserver.packets.processors.sync; 2 | 3 | import io.netty.channel.ChannelHandlerContext; 4 | import lombok.RequiredArgsConstructor; 5 | import pl.cwanix.opensun.commonserver.packets.SUNPacketProcessor; 6 | import pl.cwanix.opensun.commonserver.packets.annotations.PacketProcessor; 7 | import pl.cwanix.opensun.worldserver.packets.c2s.sync.C2SFD60Packet; 8 | 9 | @RequiredArgsConstructor 10 | @PacketProcessor(packetClass = C2SFD60Packet.class) 11 | public class C2SFD60Processor implements SUNPacketProcessor { 12 | 13 | @Override 14 | public void process(final ChannelHandlerContext ctx, final C2SFD60Packet packet) { 15 | 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /world-server/src/main/java/pl/cwanix/opensun/worldserver/packets/s2c/connection/S2C486CPacket.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.worldserver.packets.s2c.connection; 2 | 3 | import pl.cwanix.opensun.commonserver.packets.Packet; 4 | import pl.cwanix.opensun.commonserver.packets.annotations.OutgoingPacket; 5 | import pl.cwanix.opensun.worldserver.packets.WorldServerPacketOPCode; 6 | 7 | @OutgoingPacket(category = WorldServerPacketOPCode.Connection.CATEGORY, operation = WorldServerPacketOPCode.Connection.Unk.UNK_486C) 8 | public class S2C486CPacket implements Packet { 9 | 10 | @Override 11 | public Object[] getOrderedFields() { 12 | return null; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /world-server/src/main/java/pl/cwanix/opensun/worldserver/properties/WorldServerProperties.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.worldserver.properties; 2 | 3 | import org.springframework.boot.context.properties.ConfigurationProperties; 4 | 5 | import lombok.Getter; 6 | import lombok.Setter; 7 | import pl.cwanix.opensun.commonserver.properties.SUNServerProperties; 8 | 9 | @Getter 10 | @Setter 11 | @ConfigurationProperties(prefix = "opensun") 12 | public class WorldServerProperties extends SUNServerProperties { 13 | 14 | } 15 | -------------------------------------------------------------------------------- /world-server/src/main/java/pl/cwanix/opensun/worldserver/server/WorldServerChannelHandler.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.worldserver.server; 2 | 3 | import io.netty.channel.ChannelHandlerContext; 4 | import lombok.RequiredArgsConstructor; 5 | import pl.cwanix.opensun.commonserver.packets.Packet; 6 | import pl.cwanix.opensun.commonserver.packets.SUNPacketProcessorExecutor; 7 | import pl.cwanix.opensun.commonserver.server.SUNServerChannelHandler; 8 | 9 | @RequiredArgsConstructor 10 | public class WorldServerChannelHandler extends SUNServerChannelHandler { 11 | 12 | private final SUNPacketProcessorExecutor packetProcessorExecutor; 13 | 14 | @Override 15 | @SuppressWarnings("unchecked") 16 | public void channelRead(final ChannelHandlerContext ctx, final Object msg) { 17 | Packet packet = (Packet) msg; 18 | packetProcessorExecutor.process(ctx, packet); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /world-server/src/main/java/pl/cwanix/opensun/worldserver/server/WorldServerChannelHandlerFactory.java: -------------------------------------------------------------------------------- 1 | package pl.cwanix.opensun.worldserver.server; 2 | 3 | import lombok.RequiredArgsConstructor; 4 | import org.springframework.stereotype.Component; 5 | import pl.cwanix.opensun.commonserver.packets.SUNPacketProcessorExecutor; 6 | import pl.cwanix.opensun.commonserver.server.SUNServerChannelHandler; 7 | import pl.cwanix.opensun.commonserver.server.SUNServerChannelHandlerFactory; 8 | 9 | @Component 10 | @RequiredArgsConstructor 11 | public class WorldServerChannelHandlerFactory implements SUNServerChannelHandlerFactory { 12 | 13 | private final SUNPacketProcessorExecutor packetProcessorExecutor; 14 | 15 | @Override 16 | public SUNServerChannelHandler getChannelHandler() { 17 | return new WorldServerChannelHandler(packetProcessorExecutor); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /world-server/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | info.version=@pom.version@ 2 | 3 | spring.application.name=@pom.artifactId@ 4 | spring.profiles.active=production 5 | 6 | logging.level.root=error 7 | logging.level.pl.cwanix=debug 8 | logging.level.io.netty=info 9 | logging.pattern.console=%clr(%d{${LOG_DATEFORMAT_PATTERN:yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %clr([%25marker]){faint} %clr([userId: %5mdc{userId}]){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:%wEx} 10 | 11 | server.port=${opensun.server.port} 12 | -------------------------------------------------------------------------------- /world-server/src/main/resources/banner.txt: -------------------------------------------------------------------------------- 1 | _____ _____ _____ _____ _____ 2 | | |___ ___ ___| __| | | | | | __|_____ _ _ 3 | | | | . | -_| |__ | | | | | | | __| | | | 4 | |_____| _|___|_|_|_____|_____|_|___| |_____|_|_|_|___| 5 | |_| World Server (${info.version}) 6 | -------------------------------------------------------------------------------- /world-server/src/main/resources/world-server.properties_template: -------------------------------------------------------------------------------- 1 | opensun.server.port=6000 2 | 3 | opensun.client.port=20004 4 | opensun.client.max_queue_size=128 5 | opensun.client.max_thread_count=2 6 | opensun.client.epoll_mode=false --------------------------------------------------------------------------------