From 6cf780fb9da381c0ba15fd4f0baddf4b65cfe0a4 Mon Sep 17 00:00:00 2001 From: Ammo Date: Sat, 9 Aug 2025 23:58:08 +0200 Subject: [PATCH 01/11] Everything is completely broken - cloud fuck yeah --- build.gradle.kts | 24 +++---- gradle.properties | 4 +- settings.gradle.kts | 27 ++++---- surf-roleplay-api/build.gradle.kts | 3 - .../roleplay/api/events/CancellableRpEvent.kt | 14 ---- .../slne/surf/roleplay/api/events/RpEvent.kt | 19 ----- .../roleplay/api/player/RpPlayerManager.kt | 32 --------- .../api/player/events/RpPlayerJoinEvent.kt | 8 --- .../api/player/events/RpPlayerQuitEvent.kt | 8 --- .../event/RpPlayerLicenseAddedEvent.kt | 14 ---- .../event/RpPlayerLicenseRemovedEvent.kt | 14 ---- .../civilian/CivilianFishingLicense.kt | 5 -- .../civilian/CivilianWeaponLicense.kt | 8 --- .../licenses/police/PoliceWeaponLicense.kt | 8 --- .../build.gradle.kts | 11 +++ .../build.gradle.kts | 11 +++ .../player/events/RpPlayerDeathEvent.kt | 14 ++-- .../surf-roleplay-common-api/build.gradle.kts | 7 ++ .../api/common/InternalContextHolder.kt | 14 ++++ .../roleplay/api/common}/mechanic/Mechanic.kt | 0 .../api/common}/mechanic/MechanicRegistry.kt | 0 .../common}/mechanic/idcard/IdCardMechanic.kt | 0 .../api/common}/mechanic/rentable/Rentable.kt | 0 .../mechanic/rentable/RentableMechanic.kt | 0 .../rentable/events/RentableMemberAddEvent.kt | 0 .../events/RentableMemberRemoveEvent.kt | 0 .../events/RentableOwnerChangeEvent.kt | 0 .../events/RentableRentCollectEvent.kt | 0 .../mechanic/rentable/rentables/Apartment.kt | 0 .../mechanic/rentable/rentables/House.kt | 0 .../mechanic/rentable/utils/Crackable.kt | 0 .../mechanic/rentable/utils/LockPick.kt | 0 .../mechanic/rentable/utils/Lockable.kt | 0 .../rentable/utils/StorageContainer.kt | 0 .../mechanic/rentable/utils/door/Door.kt | 0 .../rentable/utils/door/DoorContainer.kt | 0 .../api/common}/mechanic/weapon/Weapon.kt | 0 .../common}/mechanic/weapon/WeaponMechanic.kt | 0 .../mechanic/weapon/magazine/Magazine.kt | 0 .../weapon/magazine/PlayerMagazine.kt | 0 .../mechanic/weapon/player/PlayerWeapon.kt | 0 .../mechanic/weapon/utils/WeaponType.kt | 0 .../roleplay/api/common}/player/RpPlayer.kt | 69 ++++++------------- .../api/common/player/RpPlayerManager.kt | 15 ++++ .../common/player/events/RpPlayerJoinEvent.kt | 9 +++ .../common/player/events/RpPlayerQuitEvent.kt | 9 +++ .../api/common}/player/identity/RpIdentity.kt | 12 ++-- .../player/license/ExpirableLicense.kt | 2 +- .../api/common}/player/license/HasLicenses.kt | 12 ++-- .../common}/player/license/IdentityLicense.kt | 4 +- .../player/license/InternalLicenseBridge.kt} | 24 ++++--- .../api/common}/player/license/License.kt | 12 ++-- .../event/RpPlayerLicenseAddedEvent.kt | 15 ++++ .../event/RpPlayerLicenseRemovedEvent.kt | 15 ++++ .../civilian/CivilianFishingLicense.kt | 5 ++ .../civilian/CivilianVehicleLicense.kt | 5 +- .../civilian/CivilianWeaponLicense.kt | 8 +++ .../licenses/police/PoliceWeaponLicense.kt | 8 +++ .../license/utils/LicenseCreateResult.kt | 4 +- .../license/utils/LicenseRemovedReason.kt | 10 +-- .../license/utils/UnobtainableReason.kt | 4 +- .../common/transaction/HasRpTransactions.kt} | 6 +- .../api/common}/transaction/RpTransaction.kt | 6 +- .../common/transaction}/utils/BalanceType.kt | 4 +- .../api/common/util/InternalRoleplayApi.kt | 17 +++++ .../surf/roleplay/api/common/util}/RpJob.kt | 2 +- .../surf-roleplay-server-api/build.gradle.kts | 11 +++ surf-roleplay-core/build.gradle.kts | 9 --- .../dev/slne/surf/roleplay/core/RpCore.kt | 11 --- .../dev/slne/surf/roleplay/core/RpDatabase.kt | 43 ------------ .../civilian/RpPlayerCivilianIdentityTable.kt | 5 -- .../RpPlayerRescueServiceIdentityTable.kt | 9 --- .../build.gradle.kts | 12 ++++ .../core/client/player/ClientRpPlayer.kt | 25 +++++++ .../client/player/ClientRpPlayerManager.kt | 10 +++ .../build.gradle.kts | 11 +++ .../slne/surf/roleplay/RoleplayApplication.kt | 6 ++ .../roleplay/core/common/ContextHolderImpl.kt | 16 +++++ .../core/common/player/CommonRpPlayer.kt} | 66 +++++++----------- .../common/player/CommonRpPlayerManager.kt | 20 ++++++ .../player/license/CommonRpIdentity.kt} | 56 ++++++++------- .../build.gradle.kts | 0 .../surf/roleplay/mechanic/MechanicImpl.kt | 0 .../roleplay/mechanic/MechanicRegistryImpl.kt | 0 .../mechanic/mechanics/idcard/IdCard.kt | 0 .../mechanics/idcard/IdCardMechanicImpl.kt | 0 .../mechanic/mechanics/idcard/IdCardNpc.kt | 0 .../idcard/dialogs/CreateIdDialog.kt | 0 .../idcard/listeners/IdCardHandler.kt | 0 .../mechanics/rentable/RentCollectorJob.kt | 0 .../mechanics/rentable/RentableImpl.kt | 0 .../rentable/RentableMechanicImpl.kt | 0 .../listeners/RentCollectedListener.kt | 0 .../rentable/listeners/RentableListener.kt | 0 .../listeners/RentableOnlineListener.kt | 0 .../rentable/rentables/ApartmentImpl.kt | 0 .../mechanics/rentable/rentables/HouseImpl.kt | 0 .../mechanics/rentable/utils/Cracker.kt | 0 .../mechanics/rentable/utils/DoorImpl.kt | 0 .../mechanics/rentable/utils/LockPickImpl.kt | 0 .../rentable/utils/StorageContainerImpl.kt | 0 .../containers/RegularStorageContainer.kt | 0 .../utils/containers/VaultStorageContainer.kt | 0 .../rentable/utils/doors/FrontDoor.kt | 0 .../rentable/utils/doors/GarageDoor.kt | 0 .../rentable/utils/doors/RegularDoor.kt | 0 .../rentable/utils/lockpick/BatteringRam.kt | 0 .../utils/lockpick/PremiumLockPick.kt | 0 .../utils/lockpick/RegularLockPick.kt | 0 .../mechanics/utils/PermissionRegistry.kt | 0 .../mechanic/mechanics/weapon/WeaponImpl.kt | 0 .../mechanics/weapon/WeaponMechanicImpl.kt | 0 .../mechanics/weapon/magazine/MagazineImpl.kt | 0 .../weapon/magazine/PlayerMagazineImpl.kt | 0 .../weapon/player/PlayerWeaponImpl.kt | 0 surf-roleplay-paper-old/build.gradle.kts | 41 +++++++++++ .../slne/surf/roleplay/paper/SurfRoleplay.kt | 0 .../paper/command/args/BalanceTypeArgument.kt | 0 .../dialogs/IdentitySelectorDialog.kt | 0 .../listener/IdentityOnlineListener.kt | 0 .../paper/listeners/ListenerManager.kt | 0 .../paper/listeners/OnlineListener.kt | 0 surf-roleplay-paper/build.gradle.kts | 42 +++-------- .../surf/roleplay/paper/PaperBootstrap.kt | 16 +++++ .../dev/slne/surf/roleplay/paper/PaperMain.kt | 9 +++ surf-roleplay-server/build.gradle.kts | 18 +++++ .../server/GenerateExposedMigrationScript.kt | 11 +++ .../surf/roleplay/server/PluginBootstrap.kt | 15 ++++ .../slne/surf/roleplay/server/PluginMain.kt | 18 +++++ .../server}/player/RpPlayerManagerImpl.kt | 12 ++-- .../server}/player/db/RpPlayerModel.kt | 11 +-- .../server}/player/db/RpPlayerTable.kt | 6 +- .../identity/db/RpPlayerIdentityBaseModel.kt | 6 +- .../identity/db/RpPlayerIdentityBaseTable.kt | 8 +-- .../civilian/RpPlayerCivilianIdentityModel.kt | 18 ++--- .../civilian/RpPlayerCivilianIdentityTable.kt | 5 ++ .../police/RpPlayerPoliceIdentityModel.kt | 15 ++-- .../police/RpPlayerPoliceIdentityTable.kt | 4 +- .../RpPlayerRescueServiceIdentityModel.kt | 16 ++--- .../RpPlayerRescueServiceIdentityTable.kt | 9 +++ .../identities/CivilianIdentityImpl.kt | 8 +-- .../identity/identities/PoliceIdentityImpl.kt | 2 +- .../identities/RescueServiceIdentityImpl.kt | 2 +- .../player/license/ExpirableLicenseImpl.kt | 0 .../player/license/LicenseExpirationJob.kt | 0 .../server}/player/license/LicenseImpl.kt | 0 .../server}/player/license/LicenseNpc.kt | 0 .../player/license/LicenseServiceImpl.kt | 0 .../player/license/db/IdentityLicenseModel.kt | 0 .../player/license/db/IdentityLicenseTable.kt | 2 +- .../license/dialogs/BuyLicenseDialog.kt | 0 .../license/dialogs/BuyLicensesDialog.kt | 0 .../player/license/dialogs/LicenseDialog.kt | 0 .../player/license/dialogs/MyLicenseDialog.kt | 0 .../license/dialogs/MyLicensesDialog.kt | 0 .../civilian/CivilianFishingLicenseImpl.kt | 0 .../civilian/CivilianVehicleLicenseImpl.kt | 0 .../civilian/CivilianWeaponLicenseImpl.kt | 0 .../license/listeners/LicenseBuyHandler.kt | 0 .../listeners/LicenseChangedHandler.kt | 0 .../utils/LicensePermissionRegistry.kt | 0 .../src/main/resources/standalone-plugin.yml | 8 +++ 162 files changed, 630 insertions(+), 504 deletions(-) delete mode 100644 surf-roleplay-api/build.gradle.kts delete mode 100644 surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/events/CancellableRpEvent.kt delete mode 100644 surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/events/RpEvent.kt delete mode 100644 surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/RpPlayerManager.kt delete mode 100644 surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/events/RpPlayerJoinEvent.kt delete mode 100644 surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/events/RpPlayerQuitEvent.kt delete mode 100644 surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/license/event/RpPlayerLicenseAddedEvent.kt delete mode 100644 surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/license/event/RpPlayerLicenseRemovedEvent.kt delete mode 100644 surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/license/licenses/civilian/CivilianFishingLicense.kt delete mode 100644 surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/license/licenses/civilian/CivilianWeaponLicense.kt delete mode 100644 surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/license/licenses/police/PoliceWeaponLicense.kt create mode 100644 surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-common-api/build.gradle.kts create mode 100644 surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/build.gradle.kts rename surf-roleplay-api/{src/main/kotlin/dev/slne/surf/roleplay/api => surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper}/player/events/RpPlayerDeathEvent.kt (69%) create mode 100644 surf-roleplay-api/surf-roleplay-common-api/build.gradle.kts create mode 100644 surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/InternalContextHolder.kt rename surf-roleplay-api/{src/main/kotlin/dev/slne/surf/roleplay/api => surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common}/mechanic/Mechanic.kt (100%) rename surf-roleplay-api/{src/main/kotlin/dev/slne/surf/roleplay/api => surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common}/mechanic/MechanicRegistry.kt (100%) rename surf-roleplay-api/{src/main/kotlin/dev/slne/surf/roleplay/api => surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common}/mechanic/idcard/IdCardMechanic.kt (100%) rename surf-roleplay-api/{src/main/kotlin/dev/slne/surf/roleplay/api => surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common}/mechanic/rentable/Rentable.kt (100%) rename surf-roleplay-api/{src/main/kotlin/dev/slne/surf/roleplay/api => surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common}/mechanic/rentable/RentableMechanic.kt (100%) rename surf-roleplay-api/{src/main/kotlin/dev/slne/surf/roleplay/api => surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common}/mechanic/rentable/events/RentableMemberAddEvent.kt (100%) rename surf-roleplay-api/{src/main/kotlin/dev/slne/surf/roleplay/api => surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common}/mechanic/rentable/events/RentableMemberRemoveEvent.kt (100%) rename surf-roleplay-api/{src/main/kotlin/dev/slne/surf/roleplay/api => surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common}/mechanic/rentable/events/RentableOwnerChangeEvent.kt (100%) rename surf-roleplay-api/{src/main/kotlin/dev/slne/surf/roleplay/api => surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common}/mechanic/rentable/events/RentableRentCollectEvent.kt (100%) rename surf-roleplay-api/{src/main/kotlin/dev/slne/surf/roleplay/api => surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common}/mechanic/rentable/rentables/Apartment.kt (100%) rename surf-roleplay-api/{src/main/kotlin/dev/slne/surf/roleplay/api => surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common}/mechanic/rentable/rentables/House.kt (100%) rename surf-roleplay-api/{src/main/kotlin/dev/slne/surf/roleplay/api => surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common}/mechanic/rentable/utils/Crackable.kt (100%) rename surf-roleplay-api/{src/main/kotlin/dev/slne/surf/roleplay/api => surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common}/mechanic/rentable/utils/LockPick.kt (100%) rename surf-roleplay-api/{src/main/kotlin/dev/slne/surf/roleplay/api => surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common}/mechanic/rentable/utils/Lockable.kt (100%) rename surf-roleplay-api/{src/main/kotlin/dev/slne/surf/roleplay/api => surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common}/mechanic/rentable/utils/StorageContainer.kt (100%) rename surf-roleplay-api/{src/main/kotlin/dev/slne/surf/roleplay/api => surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common}/mechanic/rentable/utils/door/Door.kt (100%) rename surf-roleplay-api/{src/main/kotlin/dev/slne/surf/roleplay/api => surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common}/mechanic/rentable/utils/door/DoorContainer.kt (100%) rename surf-roleplay-api/{src/main/kotlin/dev/slne/surf/roleplay/api => surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common}/mechanic/weapon/Weapon.kt (100%) rename surf-roleplay-api/{src/main/kotlin/dev/slne/surf/roleplay/api => surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common}/mechanic/weapon/WeaponMechanic.kt (100%) rename surf-roleplay-api/{src/main/kotlin/dev/slne/surf/roleplay/api => surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common}/mechanic/weapon/magazine/Magazine.kt (100%) rename surf-roleplay-api/{src/main/kotlin/dev/slne/surf/roleplay/api => surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common}/mechanic/weapon/magazine/PlayerMagazine.kt (100%) rename surf-roleplay-api/{src/main/kotlin/dev/slne/surf/roleplay/api => surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common}/mechanic/weapon/player/PlayerWeapon.kt (100%) rename surf-roleplay-api/{src/main/kotlin/dev/slne/surf/roleplay/api => surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common}/mechanic/weapon/utils/WeaponType.kt (100%) rename surf-roleplay-api/{src/main/kotlin/dev/slne/surf/roleplay/api => surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common}/player/RpPlayer.kt (63%) create mode 100644 surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/RpPlayerManager.kt create mode 100644 surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/events/RpPlayerJoinEvent.kt create mode 100644 surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/events/RpPlayerQuitEvent.kt rename surf-roleplay-api/{src/main/kotlin/dev/slne/surf/roleplay/api => surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common}/player/identity/RpIdentity.kt (85%) rename surf-roleplay-api/{src/main/kotlin/dev/slne/surf/roleplay/api => surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common}/player/license/ExpirableLicense.kt (78%) rename surf-roleplay-api/{src/main/kotlin/dev/slne/surf/roleplay/api => surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common}/player/license/HasLicenses.kt (87%) rename surf-roleplay-api/{src/main/kotlin/dev/slne/surf/roleplay/api => surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common}/player/license/IdentityLicense.kt (95%) rename surf-roleplay-api/{src/main/kotlin/dev/slne/surf/roleplay/api/player/license/LicenseService.kt => surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/InternalLicenseBridge.kt} (80%) rename surf-roleplay-api/{src/main/kotlin/dev/slne/surf/roleplay/api => surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common}/player/license/License.kt (78%) create mode 100644 surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/event/RpPlayerLicenseAddedEvent.kt create mode 100644 surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/event/RpPlayerLicenseRemovedEvent.kt create mode 100644 surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/licenses/civilian/CivilianFishingLicense.kt rename surf-roleplay-api/{src/main/kotlin/dev/slne/surf/roleplay/api => surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common}/player/license/licenses/civilian/CivilianVehicleLicense.kt (68%) create mode 100644 surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/licenses/civilian/CivilianWeaponLicense.kt create mode 100644 surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/licenses/police/PoliceWeaponLicense.kt rename surf-roleplay-api/{src/main/kotlin/dev/slne/surf/roleplay/api => surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common}/player/license/utils/LicenseCreateResult.kt (58%) rename surf-roleplay-api/{src/main/kotlin/dev/slne/surf/roleplay/api => surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common}/player/license/utils/LicenseRemovedReason.kt (83%) rename surf-roleplay-api/{src/main/kotlin/dev/slne/surf/roleplay/api => surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common}/player/license/utils/UnobtainableReason.kt (93%) rename surf-roleplay-api/{src/main/kotlin/dev/slne/surf/roleplay/api/transaction/HasTransactions.kt => surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/transaction/HasRpTransactions.kt} (97%) rename surf-roleplay-api/{src/main/kotlin/dev/slne/surf/roleplay/api => surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common}/transaction/RpTransaction.kt (80%) rename surf-roleplay-api/{src/main/kotlin/dev/slne/surf/roleplay/api/player => surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/transaction}/utils/BalanceType.kt (89%) create mode 100644 surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/util/InternalRoleplayApi.kt rename surf-roleplay-api/{src/main/kotlin/dev/slne/surf/roleplay/api/coroutine => surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/util}/RpJob.kt (96%) create mode 100644 surf-roleplay-api/surf-roleplay-server-api/build.gradle.kts delete mode 100644 surf-roleplay-core/build.gradle.kts delete mode 100644 surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/RpCore.kt delete mode 100644 surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/RpDatabase.kt delete mode 100644 surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/identity/db/impl/civilian/RpPlayerCivilianIdentityTable.kt delete mode 100644 surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/identity/db/impl/rescueservice/RpPlayerRescueServiceIdentityTable.kt create mode 100644 surf-roleplay-core/surf-roleplay-core-client/build.gradle.kts create mode 100644 surf-roleplay-core/surf-roleplay-core-client/src/main/kotlin/dev/slne/surf/roleplay/core/client/player/ClientRpPlayer.kt create mode 100644 surf-roleplay-core/surf-roleplay-core-client/src/main/kotlin/dev/slne/surf/roleplay/core/client/player/ClientRpPlayerManager.kt create mode 100644 surf-roleplay-core/surf-roleplay-core-common/build.gradle.kts create mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/RoleplayApplication.kt create mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/ContextHolderImpl.kt rename surf-roleplay-core/{src/main/kotlin/dev/slne/surf/roleplay/core/player/RpPlayerImpl.kt => surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/CommonRpPlayer.kt} (67%) create mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/CommonRpPlayerManager.kt rename surf-roleplay-core/{src/main/kotlin/dev/slne/surf/roleplay/core/player/identity/RpIdentityImpl.kt => surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/CommonRpIdentity.kt} (78%) rename {surf-roleplay-mechanic => surf-roleplay-mechanic-old}/build.gradle.kts (100%) rename {surf-roleplay-mechanic => surf-roleplay-mechanic-old}/src/main/kotlin/dev/slne/surf/roleplay/mechanic/MechanicImpl.kt (100%) rename {surf-roleplay-mechanic => surf-roleplay-mechanic-old}/src/main/kotlin/dev/slne/surf/roleplay/mechanic/MechanicRegistryImpl.kt (100%) rename {surf-roleplay-mechanic => surf-roleplay-mechanic-old}/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/idcard/IdCard.kt (100%) rename {surf-roleplay-mechanic => surf-roleplay-mechanic-old}/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/idcard/IdCardMechanicImpl.kt (100%) rename {surf-roleplay-mechanic => surf-roleplay-mechanic-old}/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/idcard/IdCardNpc.kt (100%) rename {surf-roleplay-mechanic => surf-roleplay-mechanic-old}/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/idcard/dialogs/CreateIdDialog.kt (100%) rename {surf-roleplay-mechanic => surf-roleplay-mechanic-old}/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/idcard/listeners/IdCardHandler.kt (100%) rename {surf-roleplay-mechanic => surf-roleplay-mechanic-old}/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/RentCollectorJob.kt (100%) rename {surf-roleplay-mechanic => surf-roleplay-mechanic-old}/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/RentableImpl.kt (100%) rename {surf-roleplay-mechanic => surf-roleplay-mechanic-old}/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/RentableMechanicImpl.kt (100%) rename {surf-roleplay-mechanic => surf-roleplay-mechanic-old}/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/listeners/RentCollectedListener.kt (100%) rename {surf-roleplay-mechanic => surf-roleplay-mechanic-old}/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/listeners/RentableListener.kt (100%) rename {surf-roleplay-mechanic => surf-roleplay-mechanic-old}/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/listeners/RentableOnlineListener.kt (100%) rename {surf-roleplay-mechanic => surf-roleplay-mechanic-old}/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/rentables/ApartmentImpl.kt (100%) rename {surf-roleplay-mechanic => surf-roleplay-mechanic-old}/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/rentables/HouseImpl.kt (100%) rename {surf-roleplay-mechanic => surf-roleplay-mechanic-old}/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/Cracker.kt (100%) rename {surf-roleplay-mechanic => surf-roleplay-mechanic-old}/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/DoorImpl.kt (100%) rename {surf-roleplay-mechanic => surf-roleplay-mechanic-old}/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/LockPickImpl.kt (100%) rename {surf-roleplay-mechanic => surf-roleplay-mechanic-old}/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/StorageContainerImpl.kt (100%) rename {surf-roleplay-mechanic => surf-roleplay-mechanic-old}/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/containers/RegularStorageContainer.kt (100%) rename {surf-roleplay-mechanic => surf-roleplay-mechanic-old}/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/containers/VaultStorageContainer.kt (100%) rename {surf-roleplay-mechanic => surf-roleplay-mechanic-old}/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/doors/FrontDoor.kt (100%) rename {surf-roleplay-mechanic => surf-roleplay-mechanic-old}/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/doors/GarageDoor.kt (100%) rename {surf-roleplay-mechanic => surf-roleplay-mechanic-old}/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/doors/RegularDoor.kt (100%) rename {surf-roleplay-mechanic => surf-roleplay-mechanic-old}/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/lockpick/BatteringRam.kt (100%) rename {surf-roleplay-mechanic => surf-roleplay-mechanic-old}/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/lockpick/PremiumLockPick.kt (100%) rename {surf-roleplay-mechanic => surf-roleplay-mechanic-old}/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/lockpick/RegularLockPick.kt (100%) rename {surf-roleplay-mechanic => surf-roleplay-mechanic-old}/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/utils/PermissionRegistry.kt (100%) rename {surf-roleplay-mechanic => surf-roleplay-mechanic-old}/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/weapon/WeaponImpl.kt (100%) rename {surf-roleplay-mechanic => surf-roleplay-mechanic-old}/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/weapon/WeaponMechanicImpl.kt (100%) rename {surf-roleplay-mechanic => surf-roleplay-mechanic-old}/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/weapon/magazine/MagazineImpl.kt (100%) rename {surf-roleplay-mechanic => surf-roleplay-mechanic-old}/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/weapon/magazine/PlayerMagazineImpl.kt (100%) rename {surf-roleplay-mechanic => surf-roleplay-mechanic-old}/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/weapon/player/PlayerWeaponImpl.kt (100%) create mode 100644 surf-roleplay-paper-old/build.gradle.kts rename {surf-roleplay-paper => surf-roleplay-paper-old}/src/main/kotlin/dev/slne/surf/roleplay/paper/SurfRoleplay.kt (100%) rename {surf-roleplay-paper => surf-roleplay-paper-old}/src/main/kotlin/dev/slne/surf/roleplay/paper/command/args/BalanceTypeArgument.kt (100%) rename {surf-roleplay-paper => surf-roleplay-paper-old}/src/main/kotlin/dev/slne/surf/roleplay/paper/identity/dialogs/IdentitySelectorDialog.kt (100%) rename {surf-roleplay-paper => surf-roleplay-paper-old}/src/main/kotlin/dev/slne/surf/roleplay/paper/identity/listener/IdentityOnlineListener.kt (100%) rename {surf-roleplay-paper => surf-roleplay-paper-old}/src/main/kotlin/dev/slne/surf/roleplay/paper/listeners/ListenerManager.kt (100%) rename {surf-roleplay-paper => surf-roleplay-paper-old}/src/main/kotlin/dev/slne/surf/roleplay/paper/listeners/OnlineListener.kt (100%) create mode 100644 surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/PaperBootstrap.kt create mode 100644 surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/PaperMain.kt create mode 100644 surf-roleplay-server/build.gradle.kts create mode 100644 surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/GenerateExposedMigrationScript.kt create mode 100644 surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/PluginBootstrap.kt create mode 100644 surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/PluginMain.kt rename {surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core => surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server}/player/RpPlayerManagerImpl.kt (92%) rename {surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core => surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server}/player/db/RpPlayerModel.kt (73%) rename {surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core => surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server}/player/db/RpPlayerTable.kt (67%) rename {surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core => surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server}/player/identity/db/RpPlayerIdentityBaseModel.kt (76%) rename {surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core => surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server}/player/identity/db/RpPlayerIdentityBaseTable.kt (73%) rename {surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core => surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server}/player/identity/db/impl/civilian/RpPlayerCivilianIdentityModel.kt (54%) create mode 100644 surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/civilian/RpPlayerCivilianIdentityTable.kt rename {surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core => surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server}/player/identity/db/impl/police/RpPlayerPoliceIdentityModel.kt (66%) rename {surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core => surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server}/player/identity/db/impl/police/RpPlayerPoliceIdentityTable.kt (55%) rename {surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core => surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server}/player/identity/db/impl/rescueservice/RpPlayerRescueServiceIdentityModel.kt (65%) create mode 100644 surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/rescueservice/RpPlayerRescueServiceIdentityTable.kt rename {surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core => surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server}/player/identity/identities/CivilianIdentityImpl.kt (70%) rename {surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core => surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server}/player/identity/identities/PoliceIdentityImpl.kt (92%) rename {surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core => surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server}/player/identity/identities/RescueServiceIdentityImpl.kt (92%) rename {surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core => surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server}/player/license/ExpirableLicenseImpl.kt (100%) rename {surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core => surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server}/player/license/LicenseExpirationJob.kt (100%) rename {surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core => surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server}/player/license/LicenseImpl.kt (100%) rename {surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core => surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server}/player/license/LicenseNpc.kt (100%) rename {surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core => surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server}/player/license/LicenseServiceImpl.kt (100%) rename {surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core => surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server}/player/license/db/IdentityLicenseModel.kt (100%) rename {surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core => surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server}/player/license/db/IdentityLicenseTable.kt (93%) rename {surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core => surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server}/player/license/dialogs/BuyLicenseDialog.kt (100%) rename {surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core => surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server}/player/license/dialogs/BuyLicensesDialog.kt (100%) rename {surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core => surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server}/player/license/dialogs/LicenseDialog.kt (100%) rename {surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core => surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server}/player/license/dialogs/MyLicenseDialog.kt (100%) rename {surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core => surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server}/player/license/dialogs/MyLicensesDialog.kt (100%) rename {surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core => surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server}/player/license/licenses/civilian/CivilianFishingLicenseImpl.kt (100%) rename {surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core => surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server}/player/license/licenses/civilian/CivilianVehicleLicenseImpl.kt (100%) rename {surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core => surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server}/player/license/licenses/civilian/CivilianWeaponLicenseImpl.kt (100%) rename {surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core => surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server}/player/license/listeners/LicenseBuyHandler.kt (100%) rename {surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core => surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server}/player/license/listeners/LicenseChangedHandler.kt (100%) rename {surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core => surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server}/player/license/utils/LicensePermissionRegistry.kt (100%) create mode 100644 surf-roleplay-server/src/main/resources/standalone-plugin.yml diff --git a/build.gradle.kts b/build.gradle.kts index c2e0f1a..7d63d99 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,10 +1,15 @@ -import com.github.jengelman.gradle.plugins.shadow.ShadowPlugin -import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar -import dev.slne.surf.surfapi.gradle.util.slnePublic - allprojects { + group = "dev.slne.surf.roleplay" + version = findProperty("version") as String +} + +buildscript { repositories { - slnePublic() + gradlePluginPortal() + maven("https://repo.slne.dev/repository/maven-public/") { name = "maven-public" } + } + dependencies { + classpath("dev.slne.surf:surf-api-gradle-plugin:1.21.7+") } } @@ -15,14 +20,5 @@ subprojects { toolchain.languageVersion.set(JavaLanguageVersion.of(24)) } } - plugins.withType { - tasks.withType { - dependencies { - exclude(dependency("org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm")) - exclude(dependency("org.jetbrains.kotlinx:kotlinx-coroutines-jdk8")) - exclude(dependency("org.jetbrains.kotlin:kotlin-stdlib")) - } - } - } } } \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index a481e58..804a362 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,6 @@ +org.gradle.configuration-cache=true +org.gradle.parallel=true +org.gradle.caching=true kotlin.code.style=official kotlin.stdlib.default.dependency=false -org.gradle.parallel=true version=1.21.7-1.0.0 \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index e049f61..c25243f 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,20 +1,17 @@ +rootProject.name = "surf-roleplay" + plugins { id("org.gradle.toolchains.foojay-resolver-convention") version "0.8.0" } -buildscript { - repositories { - gradlePluginPortal() - maven("https://repo.slne.dev/repository/maven-public/") { name = "maven-public" } - } - dependencies { - classpath("dev.slne.surf:surf-api-gradle-plugin:1.21.7+") - } -} - -rootProject.name = "surf-roleplay" +include("surf-roleplay-api:surf-roleplay-common-api") +include("surf-roleplay-api:surf-roleplay-client-api:surf-roleplay-client-common-api") +include("surf-roleplay-api:surf-roleplay-client-api:surf-roleplay-client-paper-api") +include("surf-roleplay-api:surf-roleplay-client-api:surf-roleplay-client-velocity-api") +include("surf-roleplay-api:surf-roleplay-server-api") -include("surf-roleplay-api") -include("surf-roleplay-core") -include("surf-roleplay-mechanic") -include("surf-roleplay-paper") \ No newline at end of file +include("surf-roleplay-core:surf-roleplay-core-common") +include("surf-roleplay-core:surf-roleplay-core-client") +include("surf-roleplay-paper") +include("surf-roleplay-velocity") +include("surf-roleplay-server") \ No newline at end of file diff --git a/surf-roleplay-api/build.gradle.kts b/surf-roleplay-api/build.gradle.kts deleted file mode 100644 index 64d286f..0000000 --- a/surf-roleplay-api/build.gradle.kts +++ /dev/null @@ -1,3 +0,0 @@ -plugins { - id("dev.slne.surf.surfapi.gradle.paper-raw") -} \ No newline at end of file diff --git a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/events/CancellableRpEvent.kt b/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/events/CancellableRpEvent.kt deleted file mode 100644 index 5d54cf9..0000000 --- a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/events/CancellableRpEvent.kt +++ /dev/null @@ -1,14 +0,0 @@ -package dev.slne.surf.roleplay.api.events - -import org.bukkit.event.Cancellable - -open class CancellableRpEvent() : RpEvent(), Cancellable { - - private var cancelled = false - - override fun isCancelled() = cancelled - - override fun setCancelled(cancel: Boolean) { - cancelled = cancel - } -} \ No newline at end of file diff --git a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/events/RpEvent.kt b/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/events/RpEvent.kt deleted file mode 100644 index de9e961..0000000 --- a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/events/RpEvent.kt +++ /dev/null @@ -1,19 +0,0 @@ -package dev.slne.surf.roleplay.api.events - -import org.bukkit.Bukkit -import org.bukkit.event.Event -import org.bukkit.event.HandlerList - -open class RpEvent( - async: Boolean = !Bukkit.isPrimaryThread() -) : Event(async) { - - override fun getHandlers() = handlerList - - companion object { - private val handlerList = HandlerList() - - @JvmStatic - fun getHandlerList(): HandlerList = handlerList - } -} \ No newline at end of file diff --git a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/RpPlayerManager.kt b/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/RpPlayerManager.kt deleted file mode 100644 index e505738..0000000 --- a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/RpPlayerManager.kt +++ /dev/null @@ -1,32 +0,0 @@ -package dev.slne.surf.roleplay.api.player - -import dev.slne.surf.surfapi.core.api.util.requiredService -import it.unimi.dsi.fastutil.objects.ObjectSet -import org.jetbrains.annotations.Unmodifiable -import java.util.* - -private val rpPlayerManager = requiredService() - -interface RpPlayerManager { - - /** - * A set of all [RpPlayer] instances currently managed by this manager. - */ - val players: @Unmodifiable ObjectSet - - /** - * Gets a [RpPlayer] by their UUID. - * - * @param uuid the UUID of the player - * @return the [RpPlayer] associated with the UUID - */ - suspend operator fun get(uuid: UUID): RpPlayer - - companion object : RpPlayerManager by rpPlayerManager { - /** - * The singleton instance of [RpPlayerManager]. - */ - val INSTANCE get() = rpPlayerManager - } - -} \ No newline at end of file diff --git a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/events/RpPlayerJoinEvent.kt b/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/events/RpPlayerJoinEvent.kt deleted file mode 100644 index f9b19e8..0000000 --- a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/events/RpPlayerJoinEvent.kt +++ /dev/null @@ -1,8 +0,0 @@ -package dev.slne.surf.roleplay.api.player.events - -import dev.slne.surf.roleplay.api.events.RpEvent -import dev.slne.surf.roleplay.api.player.RpPlayer - -class RpPlayerJoinEvent( - val rpPlayer: RpPlayer, -) : RpEvent() \ No newline at end of file diff --git a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/events/RpPlayerQuitEvent.kt b/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/events/RpPlayerQuitEvent.kt deleted file mode 100644 index 5455c6b..0000000 --- a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/events/RpPlayerQuitEvent.kt +++ /dev/null @@ -1,8 +0,0 @@ -package dev.slne.surf.roleplay.api.player.events - -import dev.slne.surf.roleplay.api.events.RpEvent -import dev.slne.surf.roleplay.api.player.RpPlayer - -class RpPlayerQuitEvent( - val rpPlayer: RpPlayer, -) : RpEvent() \ No newline at end of file diff --git a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/license/event/RpPlayerLicenseAddedEvent.kt b/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/license/event/RpPlayerLicenseAddedEvent.kt deleted file mode 100644 index 29a8a59..0000000 --- a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/license/event/RpPlayerLicenseAddedEvent.kt +++ /dev/null @@ -1,14 +0,0 @@ -package dev.slne.surf.roleplay.api.player.license.event - -import dev.slne.surf.roleplay.api.events.CancellableRpEvent -import dev.slne.surf.roleplay.api.player.RpPlayer -import dev.slne.surf.roleplay.api.player.identity.RpIdentity -import dev.slne.surf.roleplay.api.player.license.IdentityLicense - -class RpPlayerLicenseAddedEvent( - val player: RpPlayer, - val identity: RpIdentity, - val license: IdentityLicense -) : CancellableRpEvent() { - var cancelReason: String? = null -} \ No newline at end of file diff --git a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/license/event/RpPlayerLicenseRemovedEvent.kt b/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/license/event/RpPlayerLicenseRemovedEvent.kt deleted file mode 100644 index 060ce19..0000000 --- a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/license/event/RpPlayerLicenseRemovedEvent.kt +++ /dev/null @@ -1,14 +0,0 @@ -package dev.slne.surf.roleplay.api.player.license.event - -import dev.slne.surf.roleplay.api.events.CancellableRpEvent -import dev.slne.surf.roleplay.api.player.RpPlayer -import dev.slne.surf.roleplay.api.player.identity.RpIdentity -import dev.slne.surf.roleplay.api.player.license.IdentityLicense -import dev.slne.surf.roleplay.api.player.license.utils.LicenseRemovedReason - -class RpPlayerLicenseRemovedEvent( - val player: RpPlayer, - val identity: RpIdentity, - val license: IdentityLicense, - val reason: LicenseRemovedReason, -) : CancellableRpEvent() \ No newline at end of file diff --git a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/license/licenses/civilian/CivilianFishingLicense.kt b/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/license/licenses/civilian/CivilianFishingLicense.kt deleted file mode 100644 index 68a00f6..0000000 --- a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/license/licenses/civilian/CivilianFishingLicense.kt +++ /dev/null @@ -1,5 +0,0 @@ -package dev.slne.surf.roleplay.api.player.license.licenses.civilian - -import dev.slne.surf.roleplay.api.player.license.License - -interface CivilianFishingLicense : License \ No newline at end of file diff --git a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/license/licenses/civilian/CivilianWeaponLicense.kt b/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/license/licenses/civilian/CivilianWeaponLicense.kt deleted file mode 100644 index c09397e..0000000 --- a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/license/licenses/civilian/CivilianWeaponLicense.kt +++ /dev/null @@ -1,8 +0,0 @@ -package dev.slne.surf.roleplay.api.player.license.licenses.civilian - -import dev.slne.surf.roleplay.api.player.license.License - -interface CivilianWeaponLicense { - interface LightWeaponLicense : License - interface HeavyWeaponLicense : License -} \ No newline at end of file diff --git a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/license/licenses/police/PoliceWeaponLicense.kt b/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/license/licenses/police/PoliceWeaponLicense.kt deleted file mode 100644 index 42c575b..0000000 --- a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/license/licenses/police/PoliceWeaponLicense.kt +++ /dev/null @@ -1,8 +0,0 @@ -package dev.slne.surf.roleplay.api.player.license.licenses.police - -import dev.slne.surf.roleplay.api.player.license.License - -interface PoliceWeaponLicense { - interface LightWeaponLicense : License - interface HeavyWeaponLicense : License -} \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-common-api/build.gradle.kts b/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-common-api/build.gradle.kts new file mode 100644 index 0000000..d6c8fc1 --- /dev/null +++ b/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-common-api/build.gradle.kts @@ -0,0 +1,11 @@ +plugins { + id("dev.slne.surf.surfapi.gradle.core") +} + +surfCoreApi { + withCloudClientCommon() +} + +dependencies { + api(project(":surf-roleplay-api:surf-roleplay-common-api")) +} \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/build.gradle.kts b/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/build.gradle.kts new file mode 100644 index 0000000..0f4c276 --- /dev/null +++ b/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/build.gradle.kts @@ -0,0 +1,11 @@ +plugins { + id("dev.slne.surf.surfapi.gradle.paper-raw") +} + +surfRawPaperApi { + withCloudClientPaper() +} + +dependencies { + api(project(":surf-roleplay-api:surf-roleplay-client-api:surf-roleplay-client-common-api")) +} \ No newline at end of file diff --git a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/events/RpPlayerDeathEvent.kt b/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/player/events/RpPlayerDeathEvent.kt similarity index 69% rename from surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/events/RpPlayerDeathEvent.kt rename to surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/player/events/RpPlayerDeathEvent.kt index abd8a8c..64e0c3e 100644 --- a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/events/RpPlayerDeathEvent.kt +++ b/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/player/events/RpPlayerDeathEvent.kt @@ -1,7 +1,8 @@ -package dev.slne.surf.roleplay.api.player.events +package dev.slne.surf.roleplay.api.paper.player.events -import dev.slne.surf.roleplay.api.events.RpEvent -import dev.slne.surf.roleplay.api.player.RpPlayer +import dev.slne.surf.cloud.api.client.paper.player.toCloudOfflinePlayer +import dev.slne.surf.cloud.api.common.event.CloudEvent +import dev.slne.surf.roleplay.api.common.player.RpPlayer import org.bukkit.block.Block import org.bukkit.entity.Entity import org.bukkit.entity.Player @@ -10,9 +11,10 @@ import org.bukkit.event.entity.EntityDamageByEntityEvent import org.bukkit.event.entity.PlayerDeathEvent class RpPlayerDeathEvent( - val rpPlayer: RpPlayer, + source: Any, + val player: RpPlayer, bukkitEvent: PlayerDeathEvent -) : RpEvent() { +) : CloudEvent(source) { var killerEntity: Entity? private set @@ -20,7 +22,7 @@ class RpPlayerDeathEvent( var killerBlock: Block? = null private set - suspend fun killerRpPlayer() = (killerEntity as? Player)?.let { RpPlayer[it.uniqueId] } + fun killerRpPlayer() = (killerEntity as? Player)?.let { RpPlayer[it.toCloudOfflinePlayer()] } init { val player = bukkitEvent.player diff --git a/surf-roleplay-api/surf-roleplay-common-api/build.gradle.kts b/surf-roleplay-api/surf-roleplay-common-api/build.gradle.kts new file mode 100644 index 0000000..7516627 --- /dev/null +++ b/surf-roleplay-api/surf-roleplay-common-api/build.gradle.kts @@ -0,0 +1,7 @@ +plugins { + id("dev.slne.surf.surfapi.gradle.core") +} + +surfCoreApi { + withCloudCommon() +} \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/InternalContextHolder.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/InternalContextHolder.kt new file mode 100644 index 0000000..20bcf6e --- /dev/null +++ b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/InternalContextHolder.kt @@ -0,0 +1,14 @@ +package dev.slne.surf.roleplay.api.common + +import dev.slne.surf.roleplay.api.common.util.InternalRoleplayApi +import dev.slne.surf.surfapi.core.api.util.requiredService +import org.springframework.context.ApplicationContext + +@InternalRoleplayApi +interface InternalContextHolder { + val context: ApplicationContext + + companion object { + val instance = requiredService() + } +} \ No newline at end of file diff --git a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/mechanic/Mechanic.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/Mechanic.kt similarity index 100% rename from surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/mechanic/Mechanic.kt rename to surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/Mechanic.kt diff --git a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/mechanic/MechanicRegistry.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/MechanicRegistry.kt similarity index 100% rename from surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/mechanic/MechanicRegistry.kt rename to surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/MechanicRegistry.kt diff --git a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/mechanic/idcard/IdCardMechanic.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/idcard/IdCardMechanic.kt similarity index 100% rename from surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/mechanic/idcard/IdCardMechanic.kt rename to surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/idcard/IdCardMechanic.kt diff --git a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/mechanic/rentable/Rentable.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/Rentable.kt similarity index 100% rename from surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/mechanic/rentable/Rentable.kt rename to surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/Rentable.kt diff --git a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/mechanic/rentable/RentableMechanic.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/RentableMechanic.kt similarity index 100% rename from surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/mechanic/rentable/RentableMechanic.kt rename to surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/RentableMechanic.kt diff --git a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/mechanic/rentable/events/RentableMemberAddEvent.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/events/RentableMemberAddEvent.kt similarity index 100% rename from surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/mechanic/rentable/events/RentableMemberAddEvent.kt rename to surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/events/RentableMemberAddEvent.kt diff --git a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/mechanic/rentable/events/RentableMemberRemoveEvent.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/events/RentableMemberRemoveEvent.kt similarity index 100% rename from surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/mechanic/rentable/events/RentableMemberRemoveEvent.kt rename to surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/events/RentableMemberRemoveEvent.kt diff --git a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/mechanic/rentable/events/RentableOwnerChangeEvent.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/events/RentableOwnerChangeEvent.kt similarity index 100% rename from surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/mechanic/rentable/events/RentableOwnerChangeEvent.kt rename to surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/events/RentableOwnerChangeEvent.kt diff --git a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/mechanic/rentable/events/RentableRentCollectEvent.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/events/RentableRentCollectEvent.kt similarity index 100% rename from surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/mechanic/rentable/events/RentableRentCollectEvent.kt rename to surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/events/RentableRentCollectEvent.kt diff --git a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/mechanic/rentable/rentables/Apartment.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/rentables/Apartment.kt similarity index 100% rename from surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/mechanic/rentable/rentables/Apartment.kt rename to surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/rentables/Apartment.kt diff --git a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/mechanic/rentable/rentables/House.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/rentables/House.kt similarity index 100% rename from surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/mechanic/rentable/rentables/House.kt rename to surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/rentables/House.kt diff --git a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/mechanic/rentable/utils/Crackable.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/Crackable.kt similarity index 100% rename from surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/mechanic/rentable/utils/Crackable.kt rename to surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/Crackable.kt diff --git a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/mechanic/rentable/utils/LockPick.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/LockPick.kt similarity index 100% rename from surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/mechanic/rentable/utils/LockPick.kt rename to surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/LockPick.kt diff --git a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/mechanic/rentable/utils/Lockable.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/Lockable.kt similarity index 100% rename from surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/mechanic/rentable/utils/Lockable.kt rename to surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/Lockable.kt diff --git a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/mechanic/rentable/utils/StorageContainer.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/StorageContainer.kt similarity index 100% rename from surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/mechanic/rentable/utils/StorageContainer.kt rename to surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/StorageContainer.kt diff --git a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/mechanic/rentable/utils/door/Door.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/door/Door.kt similarity index 100% rename from surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/mechanic/rentable/utils/door/Door.kt rename to surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/door/Door.kt diff --git a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/mechanic/rentable/utils/door/DoorContainer.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/door/DoorContainer.kt similarity index 100% rename from surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/mechanic/rentable/utils/door/DoorContainer.kt rename to surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/door/DoorContainer.kt diff --git a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/mechanic/weapon/Weapon.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/weapon/Weapon.kt similarity index 100% rename from surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/mechanic/weapon/Weapon.kt rename to surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/weapon/Weapon.kt diff --git a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/mechanic/weapon/WeaponMechanic.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/weapon/WeaponMechanic.kt similarity index 100% rename from surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/mechanic/weapon/WeaponMechanic.kt rename to surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/weapon/WeaponMechanic.kt diff --git a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/mechanic/weapon/magazine/Magazine.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/weapon/magazine/Magazine.kt similarity index 100% rename from surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/mechanic/weapon/magazine/Magazine.kt rename to surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/weapon/magazine/Magazine.kt diff --git a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/mechanic/weapon/magazine/PlayerMagazine.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/weapon/magazine/PlayerMagazine.kt similarity index 100% rename from surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/mechanic/weapon/magazine/PlayerMagazine.kt rename to surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/weapon/magazine/PlayerMagazine.kt diff --git a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/mechanic/weapon/player/PlayerWeapon.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/weapon/player/PlayerWeapon.kt similarity index 100% rename from surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/mechanic/weapon/player/PlayerWeapon.kt rename to surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/weapon/player/PlayerWeapon.kt diff --git a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/mechanic/weapon/utils/WeaponType.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/weapon/utils/WeaponType.kt similarity index 100% rename from surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/mechanic/weapon/utils/WeaponType.kt rename to surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/weapon/utils/WeaponType.kt diff --git a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/RpPlayer.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/RpPlayer.kt similarity index 63% rename from surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/RpPlayer.kt rename to surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/RpPlayer.kt index e1a7850..8f0a493 100644 --- a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/RpPlayer.kt +++ b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/RpPlayer.kt @@ -1,27 +1,19 @@ -package dev.slne.surf.roleplay.api.player +package dev.slne.surf.roleplay.api.common.player -import dev.slne.surf.roleplay.api.player.identity.RpIdentity -import dev.slne.surf.roleplay.api.player.license.HasLicenses -import dev.slne.surf.roleplay.api.transaction.HasTransactions +import dev.slne.surf.cloud.api.common.player.OfflineCloudPlayer +import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity +import dev.slne.surf.roleplay.api.common.player.license.HasLicenses +import dev.slne.surf.roleplay.api.common.transaction.HasRpTransactions import it.unimi.dsi.fastutil.objects.ObjectSet -import net.kyori.adventure.text.ComponentLike -import org.bukkit.OfflinePlayer -import org.bukkit.entity.Player +import net.kyori.adventure.text.Component import java.time.ZonedDateTime -import java.util.* -interface RpPlayer : HasTransactions, HasLicenses, - ComponentLike { +interface RpPlayer : HasRpTransactions, HasLicenses { /** - * The [UUID] of the player + * The cloud player associated with this [RpPlayer]. */ - val uuid: UUID - - /** - * The username of the player. - */ - val username: String? + val cloudPlayer: OfflineCloudPlayer /** * The active identity of the player. @@ -33,17 +25,6 @@ interface RpPlayer : HasTransactions, HasLicenses, */ val identities: ObjectSet - /** - * The Bukkit [Player] representation of this player, if they are online. - * Returns `null` if the player is not online. - */ - val bukkitPlayer: Player? - - /** - * The Bukkit [OfflinePlayer] representation of this player. - */ - val bukkitOfflinePlayer: OfflinePlayer - /** * The date and time when the player was created. */ @@ -77,21 +58,6 @@ interface RpPlayer : HasTransactions, HasLicenses, */ fun getIdentity(clazz: Class): RpIdentity? - /** - * Checks if the player has a specific permission. - * - * @param permission The permission to check. - * @return `true` if the player has the permission, `false` otherwise. - */ - fun hasPermission(permission: String): Boolean = bukkitPlayer?.hasPermission(permission) == true - - /** - * Updates the player's username. - * - * @param username The new username to set for the player. - */ - suspend fun updateUsername(username: String) - /** * Creates a new identity for the player. * @@ -126,11 +92,16 @@ interface RpPlayer : HasTransactions, HasLicenses, */ fun hasCompletedCitizenship(): Boolean + /** + * Returns the player as a Component for display purposes. + * This method is used to convert the player information into a format suitable for display in user interfaces. + * + * @return A [Component] representing the player. + */ + suspend fun asComponent(): Component + companion object { - /** - * Gets a [RpPlayer] by their [UUID]. - */ - suspend operator fun get(uuid: UUID) = RpPlayerManager[uuid] + operator fun get(cloudPlayer: OfflineCloudPlayer): RpPlayer = null } } @@ -143,8 +114,8 @@ interface RpPlayer : HasTransactions, HasLicenses, inline fun RpPlayer.getIdentity() = getIdentity(T::class.java) /** - * Gets the [RpPlayer] associated with this [Player]. + * Gets the [RpPlayer] associated with this [OfflineCloudPlayer]. * * @return The [RpPlayer] instance for this player. */ -suspend fun Player.rpPlayer() = RpPlayer[uniqueId] \ No newline at end of file +fun OfflineCloudPlayer.rpPlayer() = RpPlayer[this] \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/RpPlayerManager.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/RpPlayerManager.kt new file mode 100644 index 0000000..7781a9d --- /dev/null +++ b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/RpPlayerManager.kt @@ -0,0 +1,15 @@ +package dev.slne.surf.roleplay.api.common.player + +import dev.slne.surf.roleplay.api.common.InternalContextHolder +import dev.slne.surf.roleplay.api.common.util.InternalRoleplayApi +import org.springframework.beans.factory.getBean +import java.util.* + +@InternalRoleplayApi +interface RpPlayerManager { + fun getPlayerByUuid(uuid: UUID): RpPlayer + + companion object { + val instance get() = InternalContextHolder.instance.context.getBean() + } +} \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/events/RpPlayerJoinEvent.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/events/RpPlayerJoinEvent.kt new file mode 100644 index 0000000..bdd4d79 --- /dev/null +++ b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/events/RpPlayerJoinEvent.kt @@ -0,0 +1,9 @@ +package dev.slne.surf.roleplay.api.common.player.events + +import dev.slne.surf.cloud.api.common.event.CloudEvent +import dev.slne.surf.roleplay.api.common.player.RpPlayer + +class RpPlayerJoinEvent( + source: Any, + val player: RpPlayer, +) : CloudEvent(source) \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/events/RpPlayerQuitEvent.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/events/RpPlayerQuitEvent.kt new file mode 100644 index 0000000..d0a2e54 --- /dev/null +++ b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/events/RpPlayerQuitEvent.kt @@ -0,0 +1,9 @@ +package dev.slne.surf.roleplay.api.common.player.events + +import dev.slne.surf.cloud.api.common.event.CloudEvent +import dev.slne.surf.roleplay.api.common.player.RpPlayer + +class RpPlayerQuitEvent( + source: Any, + val player: RpPlayer, +) : CloudEvent(source) \ No newline at end of file diff --git a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/identity/RpIdentity.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/identity/RpIdentity.kt similarity index 85% rename from surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/identity/RpIdentity.kt rename to surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/identity/RpIdentity.kt index 6b3a1d2..bae781c 100644 --- a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/identity/RpIdentity.kt +++ b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/identity/RpIdentity.kt @@ -1,8 +1,8 @@ -package dev.slne.surf.roleplay.api.player.identity +package dev.slne.surf.roleplay.api.common.player.identity -import dev.slne.surf.roleplay.api.player.RpPlayer -import dev.slne.surf.roleplay.api.player.license.HasLicenses -import dev.slne.surf.roleplay.api.transaction.HasTransactions +import dev.slne.surf.roleplay.api.common.player.RpPlayer +import dev.slne.surf.roleplay.api.common.player.license.HasLicenses +import dev.slne.surf.roleplay.api.common.transaction.HasRpTransactions import dev.slne.surf.surfapi.core.api.messages.adventure.buildText import net.kyori.adventure.text.ComponentLike import java.time.LocalDate @@ -11,8 +11,8 @@ import java.time.ZonedDateTime /** * Represents a roleplay identity of a player */ -interface RpIdentity : HasTransactions, HasLicenses { - +interface RpIdentity : HasRpTransactions, HasLicenses { + /** * The player associated with this identity. */ diff --git a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/license/ExpirableLicense.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/ExpirableLicense.kt similarity index 78% rename from surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/license/ExpirableLicense.kt rename to surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/ExpirableLicense.kt index c373553..59e95ed 100644 --- a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/license/ExpirableLicense.kt +++ b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/ExpirableLicense.kt @@ -1,4 +1,4 @@ -package dev.slne.surf.roleplay.api.player.license +package dev.slne.surf.roleplay.api.common.player.license import kotlin.time.Duration diff --git a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/license/HasLicenses.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/HasLicenses.kt similarity index 87% rename from surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/license/HasLicenses.kt rename to surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/HasLicenses.kt index 5d2fd62..7d43e3b 100644 --- a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/license/HasLicenses.kt +++ b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/HasLicenses.kt @@ -1,10 +1,10 @@ -package dev.slne.surf.roleplay.api.player.license +package dev.slne.surf.roleplay.api.common.player.license -import dev.slne.surf.roleplay.api.player.RpPlayer -import dev.slne.surf.roleplay.api.player.identity.RpIdentity -import dev.slne.surf.roleplay.api.player.license.utils.LicenseCreateResult -import dev.slne.surf.roleplay.api.player.license.utils.LicenseRemovedReason -import dev.slne.surf.roleplay.api.player.license.utils.UnobtainableReason +import dev.slne.surf.roleplay.api.common.player.RpPlayer +import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity +import dev.slne.surf.roleplay.api.common.player.license.utils.LicenseCreateResult +import dev.slne.surf.roleplay.api.common.player.license.utils.LicenseRemovedReason +import dev.slne.surf.roleplay.api.common.player.license.utils.UnobtainableReason import it.unimi.dsi.fastutil.objects.ObjectSet import org.jetbrains.annotations.Unmodifiable diff --git a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/license/IdentityLicense.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/IdentityLicense.kt similarity index 95% rename from surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/license/IdentityLicense.kt rename to surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/IdentityLicense.kt index 94477db..a2f4eb9 100644 --- a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/license/IdentityLicense.kt +++ b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/IdentityLicense.kt @@ -1,6 +1,6 @@ -package dev.slne.surf.roleplay.api.player.license +package dev.slne.surf.roleplay.api.common.player.license -import dev.slne.surf.roleplay.api.player.identity.RpIdentity +import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity import java.time.ZonedDateTime /** diff --git a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/license/LicenseService.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/InternalLicenseBridge.kt similarity index 80% rename from surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/license/LicenseService.kt rename to surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/InternalLicenseBridge.kt index acd9727..abd78b4 100644 --- a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/license/LicenseService.kt +++ b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/InternalLicenseBridge.kt @@ -1,15 +1,17 @@ -package dev.slne.surf.roleplay.api.player.license +@file:OptIn(InternalRoleplayApi::class) -import dev.slne.surf.roleplay.api.player.RpPlayer -import dev.slne.surf.roleplay.api.player.identity.RpIdentity -import dev.slne.surf.surfapi.core.api.util.requiredService +package dev.slne.surf.roleplay.api.common.player.license + +import dev.slne.surf.roleplay.api.common.InternalContextHolder +import dev.slne.surf.roleplay.api.common.player.RpPlayer +import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity +import dev.slne.surf.roleplay.api.common.util.InternalRoleplayApi import it.unimi.dsi.fastutil.objects.ObjectSet import net.kyori.adventure.key.Key import org.jetbrains.annotations.Unmodifiable +import org.springframework.beans.factory.getBean -private val licenseService = requiredService() - -interface LicenseService { +interface InternalLicenseBridge { /** * All licenses available in the game. @@ -86,8 +88,8 @@ interface LicenseService { license: License ): Boolean - companion object : LicenseService by licenseService { - val INSTANCE get() = licenseService + companion object { + val instance get() = InternalContextHolder.instance.context.getBean() } } @@ -97,7 +99,7 @@ interface LicenseService { * @param T the type of the license to retrieve. * @return the license instance if found, or null if not found. */ -inline fun LicenseService.getLicense() = getLicense(T::class.java) +inline fun InternalLicenseBridge.getLicense() = getLicense(T::class.java) /** * Convenience function to get a license by its type, or throw an exception if not found. @@ -106,5 +108,5 @@ inline fun LicenseService.getLicense() = getLicense(T::cla * @return the license instance if found. * @throws IllegalArgumentException if the license is not found. */ -inline fun LicenseService.getLicenseOrThrow() = +inline fun InternalLicenseBridge.getLicenseOrThrow() = getLicenseOrThrow(T::class.java) \ No newline at end of file diff --git a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/license/License.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/License.kt similarity index 78% rename from surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/license/License.kt rename to surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/License.kt index c8fba69..a3b5ff7 100644 --- a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/license/License.kt +++ b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/License.kt @@ -1,8 +1,7 @@ -package dev.slne.surf.roleplay.api.player.license +package dev.slne.surf.roleplay.api.common.player.license -import dev.slne.surf.roleplay.api.player.identity.RpIdentity -import dev.slne.surf.roleplay.api.player.license.utils.UnobtainableReason -import dev.slne.surf.surfapi.bukkit.api.builder.LoreBuilder +import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity +import dev.slne.surf.roleplay.api.common.player.license.utils.UnobtainableReason import it.unimi.dsi.fastutil.objects.ObjectSet import net.kyori.adventure.key.Key import net.kyori.adventure.text.Component @@ -19,10 +18,9 @@ interface License { val displayName: Component /** - * A function that builds the description of the license using a [LoreBuilder]. - * This allows for a flexible and formatted description. + * A description of the license, providing more details about its purpose and benefits. */ - val description: LoreBuilder.() -> Unit + val description: Component /** * The price of the license in the game currency. diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/event/RpPlayerLicenseAddedEvent.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/event/RpPlayerLicenseAddedEvent.kt new file mode 100644 index 0000000..5227ab6 --- /dev/null +++ b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/event/RpPlayerLicenseAddedEvent.kt @@ -0,0 +1,15 @@ +package dev.slne.surf.roleplay.api.common.player.license.event + +import dev.slne.surf.cloud.api.common.event.CancellableCloudEvent +import dev.slne.surf.roleplay.api.common.player.RpPlayer +import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity +import dev.slne.surf.roleplay.api.common.player.license.IdentityLicense + +class RpPlayerLicenseAddedEvent( + source: Any, + val player: RpPlayer, + val identity: RpIdentity, + val license: IdentityLicense +) : CancellableCloudEvent(source) { + var cancelReason: String? = null +} \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/event/RpPlayerLicenseRemovedEvent.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/event/RpPlayerLicenseRemovedEvent.kt new file mode 100644 index 0000000..2672dc3 --- /dev/null +++ b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/event/RpPlayerLicenseRemovedEvent.kt @@ -0,0 +1,15 @@ +package dev.slne.surf.roleplay.api.common.player.license.event + +import dev.slne.surf.cloud.api.common.event.CancellableCloudEvent +import dev.slne.surf.roleplay.api.common.player.RpPlayer +import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity +import dev.slne.surf.roleplay.api.common.player.license.IdentityLicense +import dev.slne.surf.roleplay.api.common.player.license.utils.LicenseRemovedReason + +class RpPlayerLicenseRemovedEvent( + source: Any, + val player: RpPlayer, + val identity: RpIdentity, + val license: IdentityLicense, + val reason: LicenseRemovedReason, +) : CancellableCloudEvent(source) \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/licenses/civilian/CivilianFishingLicense.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/licenses/civilian/CivilianFishingLicense.kt new file mode 100644 index 0000000..6105b24 --- /dev/null +++ b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/licenses/civilian/CivilianFishingLicense.kt @@ -0,0 +1,5 @@ +package dev.slne.surf.roleplay.api.common.player.license.licenses.civilian + +import dev.slne.surf.roleplay.api.common.player.license.License + +interface CivilianFishingLicense : License \ No newline at end of file diff --git a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/license/licenses/civilian/CivilianVehicleLicense.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/licenses/civilian/CivilianVehicleLicense.kt similarity index 68% rename from surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/license/licenses/civilian/CivilianVehicleLicense.kt rename to surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/licenses/civilian/CivilianVehicleLicense.kt index 81391d1..a7cc564 100644 --- a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/license/licenses/civilian/CivilianVehicleLicense.kt +++ b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/licenses/civilian/CivilianVehicleLicense.kt @@ -1,7 +1,6 @@ -package dev.slne.surf.roleplay.api.player.license.licenses.civilian - -import dev.slne.surf.roleplay.api.player.license.License +package dev.slne.surf.roleplay.api.common.player.license.licenses.civilian +import dev.slne.surf.roleplay.api.common.player.license.License interface CivilianVehicleLicense { interface DriversLicense : License diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/licenses/civilian/CivilianWeaponLicense.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/licenses/civilian/CivilianWeaponLicense.kt new file mode 100644 index 0000000..ca3a367 --- /dev/null +++ b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/licenses/civilian/CivilianWeaponLicense.kt @@ -0,0 +1,8 @@ +package dev.slne.surf.roleplay.api.common.player.license.licenses.civilian + +import dev.slne.surf.roleplay.api.common.player.license.License + +interface CivilianWeaponLicense { + interface LightWeaponLicense : License + interface HeavyWeaponLicense : License +} \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/licenses/police/PoliceWeaponLicense.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/licenses/police/PoliceWeaponLicense.kt new file mode 100644 index 0000000..90b106a --- /dev/null +++ b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/licenses/police/PoliceWeaponLicense.kt @@ -0,0 +1,8 @@ +package dev.slne.surf.roleplay.api.common.player.license.licenses.police + +import dev.slne.surf.roleplay.api.common.player.license.License + +interface PoliceWeaponLicense { + interface LightWeaponLicense : License + interface HeavyWeaponLicense : License +} \ No newline at end of file diff --git a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/license/utils/LicenseCreateResult.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/utils/LicenseCreateResult.kt similarity index 58% rename from surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/license/utils/LicenseCreateResult.kt rename to surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/utils/LicenseCreateResult.kt index c9ee17a..5361dd0 100644 --- a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/license/utils/LicenseCreateResult.kt +++ b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/utils/LicenseCreateResult.kt @@ -1,6 +1,6 @@ -package dev.slne.surf.roleplay.api.player.license.utils +package dev.slne.surf.roleplay.api.common.player.license.utils -import dev.slne.surf.roleplay.api.player.license.IdentityLicense +import dev.slne.surf.roleplay.api.common.player.license.IdentityLicense import it.unimi.dsi.fastutil.objects.ObjectSet data class LicenseCreateResult( diff --git a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/license/utils/LicenseRemovedReason.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/utils/LicenseRemovedReason.kt similarity index 83% rename from surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/license/utils/LicenseRemovedReason.kt rename to surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/utils/LicenseRemovedReason.kt index a1129cd..e6298c5 100644 --- a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/license/utils/LicenseRemovedReason.kt +++ b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/utils/LicenseRemovedReason.kt @@ -1,7 +1,7 @@ -package dev.slne.surf.roleplay.api.player.license.utils +package dev.slne.surf.roleplay.api.common.player.license.utils -import dev.slne.surf.roleplay.api.player.RpPlayer -import dev.slne.surf.roleplay.api.player.license.IdentityLicense +import dev.slne.surf.roleplay.api.common.player.RpPlayer +import dev.slne.surf.roleplay.api.common.player.license.IdentityLicense import dev.slne.surf.surfapi.core.api.messages.builder.SurfComponentBuilder sealed class LicenseRemovedReason(val message: SurfComponentBuilder.(IdentityLicense) -> Unit) { @@ -30,7 +30,7 @@ sealed class LicenseRemovedReason(val message: SurfComponentBuilder.(IdentityLic info("Deine ") append(it.license.displayName) info(" Lizenz wurde durch ") - variableValue(confiscatedBy.username ?: confiscatedBy.uuid.toString()) + append(confiscatedBy) info(" beschlagnahmt. Grund: ") variableValue(confiscatedReason) info(".") @@ -44,7 +44,7 @@ sealed class LicenseRemovedReason(val message: SurfComponentBuilder.(IdentityLic info("Deine ") append(it.license.displayName) info(" Lizenz wurde von ") - variableValue(confiscatedBy.username ?: confiscatedBy.uuid.toString()) + append(confiscatedBy) info(" beschlagnahmt, da die übergeordnete Lizenz ") append(parent.license.displayName) info(" beschlagnahmt wurde. Grund: ") diff --git a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/license/utils/UnobtainableReason.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/utils/UnobtainableReason.kt similarity index 93% rename from surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/license/utils/UnobtainableReason.kt rename to surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/utils/UnobtainableReason.kt index 0c5c4ff..53ed21b 100644 --- a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/license/utils/UnobtainableReason.kt +++ b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/utils/UnobtainableReason.kt @@ -1,6 +1,6 @@ -package dev.slne.surf.roleplay.api.player.license.utils +package dev.slne.surf.roleplay.api.common.player.license.utils -import dev.slne.surf.roleplay.api.player.license.License +import dev.slne.surf.roleplay.api.common.player.license.License import dev.slne.surf.surfapi.core.api.messages.adventure.appendNewline import dev.slne.surf.surfapi.core.api.messages.builder.SurfComponentBuilder import it.unimi.dsi.fastutil.objects.ObjectSet diff --git a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/transaction/HasTransactions.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/transaction/HasRpTransactions.kt similarity index 97% rename from surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/transaction/HasTransactions.kt rename to surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/transaction/HasRpTransactions.kt index 07173ec..25d03aa 100644 --- a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/transaction/HasTransactions.kt +++ b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/transaction/HasRpTransactions.kt @@ -1,9 +1,9 @@ -package dev.slne.surf.roleplay.api.transaction +package dev.slne.surf.roleplay.api.common.transaction -import dev.slne.surf.roleplay.api.player.utils.BalanceType +import dev.slne.surf.roleplay.api.common.transaction.utils.BalanceType import it.unimi.dsi.fastutil.objects.ObjectLinkedOpenHashSet -interface HasTransactions { +interface HasRpTransactions { /** * Returns the player's balance for the specified [BalanceType]. diff --git a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/transaction/RpTransaction.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/transaction/RpTransaction.kt similarity index 80% rename from surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/transaction/RpTransaction.kt rename to surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/transaction/RpTransaction.kt index b563b87..59d69ea 100644 --- a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/transaction/RpTransaction.kt +++ b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/transaction/RpTransaction.kt @@ -1,7 +1,7 @@ -package dev.slne.surf.roleplay.api.transaction +package dev.slne.surf.roleplay.api.common.transaction -import dev.slne.surf.roleplay.api.player.RpPlayer -import dev.slne.surf.roleplay.api.player.utils.BalanceType +import dev.slne.surf.roleplay.api.common.player.RpPlayer +import dev.slne.surf.roleplay.api.common.transaction.utils.BalanceType import java.time.ZonedDateTime import java.util.* diff --git a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/utils/BalanceType.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/transaction/utils/BalanceType.kt similarity index 89% rename from surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/utils/BalanceType.kt rename to surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/transaction/utils/BalanceType.kt index 8c7bd61..b9f97ed 100644 --- a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/player/utils/BalanceType.kt +++ b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/transaction/utils/BalanceType.kt @@ -1,6 +1,6 @@ -package dev.slne.surf.roleplay.api.player.utils +package dev.slne.surf.roleplay.api.common.transaction.utils -import dev.slne.surf.roleplay.api.player.identity.RpIdentity +import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity enum class BalanceType(val currencyName: (RpIdentity) -> String) { CASH({ diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/util/InternalRoleplayApi.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/util/InternalRoleplayApi.kt new file mode 100644 index 0000000..cf5b32c --- /dev/null +++ b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/util/InternalRoleplayApi.kt @@ -0,0 +1,17 @@ +package dev.slne.surf.roleplay.api.common.util + +@RequiresOptIn( + level = RequiresOptIn.Level.ERROR, + message = "This API is intended for internal use only. Do not use it in your code unless you are sure you know what you are doing. " + + "Using this API may lead to unexpected behavior or compatibility issues in future versions." +) +@Retention(AnnotationRetention.BINARY) +@Target( + AnnotationTarget.CLASS, + AnnotationTarget.FUNCTION, + AnnotationTarget.PROPERTY, + AnnotationTarget.TYPEALIAS, + AnnotationTarget.VALUE_PARAMETER, + AnnotationTarget.FIELD +) +annotation class InternalRoleplayApi \ No newline at end of file diff --git a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/coroutine/RpJob.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/util/RpJob.kt similarity index 96% rename from surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/coroutine/RpJob.kt rename to surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/util/RpJob.kt index 1a8b389..0f76179 100644 --- a/surf-roleplay-api/src/main/kotlin/dev/slne/surf/roleplay/api/coroutine/RpJob.kt +++ b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/util/RpJob.kt @@ -1,4 +1,4 @@ -package dev.slne.surf.roleplay.api.coroutine +package dev.slne.surf.roleplay.api.common.util import dev.slne.surf.surfapi.core.api.util.logger import kotlinx.coroutines.* diff --git a/surf-roleplay-api/surf-roleplay-server-api/build.gradle.kts b/surf-roleplay-api/surf-roleplay-server-api/build.gradle.kts new file mode 100644 index 0000000..ad6c7f2 --- /dev/null +++ b/surf-roleplay-api/surf-roleplay-server-api/build.gradle.kts @@ -0,0 +1,11 @@ +plugins { + id("dev.slne.surf.surfapi.gradle.core") +} + +surfCoreApi { + withCloudServer() +} + +dependencies { + api(project(":surf-roleplay-api:surf-roleplay-common-api")) +} \ No newline at end of file diff --git a/surf-roleplay-core/build.gradle.kts b/surf-roleplay-core/build.gradle.kts deleted file mode 100644 index 3d359ee..0000000 --- a/surf-roleplay-core/build.gradle.kts +++ /dev/null @@ -1,9 +0,0 @@ -plugins { - id("dev.slne.surf.surfapi.gradle.paper-raw") -} - -dependencies { - api(project(":surf-roleplay-api")) - api(libs.surf.database) - compileOnlyApi(libs.surf.npc.api) -} \ No newline at end of file diff --git a/surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/RpCore.kt b/surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/RpCore.kt deleted file mode 100644 index b332ac3..0000000 --- a/surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/RpCore.kt +++ /dev/null @@ -1,11 +0,0 @@ -package dev.slne.surf.roleplay.core - -import com.github.shynixn.mccoroutine.folia.SuspendingJavaPlugin - -val plugin get() = RpCore.plugin - -object RpCore { - - lateinit var plugin: SuspendingJavaPlugin - -} \ No newline at end of file diff --git a/surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/RpDatabase.kt b/surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/RpDatabase.kt deleted file mode 100644 index 02c1110..0000000 --- a/surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/RpDatabase.kt +++ /dev/null @@ -1,43 +0,0 @@ -package dev.slne.surf.roleplay.core - -import dev.slne.surf.database.DatabaseManager -import dev.slne.surf.roleplay.core.player.db.RpPlayerTable -import dev.slne.surf.roleplay.core.player.identity.db.impl.civilian.RpPlayerCivilianIdentityTable -import dev.slne.surf.roleplay.core.player.identity.db.impl.police.RpPlayerPoliceIdentityTable -import dev.slne.surf.roleplay.core.player.identity.db.impl.rescueservice.RpPlayerRescueServiceIdentityTable -import dev.slne.surf.roleplay.core.player.license.db.IdentityLicenseTable -import dev.slne.surf.surfapi.core.api.util.mutableObjectSetOf -import org.jetbrains.exposed.sql.SchemaUtils -import org.jetbrains.exposed.sql.Table -import org.jetbrains.exposed.sql.transactions.experimental.newSuspendedTransaction -import java.nio.file.Path -import kotlin.io.path.div - -class RpDatabase(val configPath: Path, val storagePath: Path = configPath / "storage") { - - private lateinit var dbManager: DatabaseManager - private val mechanicTables = mutableObjectSetOf() - - fun registerMechanicTable(table: Table) = mechanicTables.add(table) - - suspend fun onLoad() { - dbManager = DatabaseManager(configPath, storagePath) - dbManager.databaseProvider.connect() - - newSuspendedTransaction { - SchemaUtils.create( - RpPlayerTable, - RpPlayerCivilianIdentityTable, - RpPlayerRescueServiceIdentityTable, - RpPlayerPoliceIdentityTable, - IdentityLicenseTable, - *mechanicTables.toTypedArray() - ) - } - } - - fun onDisable() { - dbManager.databaseProvider.disconnect() - } - -} \ No newline at end of file diff --git a/surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/identity/db/impl/civilian/RpPlayerCivilianIdentityTable.kt b/surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/identity/db/impl/civilian/RpPlayerCivilianIdentityTable.kt deleted file mode 100644 index 5e52f06..0000000 --- a/surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/identity/db/impl/civilian/RpPlayerCivilianIdentityTable.kt +++ /dev/null @@ -1,5 +0,0 @@ -package dev.slne.surf.roleplay.core.player.identity.db.impl.civilian - -import dev.slne.surf.roleplay.core.player.identity.db.RpPlayerIdentityBaseTable - -object RpPlayerCivilianIdentityTable : RpPlayerIdentityBaseTable("rp_player_civilian_identities") \ No newline at end of file diff --git a/surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/identity/db/impl/rescueservice/RpPlayerRescueServiceIdentityTable.kt b/surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/identity/db/impl/rescueservice/RpPlayerRescueServiceIdentityTable.kt deleted file mode 100644 index 5c259f9..0000000 --- a/surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/identity/db/impl/rescueservice/RpPlayerRescueServiceIdentityTable.kt +++ /dev/null @@ -1,9 +0,0 @@ -package dev.slne.surf.roleplay.core.player.identity.db.impl.rescueservice - -import dev.slne.surf.roleplay.core.player.identity.db.RpPlayerIdentityBaseTable - -object RpPlayerRescueServiceIdentityTable : RpPlayerIdentityBaseTable( - "rp_player_rescue_service_identities" -) { - val rank = varchar("rank", 255) -} \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-client/build.gradle.kts b/surf-roleplay-core/surf-roleplay-core-client/build.gradle.kts new file mode 100644 index 0000000..e225f30 --- /dev/null +++ b/surf-roleplay-core/surf-roleplay-core-client/build.gradle.kts @@ -0,0 +1,12 @@ +plugins { + id("dev.slne.surf.surfapi.gradle.core") +} + +surfCoreApi { + withCloudClientCommon() +} + +dependencies { + api(project(":surf-roleplay-api:surf-roleplay-client-api:surf-roleplay-client-common-api")) + api(project(":surf-roleplay-core:surf-roleplay-core-common")) +} \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-client/src/main/kotlin/dev/slne/surf/roleplay/core/client/player/ClientRpPlayer.kt b/surf-roleplay-core/surf-roleplay-core-client/src/main/kotlin/dev/slne/surf/roleplay/core/client/player/ClientRpPlayer.kt new file mode 100644 index 0000000..b10bd5d --- /dev/null +++ b/surf-roleplay-core/surf-roleplay-core-client/src/main/kotlin/dev/slne/surf/roleplay/core/client/player/ClientRpPlayer.kt @@ -0,0 +1,25 @@ +package dev.slne.surf.roleplay.core.client.player + +import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity +import dev.slne.surf.roleplay.core.common.player.CommonRpPlayer +import java.util.* + +class ClientRpPlayer(uuid: UUID) : CommonRpPlayer(uuid) { + override suspend fun createIdentity( + identity: T + ): T { + TODO("Not yet implemented") + } + + override suspend fun updateIdentity( + identity: T + ): T? { + TODO("Not yet implemented") + } + + override suspend fun createOrUpdateIdentity( + identity: T + ): T { + TODO("Not yet implemented") + } +} \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-client/src/main/kotlin/dev/slne/surf/roleplay/core/client/player/ClientRpPlayerManager.kt b/surf-roleplay-core/surf-roleplay-core-client/src/main/kotlin/dev/slne/surf/roleplay/core/client/player/ClientRpPlayerManager.kt new file mode 100644 index 0000000..98de58d --- /dev/null +++ b/surf-roleplay-core/surf-roleplay-core-client/src/main/kotlin/dev/slne/surf/roleplay/core/client/player/ClientRpPlayerManager.kt @@ -0,0 +1,10 @@ +package dev.slne.surf.roleplay.core.client.player + +import dev.slne.surf.roleplay.core.common.player.CommonRpPlayerManager +import org.springframework.stereotype.Component +import java.util.* + +@Component +class ClientRpPlayerManager : CommonRpPlayerManager() { + override fun createPlayer(uuid: UUID) = ClientRpPlayer(uuid) +} \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/build.gradle.kts b/surf-roleplay-core/surf-roleplay-core-common/build.gradle.kts new file mode 100644 index 0000000..dabaaaa --- /dev/null +++ b/surf-roleplay-core/surf-roleplay-core-common/build.gradle.kts @@ -0,0 +1,11 @@ +plugins { + id("dev.slne.surf.surfapi.gradle.core") +} + +surfCoreApi { + withCloudCommon() +} + +dependencies { + api(project(":surf-roleplay-api:surf-roleplay-common-api")) +} \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/RoleplayApplication.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/RoleplayApplication.kt new file mode 100644 index 0000000..8ab6df4 --- /dev/null +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/RoleplayApplication.kt @@ -0,0 +1,6 @@ +package dev.slne.surf.roleplay + +import dev.slne.surf.cloud.api.common.SurfCloudApplication + +@SurfCloudApplication +class RoleplayApplication \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/ContextHolderImpl.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/ContextHolderImpl.kt new file mode 100644 index 0000000..6067607 --- /dev/null +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/ContextHolderImpl.kt @@ -0,0 +1,16 @@ +package dev.slne.surf.roleplay.core.common + +import com.google.auto.service.AutoService +import dev.slne.surf.roleplay.api.common.InternalContextHolder +import dev.slne.surf.roleplay.api.common.util.InternalRoleplayApi +import org.springframework.context.ApplicationContext + +@OptIn(InternalRoleplayApi::class) +@AutoService(InternalContextHolder::class) +class ContextHolderImpl : InternalContextHolder { + override lateinit var context: ApplicationContext + + companion object { + val instance = InternalContextHolder.instance as ContextHolderImpl + } +} \ No newline at end of file diff --git a/surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/RpPlayerImpl.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/CommonRpPlayer.kt similarity index 67% rename from surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/RpPlayerImpl.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/CommonRpPlayer.kt index 2d651fe..ba4eaeb 100644 --- a/surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/RpPlayerImpl.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/CommonRpPlayer.kt @@ -1,34 +1,32 @@ -package dev.slne.surf.roleplay.core.player - -import dev.slne.surf.roleplay.api.player.RpPlayer -import dev.slne.surf.roleplay.api.player.getIdentity -import dev.slne.surf.roleplay.api.player.identity.RpIdentity -import dev.slne.surf.roleplay.api.player.license.License -import dev.slne.surf.roleplay.api.player.license.utils.LicenseRemovedReason -import dev.slne.surf.roleplay.api.player.utils.BalanceType -import dev.slne.surf.surfapi.bukkit.api.extensions.server +package dev.slne.surf.roleplay.core.common.player + +import dev.slne.surf.cloud.api.common.player.OfflineCloudPlayer +import dev.slne.surf.cloud.api.common.player.toOfflineCloudPlayer +import dev.slne.surf.roleplay.api.common.player.RpPlayer +import dev.slne.surf.roleplay.api.common.player.getIdentity +import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity +import dev.slne.surf.roleplay.api.common.player.license.License +import dev.slne.surf.roleplay.api.common.player.license.utils.LicenseRemovedReason +import dev.slne.surf.roleplay.api.common.transaction.utils.BalanceType import dev.slne.surf.surfapi.core.api.messages.adventure.appendNewline import dev.slne.surf.surfapi.core.api.messages.adventure.buildText import dev.slne.surf.surfapi.core.api.util.mutableObjectSetOf import it.unimi.dsi.fastutil.objects.ObjectSet -import org.bukkit.OfflinePlayer -import org.bukkit.entity.Player import java.time.ZonedDateTime import java.util.* -class RpPlayerImpl( - override val uuid: UUID, +abstract class CommonRpPlayer( + private val uuid: UUID, override var createdAt: ZonedDateTime = ZonedDateTime.now(), override var updatedAt: ZonedDateTime = ZonedDateTime.now() ) : RpPlayer { + override val cloudPlayer: OfflineCloudPlayer + get() = uuid.toOfflineCloudPlayer() + private val _identities = mutableObjectSetOf() override val identities: ObjectSet get() = _identities - override var username: String? = null - override val bukkitPlayer: Player? get() = server.getPlayer(uuid) - override val bukkitOfflinePlayer: OfflinePlayer get() = server.getOfflinePlayer(uuid) - override var activeIdentity: RpIdentity? = null override suspend fun setActiveIdentity(identity: RpIdentity) { @@ -46,18 +44,6 @@ class RpPlayerImpl( _identities.firstOrNull { it.type == type } ?: error("No identity of type $type found for player $uuid") - override suspend fun createIdentity(identity: T) = - rpPlayerManagerImpl.createIdentity(this, identity) - - override suspend fun createOrUpdateIdentity(identity: T) = - rpPlayerManagerImpl.createOrUpdateIdentity(this, identity) - - override suspend fun updateIdentity(identity: T) = - rpPlayerManagerImpl.updateIdentity(this, identity) - - override suspend fun updateUsername(username: String) = - rpPlayerManagerImpl.updateUsername(this, username) - override suspend fun getBalance(balanceType: BalanceType) = activeIdentity?.getBalance(balanceType) ?: error("Tried accessing balance of a player without an active identity $uuid") @@ -113,13 +99,15 @@ class RpPlayerImpl( license, confiscatedBy, confiscatedReason - ) ?: error("Tried confiscating a license from a player without an active identity $uuid") + ) + ?: error("Tried confiscating a license from a player without an active identity $uuid") - override fun asComponent() = buildText { + override suspend fun asComponent() = buildText { val activeIdentity = activeIdentity + val name = cloudPlayer.name() if (activeIdentity == null) { - variableKey(username ?: uuid.toString()) + variableKey(name ?: uuid.toString()) return@buildText } @@ -134,7 +122,7 @@ class RpPlayerImpl( variableValue(uuid.toString()) appendNewline(2) - username?.let { + name?.let { variableKey("Username: ") variableValue(it) } @@ -143,17 +131,15 @@ class RpPlayerImpl( override fun equals(other: Any?): Boolean { if (this === other) return true - if (other !is RpPlayerImpl) return false + if (javaClass != other?.javaClass) return false - if (uuid != other.uuid) return false + other as CommonRpPlayer - return true + return cloudPlayer == other.cloudPlayer } - override fun hashCode() = uuid.hashCode() - - override fun toString(): String { - return "RpPlayerImpl(uuid=$uuid, createdAt=$createdAt, updatedAt=$updatedAt, identities=$identities, username=$username, activeIdentity=$activeIdentity, licenses=$licenses)" + override fun hashCode(): Int { + return cloudPlayer.hashCode() } } \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/CommonRpPlayerManager.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/CommonRpPlayerManager.kt new file mode 100644 index 0000000..282d6a3 --- /dev/null +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/CommonRpPlayerManager.kt @@ -0,0 +1,20 @@ +package dev.slne.surf.roleplay.core.common.player + +import com.github.benmanes.caffeine.cache.Caffeine +import dev.slne.surf.roleplay.api.common.player.RpPlayerManager +import dev.slne.surf.roleplay.api.common.util.InternalRoleplayApi +import java.util.* +import kotlin.time.Duration.Companion.hours + +@OptIn(InternalRoleplayApi::class) +abstract class CommonRpPlayerManager : RpPlayerManager { + + private val cache = Caffeine.newBuilder() + .expireAfterAccess(3.hours) + .maximumSize(10_000) + .build { createPlayer(it) } + + abstract fun createPlayer(uuid: UUID): CommonRpPlayer + + override fun getPlayerByUuid(uuid: UUID) = cache.get(uuid) +} \ No newline at end of file diff --git a/surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/identity/RpIdentityImpl.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/CommonRpIdentity.kt similarity index 78% rename from surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/identity/RpIdentityImpl.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/CommonRpIdentity.kt index 6c4f1ea..c3b5147 100644 --- a/surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/identity/RpIdentityImpl.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/CommonRpIdentity.kt @@ -1,18 +1,15 @@ -package dev.slne.surf.roleplay.core.player.identity - -import dev.slne.surf.roleplay.api.player.RpPlayer -import dev.slne.surf.roleplay.api.player.identity.RpIdentity -import dev.slne.surf.roleplay.api.player.license.ExpirableLicense -import dev.slne.surf.roleplay.api.player.license.IdentityLicense -import dev.slne.surf.roleplay.api.player.license.License -import dev.slne.surf.roleplay.api.player.license.LicenseService -import dev.slne.surf.roleplay.api.player.license.event.RpPlayerLicenseAddedEvent -import dev.slne.surf.roleplay.api.player.license.event.RpPlayerLicenseRemovedEvent -import dev.slne.surf.roleplay.api.player.license.utils.LicenseCreateResult -import dev.slne.surf.roleplay.api.player.license.utils.LicenseRemovedReason -import dev.slne.surf.roleplay.api.player.license.utils.UnobtainableReason -import dev.slne.surf.roleplay.api.player.utils.BalanceType -import dev.slne.surf.roleplay.api.transaction.RpTransaction +package dev.slne.surf.roleplay.core.common.player.license + +import dev.slne.surf.roleplay.api.common.player.RpPlayer +import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity +import dev.slne.surf.roleplay.api.common.player.license.ExpirableLicense +import dev.slne.surf.roleplay.api.common.player.license.IdentityLicense +import dev.slne.surf.roleplay.api.common.player.license.License +import dev.slne.surf.roleplay.api.common.player.license.event.RpPlayerLicenseRemovedEvent +import dev.slne.surf.roleplay.api.common.player.license.utils.LicenseCreateResult +import dev.slne.surf.roleplay.api.common.player.license.utils.LicenseRemovedReason +import dev.slne.surf.roleplay.api.common.transaction.RpTransaction +import dev.slne.surf.roleplay.api.common.transaction.utils.BalanceType import dev.slne.surf.surfapi.core.api.util.mutableObject2ObjectMapOf import dev.slne.surf.surfapi.core.api.util.mutableObjectSetOf import dev.slne.surf.surfapi.core.api.util.objectSetOf @@ -20,7 +17,7 @@ import it.unimi.dsi.fastutil.objects.ObjectLinkedOpenHashSet import java.time.LocalDate import java.time.ZonedDateTime -abstract class RpIdentityImpl( +abstract class CommonRpIdentity( override val player: RpPlayer, override val type: RpIdentity.RpIdentityType, override var firstName: String, @@ -56,19 +53,20 @@ abstract class RpIdentityImpl( expiresAt = expiresAt, ) - val event = RpPlayerLicenseAddedEvent( - player = player, - identity = this, - license = playerLicense, - ) - - if (!event.callEvent()) { - return LicenseCreateResult( - false, - objectSetOf(UnobtainableReason.EventCancelled(event.cancelReason)), - null - ) - } +// val event = RpPlayerLicenseAddedEvent( +// player = player, +// identity = this, +// license = playerLicense, +// ) +// +// if (!event.callEvent()) { +// return LicenseCreateResult( +// false, +// objectSetOf(UnobtainableReason.EventCancelled(event.cancelReason)), +// null +// ) +// } + // TODO: 09.08.2025 23:56 Call event player.removeCashBalance(license.price) diff --git a/surf-roleplay-mechanic/build.gradle.kts b/surf-roleplay-mechanic-old/build.gradle.kts similarity index 100% rename from surf-roleplay-mechanic/build.gradle.kts rename to surf-roleplay-mechanic-old/build.gradle.kts diff --git a/surf-roleplay-mechanic/src/main/kotlin/dev/slne/surf/roleplay/mechanic/MechanicImpl.kt b/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/MechanicImpl.kt similarity index 100% rename from surf-roleplay-mechanic/src/main/kotlin/dev/slne/surf/roleplay/mechanic/MechanicImpl.kt rename to surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/MechanicImpl.kt diff --git a/surf-roleplay-mechanic/src/main/kotlin/dev/slne/surf/roleplay/mechanic/MechanicRegistryImpl.kt b/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/MechanicRegistryImpl.kt similarity index 100% rename from surf-roleplay-mechanic/src/main/kotlin/dev/slne/surf/roleplay/mechanic/MechanicRegistryImpl.kt rename to surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/MechanicRegistryImpl.kt diff --git a/surf-roleplay-mechanic/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/idcard/IdCard.kt b/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/idcard/IdCard.kt similarity index 100% rename from surf-roleplay-mechanic/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/idcard/IdCard.kt rename to surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/idcard/IdCard.kt diff --git a/surf-roleplay-mechanic/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/idcard/IdCardMechanicImpl.kt b/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/idcard/IdCardMechanicImpl.kt similarity index 100% rename from surf-roleplay-mechanic/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/idcard/IdCardMechanicImpl.kt rename to surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/idcard/IdCardMechanicImpl.kt diff --git a/surf-roleplay-mechanic/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/idcard/IdCardNpc.kt b/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/idcard/IdCardNpc.kt similarity index 100% rename from surf-roleplay-mechanic/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/idcard/IdCardNpc.kt rename to surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/idcard/IdCardNpc.kt diff --git a/surf-roleplay-mechanic/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/idcard/dialogs/CreateIdDialog.kt b/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/idcard/dialogs/CreateIdDialog.kt similarity index 100% rename from surf-roleplay-mechanic/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/idcard/dialogs/CreateIdDialog.kt rename to surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/idcard/dialogs/CreateIdDialog.kt diff --git a/surf-roleplay-mechanic/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/idcard/listeners/IdCardHandler.kt b/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/idcard/listeners/IdCardHandler.kt similarity index 100% rename from surf-roleplay-mechanic/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/idcard/listeners/IdCardHandler.kt rename to surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/idcard/listeners/IdCardHandler.kt diff --git a/surf-roleplay-mechanic/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/RentCollectorJob.kt b/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/RentCollectorJob.kt similarity index 100% rename from surf-roleplay-mechanic/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/RentCollectorJob.kt rename to surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/RentCollectorJob.kt diff --git a/surf-roleplay-mechanic/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/RentableImpl.kt b/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/RentableImpl.kt similarity index 100% rename from surf-roleplay-mechanic/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/RentableImpl.kt rename to surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/RentableImpl.kt diff --git a/surf-roleplay-mechanic/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/RentableMechanicImpl.kt b/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/RentableMechanicImpl.kt similarity index 100% rename from surf-roleplay-mechanic/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/RentableMechanicImpl.kt rename to surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/RentableMechanicImpl.kt diff --git a/surf-roleplay-mechanic/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/listeners/RentCollectedListener.kt b/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/listeners/RentCollectedListener.kt similarity index 100% rename from surf-roleplay-mechanic/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/listeners/RentCollectedListener.kt rename to surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/listeners/RentCollectedListener.kt diff --git a/surf-roleplay-mechanic/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/listeners/RentableListener.kt b/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/listeners/RentableListener.kt similarity index 100% rename from surf-roleplay-mechanic/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/listeners/RentableListener.kt rename to surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/listeners/RentableListener.kt diff --git a/surf-roleplay-mechanic/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/listeners/RentableOnlineListener.kt b/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/listeners/RentableOnlineListener.kt similarity index 100% rename from surf-roleplay-mechanic/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/listeners/RentableOnlineListener.kt rename to surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/listeners/RentableOnlineListener.kt diff --git a/surf-roleplay-mechanic/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/rentables/ApartmentImpl.kt b/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/rentables/ApartmentImpl.kt similarity index 100% rename from surf-roleplay-mechanic/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/rentables/ApartmentImpl.kt rename to surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/rentables/ApartmentImpl.kt diff --git a/surf-roleplay-mechanic/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/rentables/HouseImpl.kt b/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/rentables/HouseImpl.kt similarity index 100% rename from surf-roleplay-mechanic/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/rentables/HouseImpl.kt rename to surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/rentables/HouseImpl.kt diff --git a/surf-roleplay-mechanic/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/Cracker.kt b/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/Cracker.kt similarity index 100% rename from surf-roleplay-mechanic/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/Cracker.kt rename to surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/Cracker.kt diff --git a/surf-roleplay-mechanic/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/DoorImpl.kt b/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/DoorImpl.kt similarity index 100% rename from surf-roleplay-mechanic/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/DoorImpl.kt rename to surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/DoorImpl.kt diff --git a/surf-roleplay-mechanic/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/LockPickImpl.kt b/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/LockPickImpl.kt similarity index 100% rename from surf-roleplay-mechanic/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/LockPickImpl.kt rename to surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/LockPickImpl.kt diff --git a/surf-roleplay-mechanic/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/StorageContainerImpl.kt b/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/StorageContainerImpl.kt similarity index 100% rename from surf-roleplay-mechanic/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/StorageContainerImpl.kt rename to surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/StorageContainerImpl.kt diff --git a/surf-roleplay-mechanic/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/containers/RegularStorageContainer.kt b/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/containers/RegularStorageContainer.kt similarity index 100% rename from surf-roleplay-mechanic/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/containers/RegularStorageContainer.kt rename to surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/containers/RegularStorageContainer.kt diff --git a/surf-roleplay-mechanic/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/containers/VaultStorageContainer.kt b/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/containers/VaultStorageContainer.kt similarity index 100% rename from surf-roleplay-mechanic/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/containers/VaultStorageContainer.kt rename to surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/containers/VaultStorageContainer.kt diff --git a/surf-roleplay-mechanic/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/doors/FrontDoor.kt b/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/doors/FrontDoor.kt similarity index 100% rename from surf-roleplay-mechanic/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/doors/FrontDoor.kt rename to surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/doors/FrontDoor.kt diff --git a/surf-roleplay-mechanic/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/doors/GarageDoor.kt b/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/doors/GarageDoor.kt similarity index 100% rename from surf-roleplay-mechanic/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/doors/GarageDoor.kt rename to surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/doors/GarageDoor.kt diff --git a/surf-roleplay-mechanic/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/doors/RegularDoor.kt b/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/doors/RegularDoor.kt similarity index 100% rename from surf-roleplay-mechanic/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/doors/RegularDoor.kt rename to surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/doors/RegularDoor.kt diff --git a/surf-roleplay-mechanic/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/lockpick/BatteringRam.kt b/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/lockpick/BatteringRam.kt similarity index 100% rename from surf-roleplay-mechanic/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/lockpick/BatteringRam.kt rename to surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/lockpick/BatteringRam.kt diff --git a/surf-roleplay-mechanic/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/lockpick/PremiumLockPick.kt b/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/lockpick/PremiumLockPick.kt similarity index 100% rename from surf-roleplay-mechanic/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/lockpick/PremiumLockPick.kt rename to surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/lockpick/PremiumLockPick.kt diff --git a/surf-roleplay-mechanic/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/lockpick/RegularLockPick.kt b/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/lockpick/RegularLockPick.kt similarity index 100% rename from surf-roleplay-mechanic/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/lockpick/RegularLockPick.kt rename to surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/lockpick/RegularLockPick.kt diff --git a/surf-roleplay-mechanic/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/utils/PermissionRegistry.kt b/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/utils/PermissionRegistry.kt similarity index 100% rename from surf-roleplay-mechanic/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/utils/PermissionRegistry.kt rename to surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/utils/PermissionRegistry.kt diff --git a/surf-roleplay-mechanic/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/weapon/WeaponImpl.kt b/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/weapon/WeaponImpl.kt similarity index 100% rename from surf-roleplay-mechanic/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/weapon/WeaponImpl.kt rename to surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/weapon/WeaponImpl.kt diff --git a/surf-roleplay-mechanic/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/weapon/WeaponMechanicImpl.kt b/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/weapon/WeaponMechanicImpl.kt similarity index 100% rename from surf-roleplay-mechanic/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/weapon/WeaponMechanicImpl.kt rename to surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/weapon/WeaponMechanicImpl.kt diff --git a/surf-roleplay-mechanic/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/weapon/magazine/MagazineImpl.kt b/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/weapon/magazine/MagazineImpl.kt similarity index 100% rename from surf-roleplay-mechanic/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/weapon/magazine/MagazineImpl.kt rename to surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/weapon/magazine/MagazineImpl.kt diff --git a/surf-roleplay-mechanic/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/weapon/magazine/PlayerMagazineImpl.kt b/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/weapon/magazine/PlayerMagazineImpl.kt similarity index 100% rename from surf-roleplay-mechanic/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/weapon/magazine/PlayerMagazineImpl.kt rename to surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/weapon/magazine/PlayerMagazineImpl.kt diff --git a/surf-roleplay-mechanic/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/weapon/player/PlayerWeaponImpl.kt b/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/weapon/player/PlayerWeaponImpl.kt similarity index 100% rename from surf-roleplay-mechanic/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/weapon/player/PlayerWeaponImpl.kt rename to surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/weapon/player/PlayerWeaponImpl.kt diff --git a/surf-roleplay-paper-old/build.gradle.kts b/surf-roleplay-paper-old/build.gradle.kts new file mode 100644 index 0000000..2d2bf72 --- /dev/null +++ b/surf-roleplay-paper-old/build.gradle.kts @@ -0,0 +1,41 @@ +import dev.slne.surf.surfapi.gradle.util.registerRequired +import dev.slne.surf.surfapi.gradle.util.withSurfApiBukkit + +plugins { + id("dev.slne.surf.surfapi.gradle.paper-plugin") +} + +dependencies { + api(project(":surf-roleplay-core")) + api(project(":surf-roleplay-mechanic")) + + runtimeOnly(libs.surf.database) +} + +surfPaperPluginApi { + mainClass("dev.slne.surf.roleplay.paper.SurfRoleplay") + generateLibraryLoader(false) + authors.add("Ammo") + foliaSupported(true) + + serverDependencies { + registerRequired("surf-npc-bukkit") + } + + runServer { + withSurfApiBukkit() + + val npcVersion = + libs.surf.npc.api.get().version ?: error("NPC API version is not specified") + val npcAsset = "surf-npc-bukkit-${npcVersion}.jar" + + downloadPlugins { + github( + "slne-development", + "surf-npc", + "v$npcVersion", + npcAsset + ) + } + } +} \ No newline at end of file diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/SurfRoleplay.kt b/surf-roleplay-paper-old/src/main/kotlin/dev/slne/surf/roleplay/paper/SurfRoleplay.kt similarity index 100% rename from surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/SurfRoleplay.kt rename to surf-roleplay-paper-old/src/main/kotlin/dev/slne/surf/roleplay/paper/SurfRoleplay.kt diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/command/args/BalanceTypeArgument.kt b/surf-roleplay-paper-old/src/main/kotlin/dev/slne/surf/roleplay/paper/command/args/BalanceTypeArgument.kt similarity index 100% rename from surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/command/args/BalanceTypeArgument.kt rename to surf-roleplay-paper-old/src/main/kotlin/dev/slne/surf/roleplay/paper/command/args/BalanceTypeArgument.kt diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/identity/dialogs/IdentitySelectorDialog.kt b/surf-roleplay-paper-old/src/main/kotlin/dev/slne/surf/roleplay/paper/identity/dialogs/IdentitySelectorDialog.kt similarity index 100% rename from surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/identity/dialogs/IdentitySelectorDialog.kt rename to surf-roleplay-paper-old/src/main/kotlin/dev/slne/surf/roleplay/paper/identity/dialogs/IdentitySelectorDialog.kt diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/identity/listener/IdentityOnlineListener.kt b/surf-roleplay-paper-old/src/main/kotlin/dev/slne/surf/roleplay/paper/identity/listener/IdentityOnlineListener.kt similarity index 100% rename from surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/identity/listener/IdentityOnlineListener.kt rename to surf-roleplay-paper-old/src/main/kotlin/dev/slne/surf/roleplay/paper/identity/listener/IdentityOnlineListener.kt diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/listeners/ListenerManager.kt b/surf-roleplay-paper-old/src/main/kotlin/dev/slne/surf/roleplay/paper/listeners/ListenerManager.kt similarity index 100% rename from surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/listeners/ListenerManager.kt rename to surf-roleplay-paper-old/src/main/kotlin/dev/slne/surf/roleplay/paper/listeners/ListenerManager.kt diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/listeners/OnlineListener.kt b/surf-roleplay-paper-old/src/main/kotlin/dev/slne/surf/roleplay/paper/listeners/OnlineListener.kt similarity index 100% rename from surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/listeners/OnlineListener.kt rename to surf-roleplay-paper-old/src/main/kotlin/dev/slne/surf/roleplay/paper/listeners/OnlineListener.kt diff --git a/surf-roleplay-paper/build.gradle.kts b/surf-roleplay-paper/build.gradle.kts index 2d2bf72..330e542 100644 --- a/surf-roleplay-paper/build.gradle.kts +++ b/surf-roleplay-paper/build.gradle.kts @@ -1,41 +1,19 @@ -import dev.slne.surf.surfapi.gradle.util.registerRequired -import dev.slne.surf.surfapi.gradle.util.withSurfApiBukkit +import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar plugins { id("dev.slne.surf.surfapi.gradle.paper-plugin") } -dependencies { - api(project(":surf-roleplay-core")) - api(project(":surf-roleplay-mechanic")) - - runtimeOnly(libs.surf.database) -} - surfPaperPluginApi { - mainClass("dev.slne.surf.roleplay.paper.SurfRoleplay") - generateLibraryLoader(false) - authors.add("Ammo") - foliaSupported(true) - - serverDependencies { - registerRequired("surf-npc-bukkit") - } - - runServer { - withSurfApiBukkit() + withCloudClientPaper() + mainClass("dev.slne.surf.roleplay.paper.PaperMain") +} - val npcVersion = - libs.surf.npc.api.get().version ?: error("NPC API version is not specified") - val npcAsset = "surf-npc-bukkit-${npcVersion}.jar" +dependencies { + api(project(":surf-roleplay-core:surf-roleplay-core-client")) + api(project(":surf-roleplay-api:surf-roleplay-client-api:surf-roleplay-client-paper-api")) +} - downloadPlugins { - github( - "slne-development", - "surf-npc", - "v$npcVersion", - npcAsset - ) - } - } +tasks.withType { + destinationDirectory.set(rootProject.file("output")) } \ No newline at end of file diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/PaperBootstrap.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/PaperBootstrap.kt new file mode 100644 index 0000000..5a1c6a2 --- /dev/null +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/PaperBootstrap.kt @@ -0,0 +1,16 @@ +package dev.slne.surf.roleplay.paper + +import dev.slne.surf.cloud.api.common.CloudInstance +import dev.slne.surf.cloud.api.common.startSpringApplication +import dev.slne.surf.roleplay.RoleplayApplication +import dev.slne.surf.roleplay.core.common.ContextHolderImpl +import io.papermc.paper.plugin.bootstrap.BootstrapContext +import io.papermc.paper.plugin.bootstrap.PluginBootstrap + +@Suppress("UnstableApiUsage") +class PaperBootstrap : PluginBootstrap { + override fun bootstrap(context: BootstrapContext) { + ContextHolderImpl.instance.context = + CloudInstance.startSpringApplication(RoleplayApplication::class) + } +} \ No newline at end of file diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/PaperMain.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/PaperMain.kt new file mode 100644 index 0000000..7e87655 --- /dev/null +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/PaperMain.kt @@ -0,0 +1,9 @@ +package dev.slne.surf.roleplay.paper + +import com.github.shynixn.mccoroutine.folia.SuspendingJavaPlugin +import org.bukkit.plugin.java.JavaPlugin + +class PaperMain : SuspendingJavaPlugin() { +} + +val plugin get() = JavaPlugin.getPlugin(PaperMain::class.java) \ No newline at end of file diff --git a/surf-roleplay-server/build.gradle.kts b/surf-roleplay-server/build.gradle.kts new file mode 100644 index 0000000..084ea0e --- /dev/null +++ b/surf-roleplay-server/build.gradle.kts @@ -0,0 +1,18 @@ +import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar + +plugins { + id("dev.slne.surf.surfapi.gradle.core") +} + +surfCoreApi { + withCloudServer() +} + +dependencies { + api(project(":surf-roleplay-core:surf-roleplay-core-common")) + api(project(":surf-roleplay-api:surf-roleplay-server-api")) +} + +tasks.withType { + destinationDirectory.set(rootProject.file("output")) +} \ No newline at end of file diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/GenerateExposedMigrationScript.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/GenerateExposedMigrationScript.kt new file mode 100644 index 0000000..e33cda5 --- /dev/null +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/GenerateExposedMigrationScript.kt @@ -0,0 +1,11 @@ +package dev.slne.surf.roleplay.server + +import dev.slne.surf.cloud.api.server.exposed.migration.generateSimpleExposedMigration +import org.jetbrains.exposed.sql.ExperimentalDatabaseMigrationApi + +@OptIn(ExperimentalDatabaseMigrationApi::class) +fun main() { + generateSimpleExposedMigration( + scriptName = "V1__create_initial_tables", + ) +} \ No newline at end of file diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/PluginBootstrap.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/PluginBootstrap.kt new file mode 100644 index 0000000..25e1dc2 --- /dev/null +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/PluginBootstrap.kt @@ -0,0 +1,15 @@ +package dev.slne.surf.roleplay.server + +import dev.slne.surf.cloud.api.common.CloudInstance +import dev.slne.surf.cloud.api.common.startSpringApplication +import dev.slne.surf.cloud.api.server.plugin.bootstrap.BootstrapContext +import dev.slne.surf.cloud.api.server.plugin.bootstrap.StandalonePluginBootstrap +import dev.slne.surf.roleplay.RoleplayApplication +import dev.slne.surf.roleplay.core.common.ContextHolderImpl + +class PluginBootstrap : StandalonePluginBootstrap { + override suspend fun bootstrap(context: BootstrapContext) { + ContextHolderImpl.instance.context = + CloudInstance.startSpringApplication(RoleplayApplication::class) + } +} \ No newline at end of file diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/PluginMain.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/PluginMain.kt new file mode 100644 index 0000000..2aee3a8 --- /dev/null +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/PluginMain.kt @@ -0,0 +1,18 @@ +package dev.slne.surf.roleplay.server + +import dev.slne.surf.cloud.api.server.plugin.StandalonePlugin + +class PluginMain : StandalonePlugin() { + + override suspend fun load() { + + } + + override suspend fun enable() { + + } + + override suspend fun disable() { + + } +} \ No newline at end of file diff --git a/surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/RpPlayerManagerImpl.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/RpPlayerManagerImpl.kt similarity index 92% rename from surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/RpPlayerManagerImpl.kt rename to surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/RpPlayerManagerImpl.kt index 1e26557..648f653 100644 --- a/surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/RpPlayerManagerImpl.kt +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/RpPlayerManagerImpl.kt @@ -8,13 +8,13 @@ import dev.slne.surf.roleplay.api.player.RpPlayer import dev.slne.surf.roleplay.api.player.RpPlayerManager import dev.slne.surf.roleplay.api.player.identity.RpIdentity import dev.slne.surf.roleplay.core.player.db.RpPlayerModel -import dev.slne.surf.roleplay.core.player.db.RpPlayerTable -import dev.slne.surf.roleplay.core.player.identity.db.impl.civilian.RpPlayerCivilianIdentityModel -import dev.slne.surf.roleplay.core.player.identity.db.impl.civilian.RpPlayerCivilianIdentityTable import dev.slne.surf.roleplay.core.player.identity.db.impl.police.RpPlayerPoliceIdentityModel -import dev.slne.surf.roleplay.core.player.identity.db.impl.police.RpPlayerPoliceIdentityTable -import dev.slne.surf.roleplay.core.player.identity.db.impl.rescueservice.RpPlayerRescueServiceIdentityModel -import dev.slne.surf.roleplay.core.player.identity.db.impl.rescueservice.RpPlayerRescueServiceIdentityTable +import dev.slne.surf.roleplay.server.player.db.RpPlayerTable +import dev.slne.surf.roleplay.server.player.identity.db.impl.civilian.RpPlayerCivilianIdentityModel +import dev.slne.surf.roleplay.server.player.identity.db.impl.civilian.RpPlayerCivilianIdentityTable +import dev.slne.surf.roleplay.server.player.identity.db.impl.police.RpPlayerPoliceIdentityTable +import dev.slne.surf.roleplay.server.player.identity.db.impl.rescueservice.RpPlayerRescueServiceIdentityModel +import dev.slne.surf.roleplay.server.player.identity.db.impl.rescueservice.RpPlayerRescueServiceIdentityTable import dev.slne.surf.surfapi.core.api.util.getCallerClass import dev.slne.surf.surfapi.core.api.util.toObjectSet import kotlinx.coroutines.Dispatchers diff --git a/surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/db/RpPlayerModel.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/db/RpPlayerModel.kt similarity index 73% rename from surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/db/RpPlayerModel.kt rename to surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/db/RpPlayerModel.kt index c318b2e..17af6e2 100644 --- a/surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/db/RpPlayerModel.kt +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/db/RpPlayerModel.kt @@ -1,12 +1,13 @@ package dev.slne.surf.roleplay.core.player.db import dev.slne.surf.roleplay.core.player.RpPlayerImpl -import dev.slne.surf.roleplay.core.player.identity.db.impl.civilian.RpPlayerCivilianIdentityModel -import dev.slne.surf.roleplay.core.player.identity.db.impl.civilian.RpPlayerCivilianIdentityTable import dev.slne.surf.roleplay.core.player.identity.db.impl.police.RpPlayerPoliceIdentityModel -import dev.slne.surf.roleplay.core.player.identity.db.impl.police.RpPlayerPoliceIdentityTable -import dev.slne.surf.roleplay.core.player.identity.db.impl.rescueservice.RpPlayerRescueServiceIdentityModel -import dev.slne.surf.roleplay.core.player.identity.db.impl.rescueservice.RpPlayerRescueServiceIdentityTable +import dev.slne.surf.roleplay.server.player.db.RpPlayerTable +import dev.slne.surf.roleplay.server.player.identity.db.impl.civilian.RpPlayerCivilianIdentityModel +import dev.slne.surf.roleplay.server.player.identity.db.impl.civilian.RpPlayerCivilianIdentityTable +import dev.slne.surf.roleplay.server.player.identity.db.impl.police.RpPlayerPoliceIdentityTable +import dev.slne.surf.roleplay.server.player.identity.db.impl.rescueservice.RpPlayerRescueServiceIdentityModel +import dev.slne.surf.roleplay.server.player.identity.db.impl.rescueservice.RpPlayerRescueServiceIdentityTable import kotlinx.coroutines.Dispatchers import org.jetbrains.exposed.dao.LongEntity import org.jetbrains.exposed.dao.LongEntityClass diff --git a/surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/db/RpPlayerTable.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/db/RpPlayerTable.kt similarity index 67% rename from surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/db/RpPlayerTable.kt rename to surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/db/RpPlayerTable.kt index cef302e..6962cca 100644 --- a/surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/db/RpPlayerTable.kt +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/db/RpPlayerTable.kt @@ -1,7 +1,7 @@ -package dev.slne.surf.roleplay.core.player.db +package dev.slne.surf.roleplay.server.player.db -import dev.slne.surf.database.database.columns.CurrentZonedDateTime -import dev.slne.surf.database.database.columns.zonedDateTime +import dev.slne.surf.cloud.api.server.exposed.columns.CurrentZonedDateTime +import dev.slne.surf.cloud.api.server.exposed.columns.zonedDateTime import org.jetbrains.exposed.dao.id.LongIdTable object RpPlayerTable : LongIdTable("rp_players") { diff --git a/surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/identity/db/RpPlayerIdentityBaseModel.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/RpPlayerIdentityBaseModel.kt similarity index 76% rename from surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/identity/db/RpPlayerIdentityBaseModel.kt rename to surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/RpPlayerIdentityBaseModel.kt index 16584ba..470681e 100644 --- a/surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/identity/db/RpPlayerIdentityBaseModel.kt +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/RpPlayerIdentityBaseModel.kt @@ -1,7 +1,7 @@ -package dev.slne.surf.roleplay.core.player.identity.db +package dev.slne.surf.roleplay.server.player.identity.db -import dev.slne.surf.roleplay.api.player.RpPlayer -import dev.slne.surf.roleplay.api.player.identity.RpIdentity +import dev.slne.surf.roleplay.api.common.player.RpPlayer +import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity import dev.slne.surf.roleplay.core.player.db.RpPlayerModel import org.jetbrains.exposed.dao.LongEntity import org.jetbrains.exposed.dao.id.EntityID diff --git a/surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/identity/db/RpPlayerIdentityBaseTable.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/RpPlayerIdentityBaseTable.kt similarity index 73% rename from surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/identity/db/RpPlayerIdentityBaseTable.kt rename to surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/RpPlayerIdentityBaseTable.kt index cf6003c..47e258f 100644 --- a/surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/identity/db/RpPlayerIdentityBaseTable.kt +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/RpPlayerIdentityBaseTable.kt @@ -1,8 +1,8 @@ -package dev.slne.surf.roleplay.core.player.identity.db +package dev.slne.surf.roleplay.server.player.identity.db -import dev.slne.surf.database.database.columns.CurrentZonedDateTime -import dev.slne.surf.database.database.columns.zonedDateTime -import dev.slne.surf.roleplay.core.player.db.RpPlayerTable +import dev.slne.surf.cloud.api.server.exposed.columns.CurrentZonedDateTime +import dev.slne.surf.cloud.api.server.exposed.columns.zonedDateTime +import dev.slne.surf.roleplay.server.player.db.RpPlayerTable import org.jetbrains.exposed.dao.id.LongIdTable import org.jetbrains.exposed.sql.ReferenceOption import org.jetbrains.exposed.sql.javatime.date diff --git a/surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/identity/db/impl/civilian/RpPlayerCivilianIdentityModel.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/civilian/RpPlayerCivilianIdentityModel.kt similarity index 54% rename from surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/identity/db/impl/civilian/RpPlayerCivilianIdentityModel.kt rename to surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/civilian/RpPlayerCivilianIdentityModel.kt index 1f77b4f..6cd4c7d 100644 --- a/surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/identity/db/impl/civilian/RpPlayerCivilianIdentityModel.kt +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/civilian/RpPlayerCivilianIdentityModel.kt @@ -1,10 +1,9 @@ -package dev.slne.surf.roleplay.core.player.identity.db.impl.civilian +package dev.slne.surf.roleplay.server.player.identity.db.impl.civilian -import dev.slne.surf.roleplay.api.player.RpPlayer -import dev.slne.surf.roleplay.api.player.identity.RpIdentity -import dev.slne.surf.roleplay.core.player.identity.db.RpPlayerIdentityBaseModel -import dev.slne.surf.roleplay.core.player.identity.identities.CivilianIdentityImpl -import dev.slne.surf.roleplay.core.player.license.licenseServiceImpl +import dev.slne.surf.roleplay.api.common.player.RpPlayer +import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity +import dev.slne.surf.roleplay.server.player.identity.db.RpPlayerIdentityBaseModel +import dev.slne.surf.roleplay.server.player.identity.identities.CivilianIdentityImpl import org.jetbrains.exposed.dao.LongEntityClass import org.jetbrains.exposed.dao.id.EntityID @@ -24,8 +23,9 @@ class RpPlayerCivilianIdentityModel( createdAt = createdAt, updatedAt = updatedAt, ).apply { - licenseServiceImpl.fetchLicenses(this).forEach { - addLicense(it) - } +// licenseServiceImpl.fetchLicenses(this).forEach { +// addLicense(it) +// } + // TODO: 09.08.2025 23:53 Fetch licenses and attach to player } } \ No newline at end of file diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/civilian/RpPlayerCivilianIdentityTable.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/civilian/RpPlayerCivilianIdentityTable.kt new file mode 100644 index 0000000..c6ccbeb --- /dev/null +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/civilian/RpPlayerCivilianIdentityTable.kt @@ -0,0 +1,5 @@ +package dev.slne.surf.roleplay.server.player.identity.db.impl.civilian + +import dev.slne.surf.roleplay.server.player.identity.db.RpPlayerIdentityBaseTable + +object RpPlayerCivilianIdentityTable : RpPlayerIdentityBaseTable("rp_player_civilian_identities") \ No newline at end of file diff --git a/surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/identity/db/impl/police/RpPlayerPoliceIdentityModel.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/police/RpPlayerPoliceIdentityModel.kt similarity index 66% rename from surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/identity/db/impl/police/RpPlayerPoliceIdentityModel.kt rename to surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/police/RpPlayerPoliceIdentityModel.kt index 90154d2..000a68f 100644 --- a/surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/identity/db/impl/police/RpPlayerPoliceIdentityModel.kt +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/police/RpPlayerPoliceIdentityModel.kt @@ -1,10 +1,10 @@ package dev.slne.surf.roleplay.core.player.identity.db.impl.police -import dev.slne.surf.roleplay.api.player.RpPlayer -import dev.slne.surf.roleplay.api.player.identity.RpIdentity -import dev.slne.surf.roleplay.core.player.identity.db.RpPlayerIdentityBaseModel +import dev.slne.surf.roleplay.api.common.player.RpPlayer +import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity import dev.slne.surf.roleplay.core.player.identity.identities.PoliceIdentityImpl -import dev.slne.surf.roleplay.core.player.license.licenseServiceImpl +import dev.slne.surf.roleplay.server.player.identity.db.RpPlayerIdentityBaseModel +import dev.slne.surf.roleplay.server.player.identity.db.impl.police.RpPlayerPoliceIdentityTable import org.jetbrains.exposed.dao.LongEntityClass import org.jetbrains.exposed.dao.id.EntityID @@ -29,8 +29,9 @@ class RpPlayerPoliceIdentityModel( createdAt = createdAt, updatedAt = updatedAt, ).apply { - licenseServiceImpl.fetchLicenses(this).forEach { - addLicense(it) - } +// licenseServiceImpl.fetchLicenses(this).forEach { +// addLicense(it) +// } + // TODO: 09.08.2025 23:53 Fetch licenses and attach to player } } \ No newline at end of file diff --git a/surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/identity/db/impl/police/RpPlayerPoliceIdentityTable.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/police/RpPlayerPoliceIdentityTable.kt similarity index 55% rename from surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/identity/db/impl/police/RpPlayerPoliceIdentityTable.kt rename to surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/police/RpPlayerPoliceIdentityTable.kt index 93625d8..c003d79 100644 --- a/surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/identity/db/impl/police/RpPlayerPoliceIdentityTable.kt +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/police/RpPlayerPoliceIdentityTable.kt @@ -1,6 +1,6 @@ -package dev.slne.surf.roleplay.core.player.identity.db.impl.police +package dev.slne.surf.roleplay.server.player.identity.db.impl.police -import dev.slne.surf.roleplay.core.player.identity.db.RpPlayerIdentityBaseTable +import dev.slne.surf.roleplay.server.player.identity.db.RpPlayerIdentityBaseTable object RpPlayerPoliceIdentityTable : RpPlayerIdentityBaseTable("rp_player_police_identities") { val rank = varchar("rank", 255) diff --git a/surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/identity/db/impl/rescueservice/RpPlayerRescueServiceIdentityModel.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/rescueservice/RpPlayerRescueServiceIdentityModel.kt similarity index 65% rename from surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/identity/db/impl/rescueservice/RpPlayerRescueServiceIdentityModel.kt rename to surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/rescueservice/RpPlayerRescueServiceIdentityModel.kt index 675ea64..7476476 100644 --- a/surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/identity/db/impl/rescueservice/RpPlayerRescueServiceIdentityModel.kt +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/rescueservice/RpPlayerRescueServiceIdentityModel.kt @@ -1,10 +1,9 @@ -package dev.slne.surf.roleplay.core.player.identity.db.impl.rescueservice +package dev.slne.surf.roleplay.server.player.identity.db.impl.rescueservice -import dev.slne.surf.roleplay.api.player.RpPlayer -import dev.slne.surf.roleplay.api.player.identity.RpIdentity -import dev.slne.surf.roleplay.core.player.identity.db.RpPlayerIdentityBaseModel +import dev.slne.surf.roleplay.api.common.player.RpPlayer +import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity import dev.slne.surf.roleplay.core.player.identity.identities.RescueServiceIdentityImpl -import dev.slne.surf.roleplay.core.player.license.licenseServiceImpl +import dev.slne.surf.roleplay.server.player.identity.db.RpPlayerIdentityBaseModel import org.jetbrains.exposed.dao.LongEntityClass import org.jetbrains.exposed.dao.id.EntityID @@ -28,8 +27,9 @@ class RpPlayerRescueServiceIdentityModel( createdAt = createdAt, updatedAt = updatedAt, ).apply { - licenseServiceImpl.fetchLicenses(this).forEach { - addLicense(it) - } +// licenseServiceImpl.fetchLicenses(this).forEach { +// addLicense(it) +// } + // TODO: 09.08.2025 23:53 Fetch licenses and attach to player } } \ No newline at end of file diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/rescueservice/RpPlayerRescueServiceIdentityTable.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/rescueservice/RpPlayerRescueServiceIdentityTable.kt new file mode 100644 index 0000000..66674ab --- /dev/null +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/rescueservice/RpPlayerRescueServiceIdentityTable.kt @@ -0,0 +1,9 @@ +package dev.slne.surf.roleplay.server.player.identity.db.impl.rescueservice + +import dev.slne.surf.roleplay.server.player.identity.db.RpPlayerIdentityBaseTable + +object RpPlayerRescueServiceIdentityTable : RpPlayerIdentityBaseTable( + "rp_player_rescue_service_identities" +) { + val rank = varchar("rank", 255) +} \ No newline at end of file diff --git a/surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/identity/identities/CivilianIdentityImpl.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/identities/CivilianIdentityImpl.kt similarity index 70% rename from surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/identity/identities/CivilianIdentityImpl.kt rename to surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/identities/CivilianIdentityImpl.kt index ce81760..e3b0778 100644 --- a/surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/identity/identities/CivilianIdentityImpl.kt +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/identities/CivilianIdentityImpl.kt @@ -1,8 +1,8 @@ -package dev.slne.surf.roleplay.core.player.identity.identities +package dev.slne.surf.roleplay.server.player.identity.identities -import dev.slne.surf.roleplay.api.player.RpPlayer -import dev.slne.surf.roleplay.api.player.identity.RpIdentity -import dev.slne.surf.roleplay.core.player.identity.RpIdentityImpl +import dev.slne.surf.roleplay.api.common.player.RpPlayer +import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity +import dev.slne.surf.roleplay.server.player.identity.RpIdentityImpl import java.time.LocalDate import java.time.ZonedDateTime diff --git a/surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/identity/identities/PoliceIdentityImpl.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/identities/PoliceIdentityImpl.kt similarity index 92% rename from surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/identity/identities/PoliceIdentityImpl.kt rename to surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/identities/PoliceIdentityImpl.kt index d8e3bb8..9b5152a 100644 --- a/surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/identity/identities/PoliceIdentityImpl.kt +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/identities/PoliceIdentityImpl.kt @@ -2,7 +2,7 @@ package dev.slne.surf.roleplay.core.player.identity.identities import dev.slne.surf.roleplay.api.player.RpPlayer import dev.slne.surf.roleplay.api.player.identity.RpIdentity -import dev.slne.surf.roleplay.core.player.identity.RpIdentityImpl +import dev.slne.surf.roleplay.server.player.identity.RpIdentityImpl import java.time.LocalDate import java.time.ZonedDateTime diff --git a/surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/identity/identities/RescueServiceIdentityImpl.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/identities/RescueServiceIdentityImpl.kt similarity index 92% rename from surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/identity/identities/RescueServiceIdentityImpl.kt rename to surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/identities/RescueServiceIdentityImpl.kt index 984cc8a..44cf147 100644 --- a/surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/identity/identities/RescueServiceIdentityImpl.kt +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/identities/RescueServiceIdentityImpl.kt @@ -2,7 +2,7 @@ package dev.slne.surf.roleplay.core.player.identity.identities import dev.slne.surf.roleplay.api.player.RpPlayer import dev.slne.surf.roleplay.api.player.identity.RpIdentity -import dev.slne.surf.roleplay.core.player.identity.RpIdentityImpl +import dev.slne.surf.roleplay.server.player.identity.RpIdentityImpl import java.time.LocalDate import java.time.ZonedDateTime diff --git a/surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/license/ExpirableLicenseImpl.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/ExpirableLicenseImpl.kt similarity index 100% rename from surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/license/ExpirableLicenseImpl.kt rename to surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/ExpirableLicenseImpl.kt diff --git a/surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/license/LicenseExpirationJob.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/LicenseExpirationJob.kt similarity index 100% rename from surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/license/LicenseExpirationJob.kt rename to surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/LicenseExpirationJob.kt diff --git a/surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/license/LicenseImpl.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/LicenseImpl.kt similarity index 100% rename from surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/license/LicenseImpl.kt rename to surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/LicenseImpl.kt diff --git a/surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/license/LicenseNpc.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/LicenseNpc.kt similarity index 100% rename from surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/license/LicenseNpc.kt rename to surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/LicenseNpc.kt diff --git a/surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/license/LicenseServiceImpl.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/LicenseServiceImpl.kt similarity index 100% rename from surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/license/LicenseServiceImpl.kt rename to surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/LicenseServiceImpl.kt diff --git a/surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/license/db/IdentityLicenseModel.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/db/IdentityLicenseModel.kt similarity index 100% rename from surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/license/db/IdentityLicenseModel.kt rename to surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/db/IdentityLicenseModel.kt diff --git a/surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/license/db/IdentityLicenseTable.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/db/IdentityLicenseTable.kt similarity index 93% rename from surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/license/db/IdentityLicenseTable.kt rename to surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/db/IdentityLicenseTable.kt index ece6f30..72579a8 100644 --- a/surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/license/db/IdentityLicenseTable.kt +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/db/IdentityLicenseTable.kt @@ -3,7 +3,7 @@ package dev.slne.surf.roleplay.core.player.license.db import dev.slne.surf.database.database.columns.CurrentZonedDateTime import dev.slne.surf.database.database.columns.zonedDateTime import dev.slne.surf.roleplay.api.player.identity.RpIdentity -import dev.slne.surf.roleplay.core.player.db.RpPlayerTable +import dev.slne.surf.roleplay.server.player.db.RpPlayerTable import org.jetbrains.exposed.dao.id.LongIdTable import org.jetbrains.exposed.sql.ReferenceOption diff --git a/surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/license/dialogs/BuyLicenseDialog.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/dialogs/BuyLicenseDialog.kt similarity index 100% rename from surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/license/dialogs/BuyLicenseDialog.kt rename to surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/dialogs/BuyLicenseDialog.kt diff --git a/surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/license/dialogs/BuyLicensesDialog.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/dialogs/BuyLicensesDialog.kt similarity index 100% rename from surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/license/dialogs/BuyLicensesDialog.kt rename to surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/dialogs/BuyLicensesDialog.kt diff --git a/surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/license/dialogs/LicenseDialog.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/dialogs/LicenseDialog.kt similarity index 100% rename from surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/license/dialogs/LicenseDialog.kt rename to surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/dialogs/LicenseDialog.kt diff --git a/surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/license/dialogs/MyLicenseDialog.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/dialogs/MyLicenseDialog.kt similarity index 100% rename from surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/license/dialogs/MyLicenseDialog.kt rename to surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/dialogs/MyLicenseDialog.kt diff --git a/surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/license/dialogs/MyLicensesDialog.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/dialogs/MyLicensesDialog.kt similarity index 100% rename from surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/license/dialogs/MyLicensesDialog.kt rename to surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/dialogs/MyLicensesDialog.kt diff --git a/surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/license/licenses/civilian/CivilianFishingLicenseImpl.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/licenses/civilian/CivilianFishingLicenseImpl.kt similarity index 100% rename from surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/license/licenses/civilian/CivilianFishingLicenseImpl.kt rename to surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/licenses/civilian/CivilianFishingLicenseImpl.kt diff --git a/surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/license/licenses/civilian/CivilianVehicleLicenseImpl.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/licenses/civilian/CivilianVehicleLicenseImpl.kt similarity index 100% rename from surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/license/licenses/civilian/CivilianVehicleLicenseImpl.kt rename to surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/licenses/civilian/CivilianVehicleLicenseImpl.kt diff --git a/surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/license/licenses/civilian/CivilianWeaponLicenseImpl.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/licenses/civilian/CivilianWeaponLicenseImpl.kt similarity index 100% rename from surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/license/licenses/civilian/CivilianWeaponLicenseImpl.kt rename to surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/licenses/civilian/CivilianWeaponLicenseImpl.kt diff --git a/surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/license/listeners/LicenseBuyHandler.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/listeners/LicenseBuyHandler.kt similarity index 100% rename from surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/license/listeners/LicenseBuyHandler.kt rename to surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/listeners/LicenseBuyHandler.kt diff --git a/surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/license/listeners/LicenseChangedHandler.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/listeners/LicenseChangedHandler.kt similarity index 100% rename from surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/license/listeners/LicenseChangedHandler.kt rename to surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/listeners/LicenseChangedHandler.kt diff --git a/surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/license/utils/LicensePermissionRegistry.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/utils/LicensePermissionRegistry.kt similarity index 100% rename from surf-roleplay-core/src/main/kotlin/dev/slne/surf/roleplay/core/player/license/utils/LicensePermissionRegistry.kt rename to surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/utils/LicensePermissionRegistry.kt diff --git a/surf-roleplay-server/src/main/resources/standalone-plugin.yml b/surf-roleplay-server/src/main/resources/standalone-plugin.yml new file mode 100644 index 0000000..7c2640f --- /dev/null +++ b/surf-roleplay-server/src/main/resources/standalone-plugin.yml @@ -0,0 +1,8 @@ +name: surf-roleplay-server +main: 'dev.slne.surf.roleplay.server.PluginMain' +bootstrapper: 'dev.slne.surf.roleplay.server.PluginBootstrap' +version: 1.21.7-1.0.0 +description: 'Roleplay Plugin' +authors: + - 'Ammo' + - 'Jo_field' \ No newline at end of file From 1d64fb1937ca557dd2fe959afa35352759ca68f4 Mon Sep 17 00:00:00 2001 From: Ammo Date: Sun, 10 Aug 2025 14:47:46 +0200 Subject: [PATCH 02/11] More moving around --- gradle/libs.versions.toml | 4 +- .../api/paper/events/CancellableRpEvent.kt | 7 + .../surf/roleplay/api/paper/events/RpEvent.kt | 19 ++ .../paper/player/events/RpPlayerDeathEvent.kt | 13 +- .../paper/player/events/RpPlayerJoinEvent.kt | 8 + .../paper/player/events/RpPlayerQuitEvent.kt | 8 + .../events}/RpPlayerLicenseAddedEvent.kt | 7 +- .../events}/RpPlayerLicenseRemovedEvent.kt | 7 +- .../roleplay/api/paper/player/player-utils.kt | 7 + .../rentable/events/RentableMemberAddEvent.kt | 8 +- .../events/RentableMemberRemoveEvent.kt | 8 +- .../events/RentableOwnerChangeEvent.kt | 10 +- .../events/RentableRentCollectEvent.kt | 6 +- .../roleplay/api/common/mechanic/Mechanic.kt | 4 +- .../api/common/mechanic/MechanicRegistry.kt | 2 +- .../common/mechanic/idcard/IdCardMechanic.kt | 4 +- .../api/common/mechanic/rentable/Rentable.kt | 18 +- .../mechanic/rentable/RentableMechanic.kt | 6 +- .../mechanic/rentable/rentables/Apartment.kt | 4 +- .../mechanic/rentable/rentables/House.kt | 4 +- .../mechanic/rentable/utils/Crackable.kt | 4 +- .../mechanic/rentable/utils/LockPick.kt | 4 +- .../mechanic/rentable/utils/Lockable.kt | 4 +- .../rentable/utils/StorageContainer.kt | 4 +- .../mechanic/rentable/utils/door/Door.kt | 8 +- .../rentable/utils/door/DoorContainer.kt | 2 +- .../api/common/mechanic/weapon/Weapon.kt | 14 +- .../common/mechanic/weapon/WeaponMechanic.kt | 1 + .../mechanic/weapon/magazine/Magazine.kt | 21 +- .../weapon/magazine/PlayerMagazine.kt | 2 +- .../mechanic/weapon/player/PlayerWeapon.kt | 8 +- .../mechanic/weapon/utils/WeaponType.kt | 3 +- .../common/player/events/RpPlayerJoinEvent.kt | 9 - .../common/player/events/RpPlayerQuitEvent.kt | 9 - .../civilian/CivilianVehicleLicense.kt | 1 + .../core/client/player/ClientRpPlayer.kt | 21 +- .../core/common/mechanics}/MechanicImpl.kt | 10 +- .../common/mechanics}/MechanicRegistryImpl.kt | 16 +- .../mechanics/idcard/IdCardMechanicImpl.kt | 7 +- .../core/common/mechanics/rentable/Cracker.kt | 19 ++ .../mechanics/rentable/RentCollectorJob.kt | 1 + .../mechanics/rentable/RentableImpl.kt | 18 +- .../rentable/RentableMechanicImpl.kt | 85 ++++++++ .../rentable}/StorageContainerImpl.kt | 4 +- .../containers/RegularStorageContainer.kt | 4 +- .../containers/VaultStorageContainer.kt | 14 +- .../mechanics/rentable/door}/DoorImpl.kt | 19 +- .../rentable/door/doors/FrontDoor.kt | 18 ++ .../rentable/door/doors/GarageDoor.kt | 18 ++ .../rentable/door/doors/RegularDoor.kt | 18 ++ .../rentable/lockpick}/LockPickImpl.kt | 6 +- .../lockpick/lockpicks/BatteringRam.kt | 10 + .../lockpick/lockpicks/PremiumLockPick.kt | 10 + .../lockpick/lockpicks/RegularLockPick.kt | 10 + .../rentable/rentables/ApartmentImpl.kt | 10 +- .../mechanics/rentable/rentables/HouseImpl.kt | 10 +- .../common}/mechanics/weapon/WeaponImpl.kt | 0 .../mechanics/weapon/WeaponMechanicImpl.kt | 0 .../mechanics/weapon/magazine/MagazineImpl.kt | 0 .../weapon/magazine/PlayerMagazineImpl.kt | 0 .../weapon/player/PlayerWeaponImpl.kt | 0 .../core/common/player/CommonRpPlayer.kt | 18 ++ .../identities/CivilianIdentityImpl.kt | 6 +- .../identity/identities/PoliceIdentityImpl.kt | 10 +- .../identities/RescueServiceIdentityImpl.kt | 10 +- .../player/license/ExpirableLicenseImpl.kt | 10 +- .../common}/player/license/LicenseImpl.kt | 16 +- .../civilian/CivilianFishingLicenseImpl.kt | 15 ++ .../civilian/CivilianVehicleLicenseImpl.kt | 65 +++--- .../civilian/CivilianWeaponLicenseImpl.kt | 20 +- surf-roleplay-mechanic-old/build.gradle.kts | 7 - .../mechanic/mechanics/idcard/IdCard.kt | 44 ----- .../rentable/RentableMechanicImpl.kt | 160 --------------- .../listeners/RentableOnlineListener.kt | 27 --- .../mechanics/rentable/utils/Cracker.kt | 19 -- .../rentable/utils/doors/FrontDoor.kt | 18 -- .../rentable/utils/doors/GarageDoor.kt | 18 -- .../rentable/utils/doors/RegularDoor.kt | 18 -- .../rentable/utils/lockpick/BatteringRam.kt | 10 - .../utils/lockpick/PremiumLockPick.kt | 10 - .../utils/lockpick/RegularLockPick.kt | 10 - .../mechanics/utils/PermissionRegistry.kt | 10 - surf-roleplay-paper-old/build.gradle.kts | 41 ---- .../slne/surf/roleplay/paper/SurfRoleplay.kt | 185 ------------------ surf-roleplay-paper/build.gradle.kts | 8 + .../dev/slne/surf/roleplay/paper/PaperMain.kt | 17 ++ .../slne/surf/roleplay/paper/SurfRoleplay.kt | 41 ++++ .../paper/command/ActiveIdentityCommand.kt | 28 +++ .../roleplay/paper/command/BalanceCommand.kt | 121 ++++++++++++ .../paper/command/args/BalanceTypeArgument.kt | 2 +- .../paper/listener}/ListenerManager.kt | 4 +- .../paper/listener}/OnlineListener.kt | 20 +- .../roleplay/paper/mechanics/idcard/IdCard.kt | 44 +++++ .../paper}/mechanics/idcard/IdCardNpc.kt | 8 +- .../idcard/dialogs/CreateIdDialog.kt | 15 +- .../idcard/listeners/IdCardHandler.kt | 15 +- .../rentable/commands/RentableCommand.kt | 81 ++++++++ .../listeners/RentCollectedListener.kt | 8 +- .../rentable/listeners/RentableListener.kt | 27 +-- .../dialogs/IdentitySelectorDialog.kt | 4 +- .../listener/IdentityOnlineListener.kt | 10 +- .../paper}/player/license/LicenseNpc.kt | 4 +- .../license/dialogs/BuyLicenseDialog.kt | 14 +- .../license/dialogs/BuyLicensesDialog.kt | 8 +- .../player/license/dialogs/LicenseDialog.kt | 19 +- .../player/license/dialogs/MyLicenseDialog.kt | 8 +- .../license/dialogs/MyLicensesDialog.kt | 6 +- .../license/listeners/LicenseBuyHandler.kt | 13 +- .../listeners/LicenseChangedHandler.kt | 25 +-- .../civilian/RpPlayerCivilianIdentityModel.kt | 2 +- .../police/RpPlayerPoliceIdentityModel.kt | 2 +- .../RpPlayerRescueServiceIdentityModel.kt | 2 +- .../player/license/LicenseServiceImpl.kt | 11 +- .../player/license/db/IdentityLicenseModel.kt | 6 +- .../player/license/db/IdentityLicenseTable.kt | 8 +- .../civilian/CivilianFishingLicenseImpl.kt | 17 -- 116 files changed, 946 insertions(+), 975 deletions(-) create mode 100644 surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/events/CancellableRpEvent.kt create mode 100644 surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/events/RpEvent.kt create mode 100644 surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/player/events/RpPlayerJoinEvent.kt create mode 100644 surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/player/events/RpPlayerQuitEvent.kt rename surf-roleplay-api/{surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/event => surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/player/license/events}/RpPlayerLicenseAddedEvent.kt (66%) rename surf-roleplay-api/{surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/event => surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/player/license/events}/RpPlayerLicenseRemovedEvent.kt (71%) create mode 100644 surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/player/player-utils.kt rename surf-roleplay-api/{surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic => surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper}/rentable/events/RentableMemberAddEvent.kt (85%) rename surf-roleplay-api/{surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic => surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper}/rentable/events/RentableMemberRemoveEvent.kt (86%) rename surf-roleplay-api/{surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic => surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper}/rentable/events/RentableOwnerChangeEvent.kt (93%) rename surf-roleplay-api/{surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic => surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper}/rentable/events/RentableRentCollectEvent.kt (67%) delete mode 100644 surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/events/RpPlayerJoinEvent.kt delete mode 100644 surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/events/RpPlayerQuitEvent.kt rename {surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic => surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics}/MechanicImpl.kt (69%) rename {surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic => surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics}/MechanicRegistryImpl.kt (75%) rename {surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic => surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common}/mechanics/idcard/IdCardMechanicImpl.kt (55%) create mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/Cracker.kt rename {surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic => surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common}/mechanics/rentable/RentCollectorJob.kt (89%) rename {surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic => surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common}/mechanics/rentable/RentableImpl.kt (90%) create mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/RentableMechanicImpl.kt rename {surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils => surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable}/StorageContainerImpl.kt (95%) rename {surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils => surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable}/containers/RegularStorageContainer.kt (70%) rename {surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils => surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable}/containers/VaultStorageContainer.kt (58%) rename {surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils => surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/door}/DoorImpl.kt (72%) create mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/door/doors/FrontDoor.kt create mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/door/doors/GarageDoor.kt create mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/door/doors/RegularDoor.kt rename {surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils => surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/lockpick}/LockPickImpl.kt (53%) create mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/lockpick/lockpicks/BatteringRam.kt create mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/lockpick/lockpicks/PremiumLockPick.kt create mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/lockpick/lockpicks/RegularLockPick.kt rename {surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic => surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common}/mechanics/rentable/rentables/ApartmentImpl.kt (58%) rename {surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic => surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common}/mechanics/rentable/rentables/HouseImpl.kt (58%) rename {surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic => surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common}/mechanics/weapon/WeaponImpl.kt (100%) rename {surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic => surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common}/mechanics/weapon/WeaponMechanicImpl.kt (100%) rename {surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic => surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common}/mechanics/weapon/magazine/MagazineImpl.kt (100%) rename {surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic => surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common}/mechanics/weapon/magazine/PlayerMagazineImpl.kt (100%) rename {surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic => surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common}/mechanics/weapon/player/PlayerWeaponImpl.kt (100%) rename {surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server => surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common}/player/identity/identities/CivilianIdentityImpl.kt (81%) rename {surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server => surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common}/player/identity/identities/PoliceIdentityImpl.kt (70%) rename {surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server => surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common}/player/identity/identities/RescueServiceIdentityImpl.kt (69%) rename {surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server => surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common}/player/license/ExpirableLicenseImpl.kt (62%) rename {surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server => surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common}/player/license/LicenseImpl.kt (75%) create mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/licenses/civilian/CivilianFishingLicenseImpl.kt rename {surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server => surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common}/player/license/licenses/civilian/CivilianVehicleLicenseImpl.kt (59%) rename {surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server => surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common}/player/license/licenses/civilian/CivilianWeaponLicenseImpl.kt (61%) delete mode 100644 surf-roleplay-mechanic-old/build.gradle.kts delete mode 100644 surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/idcard/IdCard.kt delete mode 100644 surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/RentableMechanicImpl.kt delete mode 100644 surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/listeners/RentableOnlineListener.kt delete mode 100644 surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/Cracker.kt delete mode 100644 surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/doors/FrontDoor.kt delete mode 100644 surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/doors/GarageDoor.kt delete mode 100644 surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/doors/RegularDoor.kt delete mode 100644 surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/lockpick/BatteringRam.kt delete mode 100644 surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/lockpick/PremiumLockPick.kt delete mode 100644 surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/lockpick/RegularLockPick.kt delete mode 100644 surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/utils/PermissionRegistry.kt delete mode 100644 surf-roleplay-paper-old/build.gradle.kts delete mode 100644 surf-roleplay-paper-old/src/main/kotlin/dev/slne/surf/roleplay/paper/SurfRoleplay.kt create mode 100644 surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/SurfRoleplay.kt create mode 100644 surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/command/ActiveIdentityCommand.kt create mode 100644 surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/command/BalanceCommand.kt rename {surf-roleplay-paper-old => surf-roleplay-paper}/src/main/kotlin/dev/slne/surf/roleplay/paper/command/args/BalanceTypeArgument.kt (92%) rename {surf-roleplay-paper-old/src/main/kotlin/dev/slne/surf/roleplay/paper/listeners => surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/listener}/ListenerManager.kt (97%) rename {surf-roleplay-paper-old/src/main/kotlin/dev/slne/surf/roleplay/paper/listeners => surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/listener}/OnlineListener.kt (66%) create mode 100644 surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/IdCard.kt rename {surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic => surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper}/mechanics/idcard/IdCardNpc.kt (73%) rename {surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic => surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper}/mechanics/idcard/dialogs/CreateIdDialog.kt (95%) rename {surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic => surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper}/mechanics/idcard/listeners/IdCardHandler.kt (73%) create mode 100644 surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/commands/RentableCommand.kt rename {surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic => surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper}/mechanics/rentable/listeners/RentCollectedListener.kt (80%) rename {surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic => surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper}/mechanics/rentable/listeners/RentableListener.kt (86%) rename {surf-roleplay-paper-old/src/main/kotlin/dev/slne/surf/roleplay/paper => surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player}/identity/dialogs/IdentitySelectorDialog.kt (95%) rename {surf-roleplay-paper-old/src/main/kotlin/dev/slne/surf/roleplay/paper => surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player}/identity/listener/IdentityOnlineListener.kt (67%) rename {surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server => surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper}/player/license/LicenseNpc.kt (85%) rename {surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server => surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper}/player/license/dialogs/BuyLicenseDialog.kt (93%) rename {surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server => surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper}/player/license/dialogs/BuyLicensesDialog.kt (91%) rename {surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server => surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper}/player/license/dialogs/LicenseDialog.kt (91%) rename {surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server => surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper}/player/license/dialogs/MyLicenseDialog.kt (85%) rename {surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server => surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper}/player/license/dialogs/MyLicensesDialog.kt (90%) rename {surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server => surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper}/player/license/listeners/LicenseBuyHandler.kt (72%) rename {surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server => surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper}/player/license/listeners/LicenseChangedHandler.kt (65%) delete mode 100644 surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/licenses/civilian/CivilianFishingLicenseImpl.kt diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 7c44d96..545c5b2 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,7 +1,5 @@ [versions] -surf-database = "2.2.1-SNAPSHOT" -surf-npc-api = "1.21.7-1.4.1-SNAPSHOT" +surf-npc-api = "1.21.7-1.4.2-SNAPSHOT" [libraries] -surf-database = { module = "dev.slne.surf:surf-database", version.ref = "surf-database" } surf-npc-api = { module = "dev.slne.surf.npc:surf-npc-api", version.ref = "surf-npc-api" } diff --git a/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/events/CancellableRpEvent.kt b/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/events/CancellableRpEvent.kt new file mode 100644 index 0000000..1f5f2c9 --- /dev/null +++ b/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/events/CancellableRpEvent.kt @@ -0,0 +1,7 @@ +package dev.slne.surf.roleplay.api.paper.events + +import org.bukkit.Bukkit + +open class CancellableRpEvent( + async: Boolean = !Bukkit.isPrimaryThread() +) : RpEvent(async) \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/events/RpEvent.kt b/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/events/RpEvent.kt new file mode 100644 index 0000000..39cd380 --- /dev/null +++ b/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/events/RpEvent.kt @@ -0,0 +1,19 @@ +package dev.slne.surf.roleplay.api.paper.events + +import org.bukkit.Bukkit +import org.bukkit.event.Event +import org.bukkit.event.HandlerList + +open class RpEvent( + val async: Boolean = !Bukkit.isPrimaryThread() +) : Event(async) { + + override fun getHandlers() = handlerList + + companion object { + private val handlerList = HandlerList() + + @JvmStatic + fun getHandlerList() = handlerList + } +} \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/player/events/RpPlayerDeathEvent.kt b/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/player/events/RpPlayerDeathEvent.kt index 64e0c3e..2d290d3 100644 --- a/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/player/events/RpPlayerDeathEvent.kt +++ b/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/player/events/RpPlayerDeathEvent.kt @@ -1,8 +1,8 @@ package dev.slne.surf.roleplay.api.paper.player.events import dev.slne.surf.cloud.api.client.paper.player.toCloudOfflinePlayer -import dev.slne.surf.cloud.api.common.event.CloudEvent import dev.slne.surf.roleplay.api.common.player.RpPlayer +import dev.slne.surf.roleplay.api.paper.events.RpEvent import org.bukkit.block.Block import org.bukkit.entity.Entity import org.bukkit.entity.Player @@ -10,11 +10,18 @@ import org.bukkit.event.entity.EntityDamageByBlockEvent import org.bukkit.event.entity.EntityDamageByEntityEvent import org.bukkit.event.entity.PlayerDeathEvent +/** + * Event triggered when a player dies in the game. + * This event provides information about the player who died, the entity or block that caused the death, + * and allows access to the killer's RpPlayer instance if applicable. + * + * @property player The RpPlayer instance representing the player who died. + * @property bukkitEvent The original Bukkit PlayerDeathEvent that this event wraps. + */ class RpPlayerDeathEvent( - source: Any, val player: RpPlayer, bukkitEvent: PlayerDeathEvent -) : CloudEvent(source) { +) : RpEvent() { var killerEntity: Entity? private set diff --git a/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/player/events/RpPlayerJoinEvent.kt b/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/player/events/RpPlayerJoinEvent.kt new file mode 100644 index 0000000..c27f6ac --- /dev/null +++ b/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/player/events/RpPlayerJoinEvent.kt @@ -0,0 +1,8 @@ +package dev.slne.surf.roleplay.api.paper.player.events + +import dev.slne.surf.roleplay.api.common.player.RpPlayer +import dev.slne.surf.roleplay.api.paper.events.RpEvent + +class RpPlayerJoinEvent( + val player: RpPlayer, +) : RpEvent() \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/player/events/RpPlayerQuitEvent.kt b/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/player/events/RpPlayerQuitEvent.kt new file mode 100644 index 0000000..4849e14 --- /dev/null +++ b/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/player/events/RpPlayerQuitEvent.kt @@ -0,0 +1,8 @@ +package dev.slne.surf.roleplay.api.paper.player.events + +import dev.slne.surf.roleplay.api.common.player.RpPlayer +import dev.slne.surf.roleplay.api.paper.events.RpEvent + +class RpPlayerQuitEvent( + val player: RpPlayer, +) : RpEvent() \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/event/RpPlayerLicenseAddedEvent.kt b/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/player/license/events/RpPlayerLicenseAddedEvent.kt similarity index 66% rename from surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/event/RpPlayerLicenseAddedEvent.kt rename to surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/player/license/events/RpPlayerLicenseAddedEvent.kt index 5227ab6..859fad5 100644 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/event/RpPlayerLicenseAddedEvent.kt +++ b/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/player/license/events/RpPlayerLicenseAddedEvent.kt @@ -1,15 +1,14 @@ -package dev.slne.surf.roleplay.api.common.player.license.event +package dev.slne.surf.roleplay.api.paper.player.license.events -import dev.slne.surf.cloud.api.common.event.CancellableCloudEvent import dev.slne.surf.roleplay.api.common.player.RpPlayer import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity import dev.slne.surf.roleplay.api.common.player.license.IdentityLicense +import dev.slne.surf.roleplay.api.paper.events.CancellableRpEvent class RpPlayerLicenseAddedEvent( - source: Any, val player: RpPlayer, val identity: RpIdentity, val license: IdentityLicense -) : CancellableCloudEvent(source) { +) : CancellableRpEvent() { var cancelReason: String? = null } \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/event/RpPlayerLicenseRemovedEvent.kt b/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/player/license/events/RpPlayerLicenseRemovedEvent.kt similarity index 71% rename from surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/event/RpPlayerLicenseRemovedEvent.kt rename to surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/player/license/events/RpPlayerLicenseRemovedEvent.kt index 2672dc3..77e14fd 100644 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/event/RpPlayerLicenseRemovedEvent.kt +++ b/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/player/license/events/RpPlayerLicenseRemovedEvent.kt @@ -1,15 +1,14 @@ -package dev.slne.surf.roleplay.api.common.player.license.event +package dev.slne.surf.roleplay.api.paper.player.license.events -import dev.slne.surf.cloud.api.common.event.CancellableCloudEvent import dev.slne.surf.roleplay.api.common.player.RpPlayer import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity import dev.slne.surf.roleplay.api.common.player.license.IdentityLicense import dev.slne.surf.roleplay.api.common.player.license.utils.LicenseRemovedReason +import dev.slne.surf.roleplay.api.paper.events.CancellableRpEvent class RpPlayerLicenseRemovedEvent( - source: Any, val player: RpPlayer, val identity: RpIdentity, val license: IdentityLicense, val reason: LicenseRemovedReason, -) : CancellableCloudEvent(source) \ No newline at end of file +) : CancellableRpEvent() \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/player/player-utils.kt b/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/player/player-utils.kt new file mode 100644 index 0000000..2fe7601 --- /dev/null +++ b/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/player/player-utils.kt @@ -0,0 +1,7 @@ +package dev.slne.surf.roleplay.api.paper.player + +import dev.slne.surf.cloud.api.client.paper.player.toCloudOfflinePlayer +import dev.slne.surf.roleplay.api.common.player.RpPlayer +import org.bukkit.OfflinePlayer + +val OfflinePlayer.rpPlayer get() = RpPlayer[this.toCloudOfflinePlayer()] \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/events/RentableMemberAddEvent.kt b/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/rentable/events/RentableMemberAddEvent.kt similarity index 85% rename from surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/events/RentableMemberAddEvent.kt rename to surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/rentable/events/RentableMemberAddEvent.kt index 757a4a8..c409126 100644 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/events/RentableMemberAddEvent.kt +++ b/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/rentable/events/RentableMemberAddEvent.kt @@ -1,8 +1,8 @@ -package dev.slne.surf.roleplay.api.mechanic.rentable.events +package dev.slne.surf.roleplay.api.paper.rentable.events -import dev.slne.surf.roleplay.api.events.CancellableRpEvent -import dev.slne.surf.roleplay.api.mechanic.rentable.Rentable -import dev.slne.surf.roleplay.api.player.RpPlayer +import dev.slne.surf.roleplay.api.common.mechanic.rentable.Rentable +import dev.slne.surf.roleplay.api.common.player.RpPlayer +import dev.slne.surf.roleplay.api.paper.events.CancellableRpEvent /** * Event triggered when a member is added to a rentable property. diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/events/RentableMemberRemoveEvent.kt b/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/rentable/events/RentableMemberRemoveEvent.kt similarity index 86% rename from surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/events/RentableMemberRemoveEvent.kt rename to surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/rentable/events/RentableMemberRemoveEvent.kt index 5b1aaae..3c26f02 100644 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/events/RentableMemberRemoveEvent.kt +++ b/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/rentable/events/RentableMemberRemoveEvent.kt @@ -1,8 +1,8 @@ -package dev.slne.surf.roleplay.api.mechanic.rentable.events +package dev.slne.surf.roleplay.api.paper.rentable.events -import dev.slne.surf.roleplay.api.events.CancellableRpEvent -import dev.slne.surf.roleplay.api.mechanic.rentable.Rentable -import dev.slne.surf.roleplay.api.player.RpPlayer +import dev.slne.surf.roleplay.api.common.mechanic.rentable.Rentable +import dev.slne.surf.roleplay.api.common.player.RpPlayer +import dev.slne.surf.roleplay.api.paper.events.CancellableRpEvent /** * Event triggered when a member is removed from a rentable property. diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/events/RentableOwnerChangeEvent.kt b/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/rentable/events/RentableOwnerChangeEvent.kt similarity index 93% rename from surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/events/RentableOwnerChangeEvent.kt rename to surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/rentable/events/RentableOwnerChangeEvent.kt index e336a82..cf8e1c9 100644 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/events/RentableOwnerChangeEvent.kt +++ b/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/rentable/events/RentableOwnerChangeEvent.kt @@ -1,9 +1,9 @@ -package dev.slne.surf.roleplay.api.mechanic.rentable.events +package dev.slne.surf.roleplay.api.paper.rentable.events -import dev.slne.surf.roleplay.api.events.CancellableRpEvent -import dev.slne.surf.roleplay.api.mechanic.rentable.Rentable -import dev.slne.surf.roleplay.api.mechanic.rentable.RentableMechanic -import dev.slne.surf.roleplay.api.player.RpPlayer +import dev.slne.surf.roleplay.api.common.mechanic.rentable.Rentable +import dev.slne.surf.roleplay.api.common.mechanic.rentable.RentableMechanic +import dev.slne.surf.roleplay.api.common.player.RpPlayer +import dev.slne.surf.roleplay.api.paper.events.CancellableRpEvent import dev.slne.surf.surfapi.core.api.messages.builder.SurfComponentBuilder /** diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/events/RentableRentCollectEvent.kt b/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/rentable/events/RentableRentCollectEvent.kt similarity index 67% rename from surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/events/RentableRentCollectEvent.kt rename to surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/rentable/events/RentableRentCollectEvent.kt index aebce6d..391954e 100644 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/events/RentableRentCollectEvent.kt +++ b/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/rentable/events/RentableRentCollectEvent.kt @@ -1,7 +1,7 @@ -package dev.slne.surf.roleplay.api.mechanic.rentable.events +package dev.slne.surf.roleplay.api.paper.rentable.events -import dev.slne.surf.roleplay.api.events.CancellableRpEvent -import dev.slne.surf.roleplay.api.mechanic.rentable.Rentable +import dev.slne.surf.roleplay.api.common.mechanic.rentable.Rentable +import dev.slne.surf.roleplay.api.paper.events.CancellableRpEvent /** * Event triggered when rent is collected from a rentable property. diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/Mechanic.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/Mechanic.kt index 13d30b7..2632ba4 100644 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/Mechanic.kt +++ b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/Mechanic.kt @@ -1,8 +1,8 @@ -package dev.slne.surf.roleplay.api.mechanic +package dev.slne.surf.roleplay.api.common.mechanic import com.github.retrooper.packetevents.event.PacketListener import com.github.retrooper.packetevents.event.PacketListenerPriority -import dev.slne.surf.roleplay.api.coroutine.RpJob +import dev.slne.surf.roleplay.api.common.util.RpJob import it.unimi.dsi.fastutil.objects.ObjectSet import org.bukkit.event.Listener diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/MechanicRegistry.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/MechanicRegistry.kt index be4966d..fa7866c 100644 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/MechanicRegistry.kt +++ b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/MechanicRegistry.kt @@ -1,4 +1,4 @@ -package dev.slne.surf.roleplay.api.mechanic +package dev.slne.surf.roleplay.api.common.mechanic import dev.slne.surf.surfapi.core.api.util.requiredService diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/idcard/IdCardMechanic.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/idcard/IdCardMechanic.kt index 15de4ce..5860502 100644 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/idcard/IdCardMechanic.kt +++ b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/idcard/IdCardMechanic.kt @@ -1,5 +1,5 @@ -package dev.slne.surf.roleplay.api.mechanic.idcard +package dev.slne.surf.roleplay.api.common.mechanic.idcard -import dev.slne.surf.roleplay.api.mechanic.Mechanic +import dev.slne.surf.roleplay.api.common.mechanic.Mechanic interface IdCardMechanic : Mechanic \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/Rentable.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/Rentable.kt index f9be7e0..102ddb6 100644 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/Rentable.kt +++ b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/Rentable.kt @@ -1,12 +1,12 @@ -package dev.slne.surf.roleplay.api.mechanic.rentable - -import dev.slne.surf.roleplay.api.mechanic.rentable.events.RentableMemberAddEvent -import dev.slne.surf.roleplay.api.mechanic.rentable.events.RentableMemberRemoveEvent -import dev.slne.surf.roleplay.api.mechanic.rentable.events.RentableOwnerChangeEvent -import dev.slne.surf.roleplay.api.mechanic.rentable.utils.StorageContainer -import dev.slne.surf.roleplay.api.mechanic.rentable.utils.door.Door -import dev.slne.surf.roleplay.api.mechanic.rentable.utils.door.DoorContainer -import dev.slne.surf.roleplay.api.player.RpPlayer +package dev.slne.surf.roleplay.api.common.mechanic.rentable + +import dev.slne.surf.roleplay.api.common.mechanic.rentable.events.RentableMemberAddEvent +import dev.slne.surf.roleplay.api.common.mechanic.rentable.events.RentableMemberRemoveEvent +import dev.slne.surf.roleplay.api.common.mechanic.rentable.events.RentableOwnerChangeEvent +import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.StorageContainer +import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.door.Door +import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.door.DoorContainer +import dev.slne.surf.roleplay.api.common.player.RpPlayer import it.unimi.dsi.fastutil.objects.ObjectSet import net.kyori.adventure.key.Key import net.kyori.adventure.text.ComponentLike diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/RentableMechanic.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/RentableMechanic.kt index e4e122d..358fcbf 100644 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/RentableMechanic.kt +++ b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/RentableMechanic.kt @@ -1,7 +1,7 @@ -package dev.slne.surf.roleplay.api.mechanic.rentable +package dev.slne.surf.roleplay.api.common.mechanic.rentable -import dev.slne.surf.roleplay.api.mechanic.Mechanic -import dev.slne.surf.roleplay.api.player.RpPlayer +import dev.slne.surf.roleplay.api.common.mechanic.Mechanic +import dev.slne.surf.roleplay.api.common.player.RpPlayer import it.unimi.dsi.fastutil.objects.ObjectSet import net.kyori.adventure.key.Key import org.jetbrains.annotations.Unmodifiable diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/rentables/Apartment.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/rentables/Apartment.kt index 940404b..f536300 100644 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/rentables/Apartment.kt +++ b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/rentables/Apartment.kt @@ -1,6 +1,6 @@ -package dev.slne.surf.roleplay.api.mechanic.rentable.rentables +package dev.slne.surf.roleplay.api.common.mechanic.rentable.rentables -import dev.slne.surf.roleplay.api.mechanic.rentable.Rentable +import dev.slne.surf.roleplay.api.common.mechanic.rentable.Rentable /** * Represents an apartment that can be rented. diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/rentables/House.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/rentables/House.kt index f34f72e..2f0f8a6 100644 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/rentables/House.kt +++ b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/rentables/House.kt @@ -1,6 +1,6 @@ -package dev.slne.surf.roleplay.api.mechanic.rentable.rentables +package dev.slne.surf.roleplay.api.common.mechanic.rentable.rentables -import dev.slne.surf.roleplay.api.mechanic.rentable.Rentable +import dev.slne.surf.roleplay.api.common.mechanic.rentable.Rentable /** * Represents a house that can be rented. diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/Crackable.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/Crackable.kt index af9815a..eb6a3a2 100644 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/Crackable.kt +++ b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/Crackable.kt @@ -1,6 +1,6 @@ -package dev.slne.surf.roleplay.api.mechanic.rentable.utils +package dev.slne.surf.roleplay.api.common.mechanic.rentable.utils -import dev.slne.surf.roleplay.api.player.RpPlayer +import dev.slne.surf.roleplay.api.common.player.RpPlayer import kotlin.time.Duration /** diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/LockPick.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/LockPick.kt index 725913b..785da69 100644 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/LockPick.kt +++ b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/LockPick.kt @@ -1,6 +1,6 @@ -package dev.slne.surf.roleplay.api.mechanic.rentable.utils +package dev.slne.surf.roleplay.api.common.mechanic.rentable.utils -import dev.slne.surf.roleplay.api.player.RpPlayer +import dev.slne.surf.roleplay.api.common.player.RpPlayer import dev.slne.surf.surfapi.core.api.messages.builder.SurfComponentBuilder /** diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/Lockable.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/Lockable.kt index 10d0548..482047a 100644 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/Lockable.kt +++ b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/Lockable.kt @@ -1,6 +1,6 @@ -package dev.slne.surf.roleplay.api.mechanic.rentable.utils +package dev.slne.surf.roleplay.api.common.mechanic.rentable.utils -import dev.slne.surf.roleplay.api.player.RpPlayer +import dev.slne.surf.roleplay.api.common.player.RpPlayer /** * Represents an entity that can be locked and accessed by players. diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/StorageContainer.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/StorageContainer.kt index 3fce7ed..a3fb4ba 100644 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/StorageContainer.kt +++ b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/StorageContainer.kt @@ -1,6 +1,6 @@ -package dev.slne.surf.roleplay.api.mechanic.rentable.utils +package dev.slne.surf.roleplay.api.common.mechanic.rentable.utils -import dev.slne.surf.roleplay.api.mechanic.rentable.Rentable +import dev.slne.surf.roleplay.api.common.mechanic.rentable.Rentable import org.bukkit.Location import org.bukkit.Material import kotlin.time.Duration diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/door/Door.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/door/Door.kt index 7e9722a..25adc0c 100644 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/door/Door.kt +++ b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/door/Door.kt @@ -1,8 +1,8 @@ -package dev.slne.surf.roleplay.api.mechanic.rentable.utils.door +package dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.door -import dev.slne.surf.roleplay.api.mechanic.rentable.Rentable -import dev.slne.surf.roleplay.api.mechanic.rentable.utils.Crackable -import dev.slne.surf.roleplay.api.mechanic.rentable.utils.Lockable +import dev.slne.surf.roleplay.api.common.mechanic.rentable.Rentable +import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.Crackable +import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.Lockable import org.bukkit.Location /** diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/door/DoorContainer.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/door/DoorContainer.kt index a7f843e..70d8d56 100644 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/door/DoorContainer.kt +++ b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/door/DoorContainer.kt @@ -1,4 +1,4 @@ -package dev.slne.surf.roleplay.api.mechanic.rentable.utils.door +package dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.door import it.unimi.dsi.fastutil.objects.ObjectSet diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/weapon/Weapon.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/weapon/Weapon.kt index e6efb0c..9a7095a 100644 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/weapon/Weapon.kt +++ b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/weapon/Weapon.kt @@ -1,11 +1,11 @@ -package dev.slne.surf.roleplay.api.mechanic.weapon +package dev.slne.surf.roleplay.api.common.mechanic.weapon -import dev.slne.surf.roleplay.api.mechanic.weapon.magazine.Magazine -import dev.slne.surf.roleplay.api.mechanic.weapon.utils.WeaponType -import dev.slne.surf.surfapi.bukkit.api.builder.LoreBuilder +import dev.slne.surf.roleplay.api.common.mechanic.weapon.magazine.Magazine +import dev.slne.surf.roleplay.api.common.mechanic.weapon.utils.WeaponType import dev.slne.surf.surfapi.core.api.messages.builder.SurfComponentBuilder import it.unimi.dsi.fastutil.objects.ObjectSet -import org.bukkit.Material +import net.kyori.adventure.key.Key +import net.kyori.adventure.text.Component import kotlin.time.Duration interface Weapon { @@ -14,11 +14,11 @@ interface Weapon { val name: String - val weaponMaterial: Material + val weaponMaterial: Key val displayName: SurfComponentBuilder.() -> Unit - val description: LoreBuilder.() -> Unit + val description: Component val weaponShootCooldown: Duration diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/weapon/WeaponMechanic.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/weapon/WeaponMechanic.kt index edd2902..5a88c79 100644 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/weapon/WeaponMechanic.kt +++ b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/weapon/WeaponMechanic.kt @@ -1,5 +1,6 @@ package dev.slne.surf.roleplay.api.mechanic.weapon +import dev.slne.surf.roleplay.api.common.mechanic.weapon.Weapon import it.unimi.dsi.fastutil.objects.ObjectSet import org.jetbrains.annotations.Unmodifiable diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/weapon/magazine/Magazine.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/weapon/magazine/Magazine.kt index 3056b39..ca32439 100644 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/weapon/magazine/Magazine.kt +++ b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/weapon/magazine/Magazine.kt @@ -1,16 +1,31 @@ -package dev.slne.surf.roleplay.api.mechanic.weapon.magazine +package dev.slne.surf.roleplay.api.common.mechanic.weapon.magazine -import dev.slne.surf.surfapi.bukkit.api.builder.LoreBuilder import dev.slne.surf.surfapi.core.api.messages.builder.SurfComponentBuilder +import net.kyori.adventure.text.Component interface Magazine { + /** + * The unique identifier of the magazine. + * This is used to identify the magazine in the system. + */ val name: String + /** + * The display name of the magazine. + * This is a function that allows you to build the display name using a [SurfComponentBuilder]. + */ val displayName: SurfComponentBuilder.() -> Unit - val description: LoreBuilder.() -> Unit + /** + * The description of the magazine. + */ + val description: Component + /** + * The maximum amount of ammo that can be loaded into this magazine. + * This is used to determine how many bullets the magazine can hold. + */ val maxAmmo: Int /** diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/weapon/magazine/PlayerMagazine.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/weapon/magazine/PlayerMagazine.kt index c45b2e1..dd2987c 100644 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/weapon/magazine/PlayerMagazine.kt +++ b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/weapon/magazine/PlayerMagazine.kt @@ -1,4 +1,4 @@ -package dev.slne.surf.roleplay.api.mechanic.weapon.magazine +package dev.slne.surf.roleplay.api.common.mechanic.weapon.magazine import org.bukkit.inventory.ItemStack diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/weapon/player/PlayerWeapon.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/weapon/player/PlayerWeapon.kt index f2cb902..1ae1d4b 100644 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/weapon/player/PlayerWeapon.kt +++ b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/weapon/player/PlayerWeapon.kt @@ -1,7 +1,7 @@ -package dev.slne.surf.roleplay.api.mechanic.weapon.player +package dev.slne.surf.roleplay.api.common.mechanic.weapon.player -import dev.slne.surf.roleplay.api.mechanic.weapon.Weapon -import dev.slne.surf.roleplay.api.mechanic.weapon.magazine.PlayerMagazine +import dev.slne.surf.roleplay.api.common.mechanic.weapon.Weapon +import dev.slne.surf.roleplay.api.common.mechanic.weapon.magazine.PlayerMagazine import org.bukkit.inventory.ItemStack interface PlayerWeapon { @@ -11,6 +11,6 @@ interface PlayerWeapon { val currentMagazine: PlayerMagazine? fun setCurrentMagazine(magazine: PlayerMagazine?) - + fun buildItemStack(): ItemStack } \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/weapon/utils/WeaponType.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/weapon/utils/WeaponType.kt index 6c0e4b0..0d65b1c 100644 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/weapon/utils/WeaponType.kt +++ b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/weapon/utils/WeaponType.kt @@ -1,7 +1,6 @@ -package dev.slne.surf.roleplay.api.mechanic.weapon.utils +package dev.slne.surf.roleplay.api.common.mechanic.weapon.utils enum class WeaponType { - PISTOL, RIFLE, SHOTGUN, diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/events/RpPlayerJoinEvent.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/events/RpPlayerJoinEvent.kt deleted file mode 100644 index bdd4d79..0000000 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/events/RpPlayerJoinEvent.kt +++ /dev/null @@ -1,9 +0,0 @@ -package dev.slne.surf.roleplay.api.common.player.events - -import dev.slne.surf.cloud.api.common.event.CloudEvent -import dev.slne.surf.roleplay.api.common.player.RpPlayer - -class RpPlayerJoinEvent( - source: Any, - val player: RpPlayer, -) : CloudEvent(source) \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/events/RpPlayerQuitEvent.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/events/RpPlayerQuitEvent.kt deleted file mode 100644 index d0a2e54..0000000 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/events/RpPlayerQuitEvent.kt +++ /dev/null @@ -1,9 +0,0 @@ -package dev.slne.surf.roleplay.api.common.player.events - -import dev.slne.surf.cloud.api.common.event.CloudEvent -import dev.slne.surf.roleplay.api.common.player.RpPlayer - -class RpPlayerQuitEvent( - source: Any, - val player: RpPlayer, -) : CloudEvent(source) \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/licenses/civilian/CivilianVehicleLicense.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/licenses/civilian/CivilianVehicleLicense.kt index a7cc564..8d4d3f3 100644 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/licenses/civilian/CivilianVehicleLicense.kt +++ b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/licenses/civilian/CivilianVehicleLicense.kt @@ -10,4 +10,5 @@ interface CivilianVehicleLicense { interface MotorcycleLicense : License interface BoatLicense : License interface PilotLicense : License + interface HelicopterLicense : License } \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-client/src/main/kotlin/dev/slne/surf/roleplay/core/client/player/ClientRpPlayer.kt b/surf-roleplay-core/surf-roleplay-core-client/src/main/kotlin/dev/slne/surf/roleplay/core/client/player/ClientRpPlayer.kt index b10bd5d..c8cebd8 100644 --- a/surf-roleplay-core/surf-roleplay-core-client/src/main/kotlin/dev/slne/surf/roleplay/core/client/player/ClientRpPlayer.kt +++ b/surf-roleplay-core/surf-roleplay-core-client/src/main/kotlin/dev/slne/surf/roleplay/core/client/player/ClientRpPlayer.kt @@ -1,25 +1,6 @@ package dev.slne.surf.roleplay.core.client.player -import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity import dev.slne.surf.roleplay.core.common.player.CommonRpPlayer import java.util.* -class ClientRpPlayer(uuid: UUID) : CommonRpPlayer(uuid) { - override suspend fun createIdentity( - identity: T - ): T { - TODO("Not yet implemented") - } - - override suspend fun updateIdentity( - identity: T - ): T? { - TODO("Not yet implemented") - } - - override suspend fun createOrUpdateIdentity( - identity: T - ): T { - TODO("Not yet implemented") - } -} \ No newline at end of file +class ClientRpPlayer(uuid: UUID) : CommonRpPlayer(uuid) diff --git a/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/MechanicImpl.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/MechanicImpl.kt similarity index 69% rename from surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/MechanicImpl.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/MechanicImpl.kt index bc51da0..53c5f0c 100644 --- a/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/MechanicImpl.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/MechanicImpl.kt @@ -1,13 +1,11 @@ -package dev.slne.surf.roleplay.mechanic +package dev.slne.surf.roleplay.core.common.mechanics import com.github.retrooper.packetevents.event.PacketListener import com.github.retrooper.packetevents.event.PacketListenerPriority -import dev.slne.surf.roleplay.api.coroutine.RpJob -import dev.slne.surf.roleplay.api.mechanic.Mechanic +import dev.slne.surf.roleplay.api.common.mechanic.Mechanic +import dev.slne.surf.roleplay.api.common.util.RpJob import dev.slne.surf.surfapi.core.api.util.objectSetOf import it.unimi.dsi.fastutil.objects.ObjectSet -import org.bukkit.event.Listener -import org.jetbrains.exposed.sql.Table abstract class MechanicImpl( override val name: String, @@ -15,8 +13,6 @@ abstract class MechanicImpl( override val rpJobs: ObjectSet = objectSetOf(), override val packetListeners: ObjectSet> = objectSetOf() ) : Mechanic { - open fun getDatabaseTables(): ObjectSet
= objectSetOf() - override suspend fun onLoad() {} override suspend fun onEnable() {} override suspend fun onDisable() {} diff --git a/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/MechanicRegistryImpl.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/MechanicRegistryImpl.kt similarity index 75% rename from surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/MechanicRegistryImpl.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/MechanicRegistryImpl.kt index f515ba6..8f706f3 100644 --- a/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/MechanicRegistryImpl.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/MechanicRegistryImpl.kt @@ -1,12 +1,11 @@ -package dev.slne.surf.roleplay.mechanic +package dev.slne.surf.roleplay.core.common.mechanics import com.github.shynixn.mccoroutine.folia.SuspendingJavaPlugin import com.google.auto.service.AutoService -import dev.slne.surf.roleplay.api.mechanic.Mechanic -import dev.slne.surf.roleplay.api.mechanic.MechanicRegistry -import dev.slne.surf.roleplay.core.RpDatabase -import dev.slne.surf.roleplay.mechanic.mechanics.idcard.IdCardMechanicImpl -import dev.slne.surf.roleplay.mechanic.mechanics.rentable.RentableMechanicImpl +import dev.slne.surf.roleplay.api.common.mechanic.Mechanic +import dev.slne.surf.roleplay.api.common.mechanic.MechanicRegistry +import dev.slne.surf.roleplay.core.common.mechanics.idcard.IdCardMechanicImpl +import dev.slne.surf.roleplay.core.common.mechanics.rentable.RentableMechanicImpl import dev.slne.surf.surfapi.bukkit.api.event.register import dev.slne.surf.surfapi.core.api.util.mutableObjectSetOf import net.kyori.adventure.util.Services @@ -37,11 +36,6 @@ class MechanicRegistryImpl : MechanicRegistry, Services.Fallback { mechanics.forEach { mechanic -> mechanic.handlers.forEach { it.register() } } } - fun registerDatabaseTables(rpDatabase: RpDatabase) { - mechanics.map { it as MechanicImpl }.flatMap { it.getDatabaseTables() } - .forEach { rpDatabase.registerMechanicTable(it) } - } - fun startAllRpJobs() { mechanics.forEach { it.rpJobs.forEach { job -> job.start() } } } diff --git a/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/idcard/IdCardMechanicImpl.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/idcard/IdCardMechanicImpl.kt similarity index 55% rename from surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/idcard/IdCardMechanicImpl.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/idcard/IdCardMechanicImpl.kt index efa44fb..8e0cc61 100644 --- a/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/idcard/IdCardMechanicImpl.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/idcard/IdCardMechanicImpl.kt @@ -1,8 +1,7 @@ -package dev.slne.surf.roleplay.mechanic.mechanics.idcard +package dev.slne.surf.roleplay.core.common.mechanics.idcard -import dev.slne.surf.roleplay.api.mechanic.idcard.IdCardMechanic -import dev.slne.surf.roleplay.mechanic.MechanicImpl -import dev.slne.surf.roleplay.mechanic.mechanics.idcard.listeners.IdCardHandler +import dev.slne.surf.roleplay.api.common.mechanic.idcard.IdCardMechanic +import dev.slne.surf.roleplay.core.common.mechanics.MechanicImpl import dev.slne.surf.surfapi.core.api.util.objectSetOf object IdCardMechanicImpl : MechanicImpl( diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/Cracker.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/Cracker.kt new file mode 100644 index 0000000..e233242 --- /dev/null +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/Cracker.kt @@ -0,0 +1,19 @@ +package dev.slne.surf.roleplay.core.common.mechanics.rentable + +import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.Crackable +import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.LockPick +import dev.slne.surf.roleplay.api.common.player.RpPlayer + +object Cracker { + + fun crack( + player: RpPlayer, + crackable: Crackable, + lockPick: LockPick, + successAction: () -> Unit + ): LockPick.LockPickResult { + successAction() + return LockPick.LockPickResult.SUCCESS + } + +} \ No newline at end of file diff --git a/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/RentCollectorJob.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/RentCollectorJob.kt similarity index 89% rename from surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/RentCollectorJob.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/RentCollectorJob.kt index 5d8c4ce..851c776 100644 --- a/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/RentCollectorJob.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/RentCollectorJob.kt @@ -1,6 +1,7 @@ package dev.slne.surf.roleplay.mechanic.mechanics.rentable import dev.slne.surf.roleplay.api.coroutine.RpJob +import dev.slne.surf.roleplay.core.common.mechanics.rentable.RentableMechanicImpl import java.time.ZonedDateTime import kotlin.time.Duration.Companion.seconds diff --git a/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/RentableImpl.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/RentableImpl.kt similarity index 90% rename from surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/RentableImpl.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/RentableImpl.kt index 0138665..fc7c6b8 100644 --- a/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/RentableImpl.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/RentableImpl.kt @@ -1,14 +1,14 @@ -package dev.slne.surf.roleplay.mechanic.mechanics.rentable - -import dev.slne.surf.roleplay.api.mechanic.Mechanic -import dev.slne.surf.roleplay.api.mechanic.rentable.Rentable -import dev.slne.surf.roleplay.api.mechanic.rentable.RentableMechanic -import dev.slne.surf.roleplay.api.mechanic.rentable.events.RentableMemberAddEvent +package dev.slne.surf.roleplay.core.common.mechanics.rentable + +import dev.slne.surf.roleplay.api.common.mechanic.Mechanic +import dev.slne.surf.roleplay.api.common.mechanic.rentable.Rentable +import dev.slne.surf.roleplay.api.common.mechanic.rentable.RentableMechanic +import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.StorageContainer +import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.door.DoorContainer +import dev.slne.surf.roleplay.api.common.player.RpPlayer import dev.slne.surf.roleplay.api.mechanic.rentable.events.RentableMemberRemoveEvent import dev.slne.surf.roleplay.api.mechanic.rentable.events.RentableOwnerChangeEvent -import dev.slne.surf.roleplay.api.mechanic.rentable.utils.StorageContainer -import dev.slne.surf.roleplay.api.mechanic.rentable.utils.door.DoorContainer -import dev.slne.surf.roleplay.api.player.RpPlayer +import dev.slne.surf.roleplay.api.paper.rentable.events.RentableMemberAddEvent import dev.slne.surf.surfapi.core.api.messages.adventure.buildText import dev.slne.surf.surfapi.core.api.util.freeze import dev.slne.surf.surfapi.core.api.util.mutableObjectSetOf diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/RentableMechanicImpl.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/RentableMechanicImpl.kt new file mode 100644 index 0000000..3e8d6d7 --- /dev/null +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/RentableMechanicImpl.kt @@ -0,0 +1,85 @@ +package dev.slne.surf.roleplay.core.common.mechanics.rentable + +import dev.jorel.commandapi.kotlindsl.* +import dev.slne.surf.roleplay.api.common.mechanic.rentable.Rentable +import dev.slne.surf.roleplay.api.common.mechanic.rentable.RentableMechanic +import dev.slne.surf.roleplay.api.common.player.RpPlayer +import dev.slne.surf.roleplay.api.paper.rentable.events.RentableRentCollectEvent +import dev.slne.surf.roleplay.core.common.mechanics.rentable.rentables.HouseImpl +import dev.slne.surf.roleplay.mechanic.MechanicImpl +import dev.slne.surf.roleplay.mechanic.mechanics.rentable.RentCollectorJob +import dev.slne.surf.roleplay.mechanic.mechanics.rentable.listeners.RentCollectedListener +import dev.slne.surf.roleplay.mechanic.mechanics.rentable.listeners.RentableListener +import dev.slne.surf.roleplay.mechanic.mechanics.rentable.listeners.RentableOnlineListener +import dev.slne.surf.surfapi.core.api.messages.adventure.key +import dev.slne.surf.surfapi.core.api.util.freeze +import dev.slne.surf.surfapi.core.api.util.mutableObjectSetOf +import dev.slne.surf.surfapi.core.api.util.objectSetOf +import dev.slne.surf.surfapi.core.api.util.toObjectSet +import net.kyori.adventure.key.Key +import kotlin.time.Duration.Companion.seconds + +object RentableMechanicImpl : MechanicImpl( + name = "RentableMechanic", + handlers = objectSetOf( + RentableOnlineListener, + RentCollectedListener, + RentableListener + ), + rpJobs = objectSetOf( + RentCollectorJob + ) +), RentableMechanic { + + private val _rentables = mutableObjectSetOf() + override val rentables get() = _rentables.freeze() + + override fun addRentable(rentable: Rentable) = _rentables.add(rentable) + + override suspend fun onEnable() { + val rentable = HouseImpl( + key = key("roleplay_house", "house_1"), + rent = 1000, + rentDuration = 10.seconds, + size = 100.0, + stories = 3, + storageContainers = objectSetOf(), + doors = objectSetOf() + ) + + addRentable(rentable) + } + + override suspend fun collectRent(rentable: Rentable): RentableMechanic.RentCollectResult { + val currentOwner = rentable.owner ?: return RentableMechanic.RentCollectResult.NOT_RENTED + val currentBankBalance = currentOwner.getBankBalance() + + val event = RentableRentCollectEvent( + rentable = rentable, + amount = rentable.rent + ) + + if (!event.callEvent()) { + return RentableMechanic.RentCollectResult.EVENT_CANCELLED + } + + val rent = event.amount + + if (rent > currentBankBalance) { + return RentableMechanic.RentCollectResult.NOT_ENOUGH_MONEY + } + + currentOwner.removeBankBalance(rent) + + return RentableMechanic.RentCollectResult.SUCCESS + } + + override fun getOwnedRentablesByPlayer(player: RpPlayer) = + _rentables.filter { it.owner == player }.toObjectSet() + + override fun getMaxOwnableRentablesByPlayer(player: RpPlayer) = 1 + + override fun getByKey(key: Key) = _rentables.find { it.key == key } + ?: _rentables.find { it.key.asString() == key.asString() } + ?: _rentables.find { it.key.namespace() == key.namespace() && it.key.value() == key.value() } +} \ No newline at end of file diff --git a/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/StorageContainerImpl.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/StorageContainerImpl.kt similarity index 95% rename from surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/StorageContainerImpl.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/StorageContainerImpl.kt index 14d12f4..fe8a221 100644 --- a/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/StorageContainerImpl.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/StorageContainerImpl.kt @@ -8,7 +8,7 @@ import dev.slne.surf.roleplay.api.mechanic.rentable.utils.Crackable import dev.slne.surf.roleplay.api.mechanic.rentable.utils.Lockable import dev.slne.surf.roleplay.api.mechanic.rentable.utils.StorageContainer import dev.slne.surf.roleplay.api.player.RpPlayer -import dev.slne.surf.roleplay.mechanic.plugin +import dev.slne.surf.roleplay.core.common.mechanics.plugin import dev.slne.surf.surfapi.bukkit.api.util.getBlockAtAsync import kotlinx.coroutines.withContext import org.bukkit.Location @@ -22,7 +22,7 @@ open class StorageContainerImpl( override suspend fun placeInWorld() = withContext(plugin.regionDispatcher(location)) { val block = location.world.getBlockAtAsync(location.toBlock()) - + block.type = type.material } diff --git a/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/containers/RegularStorageContainer.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/containers/RegularStorageContainer.kt similarity index 70% rename from surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/containers/RegularStorageContainer.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/containers/RegularStorageContainer.kt index b48d7d5..d3d7fcc 100644 --- a/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/containers/RegularStorageContainer.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/containers/RegularStorageContainer.kt @@ -1,5 +1,7 @@ -package dev.slne.surf.roleplay.mechanic.mechanics.rentable.utils.containers +package dev.slne.surf.roleplay.core.common.mechanics.rentable.containers +import dev.slne.surf.roleplay.api.common.mechanic.rentable.Rentable +import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.StorageContainer import dev.slne.surf.roleplay.api.mechanic.rentable.Rentable import dev.slne.surf.roleplay.api.mechanic.rentable.utils.StorageContainer import dev.slne.surf.roleplay.mechanic.mechanics.rentable.utils.StorageContainerImpl diff --git a/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/containers/VaultStorageContainer.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/containers/VaultStorageContainer.kt similarity index 58% rename from surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/containers/VaultStorageContainer.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/containers/VaultStorageContainer.kt index 379abfd..4dd03b6 100644 --- a/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/containers/VaultStorageContainer.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/containers/VaultStorageContainer.kt @@ -1,11 +1,11 @@ -package dev.slne.surf.roleplay.mechanic.mechanics.rentable.utils.containers +package dev.slne.surf.roleplay.core.common.mechanics.rentable.containers -import dev.slne.surf.roleplay.api.mechanic.rentable.Rentable -import dev.slne.surf.roleplay.api.mechanic.rentable.utils.Crackable -import dev.slne.surf.roleplay.api.mechanic.rentable.utils.LockPick -import dev.slne.surf.roleplay.api.mechanic.rentable.utils.StorageContainer -import dev.slne.surf.roleplay.api.player.RpPlayer -import dev.slne.surf.roleplay.mechanic.mechanics.rentable.utils.Cracker +import dev.slne.surf.roleplay.api.common.mechanic.rentable.Rentable +import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.Crackable +import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.LockPick +import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.StorageContainer +import dev.slne.surf.roleplay.api.common.player.RpPlayer +import dev.slne.surf.roleplay.core.common.mechanics.rentable.Cracker import dev.slne.surf.roleplay.mechanic.mechanics.rentable.utils.StorageContainerImpl import org.bukkit.Location import kotlin.time.Duration diff --git a/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/DoorImpl.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/door/DoorImpl.kt similarity index 72% rename from surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/DoorImpl.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/door/DoorImpl.kt index 13a86bd..0abe646 100644 --- a/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/DoorImpl.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/door/DoorImpl.kt @@ -1,14 +1,11 @@ -@file:Suppress("UnstableApiUsage") - -package dev.slne.surf.roleplay.mechanic.mechanics.rentable.utils - -import dev.slne.surf.roleplay.api.mechanic.rentable.Rentable -import dev.slne.surf.roleplay.api.mechanic.rentable.utils.LockPick -import dev.slne.surf.roleplay.api.mechanic.rentable.utils.door.Door -import dev.slne.surf.roleplay.api.mechanic.rentable.utils.door.DoorContainer -import dev.slne.surf.roleplay.api.player.RpPlayer -import dev.slne.surf.surfapi.bukkit.api.util.getBlockAtAsync -import org.bukkit.Location +package dev.slne.surf.roleplay.core.common.mechanics.rentable.door + +import dev.slne.surf.roleplay.api.common.mechanic.rentable.Rentable +import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.LockPick +import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.door.Door +import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.door.DoorContainer +import dev.slne.surf.roleplay.api.common.player.RpPlayer +import dev.slne.surf.roleplay.core.common.mechanics.rentable.Cracker import kotlin.time.Duration abstract class DoorImpl( diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/door/doors/FrontDoor.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/door/doors/FrontDoor.kt new file mode 100644 index 0000000..eb0bd29 --- /dev/null +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/door/doors/FrontDoor.kt @@ -0,0 +1,18 @@ +package dev.slne.surf.roleplay.core.common.mechanics.rentable.door.doors + +import dev.slne.surf.roleplay.api.common.mechanic.rentable.Rentable +import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.door.DoorContainer +import dev.slne.surf.roleplay.core.common.mechanics.rentable.door.DoorImpl +import org.bukkit.Location +import kotlin.time.Duration.Companion.seconds + +class FrontDoor( + rentable: Rentable, + container: DoorContainer, + location: Location +) : DoorImpl( + rentable = rentable, + container = container, + location = location, + crackDuration = 30.seconds +) \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/door/doors/GarageDoor.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/door/doors/GarageDoor.kt new file mode 100644 index 0000000..ec01478 --- /dev/null +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/door/doors/GarageDoor.kt @@ -0,0 +1,18 @@ +package dev.slne.surf.roleplay.core.common.mechanics.rentable.door.doors + +import dev.slne.surf.roleplay.api.common.mechanic.rentable.Rentable +import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.door.DoorContainer +import dev.slne.surf.roleplay.core.common.mechanics.rentable.door.DoorImpl +import org.bukkit.Location +import kotlin.time.Duration.Companion.seconds + +class GarageDoor( + rentable: Rentable, + container: DoorContainer, + location: Location +) : DoorImpl( + rentable = rentable, + container = container, + location = location, + crackDuration = 15.seconds +) \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/door/doors/RegularDoor.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/door/doors/RegularDoor.kt new file mode 100644 index 0000000..21708a6 --- /dev/null +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/door/doors/RegularDoor.kt @@ -0,0 +1,18 @@ +package dev.slne.surf.roleplay.core.common.mechanics.rentable.door.doors + +import dev.slne.surf.roleplay.api.common.mechanic.rentable.Rentable +import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.door.DoorContainer +import dev.slne.surf.roleplay.core.common.mechanics.rentable.door.DoorImpl +import org.bukkit.Location +import kotlin.time.Duration.Companion.seconds + +class RegularDoor( + rentable: Rentable, + container: DoorContainer, + location: Location +) : DoorImpl( + rentable = rentable, + container = container, + location = location, + crackDuration = 15.seconds +) \ No newline at end of file diff --git a/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/LockPickImpl.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/lockpick/LockPickImpl.kt similarity index 53% rename from surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/LockPickImpl.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/lockpick/LockPickImpl.kt index 129798b..533104d 100644 --- a/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/LockPickImpl.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/lockpick/LockPickImpl.kt @@ -1,7 +1,7 @@ -package dev.slne.surf.roleplay.mechanic.mechanics.rentable.utils +package dev.slne.surf.roleplay.core.common.mechanics.rentable.lockpick -import dev.slne.surf.roleplay.api.mechanic.rentable.utils.LockPick -import dev.slne.surf.roleplay.api.player.RpPlayer +import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.LockPick +import dev.slne.surf.roleplay.api.common.player.RpPlayer import dev.slne.surf.surfapi.core.api.messages.builder.SurfComponentBuilder abstract class LockPickImpl( diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/lockpick/lockpicks/BatteringRam.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/lockpick/lockpicks/BatteringRam.kt new file mode 100644 index 0000000..603c9f9 --- /dev/null +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/lockpick/lockpicks/BatteringRam.kt @@ -0,0 +1,10 @@ +package dev.slne.surf.roleplay.core.common.mechanics.rentable.lockpick.lockpicks + +import dev.slne.surf.roleplay.core.common.mechanics.rentable.lockpick.LockPickImpl + +object BatteringRam : LockPickImpl( + displayName = { + primary("Rammbock") + }, + breakChance = { 0.0 } +) \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/lockpick/lockpicks/PremiumLockPick.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/lockpick/lockpicks/PremiumLockPick.kt new file mode 100644 index 0000000..0bbaae5 --- /dev/null +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/lockpick/lockpicks/PremiumLockPick.kt @@ -0,0 +1,10 @@ +package dev.slne.surf.roleplay.core.common.mechanics.rentable.lockpick.lockpicks + +import dev.slne.surf.roleplay.core.common.mechanics.rentable.lockpick.LockPickImpl + +object PremiumLockPick : LockPickImpl( + displayName = { + primary("Verzinkter Vierkantstahl Dietrich") + }, + breakChance = { 0.1 } +) \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/lockpick/lockpicks/RegularLockPick.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/lockpick/lockpicks/RegularLockPick.kt new file mode 100644 index 0000000..d1637b5 --- /dev/null +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/lockpick/lockpicks/RegularLockPick.kt @@ -0,0 +1,10 @@ +package dev.slne.surf.roleplay.core.common.mechanics.rentable.lockpick.lockpicks + +import dev.slne.surf.roleplay.core.common.mechanics.rentable.lockpick.LockPickImpl + +object RegularLockPick : LockPickImpl( + displayName = { + primary("Dietrich") + }, + breakChance = { 0.5 } +) \ No newline at end of file diff --git a/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/rentables/ApartmentImpl.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/rentables/ApartmentImpl.kt similarity index 58% rename from surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/rentables/ApartmentImpl.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/rentables/ApartmentImpl.kt index 4656254..94e387d 100644 --- a/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/rentables/ApartmentImpl.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/rentables/ApartmentImpl.kt @@ -1,9 +1,9 @@ -package dev.slne.surf.roleplay.mechanic.mechanics.rentable.rentables +package dev.slne.surf.roleplay.core.common.mechanics.rentable.rentables -import dev.slne.surf.roleplay.api.mechanic.rentable.rentables.Apartment -import dev.slne.surf.roleplay.api.mechanic.rentable.utils.StorageContainer -import dev.slne.surf.roleplay.api.mechanic.rentable.utils.door.DoorContainer -import dev.slne.surf.roleplay.mechanic.mechanics.rentable.RentableImpl +import dev.slne.surf.roleplay.api.common.mechanic.rentable.rentables.Apartment +import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.StorageContainer +import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.door.DoorContainer +import dev.slne.surf.roleplay.core.common.mechanics.rentable.RentableImpl import dev.slne.surf.surfapi.core.api.util.mutableObjectSetOf import it.unimi.dsi.fastutil.objects.ObjectSet import net.kyori.adventure.key.Key diff --git a/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/rentables/HouseImpl.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/rentables/HouseImpl.kt similarity index 58% rename from surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/rentables/HouseImpl.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/rentables/HouseImpl.kt index 69864cb..3d50868 100644 --- a/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/rentables/HouseImpl.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/rentables/HouseImpl.kt @@ -1,9 +1,9 @@ -package dev.slne.surf.roleplay.mechanic.mechanics.rentable.rentables +package dev.slne.surf.roleplay.core.common.mechanics.rentable.rentables -import dev.slne.surf.roleplay.api.mechanic.rentable.rentables.House -import dev.slne.surf.roleplay.api.mechanic.rentable.utils.StorageContainer -import dev.slne.surf.roleplay.api.mechanic.rentable.utils.door.DoorContainer -import dev.slne.surf.roleplay.mechanic.mechanics.rentable.RentableImpl +import dev.slne.surf.roleplay.api.common.mechanic.rentable.rentables.House +import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.StorageContainer +import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.door.DoorContainer +import dev.slne.surf.roleplay.core.common.mechanics.rentable.RentableImpl import dev.slne.surf.surfapi.core.api.util.mutableObjectSetOf import it.unimi.dsi.fastutil.objects.ObjectSet import net.kyori.adventure.key.Key diff --git a/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/weapon/WeaponImpl.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/WeaponImpl.kt similarity index 100% rename from surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/weapon/WeaponImpl.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/WeaponImpl.kt diff --git a/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/weapon/WeaponMechanicImpl.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/WeaponMechanicImpl.kt similarity index 100% rename from surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/weapon/WeaponMechanicImpl.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/WeaponMechanicImpl.kt diff --git a/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/weapon/magazine/MagazineImpl.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/magazine/MagazineImpl.kt similarity index 100% rename from surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/weapon/magazine/MagazineImpl.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/magazine/MagazineImpl.kt diff --git a/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/weapon/magazine/PlayerMagazineImpl.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/magazine/PlayerMagazineImpl.kt similarity index 100% rename from surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/weapon/magazine/PlayerMagazineImpl.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/magazine/PlayerMagazineImpl.kt diff --git a/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/weapon/player/PlayerWeaponImpl.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/player/PlayerWeaponImpl.kt similarity index 100% rename from surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/weapon/player/PlayerWeaponImpl.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/player/PlayerWeaponImpl.kt diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/CommonRpPlayer.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/CommonRpPlayer.kt index ba4eaeb..d389c2e 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/CommonRpPlayer.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/CommonRpPlayer.kt @@ -39,6 +39,24 @@ abstract class CommonRpPlayer( fun addIdentity(identity: RpIdentity) = _identities.add(identity) + override suspend fun createIdentity( + identity: T + ): T { + TODO("Not yet implemented") + } + + override suspend fun updateIdentity( + identity: T + ): T? { + TODO("Not yet implemented") + } + + override suspend fun createOrUpdateIdentity( + identity: T + ): T { + TODO("Not yet implemented") + } + @Suppress("UNCHECKED_CAST") override fun getIdentity(type: RpIdentity.RpIdentityType) = _identities.firstOrNull { it.type == type } diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/identities/CivilianIdentityImpl.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/identities/CivilianIdentityImpl.kt similarity index 81% rename from surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/identities/CivilianIdentityImpl.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/identities/CivilianIdentityImpl.kt index e3b0778..27fbe16 100644 --- a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/identities/CivilianIdentityImpl.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/identities/CivilianIdentityImpl.kt @@ -1,8 +1,8 @@ -package dev.slne.surf.roleplay.server.player.identity.identities +package dev.slne.surf.roleplay.core.common.player.identity.identities import dev.slne.surf.roleplay.api.common.player.RpPlayer import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity -import dev.slne.surf.roleplay.server.player.identity.RpIdentityImpl +import dev.slne.surf.roleplay.core.common.player.license.CommonRpIdentity import java.time.LocalDate import java.time.ZonedDateTime @@ -13,7 +13,7 @@ class CivilianIdentityImpl( dateOfBirth: LocalDate, createdAt: ZonedDateTime = ZonedDateTime.now(), updatedAt: ZonedDateTime = ZonedDateTime.now() -) : RpIdentityImpl( +) : CommonRpIdentity( player, type = RpIdentity.RpIdentityType.CIVILIAN, firstName, diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/identities/PoliceIdentityImpl.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/identities/PoliceIdentityImpl.kt similarity index 70% rename from surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/identities/PoliceIdentityImpl.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/identities/PoliceIdentityImpl.kt index 9b5152a..c60ce11 100644 --- a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/identities/PoliceIdentityImpl.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/identities/PoliceIdentityImpl.kt @@ -1,8 +1,8 @@ -package dev.slne.surf.roleplay.core.player.identity.identities +package dev.slne.surf.roleplay.core.common.player.identity.identities -import dev.slne.surf.roleplay.api.player.RpPlayer -import dev.slne.surf.roleplay.api.player.identity.RpIdentity -import dev.slne.surf.roleplay.server.player.identity.RpIdentityImpl +import dev.slne.surf.roleplay.api.common.player.RpPlayer +import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity +import dev.slne.surf.roleplay.core.common.player.license.CommonRpIdentity import java.time.LocalDate import java.time.ZonedDateTime @@ -15,7 +15,7 @@ class PoliceIdentityImpl( override val rank: String, createdAt: ZonedDateTime = ZonedDateTime.now(), updatedAt: ZonedDateTime = ZonedDateTime.now() -) : RpIdentityImpl( +) : CommonRpIdentity( player = player, type = RpIdentity.RpIdentityType.POLICE, firstName, diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/identities/RescueServiceIdentityImpl.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/identities/RescueServiceIdentityImpl.kt similarity index 69% rename from surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/identities/RescueServiceIdentityImpl.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/identities/RescueServiceIdentityImpl.kt index 44cf147..9c854f5 100644 --- a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/identities/RescueServiceIdentityImpl.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/identities/RescueServiceIdentityImpl.kt @@ -1,8 +1,8 @@ -package dev.slne.surf.roleplay.core.player.identity.identities +package dev.slne.surf.roleplay.core.common.player.identity.identities -import dev.slne.surf.roleplay.api.player.RpPlayer -import dev.slne.surf.roleplay.api.player.identity.RpIdentity -import dev.slne.surf.roleplay.server.player.identity.RpIdentityImpl +import dev.slne.surf.roleplay.api.common.player.RpPlayer +import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity +import dev.slne.surf.roleplay.core.common.player.license.CommonRpIdentity import java.time.LocalDate import java.time.ZonedDateTime @@ -14,7 +14,7 @@ class RescueServiceIdentityImpl( override val rank: String, createdAt: ZonedDateTime = ZonedDateTime.now(), updatedAt: ZonedDateTime = ZonedDateTime.now() -) : RpIdentityImpl( +) : CommonRpIdentity( player = player, type = RpIdentity.RpIdentityType.RESCUE_SERVICE, firstName, diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/ExpirableLicenseImpl.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/ExpirableLicenseImpl.kt similarity index 62% rename from surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/ExpirableLicenseImpl.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/ExpirableLicenseImpl.kt index d337bb7..3e152f6 100644 --- a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/ExpirableLicenseImpl.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/ExpirableLicenseImpl.kt @@ -1,9 +1,7 @@ -package dev.slne.surf.roleplay.core.player.license +package dev.slne.surf.roleplay.core.common.player.license -import dev.slne.surf.roleplay.api.player.license.ExpirableLicense -import dev.slne.surf.roleplay.api.player.license.License -import dev.slne.surf.roleplay.core.player.license.utils.LicensePermissionRegistry -import dev.slne.surf.surfapi.bukkit.api.builder.LoreBuilder +import dev.slne.surf.roleplay.api.common.player.license.ExpirableLicense +import dev.slne.surf.roleplay.api.common.player.license.License import dev.slne.surf.surfapi.core.api.util.objectSetOf import it.unimi.dsi.fastutil.objects.ObjectSet import net.kyori.adventure.key.Key @@ -13,7 +11,7 @@ import kotlin.time.Duration abstract class ExpirableLicenseImpl( key: Key, displayName: Component, - description: LoreBuilder.() -> Unit, + description: Component, price: Int, override val expiresIn: Duration, dependencies: ObjectSet = objectSetOf(), diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/LicenseImpl.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/LicenseImpl.kt similarity index 75% rename from surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/LicenseImpl.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/LicenseImpl.kt index 782a280..b6080e9 100644 --- a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/LicenseImpl.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/LicenseImpl.kt @@ -1,10 +1,8 @@ -package dev.slne.surf.roleplay.core.player.license +package dev.slne.surf.roleplay.core.common.player.license -import dev.slne.surf.roleplay.api.player.identity.RpIdentity -import dev.slne.surf.roleplay.api.player.license.License -import dev.slne.surf.roleplay.api.player.license.utils.UnobtainableReason -import dev.slne.surf.roleplay.core.player.license.utils.LicensePermissionRegistry -import dev.slne.surf.surfapi.bukkit.api.builder.LoreBuilder +import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity +import dev.slne.surf.roleplay.api.common.player.license.License +import dev.slne.surf.roleplay.api.common.player.license.utils.UnobtainableReason import dev.slne.surf.surfapi.core.api.util.mutableObjectSetOf import dev.slne.surf.surfapi.core.api.util.objectSetOf import dev.slne.surf.surfapi.core.api.util.toObjectSet @@ -15,7 +13,7 @@ import net.kyori.adventure.text.Component abstract class LicenseImpl( override val key: Key, override val displayName: Component, - override val description: LoreBuilder.() -> Unit, + override val description: Component, override val price: Int, override val dependencies: ObjectSet = objectSetOf(), override val permission: String = LicensePermissionRegistry.createLicensePermission(key) @@ -69,8 +67,4 @@ abstract class LicenseImpl( override fun hashCode() = key.hashCode() - override fun toString(): String { - return "LicenseImpl(key=$key, displayName=$displayName, description=$description, price=$price, dependencies=$dependencies, permission='$permission')" - } - } \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/licenses/civilian/CivilianFishingLicenseImpl.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/licenses/civilian/CivilianFishingLicenseImpl.kt new file mode 100644 index 0000000..1fd18ce --- /dev/null +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/licenses/civilian/CivilianFishingLicenseImpl.kt @@ -0,0 +1,15 @@ +package dev.slne.surf.roleplay.core.common.player.license.licenses.civilian + +import dev.slne.surf.roleplay.api.common.player.license.licenses.civilian.CivilianFishingLicense +import dev.slne.surf.roleplay.core.common.player.license.LicenseImpl +import dev.slne.surf.surfapi.core.api.messages.adventure.buildText +import dev.slne.surf.surfapi.core.api.messages.adventure.key + +object CivilianFishingLicenseImpl : LicenseImpl( + key = key("roleplay", "fishing_license"), + displayName = buildText { primary("Angelschein") }, + description = buildText { + spacer("Die Angel-Lizenz erlaubt es dir, in der Wildnis zu angeln.") + }, + price = 500, +), CivilianFishingLicense \ No newline at end of file diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/licenses/civilian/CivilianVehicleLicenseImpl.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/licenses/civilian/CivilianVehicleLicenseImpl.kt similarity index 59% rename from surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/licenses/civilian/CivilianVehicleLicenseImpl.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/licenses/civilian/CivilianVehicleLicenseImpl.kt index ae845b7..9ab2182 100644 --- a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/licenses/civilian/CivilianVehicleLicenseImpl.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/licenses/civilian/CivilianVehicleLicenseImpl.kt @@ -1,9 +1,10 @@ -package dev.slne.surf.roleplay.core.player.license.licenses.civilian +package dev.slne.surf.roleplay.core.common.player.license.licenses.civilian -import dev.slne.surf.roleplay.api.player.license.License -import dev.slne.surf.roleplay.api.player.license.licenses.civilian.CivilianVehicleLicense -import dev.slne.surf.roleplay.core.player.license.ExpirableLicenseImpl -import dev.slne.surf.roleplay.core.player.license.LicenseImpl +import dev.slne.surf.roleplay.api.common.player.license.License +import dev.slne.surf.roleplay.api.common.player.license.licenses.civilian.CivilianVehicleLicense +import dev.slne.surf.roleplay.core.common.player.license.ExpirableLicenseImpl +import dev.slne.surf.roleplay.core.common.player.license.LicenseImpl +import dev.slne.surf.surfapi.core.api.messages.adventure.buildText import dev.slne.surf.surfapi.core.api.messages.adventure.key import dev.slne.surf.surfapi.core.api.util.objectSetOf import net.kyori.adventure.text.Component @@ -18,15 +19,14 @@ object CivilianVehicleLicenseImpl { registration(MotorcycleLicenseImpl) registration(BoatLicenseImpl) registration(PilotLicenseImpl) + registration(HelicopterLicenseImpl) } object DriversLicenseImpl : LicenseImpl( key = key("roleplay", "drivers_license"), displayName = Component.text("Führerschein"), - description = { - line { - spacer("Der Führerschein erlaubt es dir, Fahrzeuge zu führen.") - } + description = buildText { + spacer("Der Führerschein erlaubt es dir, Fahrzeuge zu führen.") }, price = 1000, ), CivilianVehicleLicense.DriversLicense @@ -34,26 +34,21 @@ object CivilianVehicleLicenseImpl { object TruckLicenseImpl : ExpirableLicenseImpl( key = key("roleplay", "truck_license"), displayName = Component.text("Lkw-Führerschein"), - description = { - line { - spacer("Der Lkw-Führerschein erlaubt es dir, Lastkraftwagen zu fahren.") - } + description = buildText { + spacer("Der Lkw-Führerschein erlaubt es dir, Lastkraftwagen zu fahren.") }, price = 2000, expiresIn = 5.minutes, dependencies = objectSetOf( DriversLicenseImpl, - BusLicenseImpl ) ), CivilianVehicleLicense.TruckLicense object BusLicenseImpl : LicenseImpl( key = key("roleplay", "bus_license"), displayName = Component.text("Bus-Führerschein"), - description = { - line { - spacer("Der Bus-Führerschein erlaubt es dir, Busse zu fahren.") - } + description = buildText { + spacer("Der Bus-Führerschein erlaubt es dir, Busse zu fahren.") }, price = 2500, dependencies = objectSetOf( @@ -64,10 +59,9 @@ object CivilianVehicleLicenseImpl { object TaxiLicenseImpl : LicenseImpl( key = key("roleplay", "taxi_license"), displayName = Component.text("Taxi-Führerschein"), - description = { - line { - spacer("Der Taxi-Führerschein erlaubt es dir, Taxis zu fahren.") - } + description = buildText { + spacer("Der Taxi-Führerschein erlaubt es dir, Taxis zu fahren.") + }, price = 3000, dependencies = objectSetOf( @@ -78,10 +72,8 @@ object CivilianVehicleLicenseImpl { object MotorcycleLicenseImpl : LicenseImpl( key = key("roleplay", "motorcycle_license"), displayName = Component.text("Motorrad-Führerschein"), - description = { - line { - spacer("Der Motorrad-Führerschein erlaubt es dir, Motorräder zu fahren.") - } + description = buildText { + spacer("Der Motorrad-Führerschein erlaubt es dir, Motorräder zu fahren.") }, price = 1500, ), CivilianVehicleLicense.MotorcycleLicense @@ -89,10 +81,8 @@ object CivilianVehicleLicenseImpl { object BoatLicenseImpl : LicenseImpl( key = key("roleplay", "boat_license"), displayName = Component.text("Bootsführerschein"), - description = { - line { - spacer("Der Bootsführerschein erlaubt es dir, Boote zu fahren.") - } + description = buildText { + spacer("Der Bootsführerschein erlaubt es dir, Boote zu fahren.") }, price = 1800, ), CivilianVehicleLicense.BoatLicense @@ -100,11 +90,18 @@ object CivilianVehicleLicenseImpl { object PilotLicenseImpl : LicenseImpl( key = key("roleplay", "pilot_license"), displayName = Component.text("Pilotenschein"), - description = { - line { - spacer("Der Pilotenschein erlaubt es dir, Flugzeuge zu fliegen.") - } + description = buildText { + spacer("Der Pilotenschein erlaubt es dir, Flugzeuge zu fliegen.") }, price = 5000, ), CivilianVehicleLicense.PilotLicense + + object HelicopterLicenseImpl : LicenseImpl( + key = key("roleplay", "helicopter_license"), + displayName = Component.text("Hubschrauber-Führerschein"), + description = buildText { + spacer("Der Hubschrauber-Führerschein erlaubt es dir, Hubschrauber zu fliegen.") + }, + price = 6000, + ), CivilianVehicleLicense.HelicopterLicense } \ No newline at end of file diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/licenses/civilian/CivilianWeaponLicenseImpl.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/licenses/civilian/CivilianWeaponLicenseImpl.kt similarity index 61% rename from surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/licenses/civilian/CivilianWeaponLicenseImpl.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/licenses/civilian/CivilianWeaponLicenseImpl.kt index d427d72..acabcfa 100644 --- a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/licenses/civilian/CivilianWeaponLicenseImpl.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/licenses/civilian/CivilianWeaponLicenseImpl.kt @@ -1,8 +1,8 @@ -package dev.slne.surf.roleplay.core.player.license.licenses.civilian +package dev.slne.surf.roleplay.core.common.player.license.licenses.civilian -import dev.slne.surf.roleplay.api.player.license.License -import dev.slne.surf.roleplay.api.player.license.licenses.civilian.CivilianWeaponLicense -import dev.slne.surf.roleplay.core.player.license.LicenseImpl +import dev.slne.surf.roleplay.api.common.player.license.License +import dev.slne.surf.roleplay.api.common.player.license.licenses.civilian.CivilianWeaponLicense +import dev.slne.surf.roleplay.core.common.player.license.LicenseImpl import dev.slne.surf.surfapi.core.api.messages.adventure.buildText import dev.slne.surf.surfapi.core.api.messages.adventure.key import dev.slne.surf.surfapi.core.api.util.objectSetOf @@ -16,10 +16,8 @@ object CivilianWeaponLicenseImpl { object LightWeaponLicenseImpl : LicenseImpl( key = key("roleplay", "light_weapon_license"), displayName = buildText { success("Kleiner Waffenschein") }, - description = { - line { - info("Erlaubt das Führen von leichten Waffen wie Pistolen und Revolvern.") - } + description = buildText { + spacer("Erlaubt das Führen von leichten Waffen wie Pistolen und Revolvern.") }, price = 5000 ), CivilianWeaponLicense.LightWeaponLicense @@ -27,10 +25,8 @@ object CivilianWeaponLicenseImpl { object HeavyWeaponLicenseImpl : LicenseImpl( key = key("roleplay", "heavy_weapon_license"), displayName = buildText { error("Großer Waffenschein") }, - description = { - line { - info("Erlaubt das Führen von schweren Waffen wie Maschinengewehren und Scharfschützengewehren.") - } + description = buildText { + spacer("Erlaubt das Führen von schweren Waffen wie Maschinengewehren und Scharfschützengewehren.") }, price = 10000, dependencies = objectSetOf( diff --git a/surf-roleplay-mechanic-old/build.gradle.kts b/surf-roleplay-mechanic-old/build.gradle.kts deleted file mode 100644 index 8710723..0000000 --- a/surf-roleplay-mechanic-old/build.gradle.kts +++ /dev/null @@ -1,7 +0,0 @@ -plugins { - id("dev.slne.surf.surfapi.gradle.paper-raw") -} - -dependencies { - compileOnly(project(":surf-roleplay-core")) -} \ No newline at end of file diff --git a/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/idcard/IdCard.kt b/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/idcard/IdCard.kt deleted file mode 100644 index 7e177f1..0000000 --- a/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/idcard/IdCard.kt +++ /dev/null @@ -1,44 +0,0 @@ -package dev.slne.surf.roleplay.mechanic.mechanics.idcard - -import dev.slne.surf.surfapi.bukkit.api.builder.ItemStack -import dev.slne.surf.surfapi.bukkit.api.builder.buildLore -import dev.slne.surf.surfapi.bukkit.api.builder.displayName -import dev.slne.surf.surfapi.core.api.font.toSmallCaps -import org.bukkit.Material -import org.bukkit.NamespacedKey -import org.bukkit.persistence.PersistentDataType -import java.time.LocalDate -import java.time.format.DateTimeFormatter - - -object IdCard { - - internal val formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy") - val idCardKey = NamespacedKey("surf-roleplay-mechanic", "id_card") - - fun idCard(firstName: String, lastName: String, birthDate: LocalDate) = ItemStack(Material.FEATHER) { - displayName { - primary("Personalausweis") - } - buildLore { - line { - spacer(" - ") - variableKey("Vorname: ".toSmallCaps()) - variableValue(firstName) - } - line { - spacer(" - ") - variableKey("nachname: ".toSmallCaps()) - variableValue(lastName) - } - line { - spacer(" - ") - variableKey("geburtsdatum: ".toSmallCaps()) - variableValue(formatter.format(birthDate)) - } - } - editPersistentDataContainer { - it.set(idCardKey, PersistentDataType.BYTE, 1.toByte()) - } - } -} \ No newline at end of file diff --git a/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/RentableMechanicImpl.kt b/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/RentableMechanicImpl.kt deleted file mode 100644 index d68cf71..0000000 --- a/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/RentableMechanicImpl.kt +++ /dev/null @@ -1,160 +0,0 @@ -package dev.slne.surf.roleplay.mechanic.mechanics.rentable - -import com.github.shynixn.mccoroutine.folia.launch -import dev.jorel.commandapi.arguments.ArgumentSuggestions -import dev.jorel.commandapi.kotlindsl.* -import dev.slne.surf.roleplay.api.mechanic.rentable.Rentable -import dev.slne.surf.roleplay.api.mechanic.rentable.RentableMechanic -import dev.slne.surf.roleplay.api.mechanic.rentable.events.RentableOwnerChangeEvent -import dev.slne.surf.roleplay.api.mechanic.rentable.events.RentableRentCollectEvent -import dev.slne.surf.roleplay.api.player.RpPlayer -import dev.slne.surf.roleplay.api.player.rpPlayer -import dev.slne.surf.roleplay.mechanic.MechanicImpl -import dev.slne.surf.roleplay.mechanic.mechanics.rentable.listeners.RentCollectedListener -import dev.slne.surf.roleplay.mechanic.mechanics.rentable.listeners.RentableListener -import dev.slne.surf.roleplay.mechanic.mechanics.rentable.listeners.RentableOnlineListener -import dev.slne.surf.roleplay.mechanic.mechanics.rentable.rentables.HouseImpl -import dev.slne.surf.roleplay.mechanic.plugin -import dev.slne.surf.surfapi.core.api.messages.adventure.appendNewline -import dev.slne.surf.surfapi.core.api.messages.adventure.key -import dev.slne.surf.surfapi.core.api.messages.adventure.sendText -import dev.slne.surf.surfapi.core.api.util.freeze -import dev.slne.surf.surfapi.core.api.util.mutableObjectSetOf -import dev.slne.surf.surfapi.core.api.util.objectSetOf -import dev.slne.surf.surfapi.core.api.util.toObjectSet -import net.kyori.adventure.key.Key -import org.bukkit.NamespacedKey -import kotlin.time.Duration.Companion.seconds - -object RentableMechanicImpl : MechanicImpl( - name = "RentableMechanic", - handlers = objectSetOf( - RentableOnlineListener, - RentCollectedListener, - RentableListener - ), - rpJobs = objectSetOf( - RentCollectorJob - ) -), RentableMechanic { - - private val _rentables = mutableObjectSetOf() - override val rentables get() = _rentables.freeze() - - override fun addRentable(rentable: Rentable) = _rentables.add(rentable) - - override suspend fun onEnable() { - val rentable = HouseImpl( - key = key("roleplay_house", "house_1"), - rent = 1000, - rentDuration = 10.seconds, - size = 100.0, - stories = 3, - storageContainers = objectSetOf(), - doors = objectSetOf() - ) - - addRentable(rentable) - - commandAPICommand("rentable") { - subcommand("rent") { - namespacedKeyArgument("rentableKey") { - replaceSuggestions(ArgumentSuggestions.stringCollection { info -> - rentables.map { it.key.asString() } - }) - } - - playerExecutor { player, args -> - val rentableKey: NamespacedKey by args - val rentable = getByKey(rentableKey) ?: run { - player.sendText { - appendPrefix() - - error("Es konnte kein Mietobjekt mit dem Key ") - variableValue(rentableKey.asString()) - error(" gefunden werden.") - - } - - return@playerExecutor - } - - if (rentable.isRented) { - player.sendText { - appendPrefix() - - error("Das Mietobjekt ") - variableValue(rentableKey.asString()) - error(" ist bereits vermietet.") - - return@playerExecutor - } - } - - plugin.launch { - val rpPlayer = player.rpPlayer() - - val result = rentable.setOwner( - rpPlayer, - RentableOwnerChangeEvent.OwnerChangeReason.RentableBought - ) - - if (result is RentableOwnerChangeEvent.OwnerSetResult.Success) { - player.sendText { - appendPrefix() - - success("Du hast das Mietobjekt ") - variableValue(rentableKey.asString()) - success(" erfolgreich gemietet.") - } - } else if (result is RentableOwnerChangeEvent.OwnerSetResult.Failure) { - player.sendText { - appendPrefix() - - error("Das Mietobjekt ") - variableValue(rentableKey.asString()) - error(" konnte nicht gemietet werden: ") - appendNewline(2) - - result.reason.message(this) - } - } - } - } - } - } - } - - override suspend fun collectRent(rentable: Rentable): RentableMechanic.RentCollectResult { - val currentOwner = rentable.owner ?: return RentableMechanic.RentCollectResult.NOT_RENTED - val currentBankBalance = currentOwner.getBankBalance() - - val event = RentableRentCollectEvent( - rentable = rentable, - amount = rentable.rent - ) - - if (!event.callEvent()) { - return RentableMechanic.RentCollectResult.EVENT_CANCELLED - } - - val rent = event.amount - - if (rent > currentBankBalance) { - return RentableMechanic.RentCollectResult.NOT_ENOUGH_MONEY - } - - currentOwner.removeBankBalance(rent) - - return RentableMechanic.RentCollectResult.SUCCESS - } - - override fun getOwnedRentablesByPlayer(player: RpPlayer) = - _rentables.filter { it.owner == player }.toObjectSet() - - override fun getMaxOwnableRentablesByPlayer(player: RpPlayer) = 1 - - override fun getByKey(key: Key) = _rentables.find { it.key == key } - ?: _rentables.find { it.key.asString() == key.asString() } - ?: _rentables.find { it.key.namespace() == key.namespace() && it.key.value() == key.value() } -} \ No newline at end of file diff --git a/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/listeners/RentableOnlineListener.kt b/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/listeners/RentableOnlineListener.kt deleted file mode 100644 index 549e55d..0000000 --- a/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/listeners/RentableOnlineListener.kt +++ /dev/null @@ -1,27 +0,0 @@ -package dev.slne.surf.roleplay.mechanic.mechanics.rentable.listeners - -import com.github.shynixn.mccoroutine.folia.launch -import dev.slne.surf.roleplay.api.mechanic.Mechanic -import dev.slne.surf.roleplay.api.mechanic.rentable.RentableMechanic -import dev.slne.surf.roleplay.api.mechanic.rentable.events.RentableOwnerChangeEvent -import dev.slne.surf.roleplay.api.player.events.RpPlayerQuitEvent -import dev.slne.surf.roleplay.mechanic.plugin -import org.bukkit.event.EventHandler -import org.bukkit.event.EventPriority -import org.bukkit.event.Listener - -object RentableOnlineListener : Listener { - - @EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR) - fun onRpPlayerQuit(event: RpPlayerQuitEvent) { - val mechanic = Mechanic.getMechanic() - val ownedRentables = mechanic.getOwnedRentablesByPlayer(event.rpPlayer) - - plugin.launch { - ownedRentables.forEach { rentable -> - rentable.setOwner(null, RentableOwnerChangeEvent.OwnerChangeReason.OwnerQuit) - } - } - } - -} \ No newline at end of file diff --git a/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/Cracker.kt b/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/Cracker.kt deleted file mode 100644 index 82a32e2..0000000 --- a/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/Cracker.kt +++ /dev/null @@ -1,19 +0,0 @@ -package dev.slne.surf.roleplay.mechanic.mechanics.rentable.utils - -import dev.slne.surf.roleplay.api.mechanic.rentable.utils.Crackable -import dev.slne.surf.roleplay.api.mechanic.rentable.utils.LockPick -import dev.slne.surf.roleplay.api.player.RpPlayer - -object Cracker { - - fun crack( - player: RpPlayer, - crackable: Crackable, - lockPick: LockPick, - successAction: () -> Unit - ): LockPick.LockPickResult { - successAction() - return LockPick.LockPickResult.SUCCESS - } - -} \ No newline at end of file diff --git a/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/doors/FrontDoor.kt b/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/doors/FrontDoor.kt deleted file mode 100644 index 78493da..0000000 --- a/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/doors/FrontDoor.kt +++ /dev/null @@ -1,18 +0,0 @@ -package dev.slne.surf.roleplay.mechanic.mechanics.rentable.utils.doors - -import dev.slne.surf.roleplay.api.mechanic.rentable.Rentable -import dev.slne.surf.roleplay.api.mechanic.rentable.utils.door.DoorContainer -import dev.slne.surf.roleplay.mechanic.mechanics.rentable.utils.DoorImpl -import org.bukkit.Location -import kotlin.time.Duration.Companion.seconds - -class FrontDoor( - rentable: Rentable, - container: DoorContainer, - location: Location -) : DoorImpl( - rentable = rentable, - container = container, - location = location, - crackDuration = 30.seconds -) \ No newline at end of file diff --git a/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/doors/GarageDoor.kt b/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/doors/GarageDoor.kt deleted file mode 100644 index 7eba985..0000000 --- a/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/doors/GarageDoor.kt +++ /dev/null @@ -1,18 +0,0 @@ -package dev.slne.surf.roleplay.mechanic.mechanics.rentable.utils.doors - -import dev.slne.surf.roleplay.api.mechanic.rentable.Rentable -import dev.slne.surf.roleplay.api.mechanic.rentable.utils.door.DoorContainer -import dev.slne.surf.roleplay.mechanic.mechanics.rentable.utils.DoorImpl -import org.bukkit.Location -import kotlin.time.Duration.Companion.seconds - -class GarageDoor( - rentable: Rentable, - container: DoorContainer, - location: Location -) : DoorImpl( - rentable = rentable, - container = container, - location = location, - crackDuration = 15.seconds -) \ No newline at end of file diff --git a/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/doors/RegularDoor.kt b/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/doors/RegularDoor.kt deleted file mode 100644 index 5498bed..0000000 --- a/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/doors/RegularDoor.kt +++ /dev/null @@ -1,18 +0,0 @@ -package dev.slne.surf.roleplay.mechanic.mechanics.rentable.utils.doors - -import dev.slne.surf.roleplay.api.mechanic.rentable.Rentable -import dev.slne.surf.roleplay.api.mechanic.rentable.utils.door.DoorContainer -import dev.slne.surf.roleplay.mechanic.mechanics.rentable.utils.DoorImpl -import org.bukkit.Location -import kotlin.time.Duration.Companion.seconds - -class RegularDoor( - rentable: Rentable, - container: DoorContainer, - location: Location -) : DoorImpl( - rentable = rentable, - container = container, - location = location, - crackDuration = 15.seconds -) \ No newline at end of file diff --git a/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/lockpick/BatteringRam.kt b/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/lockpick/BatteringRam.kt deleted file mode 100644 index 6c67e77..0000000 --- a/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/lockpick/BatteringRam.kt +++ /dev/null @@ -1,10 +0,0 @@ -package dev.slne.surf.roleplay.mechanic.mechanics.rentable.utils.lockpick - -import dev.slne.surf.roleplay.mechanic.mechanics.rentable.utils.LockPickImpl - -object BatteringRam : LockPickImpl( - displayName = { - primary("Rammbock") - }, - breakChance = { 0.0 } -) \ No newline at end of file diff --git a/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/lockpick/PremiumLockPick.kt b/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/lockpick/PremiumLockPick.kt deleted file mode 100644 index ca36a13..0000000 --- a/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/lockpick/PremiumLockPick.kt +++ /dev/null @@ -1,10 +0,0 @@ -package dev.slne.surf.roleplay.mechanic.mechanics.rentable.utils.lockpick - -import dev.slne.surf.roleplay.mechanic.mechanics.rentable.utils.LockPickImpl - -object PremiumLockPick : LockPickImpl( - displayName = { - primary("Verzinkter Vierkantstahl Dietrich") - }, - breakChance = { 0.1 } -) \ No newline at end of file diff --git a/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/lockpick/RegularLockPick.kt b/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/lockpick/RegularLockPick.kt deleted file mode 100644 index a3b9cb1..0000000 --- a/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/utils/lockpick/RegularLockPick.kt +++ /dev/null @@ -1,10 +0,0 @@ -package dev.slne.surf.roleplay.mechanic.mechanics.rentable.utils.lockpick - -import dev.slne.surf.roleplay.mechanic.mechanics.rentable.utils.LockPickImpl - -object RegularLockPick : LockPickImpl( - displayName = { - primary("Dietrich") - }, - breakChance = { 0.5 } -) \ No newline at end of file diff --git a/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/utils/PermissionRegistry.kt b/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/utils/PermissionRegistry.kt deleted file mode 100644 index fad0861..0000000 --- a/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/utils/PermissionRegistry.kt +++ /dev/null @@ -1,10 +0,0 @@ -package dev.slne.surf.roleplay.mechanic.mechanics.utils - -import dev.slne.surf.surfapi.bukkit.api.permission.PermissionRegistry - -object PermissionRegistry : PermissionRegistry() { - - const val PREFIX = "surf.roleplay.mechanic" - private const val COMMAND_PREFIX = "$PREFIX.command" - -} \ No newline at end of file diff --git a/surf-roleplay-paper-old/build.gradle.kts b/surf-roleplay-paper-old/build.gradle.kts deleted file mode 100644 index 2d2bf72..0000000 --- a/surf-roleplay-paper-old/build.gradle.kts +++ /dev/null @@ -1,41 +0,0 @@ -import dev.slne.surf.surfapi.gradle.util.registerRequired -import dev.slne.surf.surfapi.gradle.util.withSurfApiBukkit - -plugins { - id("dev.slne.surf.surfapi.gradle.paper-plugin") -} - -dependencies { - api(project(":surf-roleplay-core")) - api(project(":surf-roleplay-mechanic")) - - runtimeOnly(libs.surf.database) -} - -surfPaperPluginApi { - mainClass("dev.slne.surf.roleplay.paper.SurfRoleplay") - generateLibraryLoader(false) - authors.add("Ammo") - foliaSupported(true) - - serverDependencies { - registerRequired("surf-npc-bukkit") - } - - runServer { - withSurfApiBukkit() - - val npcVersion = - libs.surf.npc.api.get().version ?: error("NPC API version is not specified") - val npcAsset = "surf-npc-bukkit-${npcVersion}.jar" - - downloadPlugins { - github( - "slne-development", - "surf-npc", - "v$npcVersion", - npcAsset - ) - } - } -} \ No newline at end of file diff --git a/surf-roleplay-paper-old/src/main/kotlin/dev/slne/surf/roleplay/paper/SurfRoleplay.kt b/surf-roleplay-paper-old/src/main/kotlin/dev/slne/surf/roleplay/paper/SurfRoleplay.kt deleted file mode 100644 index 96e7e53..0000000 --- a/surf-roleplay-paper-old/src/main/kotlin/dev/slne/surf/roleplay/paper/SurfRoleplay.kt +++ /dev/null @@ -1,185 +0,0 @@ -package dev.slne.surf.roleplay.paper - -import com.github.shynixn.mccoroutine.folia.SuspendingJavaPlugin -import com.github.shynixn.mccoroutine.folia.launch -import dev.jorel.commandapi.kotlindsl.* -import dev.slne.surf.roleplay.api.player.rpPlayer -import dev.slne.surf.roleplay.api.player.utils.BalanceType -import dev.slne.surf.roleplay.core.RpCore -import dev.slne.surf.roleplay.core.RpDatabase -import dev.slne.surf.roleplay.core.player.license.licenseServiceImpl -import dev.slne.surf.roleplay.mechanic.mechanicRegistryImpl -import dev.slne.surf.roleplay.paper.command.args.balanceTypeArgument -import dev.slne.surf.roleplay.paper.listeners.ListenerManager -import dev.slne.surf.surfapi.core.api.messages.adventure.sendText -import org.bukkit.entity.Player -import org.bukkit.plugin.java.JavaPlugin - -val plugin get() = JavaPlugin.getPlugin(SurfRoleplay::class.java) - -class SurfRoleplay : SuspendingJavaPlugin() { - - private lateinit var rpDatabase: RpDatabase - - override suspend fun onLoadAsync() { - RpCore.plugin = this - rpDatabase = RpDatabase(dataPath) - - mechanicRegistryImpl.registerMechanics(this) - mechanicRegistryImpl.registerDatabaseTables(rpDatabase) - - licenseServiceImpl.onLoad() - - rpDatabase.onLoad() - - mechanicRegistryImpl.loadMechanics() - } - - override suspend fun onEnableAsync() { - ListenerManager.registerListeners() - - mechanicRegistryImpl.enableMechanics() - mechanicRegistryImpl.registerBukkitHandlers() - - licenseServiceImpl.onEnable() - - commandAPICommand("balance") { - subcommand("get") { - balanceTypeArgument("balanceType") - entitySelectorArgumentOnePlayer("player") - - playerExecutor { sender, args -> - val player: Player by args - val balanceType: BalanceType by args - - plugin.launch { - val rpPlayer = player.rpPlayer() - val balance = rpPlayer.getBalance(balanceType) - - sender.sendText { - appendPrefix() - - info("Der Kontostand von ") - append(rpPlayer) - info(" beträgt: ") - variableValue(balance) - info(".") - } - } - } - } - - subcommand("set") { - balanceTypeArgument("balanceType") - entitySelectorArgumentOnePlayer("player") - integerArgument("amount") - - playerExecutor { sender, args -> - val player: Player by args - val balanceType: BalanceType by args - val amount: Int by args - - plugin.launch { - val rpPlayer = player.rpPlayer() - val currentAmount = rpPlayer.getBalance(balanceType) - - rpPlayer.removeBalance(balanceType, currentAmount) - rpPlayer.addBalance(balanceType, amount) - - sender.sendText { - appendPrefix() - - info("Der Kontostand von ") - append(rpPlayer) - info(" wurde auf ") - variableValue(amount) - info(" gesetzt.") - } - } - } - } - - subcommand("add") { - balanceTypeArgument("balanceType") - entitySelectorArgumentOnePlayer("player") - integerArgument("amount") - - playerExecutor { sender, args -> - val player: Player by args - val balanceType: BalanceType by args - val amount: Int by args - - plugin.launch { - val rpPlayer = player.rpPlayer() - rpPlayer.addBalance(balanceType, amount) - - sender.sendText { - appendPrefix() - - info("Der Kontostand von ") - append(rpPlayer) - info(" wurde um ") - variableValue(amount) - info(" erhöht.") - } - } - } - } - - subcommand("remove") { - balanceTypeArgument("balanceType") - entitySelectorArgumentOnePlayer("player") - integerArgument("amount") - - playerExecutor { sender, args -> - val player: Player by args - val balanceType: BalanceType by args - val amount: Int by args - - plugin.launch { - val rpPlayer = player.rpPlayer() - rpPlayer.removeBalance(balanceType, amount) - - sender.sendText { - appendPrefix() - - info("Der Kontostand von ") - append(rpPlayer) - info(" wurde um ") - variableValue(amount) - info(" verringert.") - } - } - } - } - } - - commandAPICommand("active-identity") { - playerExecutor { player, args -> - plugin.launch { - val rpPlayer = player.rpPlayer() - val activeIdentity = rpPlayer.activeIdentity - - player.sendText { - appendPrefix() - - info("Deine aktive Identität: ") - if (activeIdentity != null) { - append(activeIdentity.type) - } else { - variableValue("Keine aktive Identität gesetzt") - } - } - } - } - } - } - - override suspend fun onDisableAsync() { - licenseServiceImpl.onDisable() - mechanicRegistryImpl.disableMechanics() - - rpDatabase.onDisable() - } - -} \ No newline at end of file diff --git a/surf-roleplay-paper/build.gradle.kts b/surf-roleplay-paper/build.gradle.kts index 330e542..ca35863 100644 --- a/surf-roleplay-paper/build.gradle.kts +++ b/surf-roleplay-paper/build.gradle.kts @@ -1,4 +1,5 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar +import dev.slne.surf.surfapi.gradle.util.registerRequired plugins { id("dev.slne.surf.surfapi.gradle.paper-plugin") @@ -7,11 +8,18 @@ plugins { surfPaperPluginApi { withCloudClientPaper() mainClass("dev.slne.surf.roleplay.paper.PaperMain") + foliaSupported(true) + + serverDependencies { + registerRequired("surf-npc-bukkit") + } } dependencies { api(project(":surf-roleplay-core:surf-roleplay-core-client")) api(project(":surf-roleplay-api:surf-roleplay-client-api:surf-roleplay-client-paper-api")) + + compileOnly(libs.surf.npc.api) } tasks.withType { diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/PaperMain.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/PaperMain.kt index 7e87655..12f7f88 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/PaperMain.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/PaperMain.kt @@ -1,9 +1,26 @@ package dev.slne.surf.roleplay.paper import com.github.shynixn.mccoroutine.folia.SuspendingJavaPlugin +import dev.slne.surf.roleplay.paper.command.activeIdentityCommand +import dev.slne.surf.roleplay.paper.command.balanceCommand +import dev.slne.surf.roleplay.paper.listener.ListenerManager import org.bukkit.plugin.java.JavaPlugin class PaperMain : SuspendingJavaPlugin() { + + override suspend fun onLoadAsync() { + balanceCommand() + activeIdentityCommand() + } + + override suspend fun onEnableAsync() { + ListenerManager.registerListeners() + } + + override suspend fun onDisableAsync() { + + } + } val plugin get() = JavaPlugin.getPlugin(PaperMain::class.java) \ No newline at end of file diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/SurfRoleplay.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/SurfRoleplay.kt new file mode 100644 index 0000000..dcb75d2 --- /dev/null +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/SurfRoleplay.kt @@ -0,0 +1,41 @@ +package dev.slne.surf.roleplay.paper + +//val plugin get() = JavaPlugin.getPlugin(SurfRoleplay::class.java) +// +//class SurfRoleplay : SuspendingJavaPlugin() { +// +// private lateinit var rpDatabase: RpDatabase +// +// override suspend fun onLoadAsync() { +// RpCore.plugin = this +// rpDatabase = RpDatabase(dataPath) +// +// mechanicRegistryImpl.registerMechanics(this) +// mechanicRegistryImpl.registerDatabaseTables(rpDatabase) +// +// licenseServiceImpl.onLoad() +// +// rpDatabase.onLoad() +// +// mechanicRegistryImpl.loadMechanics() +// } +// +// override suspend fun onEnableAsync() { +// ListenerManager.registerListeners() +// +// mechanicRegistryImpl.enableMechanics() +// mechanicRegistryImpl.registerBukkitHandlers() +// +// licenseServiceImpl.onEnable() +// +// +// } +// +// override suspend fun onDisableAsync() { +// licenseServiceImpl.onDisable() +// mechanicRegistryImpl.disableMechanics() +// +// rpDatabase.onDisable() +// } +// +//} \ No newline at end of file diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/command/ActiveIdentityCommand.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/command/ActiveIdentityCommand.kt new file mode 100644 index 0000000..9a3d624 --- /dev/null +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/command/ActiveIdentityCommand.kt @@ -0,0 +1,28 @@ +package dev.slne.surf.roleplay.paper.command + +import com.github.shynixn.mccoroutine.folia.launch +import dev.jorel.commandapi.kotlindsl.commandAPICommand +import dev.jorel.commandapi.kotlindsl.playerExecutor +import dev.slne.surf.roleplay.api.paper.player.rpPlayer +import dev.slne.surf.roleplay.paper.plugin +import dev.slne.surf.surfapi.core.api.messages.adventure.sendText + +fun activeIdentityCommand() = commandAPICommand("active-identity") { + playerExecutor { player, args -> + plugin.launch { + val rpPlayer = player.rpPlayer + val activeIdentity = rpPlayer.activeIdentity + + player.sendText { + appendPrefix() + + info("Deine aktive Identität: ") + if (activeIdentity != null) { + append(activeIdentity.type) + } else { + variableValue("Keine aktive Identität gesetzt") + } + } + } + } +} \ No newline at end of file diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/command/BalanceCommand.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/command/BalanceCommand.kt new file mode 100644 index 0000000..67beb84 --- /dev/null +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/command/BalanceCommand.kt @@ -0,0 +1,121 @@ +package dev.slne.surf.roleplay.paper.command + +import com.github.shynixn.mccoroutine.folia.launch +import dev.jorel.commandapi.kotlindsl.* +import dev.slne.surf.roleplay.api.common.transaction.utils.BalanceType +import dev.slne.surf.roleplay.api.paper.player.rpPlayer +import dev.slne.surf.roleplay.paper.command.args.balanceTypeArgument +import dev.slne.surf.roleplay.paper.plugin +import dev.slne.surf.surfapi.core.api.messages.adventure.sendText +import org.bukkit.entity.Player + +fun balanceCommand() = commandAPICommand("balance") { + subcommand("get") { + balanceTypeArgument("balanceType") + entitySelectorArgumentOnePlayer("player") + + playerExecutor { sender, args -> + val player: Player by args + val balanceType: BalanceType by args + + plugin.launch { + val rpPlayer = player.rpPlayer + val balance = rpPlayer.getBalance(balanceType) + + sender.sendText { + appendPrefix() + + info("Der Kontostand von ") + append(rpPlayer.asComponent()) + info(" beträgt: ") + variableValue(balance) + info(".") + } + } + } + } + + subcommand("set") { + balanceTypeArgument("balanceType") + entitySelectorArgumentOnePlayer("player") + integerArgument("amount") + + playerExecutor { sender, args -> + val player: Player by args + val balanceType: BalanceType by args + val amount: Int by args + + plugin.launch { + val rpPlayer = player.rpPlayer + val currentAmount = rpPlayer.getBalance(balanceType) + + rpPlayer.removeBalance(balanceType, currentAmount) + rpPlayer.addBalance(balanceType, amount) + + sender.sendText { + appendPrefix() + + info("Der Kontostand von ") + append(rpPlayer.asComponent()) + info(" wurde auf ") + variableValue(amount) + info(" gesetzt.") + } + } + } + } + + subcommand("add") { + balanceTypeArgument("balanceType") + entitySelectorArgumentOnePlayer("player") + integerArgument("amount") + + playerExecutor { sender, args -> + val player: Player by args + val balanceType: BalanceType by args + val amount: Int by args + + plugin.launch { + val rpPlayer = player.rpPlayer + rpPlayer.addBalance(balanceType, amount) + + sender.sendText { + appendPrefix() + + info("Der Kontostand von ") + append(rpPlayer.asComponent()) + info(" wurde um ") + variableValue(amount) + info(" erhöht.") + } + } + } + } + + subcommand("remove") { + balanceTypeArgument("balanceType") + entitySelectorArgumentOnePlayer("player") + integerArgument("amount") + + playerExecutor { sender, args -> + val player: Player by args + val balanceType: BalanceType by args + val amount: Int by args + + plugin.launch { + val rpPlayer = player.rpPlayer + rpPlayer.removeBalance(balanceType, amount) + + sender.sendText { + appendPrefix() + + info("Der Kontostand von ") + append(rpPlayer.asComponent()) + info(" wurde um ") + variableValue(amount) + info(" verringert.") + } + } + } + } +} \ No newline at end of file diff --git a/surf-roleplay-paper-old/src/main/kotlin/dev/slne/surf/roleplay/paper/command/args/BalanceTypeArgument.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/command/args/BalanceTypeArgument.kt similarity index 92% rename from surf-roleplay-paper-old/src/main/kotlin/dev/slne/surf/roleplay/paper/command/args/BalanceTypeArgument.kt rename to surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/command/args/BalanceTypeArgument.kt index 0139d07..ede66ec 100644 --- a/surf-roleplay-paper-old/src/main/kotlin/dev/slne/surf/roleplay/paper/command/args/BalanceTypeArgument.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/command/args/BalanceTypeArgument.kt @@ -5,7 +5,7 @@ import dev.jorel.commandapi.arguments.Argument import dev.jorel.commandapi.arguments.ArgumentSuggestions import dev.jorel.commandapi.arguments.CustomArgument import dev.jorel.commandapi.arguments.StringArgument -import dev.slne.surf.roleplay.api.player.utils.BalanceType +import dev.slne.surf.roleplay.api.common.transaction.utils.BalanceType class BalanceTypeArgument(nodeName: String) : CustomArgument( StringArgument(nodeName), diff --git a/surf-roleplay-paper-old/src/main/kotlin/dev/slne/surf/roleplay/paper/listeners/ListenerManager.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/listener/ListenerManager.kt similarity index 97% rename from surf-roleplay-paper-old/src/main/kotlin/dev/slne/surf/roleplay/paper/listeners/ListenerManager.kt rename to surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/listener/ListenerManager.kt index 26b821f..d7af235 100644 --- a/surf-roleplay-paper-old/src/main/kotlin/dev/slne/surf/roleplay/paper/listeners/ListenerManager.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/listener/ListenerManager.kt @@ -1,6 +1,6 @@ @file:Suppress("UnstableApiUsage") -package dev.slne.surf.roleplay.paper.listeners +package dev.slne.surf.roleplay.paper.listener import com.github.retrooper.packetevents.PacketEvents import com.github.retrooper.packetevents.event.PacketListener @@ -16,7 +16,7 @@ import com.github.shynixn.mccoroutine.folia.launch import com.github.shynixn.mccoroutine.folia.regionDispatcher import dev.jorel.commandapi.kotlindsl.commandAPICommand import dev.jorel.commandapi.kotlindsl.playerExecutor -import dev.slne.surf.roleplay.paper.identity.listener.IdentityOnlineListener +import dev.slne.surf.roleplay.paper.player.identity.listener.IdentityOnlineListener import dev.slne.surf.roleplay.paper.plugin import dev.slne.surf.surfapi.bukkit.api.builder.ItemStack import dev.slne.surf.surfapi.bukkit.api.event.register diff --git a/surf-roleplay-paper-old/src/main/kotlin/dev/slne/surf/roleplay/paper/listeners/OnlineListener.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/listener/OnlineListener.kt similarity index 66% rename from surf-roleplay-paper-old/src/main/kotlin/dev/slne/surf/roleplay/paper/listeners/OnlineListener.kt rename to surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/listener/OnlineListener.kt index 75cfffd..809d4ee 100644 --- a/surf-roleplay-paper-old/src/main/kotlin/dev/slne/surf/roleplay/paper/listeners/OnlineListener.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/listener/OnlineListener.kt @@ -1,12 +1,12 @@ -package dev.slne.surf.roleplay.paper.listeners +package dev.slne.surf.roleplay.paper.listener import com.github.shynixn.mccoroutine.folia.globalRegionDispatcher import com.github.shynixn.mccoroutine.folia.launch -import dev.slne.surf.roleplay.api.player.RpPlayer -import dev.slne.surf.roleplay.api.player.events.RpPlayerDeathEvent -import dev.slne.surf.roleplay.api.player.events.RpPlayerJoinEvent -import dev.slne.surf.roleplay.api.player.events.RpPlayerQuitEvent -import dev.slne.surf.roleplay.core.player.rpPlayerManagerImpl +import dev.slne.surf.cloud.api.client.paper.player.toCloudOfflinePlayer +import dev.slne.surf.roleplay.api.common.player.RpPlayer +import dev.slne.surf.roleplay.api.paper.player.events.RpPlayerDeathEvent +import dev.slne.surf.roleplay.api.paper.player.events.RpPlayerJoinEvent +import dev.slne.surf.roleplay.api.paper.player.events.RpPlayerQuitEvent import dev.slne.surf.roleplay.paper.plugin import kotlinx.coroutines.withContext import org.bukkit.event.EventHandler @@ -21,9 +21,7 @@ object OnlineListener : Listener { @EventHandler(priority = EventPriority.LOWEST) fun onJoin(event: PlayerJoinEvent) { plugin.launch { - val player = RpPlayer[event.player.uniqueId] - - player.updateUsername(event.player.name) + val player = RpPlayer[event.player.toCloudOfflinePlayer()] withContext(plugin.globalRegionDispatcher) { RpPlayerJoinEvent(player).callEvent() @@ -34,7 +32,7 @@ object OnlineListener : Listener { @EventHandler(priority = EventPriority.MONITOR) fun onQuit(event: PlayerQuitEvent) { plugin.launch { - val player = RpPlayer[event.player.uniqueId] + val player = RpPlayer[event.player.toCloudOfflinePlayer()] withContext(plugin.globalRegionDispatcher) { RpPlayerQuitEvent(player).callEvent() @@ -48,7 +46,7 @@ object OnlineListener : Listener { fun onPlayerDeath(event: PlayerDeathEvent) { plugin.launch { withContext(plugin.globalRegionDispatcher) { - RpPlayerDeathEvent(RpPlayer[event.player.uniqueId], event).callEvent() + RpPlayerDeathEvent(RpPlayer[event.player.toCloudOfflinePlayer()], event).callEvent() } } } diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/IdCard.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/IdCard.kt new file mode 100644 index 0000000..81b2f3d --- /dev/null +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/IdCard.kt @@ -0,0 +1,44 @@ +package dev.slne.surf.roleplay.paper.mechanics.idcard + +import dev.slne.surf.surfapi.bukkit.api.builder.ItemStack +import dev.slne.surf.surfapi.bukkit.api.builder.buildLore +import dev.slne.surf.surfapi.bukkit.api.builder.displayName +import dev.slne.surf.surfapi.core.api.font.toSmallCaps +import org.bukkit.Material +import org.bukkit.NamespacedKey +import org.bukkit.persistence.PersistentDataType +import java.time.LocalDate +import java.time.format.DateTimeFormatter + +object IdCard { + + internal val formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy") + val idCardKey = NamespacedKey("surf-roleplay-mechanic", "id_card") + + fun idCard(firstName: String, lastName: String, birthDate: LocalDate) = + ItemStack(Material.FEATHER) { + displayName { + primary("Personalausweis") + } + buildLore { + line { + spacer(" - ") + variableKey("Vorname: ".toSmallCaps()) + variableValue(firstName) + } + line { + spacer(" - ") + variableKey("nachname: ".toSmallCaps()) + variableValue(lastName) + } + line { + spacer(" - ") + variableKey("geburtsdatum: ".toSmallCaps()) + variableValue(formatter.format(birthDate)) + } + } + editPersistentDataContainer { + it.set(idCardKey, PersistentDataType.BYTE, 1.toByte()) + } + } +} \ No newline at end of file diff --git a/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/idcard/IdCardNpc.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/IdCardNpc.kt similarity index 73% rename from surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/idcard/IdCardNpc.kt rename to surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/IdCardNpc.kt index 0a35e60..6659c23 100644 --- a/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/idcard/IdCardNpc.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/IdCardNpc.kt @@ -1,15 +1,17 @@ -package dev.slne.surf.roleplay.mechanic.mechanics.idcard +package dev.slne.surf.roleplay.paper.mechanics.idcard import dev.slne.surf.npc.api.dsl.npc import dev.slne.surf.npc.api.surfNpcApi -import dev.slne.surf.roleplay.mechanic.plugin +import dev.slne.surf.roleplay.paper.plugin object IdCardNpc { + const val NPC_NAME = "idcard_npc" + suspend fun spawnNpc() { val npcSkin = surfNpcApi.getSkin("MikeyLLP") npc(plugin) { - uniqueName = IdCardMechanicImpl.NPC_NAME + uniqueName = NPC_NAME displayName = { primary("Bürgeramt") } diff --git a/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/idcard/dialogs/CreateIdDialog.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/dialogs/CreateIdDialog.kt similarity index 95% rename from surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/idcard/dialogs/CreateIdDialog.kt rename to surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/dialogs/CreateIdDialog.kt index 32b1563..a63a0ff 100644 --- a/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/idcard/dialogs/CreateIdDialog.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/dialogs/CreateIdDialog.kt @@ -1,13 +1,14 @@ @file:Suppress("UnstableApiUsage") @file:OptIn(NmsUseWithCaution::class) -package dev.slne.surf.roleplay.mechanic.mechanics.idcard.dialogs +package dev.slne.surf.roleplay.paper.mechanics.idcard.dialogs import com.github.shynixn.mccoroutine.folia.launch -import dev.slne.surf.roleplay.api.player.RpPlayer -import dev.slne.surf.roleplay.core.player.identity.identities.CivilianIdentityImpl -import dev.slne.surf.roleplay.mechanic.mechanics.idcard.IdCard -import dev.slne.surf.roleplay.mechanic.plugin +import dev.slne.surf.cloud.api.client.paper.player.toCloudOfflinePlayer +import dev.slne.surf.roleplay.api.common.player.RpPlayer +import dev.slne.surf.roleplay.core.common.player.identity.identities.CivilianIdentityImpl +import dev.slne.surf.roleplay.paper.mechanics.idcard.IdCard +import dev.slne.surf.roleplay.paper.plugin import dev.slne.surf.surfapi.bukkit.api.dialog.base import dev.slne.surf.surfapi.bukkit.api.dialog.builder.DialogBodyBuilder import dev.slne.surf.surfapi.bukkit.api.dialog.builder.actionButton @@ -151,7 +152,7 @@ private fun confirmCreationButton(): ActionButton = actionButton { val birthDate = LocalDate.parse(birthDateString, IdCard.formatter) plugin.launch { - val rpPlayer = RpPlayer[player.uniqueId] + val rpPlayer = RpPlayer[player.toCloudOfflinePlayer()] val identity = rpPlayer.createOrUpdateIdentity( CivilianIdentityImpl( @@ -161,7 +162,7 @@ private fun confirmCreationButton(): ActionButton = actionButton { dateOfBirth = birthDate ) ) - + rpPlayer.setActiveIdentity(identity) audience.showDialog(idCreationSuccess(firstName, lastName, birthDate)) diff --git a/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/idcard/listeners/IdCardHandler.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/listeners/IdCardHandler.kt similarity index 73% rename from surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/idcard/listeners/IdCardHandler.kt rename to surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/listeners/IdCardHandler.kt index 0072cb7..e1aaed8 100644 --- a/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/idcard/listeners/IdCardHandler.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/listeners/IdCardHandler.kt @@ -1,13 +1,14 @@ -package dev.slne.surf.roleplay.mechanic.mechanics.idcard.listeners +package dev.slne.surf.roleplay.paper.mechanics.idcard.listeners import com.github.shynixn.mccoroutine.folia.entityDispatcher import com.github.shynixn.mccoroutine.folia.launch +import dev.slne.surf.cloud.api.client.paper.player.toCloudOfflinePlayer import dev.slne.surf.npc.api.event.NpcInteractEvent import dev.slne.surf.npc.api.surfNpcApi -import dev.slne.surf.roleplay.api.player.RpPlayer -import dev.slne.surf.roleplay.mechanic.mechanics.idcard.IdCardMechanicImpl -import dev.slne.surf.roleplay.mechanic.mechanics.idcard.dialogs.createIdDialog -import dev.slne.surf.roleplay.mechanic.plugin +import dev.slne.surf.roleplay.api.common.player.RpPlayer +import dev.slne.surf.roleplay.paper.mechanics.idcard.IdCardNpc +import dev.slne.surf.roleplay.paper.mechanics.idcard.dialogs.createIdDialog +import dev.slne.surf.roleplay.paper.plugin import dev.slne.surf.surfapi.core.api.messages.adventure.playSound import dev.slne.surf.surfapi.core.api.messages.adventure.sendText import org.bukkit.Sound @@ -17,7 +18,7 @@ import org.bukkit.event.Listener object IdCardHandler : Listener { private val idCardNpc - get() = surfNpcApi.getNpc(IdCardMechanicImpl.NPC_NAME) + get() = surfNpcApi.getNpc(IdCardNpc.NPC_NAME) ?: error("The IDCard NPC is not registered") @EventHandler @@ -28,7 +29,7 @@ object IdCardHandler : Listener { if (npc.npcUuid != idCardNpc.npcUuid) return plugin.launch(plugin.entityDispatcher(player)) { - val rpPlayer = RpPlayer[player.uniqueId] + val rpPlayer = RpPlayer[player.toCloudOfflinePlayer()] if (rpPlayer.hasCompletedCitizenship()) { player.sendText { diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/commands/RentableCommand.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/commands/RentableCommand.kt new file mode 100644 index 0000000..e3f402b --- /dev/null +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/commands/RentableCommand.kt @@ -0,0 +1,81 @@ +package dev.slne.surf.roleplay.paper.mechanics.rentable.commands + +import com.github.shynixn.mccoroutine.folia.launch +import dev.jorel.commandapi.arguments.ArgumentSuggestions +import dev.jorel.commandapi.kotlindsl.* +import dev.slne.surf.roleplay.api.paper.player.rpPlayer +import dev.slne.surf.roleplay.api.paper.rentable.events.RentableOwnerChangeEvent +import dev.slne.surf.roleplay.core.common.mechanics.rentable.RentableMechanicImpl.getByKey +import dev.slne.surf.roleplay.core.common.mechanics.rentable.RentableMechanicImpl.rentables +import dev.slne.surf.roleplay.paper.plugin +import dev.slne.surf.surfapi.core.api.messages.adventure.appendNewline +import dev.slne.surf.surfapi.core.api.messages.adventure.sendText +import org.bukkit.NamespacedKey + +fun rentableCommand() = commandAPICommand("rentable") { + subcommand("rent") { + namespacedKeyArgument("rentableKey") { + replaceSuggestions(ArgumentSuggestions.stringCollection { info -> + rentables.map { it.key.asString() } + }) + } + + playerExecutor { player, args -> + val rentableKey: NamespacedKey by args + val rentable = getByKey(rentableKey) ?: run { + player.sendText { + appendPrefix() + + error("Es konnte kein Mietobjekt mit dem Key ") + variableValue(rentableKey.asString()) + error(" gefunden werden.") + + } + + return@playerExecutor + } + + if (rentable.isRented) { + player.sendText { + appendPrefix() + + error("Das Mietobjekt ") + variableValue(rentableKey.asString()) + error(" ist bereits vermietet.") + + return@playerExecutor + } + } + + plugin.launch { + val rpPlayer = player.rpPlayer + + val result = rentable.setOwner( + rpPlayer, + RentableOwnerChangeEvent.OwnerChangeReason.RentableBought + ) + + if (result is RentableOwnerChangeEvent.OwnerSetResult.Success) { + player.sendText { + appendPrefix() + + success("Du hast das Mietobjekt ") + variableValue(rentableKey.asString()) + success(" erfolgreich gemietet.") + } + } else if (result is RentableOwnerChangeEvent.OwnerSetResult.Failure) { + player.sendText { + appendPrefix() + + error("Das Mietobjekt ") + variableValue(rentableKey.asString()) + error(" konnte nicht gemietet werden: ") + appendNewline(2) + + result.reason.message(this) + } + } + } + } + } +} \ No newline at end of file diff --git a/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/listeners/RentCollectedListener.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/listeners/RentCollectedListener.kt similarity index 80% rename from surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/listeners/RentCollectedListener.kt rename to surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/listeners/RentCollectedListener.kt index e57c0d7..a87d5b4 100644 --- a/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/listeners/RentCollectedListener.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/listeners/RentCollectedListener.kt @@ -1,9 +1,9 @@ -package dev.slne.surf.roleplay.mechanic.mechanics.rentable.listeners +package dev.slne.surf.roleplay.paper.mechanics.rentable.listeners import com.github.shynixn.mccoroutine.folia.entityDispatcher import com.github.shynixn.mccoroutine.folia.launch -import dev.slne.surf.roleplay.api.mechanic.rentable.events.RentableRentCollectEvent -import dev.slne.surf.roleplay.mechanic.plugin +import dev.slne.surf.roleplay.api.paper.rentable.events.RentableRentCollectEvent +import dev.slne.surf.roleplay.paper.plugin import dev.slne.surf.surfapi.core.api.messages.adventure.playSound import dev.slne.surf.surfapi.core.api.messages.adventure.sendText import org.bukkit.Sound @@ -15,7 +15,7 @@ object RentCollectedListener : Listener { @EventHandler fun onRentableRentCollect(event: RentableRentCollectEvent) { val rentable = event.rentable - val player = rentable.owner?.bukkitPlayer ?: return + val player = rentable.owner?.cloudPlayer?.player ?: return plugin.launch(plugin.entityDispatcher(player)) { player.sendText { diff --git a/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/listeners/RentableListener.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/listeners/RentableListener.kt similarity index 86% rename from surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/listeners/RentableListener.kt rename to surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/listeners/RentableListener.kt index 784e279..ce641a7 100644 --- a/surf-roleplay-mechanic-old/src/main/kotlin/dev/slne/surf/roleplay/mechanic/mechanics/rentable/listeners/RentableListener.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/listeners/RentableListener.kt @@ -1,11 +1,11 @@ -package dev.slne.surf.roleplay.mechanic.mechanics.rentable.listeners +package dev.slne.surf.roleplay.paper.mechanics.rentable.listeners import com.github.shynixn.mccoroutine.folia.entityDispatcher import com.github.shynixn.mccoroutine.folia.launch -import dev.slne.surf.roleplay.api.mechanic.rentable.events.RentableMemberAddEvent -import dev.slne.surf.roleplay.api.mechanic.rentable.events.RentableMemberRemoveEvent -import dev.slne.surf.roleplay.api.mechanic.rentable.events.RentableOwnerChangeEvent -import dev.slne.surf.roleplay.mechanic.plugin +import dev.slne.surf.roleplay.api.paper.rentable.events.RentableMemberAddEvent +import dev.slne.surf.roleplay.api.paper.rentable.events.RentableMemberRemoveEvent +import dev.slne.surf.roleplay.api.paper.rentable.events.RentableOwnerChangeEvent +import dev.slne.surf.roleplay.paper.plugin import dev.slne.surf.surfapi.core.api.messages.adventure.playSound import dev.slne.surf.surfapi.core.api.messages.adventure.sendText import kotlinx.coroutines.withContext @@ -21,7 +21,7 @@ object RentableListener : Listener { val members = event.rentable.members plugin.launch { - val memberPlayer = event.member.bukkitPlayer + val memberPlayer = event.member.cloudPlayer.player if (memberPlayer != null) { withContext(plugin.entityDispatcher(memberPlayer)) { @@ -42,13 +42,13 @@ object RentableListener : Listener { } members.filterNot { it == event.member }.forEach { member -> - val memberPlayer = member.bukkitPlayer ?: return@forEach + val memberPlayer = member.cloudPlayer.player ?: return@forEach withContext(plugin.entityDispatcher(memberPlayer)) { memberPlayer.sendText { appendPrefix() - append(event.member) + append(event.member.asComponent()) info(" wurde zu der Immobilie ") append(rentable) info(" hinzugefügt.") @@ -70,7 +70,8 @@ object RentableListener : Listener { val members = event.rentable.members plugin.launch { - val memberPlayer = event.member.bukkitPlayer + val memberPlayer = event.member.cloudPlayer.player + if (memberPlayer != null) { withContext(plugin.entityDispatcher(memberPlayer)) { memberPlayer.sendText { @@ -90,13 +91,13 @@ object RentableListener : Listener { } members.filterNot { it == event.member }.forEach { member -> - val memberPlayer = member.bukkitPlayer ?: return@forEach + val memberPlayer = member.cloudPlayer.player ?: return@forEach withContext(plugin.entityDispatcher(memberPlayer)) { memberPlayer.sendText { appendPrefix() - append(event.member) + append(event.member.asComponent()) info(" wurde von der Immobilie ") append(rentable) info(" entfernt.") @@ -120,8 +121,8 @@ object RentableListener : Listener { val newOwner = event.newOwner val oldOwner = event.oldOwner - val newOwnerPlayer = newOwner?.bukkitPlayer - val oldOwnerPlayer = oldOwner?.bukkitPlayer + val newOwnerPlayer = newOwner?.cloudPlayer?.player + val oldOwnerPlayer = oldOwner?.cloudPlayer?.player plugin.launch { if (newOwner != null && newOwnerPlayer != null) { diff --git a/surf-roleplay-paper-old/src/main/kotlin/dev/slne/surf/roleplay/paper/identity/dialogs/IdentitySelectorDialog.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/identity/dialogs/IdentitySelectorDialog.kt similarity index 95% rename from surf-roleplay-paper-old/src/main/kotlin/dev/slne/surf/roleplay/paper/identity/dialogs/IdentitySelectorDialog.kt rename to surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/identity/dialogs/IdentitySelectorDialog.kt index 54099e6..9839e46 100644 --- a/surf-roleplay-paper-old/src/main/kotlin/dev/slne/surf/roleplay/paper/identity/dialogs/IdentitySelectorDialog.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/identity/dialogs/IdentitySelectorDialog.kt @@ -1,10 +1,10 @@ @file:Suppress("UnstableApiUsage") @file:OptIn(NmsUseWithCaution::class) -package dev.slne.surf.roleplay.paper.identity.dialogs +package dev.slne.surf.roleplay.paper.player.identity.dialogs import com.github.shynixn.mccoroutine.folia.launch -import dev.slne.surf.roleplay.api.player.RpPlayer +import dev.slne.surf.roleplay.api.common.player.RpPlayer import dev.slne.surf.roleplay.paper.plugin import dev.slne.surf.surfapi.bukkit.api.dialog.base import dev.slne.surf.surfapi.bukkit.api.dialog.builder.actionButton diff --git a/surf-roleplay-paper-old/src/main/kotlin/dev/slne/surf/roleplay/paper/identity/listener/IdentityOnlineListener.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/identity/listener/IdentityOnlineListener.kt similarity index 67% rename from surf-roleplay-paper-old/src/main/kotlin/dev/slne/surf/roleplay/paper/identity/listener/IdentityOnlineListener.kt rename to surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/identity/listener/IdentityOnlineListener.kt index f14e3a9..ed117db 100644 --- a/surf-roleplay-paper-old/src/main/kotlin/dev/slne/surf/roleplay/paper/identity/listener/IdentityOnlineListener.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/identity/listener/IdentityOnlineListener.kt @@ -1,8 +1,8 @@ -package dev.slne.surf.roleplay.paper.identity.listener +package dev.slne.surf.roleplay.paper.player.identity.listener import com.github.shynixn.mccoroutine.folia.launch -import dev.slne.surf.roleplay.api.player.events.RpPlayerJoinEvent -import dev.slne.surf.roleplay.paper.identity.dialogs.createIdentitySelectorDialog +import dev.slne.surf.roleplay.api.paper.player.events.RpPlayerJoinEvent +import dev.slne.surf.roleplay.paper.player.identity.dialogs.createIdentitySelectorDialog import dev.slne.surf.roleplay.paper.plugin import org.bukkit.event.EventHandler import org.bukkit.event.EventPriority @@ -13,7 +13,7 @@ object IdentityOnlineListener : Listener { @EventHandler(priority = EventPriority.LOWEST) fun onRpPlayerJoin(event: RpPlayerJoinEvent) { plugin.launch { - val player = event.rpPlayer + val player = event.player val identities = player.identities if (identities.isEmpty()) { @@ -27,7 +27,7 @@ object IdentityOnlineListener : Listener { return@launch } - player.bukkitPlayer?.showDialog(createIdentitySelectorDialog(player)) + player.cloudPlayer.player?.showDialog(createIdentitySelectorDialog(player)) } } } \ No newline at end of file diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/LicenseNpc.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/LicenseNpc.kt similarity index 85% rename from surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/LicenseNpc.kt rename to surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/LicenseNpc.kt index f057da2..454887c 100644 --- a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/LicenseNpc.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/LicenseNpc.kt @@ -1,8 +1,8 @@ -package dev.slne.surf.roleplay.core.player.license +package dev.slne.surf.roleplay.paper.player.license import dev.slne.surf.npc.api.dsl.npc import dev.slne.surf.npc.api.surfNpcApi -import dev.slne.surf.roleplay.core.plugin +import dev.slne.surf.roleplay.paper.plugin object LicenseNpc { diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/dialogs/BuyLicenseDialog.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/dialogs/BuyLicenseDialog.kt similarity index 93% rename from surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/dialogs/BuyLicenseDialog.kt rename to surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/dialogs/BuyLicenseDialog.kt index 429acfa..b494f66 100644 --- a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/dialogs/BuyLicenseDialog.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/dialogs/BuyLicenseDialog.kt @@ -1,14 +1,14 @@ @file:Suppress("UnstableApiUsage") -package dev.slne.surf.roleplay.core.player.license.dialogs +package dev.slne.surf.roleplay.paper.player.license.dialogs import com.github.shynixn.mccoroutine.folia.launch -import dev.slne.surf.roleplay.api.player.RpPlayer -import dev.slne.surf.roleplay.api.player.identity.RpIdentity -import dev.slne.surf.roleplay.api.player.license.IdentityLicense -import dev.slne.surf.roleplay.api.player.license.License -import dev.slne.surf.roleplay.api.player.license.utils.UnobtainableReason -import dev.slne.surf.roleplay.core.plugin +import dev.slne.surf.roleplay.api.common.player.RpPlayer +import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity +import dev.slne.surf.roleplay.api.common.player.license.IdentityLicense +import dev.slne.surf.roleplay.api.common.player.license.License +import dev.slne.surf.roleplay.api.common.player.license.utils.UnobtainableReason +import dev.slne.surf.roleplay.paper.plugin import dev.slne.surf.surfapi.bukkit.api.dialog.base import dev.slne.surf.surfapi.bukkit.api.dialog.builder.actionButton import dev.slne.surf.surfapi.bukkit.api.dialog.dialog diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/dialogs/BuyLicensesDialog.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/dialogs/BuyLicensesDialog.kt similarity index 91% rename from surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/dialogs/BuyLicensesDialog.kt rename to surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/dialogs/BuyLicensesDialog.kt index 566e147..1e4e749 100644 --- a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/dialogs/BuyLicensesDialog.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/dialogs/BuyLicensesDialog.kt @@ -1,12 +1,12 @@ @file:Suppress("UnstableApiUsage") -package dev.slne.surf.roleplay.core.player.license.dialogs +package dev.slne.surf.roleplay.paper.player.license.dialogs import com.github.shynixn.mccoroutine.folia.launch -import dev.slne.surf.roleplay.api.player.RpPlayer -import dev.slne.surf.roleplay.api.player.identity.RpIdentity +import dev.slne.surf.roleplay.api.common.player.RpPlayer +import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity import dev.slne.surf.roleplay.api.player.license.LicenseService -import dev.slne.surf.roleplay.core.plugin +import dev.slne.surf.roleplay.paper.plugin import dev.slne.surf.surfapi.bukkit.api.dialog.base import dev.slne.surf.surfapi.bukkit.api.dialog.builder.actionButton import dev.slne.surf.surfapi.bukkit.api.dialog.dialog diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/dialogs/LicenseDialog.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/dialogs/LicenseDialog.kt similarity index 91% rename from surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/dialogs/LicenseDialog.kt rename to surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/dialogs/LicenseDialog.kt index 3905a20..fa02d53 100644 --- a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/dialogs/LicenseDialog.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/dialogs/LicenseDialog.kt @@ -1,12 +1,11 @@ @file:Suppress("UnstableApiUsage") -package dev.slne.surf.roleplay.core.player.license.dialogs +package dev.slne.surf.roleplay.paper.player.license.dialogs -import dev.slne.surf.roleplay.api.player.RpPlayer -import dev.slne.surf.roleplay.api.player.identity.RpIdentity -import dev.slne.surf.roleplay.api.player.license.IdentityLicense -import dev.slne.surf.roleplay.api.player.license.License -import dev.slne.surf.surfapi.bukkit.api.builder.LoreBuilder +import dev.slne.surf.roleplay.api.common.player.RpPlayer +import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity +import dev.slne.surf.roleplay.api.common.player.license.IdentityLicense +import dev.slne.surf.roleplay.api.common.player.license.License import dev.slne.surf.surfapi.bukkit.api.dialog.base import dev.slne.surf.surfapi.bukkit.api.dialog.builder.actionButton import dev.slne.surf.surfapi.bukkit.api.dialog.dialog @@ -51,13 +50,7 @@ fun SurfComponentBuilder.appendLicenseDependencies( fun SurfComponentBuilder.appendLicenseDescription(license: License) { variableKey("Beschreibung:") appendNewline() - - LoreBuilder().apply(license.description).build().forEachIndexed { index, line -> - if (index > 0) { - appendNewline() - } - append(line) - } + append(license.description) } private val formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm") diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/dialogs/MyLicenseDialog.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/dialogs/MyLicenseDialog.kt similarity index 85% rename from surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/dialogs/MyLicenseDialog.kt rename to surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/dialogs/MyLicenseDialog.kt index 7de80df..b80e92a 100644 --- a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/dialogs/MyLicenseDialog.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/dialogs/MyLicenseDialog.kt @@ -1,10 +1,10 @@ @file:Suppress("UnstableApiUsage") -package dev.slne.surf.roleplay.core.player.license.dialogs +package dev.slne.surf.roleplay.paper.player.license.dialogs -import dev.slne.surf.roleplay.api.player.RpPlayer -import dev.slne.surf.roleplay.api.player.identity.RpIdentity -import dev.slne.surf.roleplay.api.player.license.IdentityLicense +import dev.slne.surf.roleplay.api.common.player.RpPlayer +import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity +import dev.slne.surf.roleplay.api.common.player.license.IdentityLicense import dev.slne.surf.surfapi.bukkit.api.dialog.base import dev.slne.surf.surfapi.bukkit.api.dialog.dialog import dev.slne.surf.surfapi.bukkit.api.dialog.type diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/dialogs/MyLicensesDialog.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/dialogs/MyLicensesDialog.kt similarity index 90% rename from surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/dialogs/MyLicensesDialog.kt rename to surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/dialogs/MyLicensesDialog.kt index 57c6add..572680f 100644 --- a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/dialogs/MyLicensesDialog.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/dialogs/MyLicensesDialog.kt @@ -1,9 +1,9 @@ @file:Suppress("UnstableApiUsage") -package dev.slne.surf.roleplay.core.player.license.dialogs +package dev.slne.surf.roleplay.paper.player.license.dialogs -import dev.slne.surf.roleplay.api.player.RpPlayer -import dev.slne.surf.roleplay.api.player.identity.RpIdentity +import dev.slne.surf.roleplay.api.common.player.RpPlayer +import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity import dev.slne.surf.surfapi.bukkit.api.dialog.base import dev.slne.surf.surfapi.bukkit.api.dialog.builder.actionButton import dev.slne.surf.surfapi.bukkit.api.dialog.dialog diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/listeners/LicenseBuyHandler.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/listeners/LicenseBuyHandler.kt similarity index 72% rename from surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/listeners/LicenseBuyHandler.kt rename to surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/listeners/LicenseBuyHandler.kt index ce16829..89b0164 100644 --- a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/listeners/LicenseBuyHandler.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/listeners/LicenseBuyHandler.kt @@ -1,13 +1,14 @@ -package dev.slne.surf.roleplay.core.player.license.listeners +package dev.slne.surf.roleplay.paper.player.license.listeners import com.github.shynixn.mccoroutine.folia.entityDispatcher import com.github.shynixn.mccoroutine.folia.launch +import dev.slne.surf.cloud.api.client.paper.player.toCloudOfflinePlayer import dev.slne.surf.npc.api.event.NpcInteractEvent import dev.slne.surf.npc.api.surfNpcApi -import dev.slne.surf.roleplay.api.player.RpPlayer -import dev.slne.surf.roleplay.core.player.license.LicenseNpc -import dev.slne.surf.roleplay.core.player.license.dialogs.licenseDialog -import dev.slne.surf.roleplay.core.plugin +import dev.slne.surf.roleplay.api.common.player.RpPlayer +import dev.slne.surf.roleplay.paper.player.license.LicenseNpc +import dev.slne.surf.roleplay.paper.player.license.dialogs.licenseDialog +import dev.slne.surf.roleplay.paper.plugin import dev.slne.surf.surfapi.core.api.messages.adventure.sendText import org.bukkit.event.EventHandler import org.bukkit.event.Listener @@ -26,7 +27,7 @@ object LicenseBuyHandler : Listener { if (npc.npcUuid != licenseNpc.npcUuid) return plugin.launch(plugin.entityDispatcher(player)) { - val rpPlayer = RpPlayer[player.uniqueId] + val rpPlayer = RpPlayer[player.toCloudOfflinePlayer()] val activeIdentity = rpPlayer.activeIdentity ?: run { player.sendText { appendPrefix() diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/listeners/LicenseChangedHandler.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/listeners/LicenseChangedHandler.kt similarity index 65% rename from surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/listeners/LicenseChangedHandler.kt rename to surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/listeners/LicenseChangedHandler.kt index ee7063a..b92abed 100644 --- a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/listeners/LicenseChangedHandler.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/listeners/LicenseChangedHandler.kt @@ -1,10 +1,10 @@ -package dev.slne.surf.roleplay.core.player.license.listeners +package dev.slne.surf.roleplay.paper.player.license.listeners import com.github.shynixn.mccoroutine.folia.entityDispatcher import com.github.shynixn.mccoroutine.folia.launch -import dev.slne.surf.roleplay.api.player.license.event.RpPlayerLicenseAddedEvent -import dev.slne.surf.roleplay.api.player.license.event.RpPlayerLicenseRemovedEvent -import dev.slne.surf.roleplay.core.plugin +import dev.slne.surf.roleplay.api.paper.player.license.events.RpPlayerLicenseAddedEvent +import dev.slne.surf.roleplay.api.paper.player.license.events.RpPlayerLicenseRemovedEvent +import dev.slne.surf.roleplay.paper.plugin import dev.slne.surf.surfapi.core.api.messages.adventure.buildText import dev.slne.surf.surfapi.core.api.messages.adventure.playSound import dev.slne.surf.surfapi.core.api.messages.adventure.sendText @@ -17,10 +17,10 @@ object LicenseChangedHandler : Listener { @EventHandler fun onPlayerLicenseAdded(event: RpPlayerLicenseAddedEvent) { val license = event.license - val bukkitPlayer = event.player.bukkitPlayer ?: return + val cloudPlayer = event.player.cloudPlayer.player ?: return - plugin.launch(plugin.entityDispatcher(bukkitPlayer)) { - bukkitPlayer.sendText { + plugin.launch(plugin.entityDispatcher(cloudPlayer)) { + cloudPlayer.sendText { appendPrefix() info("Du hast eine ") @@ -28,7 +28,7 @@ object LicenseChangedHandler : Listener { info(" Lizenz erhalten.") } - bukkitPlayer.playSound(true) { + cloudPlayer.playSound(true) { type(Sound.ENTITY_PLAYER_LEVELUP) volume(.75f) source(net.kyori.adventure.sound.Sound.Source.NEUTRAL) @@ -39,17 +39,18 @@ object LicenseChangedHandler : Listener { @EventHandler fun onPlayerLicenseRemoved(event: RpPlayerLicenseRemovedEvent) { val license = event.license - val bukkitPlayer = event.player.bukkitPlayer ?: return + val cloudPlayer = event.player.cloudPlayer.player ?: return + val reason = buildText { appendPrefix() event.reason.apply { message(license) } } - plugin.launch(plugin.entityDispatcher(bukkitPlayer)) { - bukkitPlayer.sendMessage(reason) + plugin.launch(plugin.entityDispatcher(cloudPlayer)) { + cloudPlayer.sendMessage(reason) - bukkitPlayer.playSound(true) { + cloudPlayer.playSound(true) { type(Sound.ENTITY_VILLAGER_HURT) volume(.75f) source(net.kyori.adventure.sound.Sound.Source.NEUTRAL) diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/civilian/RpPlayerCivilianIdentityModel.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/civilian/RpPlayerCivilianIdentityModel.kt index 6cd4c7d..23a89db 100644 --- a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/civilian/RpPlayerCivilianIdentityModel.kt +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/civilian/RpPlayerCivilianIdentityModel.kt @@ -2,8 +2,8 @@ package dev.slne.surf.roleplay.server.player.identity.db.impl.civilian import dev.slne.surf.roleplay.api.common.player.RpPlayer import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity +import dev.slne.surf.roleplay.core.common.player.identity.identities.CivilianIdentityImpl import dev.slne.surf.roleplay.server.player.identity.db.RpPlayerIdentityBaseModel -import dev.slne.surf.roleplay.server.player.identity.identities.CivilianIdentityImpl import org.jetbrains.exposed.dao.LongEntityClass import org.jetbrains.exposed.dao.id.EntityID diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/police/RpPlayerPoliceIdentityModel.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/police/RpPlayerPoliceIdentityModel.kt index 000a68f..cd13636 100644 --- a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/police/RpPlayerPoliceIdentityModel.kt +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/police/RpPlayerPoliceIdentityModel.kt @@ -2,7 +2,7 @@ package dev.slne.surf.roleplay.core.player.identity.db.impl.police import dev.slne.surf.roleplay.api.common.player.RpPlayer import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity -import dev.slne.surf.roleplay.core.player.identity.identities.PoliceIdentityImpl +import dev.slne.surf.roleplay.core.common.player.identity.identities.PoliceIdentityImpl import dev.slne.surf.roleplay.server.player.identity.db.RpPlayerIdentityBaseModel import dev.slne.surf.roleplay.server.player.identity.db.impl.police.RpPlayerPoliceIdentityTable import org.jetbrains.exposed.dao.LongEntityClass diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/rescueservice/RpPlayerRescueServiceIdentityModel.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/rescueservice/RpPlayerRescueServiceIdentityModel.kt index 7476476..77387bf 100644 --- a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/rescueservice/RpPlayerRescueServiceIdentityModel.kt +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/rescueservice/RpPlayerRescueServiceIdentityModel.kt @@ -2,7 +2,7 @@ package dev.slne.surf.roleplay.server.player.identity.db.impl.rescueservice import dev.slne.surf.roleplay.api.common.player.RpPlayer import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity -import dev.slne.surf.roleplay.core.player.identity.identities.RescueServiceIdentityImpl +import dev.slne.surf.roleplay.core.common.player.identity.identities.RescueServiceIdentityImpl import dev.slne.surf.roleplay.server.player.identity.db.RpPlayerIdentityBaseModel import org.jetbrains.exposed.dao.LongEntityClass import org.jetbrains.exposed.dao.id.EntityID diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/LicenseServiceImpl.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/LicenseServiceImpl.kt index 44f5a05..0932da1 100644 --- a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/LicenseServiceImpl.kt +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/LicenseServiceImpl.kt @@ -14,15 +14,15 @@ import dev.slne.surf.roleplay.api.player.license.IdentityLicense import dev.slne.surf.roleplay.api.player.license.License import dev.slne.surf.roleplay.api.player.license.LicenseService import dev.slne.surf.roleplay.api.player.license.utils.LicenseRemovedReason -import dev.slne.surf.roleplay.core.player.license.db.IdentityLicenseModel -import dev.slne.surf.roleplay.core.player.license.db.IdentityLicenseTable -import dev.slne.surf.roleplay.core.player.license.licenses.civilian.CivilianFishingLicenseImpl -import dev.slne.surf.roleplay.core.player.license.licenses.civilian.CivilianVehicleLicenseImpl -import dev.slne.surf.roleplay.core.player.license.licenses.civilian.CivilianWeaponLicenseImpl +import dev.slne.surf.roleplay.core.common.player.license.licenses.civilian.CivilianFishingLicenseImpl +import dev.slne.surf.roleplay.core.common.player.license.licenses.civilian.CivilianVehicleLicenseImpl +import dev.slne.surf.roleplay.core.common.player.license.licenses.civilian.CivilianWeaponLicenseImpl import dev.slne.surf.roleplay.core.player.license.listeners.LicenseBuyHandler import dev.slne.surf.roleplay.core.player.license.listeners.LicenseChangedHandler import dev.slne.surf.roleplay.core.player.rpPlayerManagerImpl import dev.slne.surf.roleplay.core.plugin +import dev.slne.surf.roleplay.server.player.license.db.IdentityLicenseModel +import dev.slne.surf.roleplay.server.player.license.db.IdentityLicenseTable import dev.slne.surf.surfapi.bukkit.api.event.register import dev.slne.surf.surfapi.core.api.messages.adventure.key import dev.slne.surf.surfapi.core.api.messages.adventure.sendText @@ -34,6 +34,7 @@ import net.kyori.adventure.key.Key import net.kyori.adventure.util.Services import org.jetbrains.exposed.sql.and import org.jetbrains.exposed.sql.transactions.experimental.newSuspendedTransaction +import kotlin.jvm.java @AutoService(LicenseService::class) class LicenseServiceImpl : LicenseService, Services.Fallback { diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/db/IdentityLicenseModel.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/db/IdentityLicenseModel.kt index b4d5683..ec6ecef 100644 --- a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/db/IdentityLicenseModel.kt +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/db/IdentityLicenseModel.kt @@ -1,7 +1,7 @@ -package dev.slne.surf.roleplay.core.player.license.db +package dev.slne.surf.roleplay.server.player.license.db -import dev.slne.surf.roleplay.api.player.identity.RpIdentity -import dev.slne.surf.roleplay.api.player.license.IdentityLicense +import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity +import dev.slne.surf.roleplay.api.common.player.license.IdentityLicense import dev.slne.surf.roleplay.api.player.license.LicenseService import dev.slne.surf.roleplay.core.player.db.RpPlayerModel import dev.slne.surf.surfapi.core.api.messages.adventure.key diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/db/IdentityLicenseTable.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/db/IdentityLicenseTable.kt index 72579a8..1df59bd 100644 --- a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/db/IdentityLicenseTable.kt +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/db/IdentityLicenseTable.kt @@ -1,8 +1,8 @@ -package dev.slne.surf.roleplay.core.player.license.db +package dev.slne.surf.roleplay.server.player.license.db -import dev.slne.surf.database.database.columns.CurrentZonedDateTime -import dev.slne.surf.database.database.columns.zonedDateTime -import dev.slne.surf.roleplay.api.player.identity.RpIdentity +import dev.slne.surf.cloud.api.server.exposed.columns.CurrentZonedDateTime +import dev.slne.surf.cloud.api.server.exposed.columns.zonedDateTime +import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity import dev.slne.surf.roleplay.server.player.db.RpPlayerTable import org.jetbrains.exposed.dao.id.LongIdTable import org.jetbrains.exposed.sql.ReferenceOption diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/licenses/civilian/CivilianFishingLicenseImpl.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/licenses/civilian/CivilianFishingLicenseImpl.kt deleted file mode 100644 index 3211cef..0000000 --- a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/licenses/civilian/CivilianFishingLicenseImpl.kt +++ /dev/null @@ -1,17 +0,0 @@ -package dev.slne.surf.roleplay.core.player.license.licenses.civilian - -import dev.slne.surf.roleplay.api.player.license.licenses.civilian.CivilianFishingLicense -import dev.slne.surf.roleplay.core.player.license.LicenseImpl -import dev.slne.surf.surfapi.core.api.messages.adventure.buildText -import dev.slne.surf.surfapi.core.api.messages.adventure.key - -object CivilianFishingLicenseImpl : LicenseImpl( - key = key("roleplay", "fishing_license"), - displayName = buildText { primary("Angelschein") }, - description = { - line { - spacer("Die Angel-Lizenz erlaubt es dir, in der Wildnis zu angeln.") - } - }, - price = 500, -), CivilianFishingLicense \ No newline at end of file From 1953f0522433280aeb261a5e6426f9e03c2400ee Mon Sep 17 00:00:00 2001 From: Ammo Date: Mon, 11 Aug 2025 22:01:25 +0200 Subject: [PATCH 03/11] Implement core mechanics and identity handling: add new mechanics, refactor identity events, and enhance license management --- build.gradle.kts | 2 +- .../api/paper/events/CancellableRpEvent.kt | 7 -- .../surf/roleplay/api/paper/events/RpEvent.kt | 19 ----- .../paper/player/events/RpPlayerDeathEvent.kt | 8 +- .../paper/player/events/RpPlayerJoinEvent.kt | 8 -- .../paper/player/events/RpPlayerQuitEvent.kt | 8 -- .../roleplay/api/common/mechanic/Mechanic.kt | 29 ++----- .../api/common/mechanic/MechanicRegistry.kt | 8 -- .../common/mechanic/idcard/IdCardMechanic.kt | 2 +- .../api/common/mechanic/rentable/Rentable.kt | 6 +- .../rentable/utils/StorageContainer.kt | 13 +-- .../mechanic/rentable/utils/door/Door.kt | 4 +- .../utils}/events/RentableMemberAddEvent.kt | 36 ++++---- .../events/RentableMemberRemoveEvent.kt | 36 ++++---- .../utils}/events/RentableOwnerChangeEvent.kt | 43 +++++----- .../utils}/events/RentableRentCollectEvent.kt | 7 +- .../common/mechanic/weapon/WeaponMechanic.kt | 6 +- .../weapon/magazine/PlayerMagazine.kt | 13 --- .../mechanic/weapon/player/PlayerWeapon.kt | 16 ---- .../roleplay/api/common/player/RpPlayer.kt | 21 +++-- .../common/player/events/RpPlayerJoinEvent.kt | 9 ++ .../common/player/events/RpPlayerQuitEvent.kt | 9 ++ .../api/common/player/identity/RpIdentity.kt | 51 +++++++++++ .../common/player/license/IdentityLicense.kt | 8 +- .../player/license/InternalLicenseBridge.kt | 45 +++++----- .../api/common/player/license/License.kt | 2 + .../player/license/LicenseSerializer.kt | 26 ++++++ .../events/RpPlayerLicenseAddedEvent.kt | 7 +- .../events/RpPlayerLicenseRemovedEvent.kt | 7 +- .../client/player/ClientRpPlayerManager.kt | 23 +++++ .../roleplay/core/common/CommonRpInstance.kt | 25 ++++++ .../core/common/mechanics/CommonMechanic.kt | 11 +++ .../mechanics/CommonMechanicRegistry.kt | 29 +++++++ .../core/common/mechanics/MechanicImpl.kt | 19 ----- .../common/mechanics/MechanicRegistryImpl.kt | 64 -------------- .../mechanics/idcard/IdCardCommonMechanic.kt | 8 ++ .../mechanics/idcard/IdCardMechanicImpl.kt | 19 ----- .../mechanics/rentable/door/DoorImpl.kt | 3 +- .../core/common/mechanics/utils/RpMechanic.kt | 8 ++ .../mechanics/utils/RpPacketListener.kt | 11 +++ .../mechanics/weapon/WeaponMechanicImpl.kt | 2 +- .../core/common/player/CommonRpPlayer.kt | 42 ++++----- .../common/player/CommonRpPlayerManager.kt | 9 +- .../common/player/PlayerIdentityFetcher.kt | 24 ++++++ .../{license => identity}/CommonRpIdentity.kt | 85 ++++++++++++------- .../identities/CivilianIdentityImpl.kt | 31 +++---- .../identity/identities/PoliceIdentityImpl.kt | 32 ++++--- .../identities/RescueServiceIdentityImpl.kt | 32 ++++--- .../ClientboundIdentityGetPacket.kt | 32 +++++++ .../ServerboundCreateIdentityPacket.kt | 4 + ...censeImpl.kt => CommonExpirableLicense.kt} | 4 +- .../{LicenseImpl.kt => CommonLicense.kt} | 14 ++- .../player/license/CommonLicenseBridge.kt | 28 ++++++ .../license/LicensePermissionRegistry.kt | 8 ++ ...censeImpl.kt => CivilianFishingLicense.kt} | 8 +- .../civilian/CivilianVehicleLicenseImpl.kt | 73 ++++++++-------- .../civilian/CivilianWeaponLicenseImpl.kt | 24 +++--- .../dev/slne/surf/roleplay/paper/PaperMain.kt | 14 ++- .../surf/roleplay/paper/PaperRpInstance.kt | 25 ++++++ .../paper/listener/ListenerManager.kt | 21 ++--- .../roleplay/paper/listener/OnlineListener.kt | 8 +- .../mechanics/idcard/IdCardMechanicImpl.kt | 11 +++ .../idcard/listeners/IdCardHandler.kt | 4 +- .../rentable/commands/RentableCommand.kt | 9 +- .../listeners/RentCollectedListener.kt | 6 +- .../rentable/listeners/RentableListener.kt | 17 ++-- .../listener/IdentityOnlineListener.kt | 6 +- .../license/listeners/LicenseBuyHandler.kt | 4 +- .../listeners/LicenseChangedHandler.kt | 8 +- .../BukkitListenerPostProcessor.kt | 27 ++++++ .../PacketListenerPostProcessor.kt | 34 ++++++++ .../mechanics/idcard/IdCardMechanicImpl.kt | 7 ++ .../player/license/LicenseExpirationJob.kt | 22 +++-- .../player/license/LicenseServiceImpl.kt | 67 --------------- 74 files changed, 816 insertions(+), 602 deletions(-) delete mode 100644 surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/events/CancellableRpEvent.kt delete mode 100644 surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/events/RpEvent.kt delete mode 100644 surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/player/events/RpPlayerJoinEvent.kt delete mode 100644 surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/player/events/RpPlayerQuitEvent.kt rename surf-roleplay-api/{surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/rentable => surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils}/events/RentableMemberAddEvent.kt (89%) rename surf-roleplay-api/{surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/rentable => surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils}/events/RentableMemberRemoveEvent.kt (89%) rename surf-roleplay-api/{surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/rentable => surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils}/events/RentableOwnerChangeEvent.kt (96%) rename surf-roleplay-api/{surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/rentable => surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils}/events/RentableRentCollectEvent.kt (70%) delete mode 100644 surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/weapon/magazine/PlayerMagazine.kt delete mode 100644 surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/weapon/player/PlayerWeapon.kt create mode 100644 surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/events/RpPlayerJoinEvent.kt create mode 100644 surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/events/RpPlayerQuitEvent.kt create mode 100644 surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/LicenseSerializer.kt rename surf-roleplay-api/{surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper => surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common}/player/license/events/RpPlayerLicenseAddedEvent.kt (66%) rename surf-roleplay-api/{surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper => surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common}/player/license/events/RpPlayerLicenseRemovedEvent.kt (71%) create mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/CommonRpInstance.kt create mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/CommonMechanic.kt create mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/CommonMechanicRegistry.kt delete mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/MechanicImpl.kt delete mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/MechanicRegistryImpl.kt create mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/idcard/IdCardCommonMechanic.kt delete mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/idcard/IdCardMechanicImpl.kt create mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/utils/RpMechanic.kt create mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/utils/RpPacketListener.kt create mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/PlayerIdentityFetcher.kt rename surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/{license => identity}/CommonRpIdentity.kt (65%) create mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/protocol/clientbound/ClientboundIdentityGetPacket.kt create mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/protocol/serverbound/ServerboundCreateIdentityPacket.kt rename surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/{ExpirableLicenseImpl.kt => CommonExpirableLicense.kt} (92%) rename surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/{LicenseImpl.kt => CommonLicense.kt} (82%) create mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/CommonLicenseBridge.kt create mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/LicensePermissionRegistry.kt rename surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/licenses/civilian/{CivilianFishingLicenseImpl.kt => CivilianFishingLicense.kt} (69%) create mode 100644 surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/PaperRpInstance.kt create mode 100644 surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/IdCardMechanicImpl.kt create mode 100644 surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/spring/postprocessor/BukkitListenerPostProcessor.kt create mode 100644 surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/spring/postprocessor/PacketListenerPostProcessor.kt create mode 100644 surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/mechanics/idcard/IdCardMechanicImpl.kt diff --git a/build.gradle.kts b/build.gradle.kts index 7d63d99..80d47f5 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -9,7 +9,7 @@ buildscript { maven("https://repo.slne.dev/repository/maven-public/") { name = "maven-public" } } dependencies { - classpath("dev.slne.surf:surf-api-gradle-plugin:1.21.7+") + classpath("dev.slne.surf:surf-api-gradle-plugin:1.21.8+") } } diff --git a/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/events/CancellableRpEvent.kt b/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/events/CancellableRpEvent.kt deleted file mode 100644 index 1f5f2c9..0000000 --- a/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/events/CancellableRpEvent.kt +++ /dev/null @@ -1,7 +0,0 @@ -package dev.slne.surf.roleplay.api.paper.events - -import org.bukkit.Bukkit - -open class CancellableRpEvent( - async: Boolean = !Bukkit.isPrimaryThread() -) : RpEvent(async) \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/events/RpEvent.kt b/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/events/RpEvent.kt deleted file mode 100644 index 39cd380..0000000 --- a/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/events/RpEvent.kt +++ /dev/null @@ -1,19 +0,0 @@ -package dev.slne.surf.roleplay.api.paper.events - -import org.bukkit.Bukkit -import org.bukkit.event.Event -import org.bukkit.event.HandlerList - -open class RpEvent( - val async: Boolean = !Bukkit.isPrimaryThread() -) : Event(async) { - - override fun getHandlers() = handlerList - - companion object { - private val handlerList = HandlerList() - - @JvmStatic - fun getHandlerList() = handlerList - } -} \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/player/events/RpPlayerDeathEvent.kt b/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/player/events/RpPlayerDeathEvent.kt index 2d290d3..6d5cfe5 100644 --- a/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/player/events/RpPlayerDeathEvent.kt +++ b/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/player/events/RpPlayerDeathEvent.kt @@ -1,8 +1,8 @@ package dev.slne.surf.roleplay.api.paper.player.events import dev.slne.surf.cloud.api.client.paper.player.toCloudOfflinePlayer +import dev.slne.surf.cloud.api.common.event.CloudEvent import dev.slne.surf.roleplay.api.common.player.RpPlayer -import dev.slne.surf.roleplay.api.paper.events.RpEvent import org.bukkit.block.Block import org.bukkit.entity.Entity import org.bukkit.entity.Player @@ -19,9 +19,10 @@ import org.bukkit.event.entity.PlayerDeathEvent * @property bukkitEvent The original Bukkit PlayerDeathEvent that this event wraps. */ class RpPlayerDeathEvent( + source: Any, val player: RpPlayer, bukkitEvent: PlayerDeathEvent -) : RpEvent() { +) : CloudEvent(source) { var killerEntity: Entity? private set @@ -29,7 +30,8 @@ class RpPlayerDeathEvent( var killerBlock: Block? = null private set - fun killerRpPlayer() = (killerEntity as? Player)?.let { RpPlayer[it.toCloudOfflinePlayer()] } + fun killerRpPlayer() = + (killerEntity as? Player)?.let { RpPlayer.Companion[it.toCloudOfflinePlayer()] } init { val player = bukkitEvent.player diff --git a/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/player/events/RpPlayerJoinEvent.kt b/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/player/events/RpPlayerJoinEvent.kt deleted file mode 100644 index c27f6ac..0000000 --- a/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/player/events/RpPlayerJoinEvent.kt +++ /dev/null @@ -1,8 +0,0 @@ -package dev.slne.surf.roleplay.api.paper.player.events - -import dev.slne.surf.roleplay.api.common.player.RpPlayer -import dev.slne.surf.roleplay.api.paper.events.RpEvent - -class RpPlayerJoinEvent( - val player: RpPlayer, -) : RpEvent() \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/player/events/RpPlayerQuitEvent.kt b/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/player/events/RpPlayerQuitEvent.kt deleted file mode 100644 index 4849e14..0000000 --- a/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/player/events/RpPlayerQuitEvent.kt +++ /dev/null @@ -1,8 +0,0 @@ -package dev.slne.surf.roleplay.api.paper.player.events - -import dev.slne.surf.roleplay.api.common.player.RpPlayer -import dev.slne.surf.roleplay.api.paper.events.RpEvent - -class RpPlayerQuitEvent( - val player: RpPlayer, -) : RpEvent() \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/Mechanic.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/Mechanic.kt index 2632ba4..282df7a 100644 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/Mechanic.kt +++ b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/Mechanic.kt @@ -1,10 +1,10 @@ +@file:OptIn(InternalRoleplayApi::class) + package dev.slne.surf.roleplay.api.common.mechanic -import com.github.retrooper.packetevents.event.PacketListener -import com.github.retrooper.packetevents.event.PacketListenerPriority -import dev.slne.surf.roleplay.api.common.util.RpJob -import it.unimi.dsi.fastutil.objects.ObjectSet -import org.bukkit.event.Listener +import dev.slne.surf.roleplay.api.common.InternalContextHolder +import dev.slne.surf.roleplay.api.common.util.InternalRoleplayApi +import org.springframework.beans.factory.getBean interface Mechanic { @@ -14,23 +14,6 @@ interface Mechanic { */ val name: String - /** - * Returns an object set of handlers for this mechanic. - */ - val handlers: ObjectSet - - /** - * Returns an object set of all rp jobs associated with this mechanic. - * Rp jobs are tasks that can be scheduled to run periodically or at specific times. - * This is used for mechanics that require periodic updates or tasks. - */ - val rpJobs: ObjectSet - - /** - * Returns an object set of all packet listeners associated with this mechanic. - */ - val packetListeners: ObjectSet> - /** * Called when the mechanic is loaded. */ @@ -55,7 +38,7 @@ interface Mechanic { * @return The [Mechanic] instance of type [T]. */ fun getMechanic(mechanic: Class): T = - MechanicRegistry.getMechanic(mechanic) + InternalContextHolder.instance.context.getBean().getMechanic(mechanic) /** * Gets the mechanic by its class type. diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/MechanicRegistry.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/MechanicRegistry.kt index fa7866c..19f5cb3 100644 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/MechanicRegistry.kt +++ b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/MechanicRegistry.kt @@ -1,9 +1,5 @@ package dev.slne.surf.roleplay.api.common.mechanic -import dev.slne.surf.surfapi.core.api.util.requiredService - -private val mechanicRegistry = requiredService() - interface MechanicRegistry { /** @@ -14,10 +10,6 @@ interface MechanicRegistry { * @throws IllegalArgumentException if no mechanic of the specified class is registered. */ fun getMechanic(clazz: Class): T - - companion object : MechanicRegistry by mechanicRegistry { - val INSTANCE get() = mechanicRegistry - } } /** diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/idcard/IdCardMechanic.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/idcard/IdCardMechanic.kt index 5860502..f9454bd 100644 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/idcard/IdCardMechanic.kt +++ b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/idcard/IdCardMechanic.kt @@ -2,4 +2,4 @@ package dev.slne.surf.roleplay.api.common.mechanic.idcard import dev.slne.surf.roleplay.api.common.mechanic.Mechanic -interface IdCardMechanic : Mechanic \ No newline at end of file +interface IdCardMechanic : Mechanic \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/Rentable.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/Rentable.kt index 102ddb6..65784a6 100644 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/Rentable.kt +++ b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/Rentable.kt @@ -1,11 +1,11 @@ package dev.slne.surf.roleplay.api.common.mechanic.rentable -import dev.slne.surf.roleplay.api.common.mechanic.rentable.events.RentableMemberAddEvent -import dev.slne.surf.roleplay.api.common.mechanic.rentable.events.RentableMemberRemoveEvent -import dev.slne.surf.roleplay.api.common.mechanic.rentable.events.RentableOwnerChangeEvent import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.StorageContainer import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.door.Door import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.door.DoorContainer +import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.events.RentableMemberAddEvent +import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.events.RentableMemberRemoveEvent +import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.events.RentableOwnerChangeEvent import dev.slne.surf.roleplay.api.common.player.RpPlayer import it.unimi.dsi.fastutil.objects.ObjectSet import net.kyori.adventure.key.Key diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/StorageContainer.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/StorageContainer.kt index a3fb4ba..2696c8f 100644 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/StorageContainer.kt +++ b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/StorageContainer.kt @@ -1,8 +1,9 @@ package dev.slne.surf.roleplay.api.common.mechanic.rentable.utils +import dev.slne.surf.cloud.api.common.player.teleport.TeleportLocation import dev.slne.surf.roleplay.api.common.mechanic.rentable.Rentable -import org.bukkit.Location -import org.bukkit.Material +import dev.slne.surf.surfapi.core.api.messages.adventure.key +import net.kyori.adventure.key.Key import kotlin.time.Duration import kotlin.time.Duration.Companion.seconds @@ -19,7 +20,7 @@ interface StorageContainer { /** * The location of the storage container in the world. */ - val location: Location + val location: TeleportLocation /** * The type of the storage container, which can be either a regular storage container or a vault. @@ -39,9 +40,9 @@ interface StorageContainer { /** * The different types of storage containers. */ - enum class StorageContainerType(val material: Material) { - REGULAR(Material.CHEST), - VAULT(Material.VAULT); + enum class StorageContainerType(val material: Key) { + REGULAR(key("minecraft:chest")), + VAULT(key("minecraft:vault")), ; } /** diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/door/Door.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/door/Door.kt index 25adc0c..a376373 100644 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/door/Door.kt +++ b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/door/Door.kt @@ -1,9 +1,9 @@ package dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.door +import dev.slne.surf.cloud.api.common.player.teleport.TeleportLocation import dev.slne.surf.roleplay.api.common.mechanic.rentable.Rentable import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.Crackable import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.Lockable -import org.bukkit.Location /** * Represents a door in the game that can be locked and cracked. @@ -24,7 +24,7 @@ interface Door : Lockable, Crackable { /** * The location of the door in the world. */ - val location: Location + val location: TeleportLocation /** * Opens the door. diff --git a/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/rentable/events/RentableMemberAddEvent.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/events/RentableMemberAddEvent.kt similarity index 89% rename from surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/rentable/events/RentableMemberAddEvent.kt rename to surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/events/RentableMemberAddEvent.kt index c409126..3a66fdb 100644 --- a/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/rentable/events/RentableMemberAddEvent.kt +++ b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/events/RentableMemberAddEvent.kt @@ -1,8 +1,8 @@ -package dev.slne.surf.roleplay.api.paper.rentable.events +package dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.events +import dev.slne.surf.cloud.api.common.event.CancellableCloudEvent import dev.slne.surf.roleplay.api.common.mechanic.rentable.Rentable import dev.slne.surf.roleplay.api.common.player.RpPlayer -import dev.slne.surf.roleplay.api.paper.events.CancellableRpEvent /** * Event triggered when a member is added to a rentable property. @@ -12,9 +12,24 @@ import dev.slne.surf.roleplay.api.paper.events.CancellableRpEvent * @property member The player who is being added as a member to the rentable property. */ class RentableMemberAddEvent( + source: Any, val rentable: Rentable, val member: RpPlayer, -) : CancellableRpEvent() { +) : CancellableCloudEvent(source) { + /** + * Represents the reasons why adding a member to a rentable property might fail. + */ + sealed class MemberAddFailureReason { + /** + * Indicates that the member is already part of the rentable property. + */ + data object AlreadyMember : MemberAddFailureReason() + + /** + * Indicates that the addition of the member was cancelled by an event handler. + */ + data object EventCancelled : MemberAddFailureReason() + } /** * The result of the member addition operation. @@ -33,19 +48,4 @@ class RentableMemberAddEvent( */ data class Failure(val reason: MemberAddFailureReason) : MemberAddResult() } - - /** - * Represents the reasons why adding a member to a rentable property might fail. - */ - sealed class MemberAddFailureReason { - /** - * Indicates that the member is already part of the rentable property. - */ - data object AlreadyMember : MemberAddFailureReason() - - /** - * Indicates that the addition of the member was cancelled by an event handler. - */ - data object EventCancelled : MemberAddFailureReason() - } } \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/rentable/events/RentableMemberRemoveEvent.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/events/RentableMemberRemoveEvent.kt similarity index 89% rename from surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/rentable/events/RentableMemberRemoveEvent.kt rename to surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/events/RentableMemberRemoveEvent.kt index 3c26f02..d068f3c 100644 --- a/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/rentable/events/RentableMemberRemoveEvent.kt +++ b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/events/RentableMemberRemoveEvent.kt @@ -1,8 +1,8 @@ -package dev.slne.surf.roleplay.api.paper.rentable.events +package dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.events +import dev.slne.surf.cloud.api.common.event.CancellableCloudEvent import dev.slne.surf.roleplay.api.common.mechanic.rentable.Rentable import dev.slne.surf.roleplay.api.common.player.RpPlayer -import dev.slne.surf.roleplay.api.paper.events.CancellableRpEvent /** * Event triggered when a member is removed from a rentable property. @@ -12,9 +12,24 @@ import dev.slne.surf.roleplay.api.paper.events.CancellableRpEvent * @property member The player who is being removed as a member from the rentable property. */ class RentableMemberRemoveEvent( + source: Any, val rentable: Rentable, val member: RpPlayer, -) : CancellableRpEvent() { +) : CancellableCloudEvent(source) { + /** + * Represents the reasons why removing a member from a rentable property might fail. + */ + sealed class MemberRemoveFailureReason { + /** + * Indicates that the member is not part of the rentable property. + */ + data object NotMember : MemberRemoveFailureReason() + + /** + * Indicates that the event was cancelled, preventing the member from being removed. + */ + data object EventCancelled : MemberRemoveFailureReason() + } /** * The result of the member removal operation. @@ -33,19 +48,4 @@ class RentableMemberRemoveEvent( */ data class Failure(val reason: MemberRemoveFailureReason) : MemberRemoveResult() } - - /** - * Represents the reasons why removing a member from a rentable property might fail. - */ - sealed class MemberRemoveFailureReason { - /** - * Indicates that the member is not part of the rentable property. - */ - data object NotMember : MemberRemoveFailureReason() - - /** - * Indicates that the event was cancelled, preventing the member from being removed. - */ - data object EventCancelled : MemberRemoveFailureReason() - } } \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/rentable/events/RentableOwnerChangeEvent.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/events/RentableOwnerChangeEvent.kt similarity index 96% rename from surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/rentable/events/RentableOwnerChangeEvent.kt rename to surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/events/RentableOwnerChangeEvent.kt index cf8e1c9..e5bcdd6 100644 --- a/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/rentable/events/RentableOwnerChangeEvent.kt +++ b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/events/RentableOwnerChangeEvent.kt @@ -1,9 +1,9 @@ -package dev.slne.surf.roleplay.api.paper.rentable.events +package dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.events +import dev.slne.surf.cloud.api.common.event.CancellableCloudEvent import dev.slne.surf.roleplay.api.common.mechanic.rentable.Rentable import dev.slne.surf.roleplay.api.common.mechanic.rentable.RentableMechanic import dev.slne.surf.roleplay.api.common.player.RpPlayer -import dev.slne.surf.roleplay.api.paper.events.CancellableRpEvent import dev.slne.surf.surfapi.core.api.messages.builder.SurfComponentBuilder /** @@ -16,11 +16,12 @@ import dev.slne.surf.surfapi.core.api.messages.builder.SurfComponentBuilder * @property reason The reason for the owner change. */ class RentableOwnerChangeEvent( + source: Any, val rentable: Rentable, val oldOwner: RpPlayer?, val newOwner: RpPlayer?, val reason: OwnerChangeReason, -) : CancellableRpEvent() { +) : CancellableCloudEvent(source) { /** * The reason why the owner change was cancelled, if applicable. @@ -47,23 +48,6 @@ class RentableOwnerChangeEvent( data object OwnerSetNewOwner : OwnerChangeReason() } - /** - * The result of setting a new owner for the rentable property. - */ - sealed class OwnerSetResult { - /** - * Indicates a successful owner change operation. - */ - data object Success : OwnerSetResult() - - /** - * Indicates a failure in setting the new owner for the rentable property. - * Contains the reason for the failure. - * - * @property reason The reason why the owner change failed. - */ - data class Failure(val reason: OwnerSetFailureReason) : OwnerSetResult() - } /** * Represents the reasons why setting a new owner for a rentable property might fail. @@ -135,4 +119,23 @@ class RentableOwnerChangeEvent( variableValue(reason) }) } + + /** + * The result of setting a new owner for the rentable property. + */ + sealed class OwnerSetResult { + /** + * Indicates a successful owner change operation. + */ + data object Success : OwnerSetResult() + + /** + * Indicates a failure in setting the new owner for the rentable property. + * Contains the reason for the failure. + * + * @property reason The reason why the owner change failed. + */ + data class Failure(val reason: OwnerSetFailureReason) : OwnerSetResult() + } + } \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/rentable/events/RentableRentCollectEvent.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/events/RentableRentCollectEvent.kt similarity index 70% rename from surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/rentable/events/RentableRentCollectEvent.kt rename to surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/events/RentableRentCollectEvent.kt index 391954e..49113b6 100644 --- a/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/rentable/events/RentableRentCollectEvent.kt +++ b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/events/RentableRentCollectEvent.kt @@ -1,7 +1,7 @@ -package dev.slne.surf.roleplay.api.paper.rentable.events +package dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.events +import dev.slne.surf.cloud.api.common.event.CancellableCloudEvent import dev.slne.surf.roleplay.api.common.mechanic.rentable.Rentable -import dev.slne.surf.roleplay.api.paper.events.CancellableRpEvent /** * Event triggered when rent is collected from a rentable property. @@ -11,6 +11,7 @@ import dev.slne.surf.roleplay.api.paper.events.CancellableRpEvent * @property amount The amount of rent being collected. */ class RentableRentCollectEvent( + source: Any, val rentable: Rentable, var amount: Int, -) : CancellableRpEvent() \ No newline at end of file +) : CancellableCloudEvent(source) \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/weapon/WeaponMechanic.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/weapon/WeaponMechanic.kt index 5a88c79..e17f6b9 100644 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/weapon/WeaponMechanic.kt +++ b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/weapon/WeaponMechanic.kt @@ -1,10 +1,10 @@ -package dev.slne.surf.roleplay.api.mechanic.weapon +package dev.slne.surf.roleplay.api.common.mechanic.weapon -import dev.slne.surf.roleplay.api.common.mechanic.weapon.Weapon +import dev.slne.surf.roleplay.api.common.mechanic.Mechanic import it.unimi.dsi.fastutil.objects.ObjectSet import org.jetbrains.annotations.Unmodifiable -interface WeaponMechanic { +interface WeaponMechanic : Mechanic { val weapons: @Unmodifiable ObjectSet diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/weapon/magazine/PlayerMagazine.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/weapon/magazine/PlayerMagazine.kt deleted file mode 100644 index dd2987c..0000000 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/weapon/magazine/PlayerMagazine.kt +++ /dev/null @@ -1,13 +0,0 @@ -package dev.slne.surf.roleplay.api.common.mechanic.weapon.magazine - -import org.bukkit.inventory.ItemStack - -interface PlayerMagazine { - - val magazine: Magazine - - val currentAmmo: Int - - fun buildItemStack(): ItemStack - -} \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/weapon/player/PlayerWeapon.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/weapon/player/PlayerWeapon.kt deleted file mode 100644 index 1ae1d4b..0000000 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/weapon/player/PlayerWeapon.kt +++ /dev/null @@ -1,16 +0,0 @@ -package dev.slne.surf.roleplay.api.common.mechanic.weapon.player - -import dev.slne.surf.roleplay.api.common.mechanic.weapon.Weapon -import dev.slne.surf.roleplay.api.common.mechanic.weapon.magazine.PlayerMagazine -import org.bukkit.inventory.ItemStack - -interface PlayerWeapon { - - val weapon: Weapon - - val currentMagazine: PlayerMagazine? - - fun setCurrentMagazine(magazine: PlayerMagazine?) - - fun buildItemStack(): ItemStack -} \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/RpPlayer.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/RpPlayer.kt index 8f0a493..319494d 100644 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/RpPlayer.kt +++ b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/RpPlayer.kt @@ -1,14 +1,19 @@ +@file:OptIn(InternalRoleplayApi::class) + package dev.slne.surf.roleplay.api.common.player import dev.slne.surf.cloud.api.common.player.OfflineCloudPlayer +import dev.slne.surf.roleplay.api.common.InternalContextHolder import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity import dev.slne.surf.roleplay.api.common.player.license.HasLicenses import dev.slne.surf.roleplay.api.common.transaction.HasRpTransactions +import dev.slne.surf.roleplay.api.common.util.InternalRoleplayApi import it.unimi.dsi.fastutil.objects.ObjectSet -import net.kyori.adventure.text.Component +import net.kyori.adventure.text.ComponentLike +import org.springframework.beans.factory.getBean import java.time.ZonedDateTime -interface RpPlayer : HasRpTransactions, HasLicenses { +interface RpPlayer : HasRpTransactions, HasLicenses, ComponentLike { /** * The cloud player associated with this [RpPlayer]. @@ -92,16 +97,10 @@ interface RpPlayer : HasRpTransactions, HasLicenses { */ fun hasCompletedCitizenship(): Boolean - /** - * Returns the player as a Component for display purposes. - * This method is used to convert the player information into a format suitable for display in user interfaces. - * - * @return A [Component] representing the player. - */ - suspend fun asComponent(): Component - companion object { - operator fun get(cloudPlayer: OfflineCloudPlayer): RpPlayer = null + operator fun get(cloudPlayer: OfflineCloudPlayer) = + InternalContextHolder.instance.context.getBean() + .getPlayerByUuid(cloudPlayer.uuid) } } diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/events/RpPlayerJoinEvent.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/events/RpPlayerJoinEvent.kt new file mode 100644 index 0000000..bdd4d79 --- /dev/null +++ b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/events/RpPlayerJoinEvent.kt @@ -0,0 +1,9 @@ +package dev.slne.surf.roleplay.api.common.player.events + +import dev.slne.surf.cloud.api.common.event.CloudEvent +import dev.slne.surf.roleplay.api.common.player.RpPlayer + +class RpPlayerJoinEvent( + source: Any, + val player: RpPlayer, +) : CloudEvent(source) \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/events/RpPlayerQuitEvent.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/events/RpPlayerQuitEvent.kt new file mode 100644 index 0000000..d0a2e54 --- /dev/null +++ b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/events/RpPlayerQuitEvent.kt @@ -0,0 +1,9 @@ +package dev.slne.surf.roleplay.api.common.player.events + +import dev.slne.surf.cloud.api.common.event.CloudEvent +import dev.slne.surf.roleplay.api.common.player.RpPlayer + +class RpPlayerQuitEvent( + source: Any, + val player: RpPlayer, +) : CloudEvent(source) \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/identity/RpIdentity.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/identity/RpIdentity.kt index bae781c..d5216cb 100644 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/identity/RpIdentity.kt +++ b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/identity/RpIdentity.kt @@ -7,12 +7,18 @@ import dev.slne.surf.surfapi.core.api.messages.adventure.buildText import net.kyori.adventure.text.ComponentLike import java.time.LocalDate import java.time.ZonedDateTime +import java.util.* /** * Represents a roleplay identity of a player */ interface RpIdentity : HasRpTransactions, HasLicenses { + /** + * The unique identifier for this identity. + */ + val uuid: UUID + /** * The player associated with this identity. */ @@ -38,6 +44,15 @@ interface RpIdentity : HasRpTransactions, HasLicenses { */ var dateOfBirth: LocalDate + /** + * Updates the information of the current instance of [RpIdentity]. + * The provided [identity] lambda is used to modify the instance's fields. + * + * @param identity A lambda that modifies the fields of the current instance of [RpIdentity]. + * @return The updated instance of [RpIdentity]. + */ + suspend fun updateInformation(identity: T.() -> Unit): T + /** * The date and time when the identity was created. */ @@ -77,14 +92,50 @@ interface RpIdentity : HasRpTransactions, HasLicenses { } } + /** + * Represents a civilian identity in the roleplay system. + * + * This interface is used to distinguish a civilian roleplay identity, which is a type of + * general roleplay identity. It encapsulates all the properties and behavior associated + * specifically with civilian players. + * + * The `CivilianIdentity` is tied to the broader `RpIdentity` interface and can be manipulated + * through systems that manage identities, such as creating, updating, or associating them + * with players. This identity type is expected to represent standard non-authoritative + * roles within the game. + */ interface CivilianIdentity : RpIdentity + /** + * Represents an identity for a player who is a member of the rescue service. + * Extends the generic `RpIdentity` interface to specify details unique to rescue service personnel. + */ interface RescueServiceIdentity : RpIdentity { + /** + * Represents the rank assigned to a player within the rescue service roleplay identity. + * + * This value indicates the hierarchical position or title of the player + * in the context of their role as a member of the rescue service. + */ val rank: String } + /** + * Represents the identity of a police officer within the game. + * Extends the base roleplay identity functionality by adding police-specific attributes + * such as rank and badge number that uniquely define a police officer's identity. + */ interface PoliceIdentity : RpIdentity { + /** + * Represents the rank of a player in their roleplay identity, such as in a police or rescue service role. + * This value indicates the hierarchical status or designation within the associated identity. + */ val rank: String + + /** + * Represents the badge number associated with a police identity. + * The badge number is unique to each police officer and serves as an identifier. + */ val badgeNumber: String } } \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/IdentityLicense.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/IdentityLicense.kt index a2f4eb9..c5c6142 100644 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/IdentityLicense.kt +++ b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/IdentityLicense.kt @@ -1,6 +1,8 @@ package dev.slne.surf.roleplay.api.common.player.license import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity +import kotlinx.serialization.Contextual +import kotlinx.serialization.Serializable import java.time.ZonedDateTime /** @@ -13,11 +15,12 @@ import java.time.ZonedDateTime * @property identity The [RpIdentity] associated with this license. * @property expiresAt The expiration time of the license, if applicable. Defaults to null if the license does not expire. */ +@Serializable data class IdentityLicense( val license: License, val identity: RpIdentity, - val expiresAt: ZonedDateTime?, - val createdAt: ZonedDateTime = ZonedDateTime.now() + val expiresAt: @Contextual ZonedDateTime?, + val createdAt: @Contextual ZonedDateTime = ZonedDateTime.now() ) { /** * Checks if the license is expired. @@ -69,5 +72,4 @@ data class IdentityLicense( ) } - } \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/InternalLicenseBridge.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/InternalLicenseBridge.kt index abd78b4..cfc1b49 100644 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/InternalLicenseBridge.kt +++ b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/InternalLicenseBridge.kt @@ -6,11 +6,13 @@ import dev.slne.surf.roleplay.api.common.InternalContextHolder import dev.slne.surf.roleplay.api.common.player.RpPlayer import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity import dev.slne.surf.roleplay.api.common.util.InternalRoleplayApi +import it.unimi.dsi.fastutil.objects.Object2ObjectMap import it.unimi.dsi.fastutil.objects.ObjectSet import net.kyori.adventure.key.Key import org.jetbrains.annotations.Unmodifiable import org.springframework.beans.factory.getBean +@InternalRoleplayApi interface InternalLicenseBridge { /** @@ -19,21 +21,13 @@ interface InternalLicenseBridge { val licenses: @Unmodifiable ObjectSet /** - * Returns the license by its class. + * Retrieves a license of the specified type. * - * @param license the class of the license to retrieve. - * @return the license instance if found, or null if not found. + * @param T The type of the license to retrieve. + * @param license The class object of the license type. + * @return An instance of the requested license type. */ - fun getLicense(license: Class): License? - - /** - * Returns the license by its class. - * - * @param license the class of the license to retrieve. - * @return the license instance if found, or null if not found. - * @throws IllegalArgumentException if the license is not found. - */ - fun getLicenseOrThrow(license: Class): License + fun getLicense(license: Class): T /** * Returns the license by its key. @@ -88,19 +82,24 @@ interface InternalLicenseBridge { license: License ): Boolean + /** + * Retrieves all expired licenses grouped by their respective identities. + * + * This method scans through the available licenses and identifies those + * that have expired. The expired licenses are returned as a mapping + * of identities to their associated expired licenses. + * + * @return A map where each key is an [RpIdentity] and the corresponding value + * is a set of [IdentityLicense] objects representing the expired licenses + * for that identity. + */ + suspend fun getAllExpiredLicenses(): Object2ObjectMap> + companion object { val instance get() = InternalContextHolder.instance.context.getBean() } } -/** - * Convenience function to get a license by its type. - * - * @param T the type of the license to retrieve. - * @return the license instance if found, or null if not found. - */ -inline fun InternalLicenseBridge.getLicense() = getLicense(T::class.java) - /** * Convenience function to get a license by its type, or throw an exception if not found. * @@ -108,5 +107,5 @@ inline fun InternalLicenseBridge.getLicense() = getLicense * @return the license instance if found. * @throws IllegalArgumentException if the license is not found. */ -inline fun InternalLicenseBridge.getLicenseOrThrow() = - getLicenseOrThrow(T::class.java) \ No newline at end of file +inline fun InternalLicenseBridge.getLicense() = + getLicense(T::class.java) \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/License.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/License.kt index a3b5ff7..dd0ac0a 100644 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/License.kt +++ b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/License.kt @@ -3,9 +3,11 @@ package dev.slne.surf.roleplay.api.common.player.license import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity import dev.slne.surf.roleplay.api.common.player.license.utils.UnobtainableReason import it.unimi.dsi.fastutil.objects.ObjectSet +import kotlinx.serialization.Serializable import net.kyori.adventure.key.Key import net.kyori.adventure.text.Component +@Serializable(with = LicenseSerializer::class) interface License { /** * The internal name of the license, used for identification. diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/LicenseSerializer.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/LicenseSerializer.kt new file mode 100644 index 0000000..d54c092 --- /dev/null +++ b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/LicenseSerializer.kt @@ -0,0 +1,26 @@ +@file:OptIn(InternalRoleplayApi::class) + +package dev.slne.surf.roleplay.api.common.player.license + +import dev.slne.surf.roleplay.api.common.util.InternalRoleplayApi +import dev.slne.surf.surfapi.core.api.messages.adventure.key +import kotlinx.serialization.KSerializer +import kotlinx.serialization.descriptors.PrimitiveKind +import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder + +object LicenseSerializer : KSerializer { + + override val descriptor = PrimitiveSerialDescriptor("License", PrimitiveKind.STRING) + + override fun serialize( + encoder: Encoder, + value: License + ) { + encoder.encodeString(value.key.asString()) + } + + override fun deserialize(decoder: Decoder) = + InternalLicenseBridge.instance.getLicenseByKeyOrThrow(key(decoder.decodeString())) +} \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/player/license/events/RpPlayerLicenseAddedEvent.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/events/RpPlayerLicenseAddedEvent.kt similarity index 66% rename from surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/player/license/events/RpPlayerLicenseAddedEvent.kt rename to surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/events/RpPlayerLicenseAddedEvent.kt index 859fad5..b855c29 100644 --- a/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/player/license/events/RpPlayerLicenseAddedEvent.kt +++ b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/events/RpPlayerLicenseAddedEvent.kt @@ -1,14 +1,15 @@ -package dev.slne.surf.roleplay.api.paper.player.license.events +package dev.slne.surf.roleplay.api.common.player.license.events +import dev.slne.surf.cloud.api.common.event.CancellableCloudEvent import dev.slne.surf.roleplay.api.common.player.RpPlayer import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity import dev.slne.surf.roleplay.api.common.player.license.IdentityLicense -import dev.slne.surf.roleplay.api.paper.events.CancellableRpEvent class RpPlayerLicenseAddedEvent( + source: Any, val player: RpPlayer, val identity: RpIdentity, val license: IdentityLicense -) : CancellableRpEvent() { +) : CancellableCloudEvent(source) { var cancelReason: String? = null } \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/player/license/events/RpPlayerLicenseRemovedEvent.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/events/RpPlayerLicenseRemovedEvent.kt similarity index 71% rename from surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/player/license/events/RpPlayerLicenseRemovedEvent.kt rename to surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/events/RpPlayerLicenseRemovedEvent.kt index 77e14fd..28d3f18 100644 --- a/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/player/license/events/RpPlayerLicenseRemovedEvent.kt +++ b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/events/RpPlayerLicenseRemovedEvent.kt @@ -1,14 +1,15 @@ -package dev.slne.surf.roleplay.api.paper.player.license.events +package dev.slne.surf.roleplay.api.common.player.license.events +import dev.slne.surf.cloud.api.common.event.CancellableCloudEvent import dev.slne.surf.roleplay.api.common.player.RpPlayer import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity import dev.slne.surf.roleplay.api.common.player.license.IdentityLicense import dev.slne.surf.roleplay.api.common.player.license.utils.LicenseRemovedReason -import dev.slne.surf.roleplay.api.paper.events.CancellableRpEvent class RpPlayerLicenseRemovedEvent( + source: Any, val player: RpPlayer, val identity: RpIdentity, val license: IdentityLicense, val reason: LicenseRemovedReason, -) : CancellableRpEvent() \ No newline at end of file +) : CancellableCloudEvent(source) \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-client/src/main/kotlin/dev/slne/surf/roleplay/core/client/player/ClientRpPlayerManager.kt b/surf-roleplay-core/surf-roleplay-core-client/src/main/kotlin/dev/slne/surf/roleplay/core/client/player/ClientRpPlayerManager.kt index 98de58d..48bb546 100644 --- a/surf-roleplay-core/surf-roleplay-core-client/src/main/kotlin/dev/slne/surf/roleplay/core/client/player/ClientRpPlayerManager.kt +++ b/surf-roleplay-core/surf-roleplay-core-client/src/main/kotlin/dev/slne/surf/roleplay/core/client/player/ClientRpPlayerManager.kt @@ -1,5 +1,6 @@ package dev.slne.surf.roleplay.core.client.player +import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity import dev.slne.surf.roleplay.core.common.player.CommonRpPlayerManager import org.springframework.stereotype.Component import java.util.* @@ -7,4 +8,26 @@ import java.util.* @Component class ClientRpPlayerManager : CommonRpPlayerManager() { override fun createPlayer(uuid: UUID) = ClientRpPlayer(uuid) + + override suspend fun fetchIdentities(uuid: UUID): Set { + TODO("Not yet implemented") + } + + override suspend fun createIdentity( + identity: T + ): T { + TODO("Not yet implemented") + } + + override suspend fun updateIdentity( + identity: T + ): T? { + TODO("Not yet implemented") + } + + override suspend fun createOrUpdateIdentity( + identity: T + ): T { + TODO("Not yet implemented") + } } \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/CommonRpInstance.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/CommonRpInstance.kt new file mode 100644 index 0000000..2e5f3c8 --- /dev/null +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/CommonRpInstance.kt @@ -0,0 +1,25 @@ +package dev.slne.surf.roleplay.core.common + +import dev.slne.surf.roleplay.core.common.mechanics.CommonMechanicRegistry +import javax.annotation.OverridingMethodsMustInvokeSuper + +abstract class CommonRpInstance( + private val commonMechanicRegistry: CommonMechanicRegistry +) { + + @OverridingMethodsMustInvokeSuper + open suspend fun onLoad() { + commonMechanicRegistry.loadMechanics() + } + + @OverridingMethodsMustInvokeSuper + open suspend fun onEnable() { + commonMechanicRegistry.enableMechanics() + } + + @OverridingMethodsMustInvokeSuper + open suspend fun onDisable() { + commonMechanicRegistry.disableMechanics() + } + +} \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/CommonMechanic.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/CommonMechanic.kt new file mode 100644 index 0000000..8dfaeea --- /dev/null +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/CommonMechanic.kt @@ -0,0 +1,11 @@ +package dev.slne.surf.roleplay.core.common.mechanics + +import dev.slne.surf.roleplay.api.common.mechanic.Mechanic + +abstract class CommonMechanic( + override val name: String, +) : Mechanic { + override suspend fun onLoad() {} + override suspend fun onEnable() {} + override suspend fun onDisable() {} +} \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/CommonMechanicRegistry.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/CommonMechanicRegistry.kt new file mode 100644 index 0000000..94b27a1 --- /dev/null +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/CommonMechanicRegistry.kt @@ -0,0 +1,29 @@ +package dev.slne.surf.roleplay.core.common.mechanics + +import dev.slne.surf.cloud.api.common.util.forEachAnnotationOrdered +import dev.slne.surf.roleplay.api.common.mechanic.Mechanic +import dev.slne.surf.roleplay.api.common.mechanic.MechanicRegistry +import org.springframework.beans.factory.ObjectProvider +import org.springframework.context.ApplicationContext +import org.springframework.stereotype.Component + +@Component +class CommonMechanicRegistry( + private val context: ApplicationContext, + private val mechanics: ObjectProvider, +) : MechanicRegistry { + + override fun getMechanic(clazz: Class) = context.getBean(clazz) + + suspend fun loadMechanics() { + mechanics.forEachAnnotationOrdered { it.onLoad() } + } + + suspend fun enableMechanics() { + mechanics.forEachAnnotationOrdered { it.onEnable() } + } + + suspend fun disableMechanics() { + mechanics.forEachAnnotationOrdered { it.onDisable() } // // FIXME: 11.08.2025 20:27 turn around stream + } +} \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/MechanicImpl.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/MechanicImpl.kt deleted file mode 100644 index 53c5f0c..0000000 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/MechanicImpl.kt +++ /dev/null @@ -1,19 +0,0 @@ -package dev.slne.surf.roleplay.core.common.mechanics - -import com.github.retrooper.packetevents.event.PacketListener -import com.github.retrooper.packetevents.event.PacketListenerPriority -import dev.slne.surf.roleplay.api.common.mechanic.Mechanic -import dev.slne.surf.roleplay.api.common.util.RpJob -import dev.slne.surf.surfapi.core.api.util.objectSetOf -import it.unimi.dsi.fastutil.objects.ObjectSet - -abstract class MechanicImpl( - override val name: String, - override val handlers: ObjectSet = objectSetOf(), - override val rpJobs: ObjectSet = objectSetOf(), - override val packetListeners: ObjectSet> = objectSetOf() -) : Mechanic { - override suspend fun onLoad() {} - override suspend fun onEnable() {} - override suspend fun onDisable() {} -} \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/MechanicRegistryImpl.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/MechanicRegistryImpl.kt deleted file mode 100644 index 8f706f3..0000000 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/MechanicRegistryImpl.kt +++ /dev/null @@ -1,64 +0,0 @@ -package dev.slne.surf.roleplay.core.common.mechanics - -import com.github.shynixn.mccoroutine.folia.SuspendingJavaPlugin -import com.google.auto.service.AutoService -import dev.slne.surf.roleplay.api.common.mechanic.Mechanic -import dev.slne.surf.roleplay.api.common.mechanic.MechanicRegistry -import dev.slne.surf.roleplay.core.common.mechanics.idcard.IdCardMechanicImpl -import dev.slne.surf.roleplay.core.common.mechanics.rentable.RentableMechanicImpl -import dev.slne.surf.surfapi.bukkit.api.event.register -import dev.slne.surf.surfapi.core.api.util.mutableObjectSetOf -import net.kyori.adventure.util.Services - -val plugin get() = mechanicRegistryImpl.plugin - -@AutoService(MechanicRegistry::class) -class MechanicRegistryImpl : MechanicRegistry, Services.Fallback { - - lateinit var plugin: SuspendingJavaPlugin - private set - - private val mechanics = mutableObjectSetOf() - - @Suppress("UNCHECKED_CAST") - override fun getMechanic(clazz: Class) = - mechanics.firstOrNull { clazz.isAssignableFrom(it.javaClass) } as? T - ?: throw IllegalArgumentException("No mechanic of class ${clazz.name} is registered.") - - fun registerMechanics(plugin: SuspendingJavaPlugin) { - this.plugin = plugin - - mechanics.add(IdCardMechanicImpl) - mechanics.add(RentableMechanicImpl) - } - - fun registerBukkitHandlers() { - mechanics.forEach { mechanic -> mechanic.handlers.forEach { it.register() } } - } - - fun startAllRpJobs() { - mechanics.forEach { it.rpJobs.forEach { job -> job.start() } } - } - - suspend fun stopAllRpJobs() { - mechanics.forEach { it.rpJobs.forEach { job -> job.stop() } } - } - - suspend fun loadMechanics() { - mechanics.forEach { it.onLoad() } - } - - suspend fun enableMechanics() { - mechanics.forEach { it.onEnable() } - - startAllRpJobs() - } - - suspend fun disableMechanics() { - stopAllRpJobs() - - mechanics.forEach { it.onDisable() } - } -} - -val mechanicRegistryImpl get() = MechanicRegistry.INSTANCE as MechanicRegistryImpl \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/idcard/IdCardCommonMechanic.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/idcard/IdCardCommonMechanic.kt new file mode 100644 index 0000000..84a30fa --- /dev/null +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/idcard/IdCardCommonMechanic.kt @@ -0,0 +1,8 @@ +package dev.slne.surf.roleplay.core.common.mechanics.idcard + +import dev.slne.surf.roleplay.api.common.mechanic.idcard.IdCardMechanic +import dev.slne.surf.roleplay.core.common.mechanics.CommonMechanic + +abstract class IdCardCommonMechanic : CommonMechanic( + name = "IdCardMechanic", +), IdCardMechanic \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/idcard/IdCardMechanicImpl.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/idcard/IdCardMechanicImpl.kt deleted file mode 100644 index 8e0cc61..0000000 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/idcard/IdCardMechanicImpl.kt +++ /dev/null @@ -1,19 +0,0 @@ -package dev.slne.surf.roleplay.core.common.mechanics.idcard - -import dev.slne.surf.roleplay.api.common.mechanic.idcard.IdCardMechanic -import dev.slne.surf.roleplay.core.common.mechanics.MechanicImpl -import dev.slne.surf.surfapi.core.api.util.objectSetOf - -object IdCardMechanicImpl : MechanicImpl( - name = "IdCardMechanic", - handlers = objectSetOf( - IdCardHandler - ) -), IdCardMechanic { - - const val NPC_NAME = "ID-Card_npc" - - override suspend fun onEnable() { - IdCardNpc.spawnNpc() - } -} \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/door/DoorImpl.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/door/DoorImpl.kt index 0abe646..78a3845 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/door/DoorImpl.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/door/DoorImpl.kt @@ -1,5 +1,6 @@ package dev.slne.surf.roleplay.core.common.mechanics.rentable.door +import dev.slne.surf.cloud.api.common.player.teleport.TeleportLocation import dev.slne.surf.roleplay.api.common.mechanic.rentable.Rentable import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.LockPick import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.door.Door @@ -11,7 +12,7 @@ import kotlin.time.Duration abstract class DoorImpl( override val rentable: Rentable, override val container: DoorContainer, - override val location: Location, + override val location: TeleportLocation, override val crackDuration: Duration ) : Door { diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/utils/RpMechanic.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/utils/RpMechanic.kt new file mode 100644 index 0000000..fde0fa6 --- /dev/null +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/utils/RpMechanic.kt @@ -0,0 +1,8 @@ +package dev.slne.surf.roleplay.core.common.mechanics.utils + +import org.springframework.stereotype.Component + +@Component +@Retention(AnnotationRetention.RUNTIME) +@Target(AnnotationTarget.CLASS) +annotation class RpMechanic() diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/utils/RpPacketListener.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/utils/RpPacketListener.kt new file mode 100644 index 0000000..6b1a600 --- /dev/null +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/utils/RpPacketListener.kt @@ -0,0 +1,11 @@ +package dev.slne.surf.roleplay.core.common.mechanics.utils + +import com.github.retrooper.packetevents.event.PacketListenerPriority +import org.springframework.stereotype.Component + +@Component +@Retention(AnnotationRetention.RUNTIME) +@Target(AnnotationTarget.CLASS) +annotation class RpPacketListener( + val priority: PacketListenerPriority = PacketListenerPriority.NORMAL, +) \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/WeaponMechanicImpl.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/WeaponMechanicImpl.kt index 8ce65d5..70aca44 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/WeaponMechanicImpl.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/WeaponMechanicImpl.kt @@ -1,7 +1,7 @@ package dev.slne.surf.roleplay.mechanic.mechanics.weapon +import dev.slne.surf.roleplay.api.common.mechanic.weapon.WeaponMechanic import dev.slne.surf.roleplay.api.mechanic.weapon.Weapon -import dev.slne.surf.roleplay.api.mechanic.weapon.WeaponMechanic import dev.slne.surf.roleplay.mechanic.MechanicImpl import dev.slne.surf.surfapi.core.api.util.freeze import dev.slne.surf.surfapi.core.api.util.mutableObjectSetOf diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/CommonRpPlayer.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/CommonRpPlayer.kt index d389c2e..1e3f4a3 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/CommonRpPlayer.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/CommonRpPlayer.kt @@ -2,19 +2,23 @@ package dev.slne.surf.roleplay.core.common.player import dev.slne.surf.cloud.api.common.player.OfflineCloudPlayer import dev.slne.surf.cloud.api.common.player.toOfflineCloudPlayer +import dev.slne.surf.roleplay.api.common.InternalContextHolder import dev.slne.surf.roleplay.api.common.player.RpPlayer import dev.slne.surf.roleplay.api.common.player.getIdentity import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity import dev.slne.surf.roleplay.api.common.player.license.License import dev.slne.surf.roleplay.api.common.player.license.utils.LicenseRemovedReason import dev.slne.surf.roleplay.api.common.transaction.utils.BalanceType +import dev.slne.surf.roleplay.api.common.util.InternalRoleplayApi import dev.slne.surf.surfapi.core.api.messages.adventure.appendNewline import dev.slne.surf.surfapi.core.api.messages.adventure.buildText +import dev.slne.surf.surfapi.core.api.util.freeze import dev.slne.surf.surfapi.core.api.util.mutableObjectSetOf -import it.unimi.dsi.fastutil.objects.ObjectSet +import org.springframework.beans.factory.getBean import java.time.ZonedDateTime import java.util.* +@OptIn(InternalRoleplayApi::class) abstract class CommonRpPlayer( private val uuid: UUID, override var createdAt: ZonedDateTime = ZonedDateTime.now(), @@ -25,10 +29,19 @@ abstract class CommonRpPlayer( get() = uuid.toOfflineCloudPlayer() private val _identities = mutableObjectSetOf() - override val identities: ObjectSet get() = _identities + override val identities = _identities.freeze() override var activeIdentity: RpIdentity? = null + private val playerService get() = InternalContextHolder.instance.context.getBean() + + suspend fun fetchIdentities() { + val fetched = playerService.fetchIdentities(uuid) + + _identities.clear() + _identities.addAll(fetched) + } + override suspend fun setActiveIdentity(identity: RpIdentity) { if (!_identities.contains(identity)) { error("Tried to set an active identity that is not part of the player's identities: $identity") @@ -39,23 +52,14 @@ abstract class CommonRpPlayer( fun addIdentity(identity: RpIdentity) = _identities.add(identity) - override suspend fun createIdentity( - identity: T - ): T { - TODO("Not yet implemented") - } + override suspend fun createIdentity(identity: T) = + playerService.createIdentity(identity) - override suspend fun updateIdentity( - identity: T - ): T? { - TODO("Not yet implemented") - } + override suspend fun updateIdentity(identity: T) = + playerService.updateIdentity(identity) - override suspend fun createOrUpdateIdentity( - identity: T - ): T { - TODO("Not yet implemented") - } + override suspend fun createOrUpdateIdentity(identity: T) = + playerService.createOrUpdateIdentity(identity) @Suppress("UNCHECKED_CAST") override fun getIdentity(type: RpIdentity.RpIdentityType) = @@ -120,9 +124,9 @@ abstract class CommonRpPlayer( ) ?: error("Tried confiscating a license from a player without an active identity $uuid") - override suspend fun asComponent() = buildText { + override fun asComponent() = buildText { val activeIdentity = activeIdentity - val name = cloudPlayer.name() + val name = cloudPlayer.player?.name if (activeIdentity == null) { variableKey(name ?: uuid.toString()) diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/CommonRpPlayerManager.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/CommonRpPlayerManager.kt index 282d6a3..44bd116 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/CommonRpPlayerManager.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/CommonRpPlayerManager.kt @@ -2,19 +2,24 @@ package dev.slne.surf.roleplay.core.common.player import com.github.benmanes.caffeine.cache.Caffeine import dev.slne.surf.roleplay.api.common.player.RpPlayerManager +import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity import dev.slne.surf.roleplay.api.common.util.InternalRoleplayApi import java.util.* -import kotlin.time.Duration.Companion.hours @OptIn(InternalRoleplayApi::class) abstract class CommonRpPlayerManager : RpPlayerManager { private val cache = Caffeine.newBuilder() - .expireAfterAccess(3.hours) .maximumSize(10_000) .build { createPlayer(it) } abstract fun createPlayer(uuid: UUID): CommonRpPlayer override fun getPlayerByUuid(uuid: UUID) = cache.get(uuid) + + abstract suspend fun fetchIdentities(uuid: UUID): Set + + abstract suspend fun createIdentity(identity: T): T + abstract suspend fun updateIdentity(identity: T): T? + abstract suspend fun createOrUpdateIdentity(identity: T): T } \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/PlayerIdentityFetcher.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/PlayerIdentityFetcher.kt new file mode 100644 index 0000000..d768cff --- /dev/null +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/PlayerIdentityFetcher.kt @@ -0,0 +1,24 @@ +package dev.slne.surf.roleplay.core.common.player + +import dev.slne.surf.cloud.api.common.player.OfflineCloudPlayer +import dev.slne.surf.cloud.api.common.player.task.PrePlayerJoinTask +import dev.slne.surf.roleplay.api.common.player.rpPlayer +import dev.slne.surf.surfapi.core.api.util.logger +import org.springframework.stereotype.Component + +@Component +class PlayerIdentityFetcher : PrePlayerJoinTask { + private val log = logger() + + override suspend fun preJoin(player: OfflineCloudPlayer): PrePlayerJoinTask.Result { + try { + (player.rpPlayer() as CommonRpPlayer).fetchIdentities() + return PrePlayerJoinTask.Result.ALLOWED + } catch (e: Throwable) { + log.atSevere() + .withCause(e) + .log("Failed to fetch player identity for ${player.uuid}") + return PrePlayerJoinTask.Result.ERROR + } + } +} \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/CommonRpIdentity.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/CommonRpIdentity.kt similarity index 65% rename from surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/CommonRpIdentity.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/CommonRpIdentity.kt index c3b5147..8757e8b 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/CommonRpIdentity.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/CommonRpIdentity.kt @@ -1,32 +1,43 @@ -package dev.slne.surf.roleplay.core.common.player.license +@file:OptIn(InternalRoleplayApi::class) +package dev.slne.surf.roleplay.core.common.player.identity + +import dev.slne.surf.cloud.api.common.netty.network.codec.StreamCodec +import dev.slne.surf.cloud.api.common.netty.protocol.buffer.SurfByteBuf import dev.slne.surf.roleplay.api.common.player.RpPlayer +import dev.slne.surf.roleplay.api.common.player.RpPlayerManager import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity import dev.slne.surf.roleplay.api.common.player.license.ExpirableLicense import dev.slne.surf.roleplay.api.common.player.license.IdentityLicense +import dev.slne.surf.roleplay.api.common.player.license.InternalLicenseBridge import dev.slne.surf.roleplay.api.common.player.license.License -import dev.slne.surf.roleplay.api.common.player.license.event.RpPlayerLicenseRemovedEvent +import dev.slne.surf.roleplay.api.common.player.license.events.RpPlayerLicenseAddedEvent +import dev.slne.surf.roleplay.api.common.player.license.events.RpPlayerLicenseRemovedEvent import dev.slne.surf.roleplay.api.common.player.license.utils.LicenseCreateResult import dev.slne.surf.roleplay.api.common.player.license.utils.LicenseRemovedReason +import dev.slne.surf.roleplay.api.common.player.license.utils.UnobtainableReason import dev.slne.surf.roleplay.api.common.transaction.RpTransaction import dev.slne.surf.roleplay.api.common.transaction.utils.BalanceType +import dev.slne.surf.roleplay.api.common.util.InternalRoleplayApi +import dev.slne.surf.roleplay.core.common.player.identity.identities.CivilianIdentityImpl +import dev.slne.surf.roleplay.core.common.player.identity.identities.PoliceIdentityImpl import dev.slne.surf.surfapi.core.api.util.mutableObject2ObjectMapOf import dev.slne.surf.surfapi.core.api.util.mutableObjectSetOf import dev.slne.surf.surfapi.core.api.util.objectSetOf import it.unimi.dsi.fastutil.objects.ObjectLinkedOpenHashSet -import java.time.LocalDate +import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient import java.time.ZonedDateTime +@Serializable abstract class CommonRpIdentity( - override val player: RpPlayer, - override val type: RpIdentity.RpIdentityType, - override var firstName: String, - override var lastName: String, - override var dateOfBirth: LocalDate, - override val createdAt: ZonedDateTime = ZonedDateTime.now(), - override var updatedAt: ZonedDateTime = ZonedDateTime.now() + val codecType: RpIdentityCodecType, ) : RpIdentity { + override val player: RpPlayer get() = RpPlayerManager.instance.getPlayerByUuid(uuid) + private val licenseService get() = InternalLicenseBridge.instance + + @Transient private val _licenses = mutableObjectSetOf() override val licenses get() = _licenses @@ -34,6 +45,16 @@ abstract class CommonRpIdentity( _licenses.add(license) } + enum class RpIdentityCodecType(val codec: StreamCodec) { + CIVILIAN(SurfByteBuf.streamCodecFromKotlin(CivilianIdentityImpl.serializer())), + POLICE(SurfByteBuf.streamCodecFromKotlin(PoliceIdentityImpl.serializer())), + RESCUE_SERVICE(SurfByteBuf.streamCodecFromKotlin(PoliceIdentityImpl.serializer())), + } + + override suspend fun updateInformation(identity: T.() -> Unit): T { + TODO("Not yet implemented") + } + override suspend fun addLicense(license: License): LicenseCreateResult { val (canObtain, reason) = license.canObtain(this) @@ -53,24 +74,24 @@ abstract class CommonRpIdentity( expiresAt = expiresAt, ) -// val event = RpPlayerLicenseAddedEvent( -// player = player, -// identity = this, -// license = playerLicense, -// ) -// -// if (!event.callEvent()) { -// return LicenseCreateResult( -// false, -// objectSetOf(UnobtainableReason.EventCancelled(event.cancelReason)), -// null -// ) -// } - // TODO: 09.08.2025 23:56 Call event + val event = RpPlayerLicenseAddedEvent( + source = this, + player = player, + identity = this, + license = playerLicense, + ).also { it.post() } + + if (event.isCancelled) { + return LicenseCreateResult( + false, + objectSetOf(UnobtainableReason.EventCancelled(event.cancelReason)), + null + ) + } player.removeCashBalance(license.price) - val createdPlayerLicense = LicenseService.createLicense(playerLicense) + val createdPlayerLicense = licenseService.createLicense(playerLicense) _licenses.add(createdPlayerLicense) return LicenseCreateResult( @@ -84,17 +105,18 @@ abstract class CommonRpIdentity( val playerLicense = getLicense(license.javaClass) ?: return false val event = RpPlayerLicenseRemovedEvent( + source = this, player = player, identity = this, license = playerLicense, reason = reason - ) + ).also { it.post() } - if (!event.callEvent()) { + if (event.isCancelled) { return false } - val result = LicenseService.removeLicense(this, license) + val result = licenseService.removeLicense(this, license) if (result) { _licenses.removeIf { it.license == license } @@ -108,7 +130,7 @@ abstract class CommonRpIdentity( license: License, confiscatedBy: RpPlayer, confiscatedReason: String - ) = LicenseService.confiscateLicense(identity, license, confiscatedBy, confiscatedReason) + ) = licenseService.confiscateLicense(identity, license, confiscatedBy, confiscatedReason) override fun getLicense(license: Class) = _licenses.firstOrNull { it.license::class.java == license } @@ -116,6 +138,7 @@ abstract class CommonRpIdentity( override fun hasLicense(license: Class) = _licenses.any { it.license::class.java == license } + @Transient private val currencyMap = mutableObject2ObjectMapOf( BalanceType.CASH to 0, BalanceType.BANK to 0, @@ -169,8 +192,4 @@ abstract class CommonRpIdentity( return ObjectLinkedOpenHashSet() } - override fun toString(): String { - return "RpIdentityImpl(type=$type, firstName='$firstName', lastName='$lastName', dateOfBirth=$dateOfBirth, createdAt=$createdAt, updatedAt=$updatedAt, licenses=$licenses)" - } - } \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/identities/CivilianIdentityImpl.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/identities/CivilianIdentityImpl.kt index 27fbe16..38b54fc 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/identities/CivilianIdentityImpl.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/identities/CivilianIdentityImpl.kt @@ -1,27 +1,24 @@ package dev.slne.surf.roleplay.core.common.player.identity.identities -import dev.slne.surf.roleplay.api.common.player.RpPlayer import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity -import dev.slne.surf.roleplay.core.common.player.license.CommonRpIdentity +import dev.slne.surf.roleplay.core.common.player.identity.CommonRpIdentity +import kotlinx.serialization.Contextual +import kotlinx.serialization.Serializable import java.time.LocalDate import java.time.ZonedDateTime +import java.util.* +@Serializable class CivilianIdentityImpl( - player: RpPlayer, - firstName: String, - lastName: String, - dateOfBirth: LocalDate, - createdAt: ZonedDateTime = ZonedDateTime.now(), - updatedAt: ZonedDateTime = ZonedDateTime.now() -) : CommonRpIdentity( - player, - type = RpIdentity.RpIdentityType.CIVILIAN, - firstName, - lastName, - dateOfBirth, - createdAt, - updatedAt -), RpIdentity.CivilianIdentity { + override val uuid: @Contextual UUID, + override var firstName: String, + override var lastName: String, + override var dateOfBirth: @Contextual LocalDate, + override val createdAt: @Contextual ZonedDateTime = ZonedDateTime.now(), + override var updatedAt: @Contextual ZonedDateTime = ZonedDateTime.now() +) : CommonRpIdentity(RpIdentityCodecType.CIVILIAN), RpIdentity.CivilianIdentity { + override val type = RpIdentity.RpIdentityType.CIVILIAN + override fun toString(): String { val parent = super.toString() diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/identities/PoliceIdentityImpl.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/identities/PoliceIdentityImpl.kt index c60ce11..6bfe1ca 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/identities/PoliceIdentityImpl.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/identities/PoliceIdentityImpl.kt @@ -1,29 +1,27 @@ package dev.slne.surf.roleplay.core.common.player.identity.identities -import dev.slne.surf.roleplay.api.common.player.RpPlayer import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity -import dev.slne.surf.roleplay.core.common.player.license.CommonRpIdentity +import dev.slne.surf.roleplay.core.common.player.identity.CommonRpIdentity +import kotlinx.serialization.Contextual +import kotlinx.serialization.Serializable import java.time.LocalDate import java.time.ZonedDateTime +import java.util.* +@Serializable class PoliceIdentityImpl( - player: RpPlayer, - firstName: String, - lastName: String, - dateOfBirth: LocalDate, + override val uuid: @Contextual UUID, + override var firstName: String, + override var lastName: String, + override var dateOfBirth: @Contextual LocalDate, override val badgeNumber: String, override val rank: String, - createdAt: ZonedDateTime = ZonedDateTime.now(), - updatedAt: ZonedDateTime = ZonedDateTime.now() -) : CommonRpIdentity( - player = player, - type = RpIdentity.RpIdentityType.POLICE, - firstName, - lastName, - dateOfBirth, - createdAt, - updatedAt -), RpIdentity.PoliceIdentity { + override val createdAt: @Contextual ZonedDateTime = ZonedDateTime.now(), + override var updatedAt: @Contextual ZonedDateTime = ZonedDateTime.now() +) : CommonRpIdentity(RpIdentityCodecType.POLICE), RpIdentity.PoliceIdentity { + + override val type = RpIdentity.RpIdentityType.POLICE + override fun toString(): String { val parent = super.toString() diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/identities/RescueServiceIdentityImpl.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/identities/RescueServiceIdentityImpl.kt index 9c854f5..8ec06a7 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/identities/RescueServiceIdentityImpl.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/identities/RescueServiceIdentityImpl.kt @@ -1,28 +1,26 @@ package dev.slne.surf.roleplay.core.common.player.identity.identities -import dev.slne.surf.roleplay.api.common.player.RpPlayer import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity -import dev.slne.surf.roleplay.core.common.player.license.CommonRpIdentity +import dev.slne.surf.roleplay.core.common.player.identity.CommonRpIdentity +import kotlinx.serialization.Contextual +import kotlinx.serialization.Serializable import java.time.LocalDate import java.time.ZonedDateTime +import java.util.* +@Serializable class RescueServiceIdentityImpl( - player: RpPlayer, - firstName: String, - lastName: String, - dateOfBirth: LocalDate, + override val uuid: @Contextual UUID, + override var firstName: String, + override var lastName: String, + override var dateOfBirth: @Contextual LocalDate, override val rank: String, - createdAt: ZonedDateTime = ZonedDateTime.now(), - updatedAt: ZonedDateTime = ZonedDateTime.now() -) : CommonRpIdentity( - player = player, - type = RpIdentity.RpIdentityType.RESCUE_SERVICE, - firstName, - lastName, - dateOfBirth, - createdAt, - updatedAt -), RpIdentity.RescueServiceIdentity { + override val createdAt: @Contextual ZonedDateTime = ZonedDateTime.now(), + override var updatedAt: @Contextual ZonedDateTime = ZonedDateTime.now() +) : CommonRpIdentity(RpIdentityCodecType.RESCUE_SERVICE), RpIdentity.RescueServiceIdentity { + + override val type = RpIdentity.RpIdentityType.RESCUE_SERVICE + override fun toString(): String { val parent = super.toString() diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/protocol/clientbound/ClientboundIdentityGetPacket.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/protocol/clientbound/ClientboundIdentityGetPacket.kt new file mode 100644 index 0000000..7c0cd81 --- /dev/null +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/protocol/clientbound/ClientboundIdentityGetPacket.kt @@ -0,0 +1,32 @@ +package dev.slne.surf.roleplay.core.common.player.identity.protocol.clientbound + +import dev.slne.surf.cloud.api.common.meta.SurfNettyPacket +import dev.slne.surf.cloud.api.common.netty.network.codec.StreamCodec +import dev.slne.surf.cloud.api.common.netty.network.protocol.PacketFlow +import dev.slne.surf.cloud.api.common.netty.packet.ResponseNettyPacket +import dev.slne.surf.cloud.api.common.netty.packet.packetCodec +import dev.slne.surf.cloud.api.common.netty.protocol.buffer.SurfByteBuf +import dev.slne.surf.cloud.api.common.netty.protocol.buffer.readEnum +import dev.slne.surf.roleplay.core.common.player.identity.CommonRpIdentity + +@SurfNettyPacket("roleplay:identity_get", PacketFlow.CLIENTBOUND) +class ClientboundIdentityGetPacket( + val identity: CommonRpIdentity +) : ResponseNettyPacket() { + + companion object { + val STREAM_CODEC = + packetCodec(ClientboundIdentityGetPacket::write, ::ClientboundIdentityGetPacket) + } + + private constructor(buf: SurfByteBuf) : this( + buf.readEnum().codec.decode(buf) + ) + + @Suppress("UNCHECKED_CAST") + private fun write(buf: SurfByteBuf) { + buf.writeEnum(identity.type) + val codec = identity.codecType.codec as StreamCodec + codec.encode(buf, identity) + } +} \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/protocol/serverbound/ServerboundCreateIdentityPacket.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/protocol/serverbound/ServerboundCreateIdentityPacket.kt new file mode 100644 index 0000000..c53425d --- /dev/null +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/protocol/serverbound/ServerboundCreateIdentityPacket.kt @@ -0,0 +1,4 @@ +package dev.slne.surf.roleplay.core.common.player.identity.protocol.serverbound + +class ServerboundCreateIdentityPacket: { +} \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/ExpirableLicenseImpl.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/CommonExpirableLicense.kt similarity index 92% rename from surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/ExpirableLicenseImpl.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/CommonExpirableLicense.kt index 3e152f6..6407e28 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/ExpirableLicenseImpl.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/CommonExpirableLicense.kt @@ -8,7 +8,7 @@ import net.kyori.adventure.key.Key import net.kyori.adventure.text.Component import kotlin.time.Duration -abstract class ExpirableLicenseImpl( +abstract class CommonExpirableLicense( key: Key, displayName: Component, description: Component, @@ -16,7 +16,7 @@ abstract class ExpirableLicenseImpl( override val expiresIn: Duration, dependencies: ObjectSet = objectSetOf(), permission: String = LicensePermissionRegistry.createLicensePermission(key) -) : LicenseImpl( +) : CommonLicense( key, displayName, description, diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/LicenseImpl.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/CommonLicense.kt similarity index 82% rename from surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/LicenseImpl.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/CommonLicense.kt index b6080e9..1856c10 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/LicenseImpl.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/CommonLicense.kt @@ -1,6 +1,7 @@ package dev.slne.surf.roleplay.core.common.player.license import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity +import dev.slne.surf.roleplay.api.common.player.license.InternalLicenseBridge import dev.slne.surf.roleplay.api.common.player.license.License import dev.slne.surf.roleplay.api.common.player.license.utils.UnobtainableReason import dev.slne.surf.surfapi.core.api.util.mutableObjectSetOf @@ -10,7 +11,7 @@ import it.unimi.dsi.fastutil.objects.ObjectSet import net.kyori.adventure.key.Key import net.kyori.adventure.text.Component -abstract class LicenseImpl( +abstract class CommonLicense( override val key: Key, override val displayName: Component, override val description: Component, @@ -19,16 +20,21 @@ abstract class LicenseImpl( override val permission: String = LicensePermissionRegistry.createLicensePermission(key) ) : License { + private val licenseService get() = InternalLicenseBridge.instance + override val children - get() = licenseServiceImpl.licenses.filter { + get() = licenseService.licenses.filter { it.dependencies.contains(this) }.toObjectSet() override suspend fun canObtain(identity: RpIdentity): Pair> { val player = identity.player + val cloudPlayer = player.cloudPlayer + val onlineCloudPlayer = cloudPlayer.player + val reasons = mutableObjectSetOf() - if (!player.hasPermission(permission)) { + if (onlineCloudPlayer != null && !onlineCloudPlayer.hasPermission(permission)) { reasons.add(UnobtainableReason.NoPermissions) } @@ -58,7 +64,7 @@ abstract class LicenseImpl( override fun equals(other: Any?): Boolean { if (this === other) return true - if (other !is LicenseImpl) return false + if (other !is CommonLicense) return false if (key != other.key) return false diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/CommonLicenseBridge.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/CommonLicenseBridge.kt new file mode 100644 index 0000000..48c6e38 --- /dev/null +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/CommonLicenseBridge.kt @@ -0,0 +1,28 @@ +package dev.slne.surf.roleplay.core.common.player.license + +import dev.slne.surf.cloud.api.common.util.toObjectSet +import dev.slne.surf.roleplay.api.common.player.license.InternalLicenseBridge +import dev.slne.surf.roleplay.api.common.player.license.License +import dev.slne.surf.roleplay.api.common.util.InternalRoleplayApi +import net.kyori.adventure.key.Key +import org.springframework.context.ApplicationContext + +@OptIn(InternalRoleplayApi::class) +abstract class CommonLicenseBridge( + private val context: ApplicationContext +) : InternalLicenseBridge { + + override val licenses + get() = context.getBeansOfType(License::class.java) + .values + .toObjectSet() + + override fun getLicense(license: Class) = + context.getBean(license) + + override fun getLicenseByKey(key: Key) = + licenses.find { it.key == key } + + override fun getLicenseByKeyOrThrow(key: Key) = + getLicenseByKey(key) ?: error("License with key $key not found in the context.") +} \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/LicensePermissionRegistry.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/LicensePermissionRegistry.kt new file mode 100644 index 0000000..fe54401 --- /dev/null +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/LicensePermissionRegistry.kt @@ -0,0 +1,8 @@ +package dev.slne.surf.roleplay.core.common.player.license + +import net.kyori.adventure.key.Key + +object LicensePermissionRegistry { + fun createLicensePermission(key: Key)= + "surf.roleplay.license.${key.asString().replace(":", ".").replace("_", "-")}" +} \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/licenses/civilian/CivilianFishingLicenseImpl.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/licenses/civilian/CivilianFishingLicense.kt similarity index 69% rename from surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/licenses/civilian/CivilianFishingLicenseImpl.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/licenses/civilian/CivilianFishingLicense.kt index 1fd18ce..beb94ee 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/licenses/civilian/CivilianFishingLicenseImpl.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/licenses/civilian/CivilianFishingLicense.kt @@ -1,12 +1,14 @@ package dev.slne.surf.roleplay.core.common.player.license.licenses.civilian import dev.slne.surf.roleplay.api.common.player.license.licenses.civilian.CivilianFishingLicense -import dev.slne.surf.roleplay.core.common.player.license.LicenseImpl +import dev.slne.surf.roleplay.core.common.player.license.CommonLicense import dev.slne.surf.surfapi.core.api.messages.adventure.buildText import dev.slne.surf.surfapi.core.api.messages.adventure.key +import org.springframework.stereotype.Component -object CivilianFishingLicenseImpl : LicenseImpl( - key = key("roleplay", "fishing_license"), +@Component +class CivilianFishingLicense : CommonLicense( + key = key("civilian", "fishing_license"), displayName = buildText { primary("Angelschein") }, description = buildText { spacer("Die Angel-Lizenz erlaubt es dir, in der Wildnis zu angeln.") diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/licenses/civilian/CivilianVehicleLicenseImpl.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/licenses/civilian/CivilianVehicleLicenseImpl.kt index 9ab2182..fabf25d 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/licenses/civilian/CivilianVehicleLicenseImpl.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/licenses/civilian/CivilianVehicleLicenseImpl.kt @@ -1,29 +1,20 @@ package dev.slne.surf.roleplay.core.common.player.license.licenses.civilian -import dev.slne.surf.roleplay.api.common.player.license.License import dev.slne.surf.roleplay.api.common.player.license.licenses.civilian.CivilianVehicleLicense -import dev.slne.surf.roleplay.core.common.player.license.ExpirableLicenseImpl -import dev.slne.surf.roleplay.core.common.player.license.LicenseImpl +import dev.slne.surf.roleplay.core.common.player.license.CommonExpirableLicense +import dev.slne.surf.roleplay.core.common.player.license.CommonLicense import dev.slne.surf.surfapi.core.api.messages.adventure.buildText import dev.slne.surf.surfapi.core.api.messages.adventure.key import dev.slne.surf.surfapi.core.api.util.objectSetOf import net.kyori.adventure.text.Component import kotlin.time.Duration.Companion.minutes +import org.springframework.stereotype.Component as SpringComponent -object CivilianVehicleLicenseImpl { - fun register(registration: (License) -> Boolean) { - registration(DriversLicenseImpl) - registration(TruckLicenseImpl) - registration(BusLicenseImpl) - registration(TaxiLicenseImpl) - registration(MotorcycleLicenseImpl) - registration(BoatLicenseImpl) - registration(PilotLicenseImpl) - registration(HelicopterLicenseImpl) - } +class CivilianVehicleLicenseImpl { - object DriversLicenseImpl : LicenseImpl( - key = key("roleplay", "drivers_license"), + @SpringComponent + class DriversLicense : CommonLicense( + key = key("civilian", "drivers_license"), displayName = Component.text("Führerschein"), description = buildText { spacer("Der Führerschein erlaubt es dir, Fahrzeuge zu führen.") @@ -31,8 +22,11 @@ object CivilianVehicleLicenseImpl { price = 1000, ), CivilianVehicleLicense.DriversLicense - object TruckLicenseImpl : ExpirableLicenseImpl( - key = key("roleplay", "truck_license"), + @SpringComponent + class TruckLicense( + driversLicense: CivilianVehicleLicense.DriversLicense + ) : CommonExpirableLicense( + key = key("civilian", "truck_license"), displayName = Component.text("Lkw-Führerschein"), description = buildText { spacer("Der Lkw-Führerschein erlaubt es dir, Lastkraftwagen zu fahren.") @@ -40,24 +34,30 @@ object CivilianVehicleLicenseImpl { price = 2000, expiresIn = 5.minutes, dependencies = objectSetOf( - DriversLicenseImpl, + driversLicense ) ), CivilianVehicleLicense.TruckLicense - object BusLicenseImpl : LicenseImpl( - key = key("roleplay", "bus_license"), + @SpringComponent + class BusLicense( + driversLicense: CivilianVehicleLicense.DriversLicense + ) : CommonLicense( + key = key("civilian", "bus_license"), displayName = Component.text("Bus-Führerschein"), description = buildText { spacer("Der Bus-Führerschein erlaubt es dir, Busse zu fahren.") }, price = 2500, dependencies = objectSetOf( - DriversLicenseImpl + driversLicense ) ), CivilianVehicleLicense.BusLicense - object TaxiLicenseImpl : LicenseImpl( - key = key("roleplay", "taxi_license"), + @SpringComponent + class TaxiLicense( + driversLicense: DriversLicense + ) : CommonLicense( + key = key("civilian", "taxi_license"), displayName = Component.text("Taxi-Führerschein"), description = buildText { spacer("Der Taxi-Führerschein erlaubt es dir, Taxis zu fahren.") @@ -65,12 +65,14 @@ object CivilianVehicleLicenseImpl { }, price = 3000, dependencies = objectSetOf( - DriversLicenseImpl + driversLicense ) - ), CivilianVehicleLicense.TaxiLicense + ), CivilianVehicleLicense.TaxiLicense { + } - object MotorcycleLicenseImpl : LicenseImpl( - key = key("roleplay", "motorcycle_license"), + @SpringComponent + class MotorcycleLicense : CommonLicense( + key = key("civilian", "motorcycle_license"), displayName = Component.text("Motorrad-Führerschein"), description = buildText { spacer("Der Motorrad-Führerschein erlaubt es dir, Motorräder zu fahren.") @@ -78,8 +80,9 @@ object CivilianVehicleLicenseImpl { price = 1500, ), CivilianVehicleLicense.MotorcycleLicense - object BoatLicenseImpl : LicenseImpl( - key = key("roleplay", "boat_license"), + @SpringComponent + class BoatLicense : CommonLicense( + key = key("civilian", "boat_license"), displayName = Component.text("Bootsführerschein"), description = buildText { spacer("Der Bootsführerschein erlaubt es dir, Boote zu fahren.") @@ -87,8 +90,9 @@ object CivilianVehicleLicenseImpl { price = 1800, ), CivilianVehicleLicense.BoatLicense - object PilotLicenseImpl : LicenseImpl( - key = key("roleplay", "pilot_license"), + @SpringComponent + class PilotLicense : CommonLicense( + key = key("civilian", "pilot_license"), displayName = Component.text("Pilotenschein"), description = buildText { spacer("Der Pilotenschein erlaubt es dir, Flugzeuge zu fliegen.") @@ -96,8 +100,9 @@ object CivilianVehicleLicenseImpl { price = 5000, ), CivilianVehicleLicense.PilotLicense - object HelicopterLicenseImpl : LicenseImpl( - key = key("roleplay", "helicopter_license"), + @SpringComponent + class HelicopterLicense : CommonLicense( + key = key("civilian", "helicopter_license"), displayName = Component.text("Hubschrauber-Führerschein"), description = buildText { spacer("Der Hubschrauber-Führerschein erlaubt es dir, Hubschrauber zu fliegen.") diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/licenses/civilian/CivilianWeaponLicenseImpl.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/licenses/civilian/CivilianWeaponLicenseImpl.kt index acabcfa..4022d45 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/licenses/civilian/CivilianWeaponLicenseImpl.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/licenses/civilian/CivilianWeaponLicenseImpl.kt @@ -1,20 +1,17 @@ package dev.slne.surf.roleplay.core.common.player.license.licenses.civilian -import dev.slne.surf.roleplay.api.common.player.license.License import dev.slne.surf.roleplay.api.common.player.license.licenses.civilian.CivilianWeaponLicense -import dev.slne.surf.roleplay.core.common.player.license.LicenseImpl +import dev.slne.surf.roleplay.core.common.player.license.CommonLicense import dev.slne.surf.surfapi.core.api.messages.adventure.buildText import dev.slne.surf.surfapi.core.api.messages.adventure.key import dev.slne.surf.surfapi.core.api.util.objectSetOf +import org.springframework.stereotype.Component -object CivilianWeaponLicenseImpl { - fun register(registration: (License) -> Boolean) { - registration(LightWeaponLicenseImpl) - registration(HeavyWeaponLicenseImpl) - } +class CivilianWeaponLicenseImpl { - object LightWeaponLicenseImpl : LicenseImpl( - key = key("roleplay", "light_weapon_license"), + @Component + class LightWeaponLicense : CommonLicense( + key = key("civilian", "light_weapon_license"), displayName = buildText { success("Kleiner Waffenschein") }, description = buildText { spacer("Erlaubt das Führen von leichten Waffen wie Pistolen und Revolvern.") @@ -22,15 +19,18 @@ object CivilianWeaponLicenseImpl { price = 5000 ), CivilianWeaponLicense.LightWeaponLicense - object HeavyWeaponLicenseImpl : LicenseImpl( - key = key("roleplay", "heavy_weapon_license"), + @Component + class HeavyWeaponLicense( + lightWeaponLicense: LightWeaponLicense + ) : CommonLicense( + key = key("civilian", "heavy_weapon_license"), displayName = buildText { error("Großer Waffenschein") }, description = buildText { spacer("Erlaubt das Führen von schweren Waffen wie Maschinengewehren und Scharfschützengewehren.") }, price = 10000, dependencies = objectSetOf( - LightWeaponLicenseImpl + lightWeaponLicense ) ), CivilianWeaponLicense.HeavyWeaponLicense } \ No newline at end of file diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/PaperMain.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/PaperMain.kt index 12f7f88..2487ead 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/PaperMain.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/PaperMain.kt @@ -1,24 +1,32 @@ package dev.slne.surf.roleplay.paper import com.github.shynixn.mccoroutine.folia.SuspendingJavaPlugin +import dev.slne.surf.roleplay.api.common.InternalContextHolder +import dev.slne.surf.roleplay.api.common.util.InternalRoleplayApi +import dev.slne.surf.roleplay.core.common.CommonRpInstance import dev.slne.surf.roleplay.paper.command.activeIdentityCommand import dev.slne.surf.roleplay.paper.command.balanceCommand -import dev.slne.surf.roleplay.paper.listener.ListenerManager import org.bukkit.plugin.java.JavaPlugin +import org.springframework.beans.factory.getBean +@OptIn(InternalRoleplayApi::class) class PaperMain : SuspendingJavaPlugin() { + private val rpInstance get() = InternalContextHolder.instance.context.getBean() + override suspend fun onLoadAsync() { + rpInstance.onLoad() + balanceCommand() activeIdentityCommand() } override suspend fun onEnableAsync() { - ListenerManager.registerListeners() + rpInstance.onEnable() } override suspend fun onDisableAsync() { - + rpInstance.onDisable() } } diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/PaperRpInstance.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/PaperRpInstance.kt new file mode 100644 index 0000000..f1dcfba --- /dev/null +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/PaperRpInstance.kt @@ -0,0 +1,25 @@ +package dev.slne.surf.roleplay.paper + +import dev.slne.surf.roleplay.core.common.CommonRpInstance +import dev.slne.surf.roleplay.core.common.mechanics.CommonMechanicRegistry +import dev.slne.surf.roleplay.paper.player.license.LicenseNpc +import dev.slne.surf.roleplay.paper.spring.postprocessor.BukkitListenerPostProcessor +import dev.slne.surf.roleplay.paper.spring.postprocessor.PacketListenerPostProcessor +import org.springframework.stereotype.Component + +@Component +class PaperRpInstance( + commonMechanicRegistry: CommonMechanicRegistry, + private val bukkitListenerPostProcessor: BukkitListenerPostProcessor, + private val packetListenerPostProcessor: PacketListenerPostProcessor +) : CommonRpInstance(commonMechanicRegistry) { + + override suspend fun onEnable() { + super.onEnable() + + LicenseNpc.spawnNpc() + + bukkitListenerPostProcessor.registerListeners() + packetListenerPostProcessor.registerListeners() + } +} \ No newline at end of file diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/listener/ListenerManager.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/listener/ListenerManager.kt index d7af235..63e8d8c 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/listener/ListenerManager.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/listener/ListenerManager.kt @@ -2,9 +2,7 @@ package dev.slne.surf.roleplay.paper.listener -import com.github.retrooper.packetevents.PacketEvents import com.github.retrooper.packetevents.event.PacketListener -import com.github.retrooper.packetevents.event.PacketListenerPriority import com.github.retrooper.packetevents.event.PacketSendEvent import com.github.retrooper.packetevents.protocol.entity.type.EntityTypes import com.github.retrooper.packetevents.protocol.packettype.PacketType @@ -16,10 +14,9 @@ import com.github.shynixn.mccoroutine.folia.launch import com.github.shynixn.mccoroutine.folia.regionDispatcher import dev.jorel.commandapi.kotlindsl.commandAPICommand import dev.jorel.commandapi.kotlindsl.playerExecutor -import dev.slne.surf.roleplay.paper.player.identity.listener.IdentityOnlineListener +import dev.slne.surf.roleplay.core.common.mechanics.utils.RpPacketListener import dev.slne.surf.roleplay.paper.plugin import dev.slne.surf.surfapi.bukkit.api.builder.ItemStack -import dev.slne.surf.surfapi.bukkit.api.event.register import dev.slne.surf.surfapi.core.api.messages.adventure.playSound import io.papermc.paper.datacomponent.DataComponentTypes import io.papermc.paper.datacomponent.item.Consumable @@ -34,19 +31,12 @@ import org.bukkit.event.EventHandler import org.bukkit.event.Listener import org.bukkit.event.entity.ProjectileHitEvent import org.bukkit.event.entity.ProjectileLaunchEvent +import org.springframework.stereotype.Component -object ListenerManager : Listener { +@Component +class ListenerManager : Listener { fun registerListeners() { - OnlineListener.register() - IdentityOnlineListener.register() - register() - - PacketEvents.getAPI().eventManager.registerListener( - ArrowHitListener, - PacketListenerPriority.LOWEST - ) - commandAPICommand("give-bow") { playerExecutor { player, arguments -> player.inventory.addItem(ItemStack(Material.BOW) { @@ -70,7 +60,8 @@ object ListenerManager : Listener { } } - object ArrowHitListener : PacketListener { + @RpPacketListener + class ArrowHitListener : PacketListener { override fun onPacketSend(event: PacketSendEvent) { if (event.packetType == PacketType.Play.Server.SPAWN_ENTITY) { val packet = WrapperPlayServerSpawnEntity(event) diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/listener/OnlineListener.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/listener/OnlineListener.kt index 809d4ee..c73ae26 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/listener/OnlineListener.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/listener/OnlineListener.kt @@ -4,9 +4,9 @@ import com.github.shynixn.mccoroutine.folia.globalRegionDispatcher import com.github.shynixn.mccoroutine.folia.launch import dev.slne.surf.cloud.api.client.paper.player.toCloudOfflinePlayer import dev.slne.surf.roleplay.api.common.player.RpPlayer +import dev.slne.surf.roleplay.api.common.player.events.RpPlayerJoinEvent +import dev.slne.surf.roleplay.api.common.player.events.RpPlayerQuitEvent import dev.slne.surf.roleplay.api.paper.player.events.RpPlayerDeathEvent -import dev.slne.surf.roleplay.api.paper.player.events.RpPlayerJoinEvent -import dev.slne.surf.roleplay.api.paper.player.events.RpPlayerQuitEvent import dev.slne.surf.roleplay.paper.plugin import kotlinx.coroutines.withContext import org.bukkit.event.EventHandler @@ -15,8 +15,10 @@ import org.bukkit.event.Listener import org.bukkit.event.entity.PlayerDeathEvent import org.bukkit.event.player.PlayerJoinEvent import org.bukkit.event.player.PlayerQuitEvent +import org.springframework.stereotype.Component -object OnlineListener : Listener { +@Component +class OnlineListener : Listener { @EventHandler(priority = EventPriority.LOWEST) fun onJoin(event: PlayerJoinEvent) { diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/IdCardMechanicImpl.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/IdCardMechanicImpl.kt new file mode 100644 index 0000000..48ee672 --- /dev/null +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/IdCardMechanicImpl.kt @@ -0,0 +1,11 @@ +package dev.slne.surf.roleplay.paper.mechanics.idcard + +import dev.slne.surf.roleplay.core.common.mechanics.idcard.IdCardCommonMechanic +import dev.slne.surf.roleplay.core.common.mechanics.utils.RpMechanic + +@RpMechanic +class IdCardMechanicImpl : IdCardCommonMechanic() { + override suspend fun onEnable() { + IdCardNpc.spawnNpc() + } +} \ No newline at end of file diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/listeners/IdCardHandler.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/listeners/IdCardHandler.kt index e1aaed8..6b4c9db 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/listeners/IdCardHandler.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/listeners/IdCardHandler.kt @@ -14,8 +14,10 @@ import dev.slne.surf.surfapi.core.api.messages.adventure.sendText import org.bukkit.Sound import org.bukkit.event.EventHandler import org.bukkit.event.Listener +import org.springframework.stereotype.Component -object IdCardHandler : Listener { +@Component +class IdCardHandler : Listener { private val idCardNpc get() = surfNpcApi.getNpc(IdCardNpc.NPC_NAME) diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/commands/RentableCommand.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/commands/RentableCommand.kt index e3f402b..32b1692 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/commands/RentableCommand.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/commands/RentableCommand.kt @@ -3,8 +3,9 @@ package dev.slne.surf.roleplay.paper.mechanics.rentable.commands import com.github.shynixn.mccoroutine.folia.launch import dev.jorel.commandapi.arguments.ArgumentSuggestions import dev.jorel.commandapi.kotlindsl.* +import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.events.OwnerChangeReason +import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.events.OwnerSetResult import dev.slne.surf.roleplay.api.paper.player.rpPlayer -import dev.slne.surf.roleplay.api.paper.rentable.events.RentableOwnerChangeEvent import dev.slne.surf.roleplay.core.common.mechanics.rentable.RentableMechanicImpl.getByKey import dev.slne.surf.roleplay.core.common.mechanics.rentable.RentableMechanicImpl.rentables import dev.slne.surf.roleplay.paper.plugin @@ -52,10 +53,10 @@ fun rentableCommand() = commandAPICommand("rentable") { val result = rentable.setOwner( rpPlayer, - RentableOwnerChangeEvent.OwnerChangeReason.RentableBought + OwnerChangeReason.RentableBought ) - if (result is RentableOwnerChangeEvent.OwnerSetResult.Success) { + if (result is OwnerSetResult.Success) { player.sendText { appendPrefix() @@ -63,7 +64,7 @@ fun rentableCommand() = commandAPICommand("rentable") { variableValue(rentableKey.asString()) success(" erfolgreich gemietet.") } - } else if (result is RentableOwnerChangeEvent.OwnerSetResult.Failure) { + } else if (result is OwnerSetResult.Failure) { player.sendText { appendPrefix() diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/listeners/RentCollectedListener.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/listeners/RentCollectedListener.kt index a87d5b4..4e907b4 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/listeners/RentCollectedListener.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/listeners/RentCollectedListener.kt @@ -2,15 +2,17 @@ package dev.slne.surf.roleplay.paper.mechanics.rentable.listeners import com.github.shynixn.mccoroutine.folia.entityDispatcher import com.github.shynixn.mccoroutine.folia.launch -import dev.slne.surf.roleplay.api.paper.rentable.events.RentableRentCollectEvent +import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.events.RentableRentCollectEvent import dev.slne.surf.roleplay.paper.plugin import dev.slne.surf.surfapi.core.api.messages.adventure.playSound import dev.slne.surf.surfapi.core.api.messages.adventure.sendText import org.bukkit.Sound import org.bukkit.event.EventHandler import org.bukkit.event.Listener +import org.springframework.stereotype.Component -object RentCollectedListener : Listener { +@Component +class RentCollectedListener : Listener { @EventHandler fun onRentableRentCollect(event: RentableRentCollectEvent) { diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/listeners/RentableListener.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/listeners/RentableListener.kt index ce641a7..da79e69 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/listeners/RentableListener.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/listeners/RentableListener.kt @@ -2,9 +2,10 @@ package dev.slne.surf.roleplay.paper.mechanics.rentable.listeners import com.github.shynixn.mccoroutine.folia.entityDispatcher import com.github.shynixn.mccoroutine.folia.launch -import dev.slne.surf.roleplay.api.paper.rentable.events.RentableMemberAddEvent -import dev.slne.surf.roleplay.api.paper.rentable.events.RentableMemberRemoveEvent -import dev.slne.surf.roleplay.api.paper.rentable.events.RentableOwnerChangeEvent +import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.events.OwnerChangeReason +import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.events.RentableMemberAddEvent +import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.events.RentableMemberRemoveEvent +import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.events.RentableOwnerChangeEvent import dev.slne.surf.roleplay.paper.plugin import dev.slne.surf.surfapi.core.api.messages.adventure.playSound import dev.slne.surf.surfapi.core.api.messages.adventure.sendText @@ -12,8 +13,10 @@ import kotlinx.coroutines.withContext import org.bukkit.Sound import org.bukkit.event.EventHandler import org.bukkit.event.Listener +import org.springframework.stereotype.Component -object RentableListener : Listener { +@Component +class RentableListener : Listener { @EventHandler fun onRentableMemberAdd(event: RentableMemberAddEvent) { @@ -134,9 +137,9 @@ object RentableListener : Listener { append(rentable) success(".") - if (reason == RentableOwnerChangeEvent.OwnerChangeReason.RentableBought) { + if (reason == OwnerChangeReason.RentableBought) { info(" Du hast die Immobilie gemietet.") - } else if (reason is RentableOwnerChangeEvent.OwnerChangeReason.OwnerSetNewOwner) { + } else if (reason is OwnerChangeReason.OwnerSetNewOwner) { info(" Du wurdest als neuer Eigentümer gesetzt.") } } @@ -158,7 +161,7 @@ object RentableListener : Listener { append(rentable) info(".") - if (reason is RentableOwnerChangeEvent.OwnerChangeReason.OwnerSetNewOwner) { + if (reason is OwnerChangeReason.OwnerSetNewOwner) { error(" Du wurdest als Eigentümer entfernt.") } } diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/identity/listener/IdentityOnlineListener.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/identity/listener/IdentityOnlineListener.kt index ed117db..2d71a78 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/identity/listener/IdentityOnlineListener.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/identity/listener/IdentityOnlineListener.kt @@ -1,14 +1,16 @@ package dev.slne.surf.roleplay.paper.player.identity.listener import com.github.shynixn.mccoroutine.folia.launch -import dev.slne.surf.roleplay.api.paper.player.events.RpPlayerJoinEvent +import dev.slne.surf.roleplay.api.common.player.events.RpPlayerJoinEvent import dev.slne.surf.roleplay.paper.player.identity.dialogs.createIdentitySelectorDialog import dev.slne.surf.roleplay.paper.plugin import org.bukkit.event.EventHandler import org.bukkit.event.EventPriority import org.bukkit.event.Listener +import org.springframework.stereotype.Component -object IdentityOnlineListener : Listener { +@Component +class IdentityOnlineListener : Listener { @EventHandler(priority = EventPriority.LOWEST) fun onRpPlayerJoin(event: RpPlayerJoinEvent) { diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/listeners/LicenseBuyHandler.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/listeners/LicenseBuyHandler.kt index 89b0164..1136ed7 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/listeners/LicenseBuyHandler.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/listeners/LicenseBuyHandler.kt @@ -12,8 +12,10 @@ import dev.slne.surf.roleplay.paper.plugin import dev.slne.surf.surfapi.core.api.messages.adventure.sendText import org.bukkit.event.EventHandler import org.bukkit.event.Listener +import org.springframework.stereotype.Component -object LicenseBuyHandler : Listener { +@Component +class LicenseBuyHandler : Listener { private val licenseNpc get() = surfNpcApi.getNpc(LicenseNpc.NPC_NAME) diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/listeners/LicenseChangedHandler.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/listeners/LicenseChangedHandler.kt index b92abed..f0e61b9 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/listeners/LicenseChangedHandler.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/listeners/LicenseChangedHandler.kt @@ -2,8 +2,8 @@ package dev.slne.surf.roleplay.paper.player.license.listeners import com.github.shynixn.mccoroutine.folia.entityDispatcher import com.github.shynixn.mccoroutine.folia.launch -import dev.slne.surf.roleplay.api.paper.player.license.events.RpPlayerLicenseAddedEvent -import dev.slne.surf.roleplay.api.paper.player.license.events.RpPlayerLicenseRemovedEvent +import dev.slne.surf.roleplay.api.common.player.license.events.RpPlayerLicenseAddedEvent +import dev.slne.surf.roleplay.api.common.player.license.events.RpPlayerLicenseRemovedEvent import dev.slne.surf.roleplay.paper.plugin import dev.slne.surf.surfapi.core.api.messages.adventure.buildText import dev.slne.surf.surfapi.core.api.messages.adventure.playSound @@ -11,8 +11,10 @@ import dev.slne.surf.surfapi.core.api.messages.adventure.sendText import org.bukkit.Sound import org.bukkit.event.EventHandler import org.bukkit.event.Listener +import org.springframework.stereotype.Component -object LicenseChangedHandler : Listener { +@Component +class LicenseChangedHandler : Listener { @EventHandler fun onPlayerLicenseAdded(event: RpPlayerLicenseAddedEvent) { diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/spring/postprocessor/BukkitListenerPostProcessor.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/spring/postprocessor/BukkitListenerPostProcessor.kt new file mode 100644 index 0000000..f81f11d --- /dev/null +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/spring/postprocessor/BukkitListenerPostProcessor.kt @@ -0,0 +1,27 @@ +package dev.slne.surf.roleplay.paper.spring.postprocessor + +import dev.slne.surf.cloud.api.common.util.mutableObjectSetOf +import dev.slne.surf.surfapi.bukkit.api.event.register +import org.bukkit.event.Listener +import org.springframework.beans.factory.config.BeanPostProcessor +import org.springframework.stereotype.Component + +@Component +class BukkitListenerPostProcessor : BeanPostProcessor { + + private val watched = mutableObjectSetOf() + + override fun postProcessAfterInitialization(bean: Any, beanName: String): Any { + if (bean is Listener) { + watched.add(bean) + } + + return bean + } + + fun registerListeners() { + for (listener in watched) { + listener.register() + } + } +} \ No newline at end of file diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/spring/postprocessor/PacketListenerPostProcessor.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/spring/postprocessor/PacketListenerPostProcessor.kt new file mode 100644 index 0000000..b1116a9 --- /dev/null +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/spring/postprocessor/PacketListenerPostProcessor.kt @@ -0,0 +1,34 @@ +package dev.slne.surf.roleplay.paper.spring.postprocessor + +import com.github.retrooper.packetevents.PacketEvents +import com.github.retrooper.packetevents.event.PacketListener +import dev.slne.surf.cloud.api.common.util.findAnnotation +import dev.slne.surf.cloud.api.common.util.object2ObjectMapOf +import dev.slne.surf.roleplay.core.common.mechanics.utils.RpPacketListener +import org.springframework.beans.factory.config.BeanPostProcessor +import org.springframework.stereotype.Component + +@Component +class PacketListenerPostProcessor : BeanPostProcessor { + private val packetListeners = object2ObjectMapOf() + + override fun postProcessAfterInitialization(bean: Any, beanName: String): Any { + if (bean !is PacketListener) return bean + + val annotation = bean::class.findAnnotation() + + if (annotation != null) { + packetListeners[bean] = annotation + } + + return bean + } + + fun registerListeners() { + val eventManager = PacketEvents.getAPI().eventManager + + packetListeners.forEach { (listener, annotation) -> + eventManager.registerListener(listener, annotation.priority) + } + } +} \ No newline at end of file diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/mechanics/idcard/IdCardMechanicImpl.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/mechanics/idcard/IdCardMechanicImpl.kt new file mode 100644 index 0000000..03b24b4 --- /dev/null +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/mechanics/idcard/IdCardMechanicImpl.kt @@ -0,0 +1,7 @@ +package dev.slne.surf.roleplay.server.mechanics.idcard + +import dev.slne.surf.roleplay.core.common.mechanics.idcard.IdCardCommonMechanic +import dev.slne.surf.roleplay.core.common.mechanics.utils.RpMechanic + +@RpMechanic +class IdCardMechanicImpl() : IdCardCommonMechanic() \ No newline at end of file diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/LicenseExpirationJob.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/LicenseExpirationJob.kt index ffd0330..760ec58 100644 --- a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/LicenseExpirationJob.kt +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/LicenseExpirationJob.kt @@ -1,12 +1,20 @@ -package dev.slne.surf.roleplay.core.player.license +@file:OptIn(InternalRoleplayApi::class) -import dev.slne.surf.roleplay.api.coroutine.RpJob -import dev.slne.surf.roleplay.api.player.license.utils.LicenseRemovedReason -import kotlin.time.Duration.Companion.seconds +package dev.slne.surf.roleplay.server.player.license -object LicenseExpirationJob : RpJob("LicenseExpirationJob", 1.seconds) { - override suspend fun tick() { - val licenses = licenseServiceImpl.getAllExpiredLicenses() +import dev.slne.surf.roleplay.api.common.player.license.InternalLicenseBridge +import dev.slne.surf.roleplay.api.common.player.license.utils.LicenseRemovedReason +import dev.slne.surf.roleplay.api.common.util.InternalRoleplayApi +import org.springframework.scheduling.annotation.Scheduled +import org.springframework.stereotype.Component +import java.util.concurrent.TimeUnit + +@Component +class LicenseExpirationJob { + + @Scheduled(fixedDelay = 1, timeUnit = TimeUnit.SECONDS) + suspend fun tick() { + val licenses = InternalLicenseBridge.instance.getAllExpiredLicenses() licenses.forEach { (identity, expiredLicenses) -> expiredLicenses.forEach { expiredLicense -> diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/LicenseServiceImpl.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/LicenseServiceImpl.kt index 0932da1..3a7f2a3 100644 --- a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/LicenseServiceImpl.kt +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/LicenseServiceImpl.kt @@ -1,12 +1,6 @@ package dev.slne.surf.roleplay.core.player.license -import com.github.shynixn.mccoroutine.folia.launch import com.google.auto.service.AutoService -import dev.jorel.commandapi.arguments.ArgumentSuggestions -import dev.jorel.commandapi.kotlindsl.commandAPICommand -import dev.jorel.commandapi.kotlindsl.getValue -import dev.jorel.commandapi.kotlindsl.playerExecutor -import dev.jorel.commandapi.kotlindsl.textArgument import dev.slne.surf.roleplay.api.player.RpPlayer import dev.slne.surf.roleplay.api.player.RpPlayerManager import dev.slne.surf.roleplay.api.player.identity.RpIdentity @@ -14,18 +8,10 @@ import dev.slne.surf.roleplay.api.player.license.IdentityLicense import dev.slne.surf.roleplay.api.player.license.License import dev.slne.surf.roleplay.api.player.license.LicenseService import dev.slne.surf.roleplay.api.player.license.utils.LicenseRemovedReason -import dev.slne.surf.roleplay.core.common.player.license.licenses.civilian.CivilianFishingLicenseImpl -import dev.slne.surf.roleplay.core.common.player.license.licenses.civilian.CivilianVehicleLicenseImpl -import dev.slne.surf.roleplay.core.common.player.license.licenses.civilian.CivilianWeaponLicenseImpl -import dev.slne.surf.roleplay.core.player.license.listeners.LicenseBuyHandler -import dev.slne.surf.roleplay.core.player.license.listeners.LicenseChangedHandler import dev.slne.surf.roleplay.core.player.rpPlayerManagerImpl -import dev.slne.surf.roleplay.core.plugin import dev.slne.surf.roleplay.server.player.license.db.IdentityLicenseModel import dev.slne.surf.roleplay.server.player.license.db.IdentityLicenseTable -import dev.slne.surf.surfapi.bukkit.api.event.register import dev.slne.surf.surfapi.core.api.messages.adventure.key -import dev.slne.surf.surfapi.core.api.messages.adventure.sendText import dev.slne.surf.surfapi.core.api.util.freeze import dev.slne.surf.surfapi.core.api.util.mutableObjectSetOf import dev.slne.surf.surfapi.core.api.util.toObjectList @@ -34,63 +20,10 @@ import net.kyori.adventure.key.Key import net.kyori.adventure.util.Services import org.jetbrains.exposed.sql.and import org.jetbrains.exposed.sql.transactions.experimental.newSuspendedTransaction -import kotlin.jvm.java @AutoService(LicenseService::class) class LicenseServiceImpl : LicenseService, Services.Fallback { - suspend fun onLoad() { - _licenses.add(CivilianFishingLicenseImpl) - - CivilianWeaponLicenseImpl.register { _licenses.add(it) } - CivilianVehicleLicenseImpl.register { _licenses.add(it) } - } - - suspend fun onEnable() { - LicenseExpirationJob.start() - - LicenseChangedHandler.register() - LicenseBuyHandler.register() - - LicenseNpc.spawnNpc() - - commandAPICommand("give-license") { - textArgument("licenseName") { - replaceSuggestions( - ArgumentSuggestions.stringCollection { - licenses.map { it.key.asString() } - } - ) - } - - playerExecutor { player, args -> - val licenseName: String by args - val namespace = licenseName.substringBefore(":") - val value = licenseName.substringAfter(":") - val license = LicenseService.getLicenseByKey(key(namespace, value)) - - if (license == null) { - player.sendText { - appendPrefix() - - error("Die Lizenz ") - variableValue(licenseName) - error(" konnte nicht gefunden werden.") - } - - return@playerExecutor - } - - plugin.launch { - RpPlayer[player.uniqueId].addLicense(license) - } - } - } - } - - suspend fun onDisable() { - LicenseExpirationJob.stop() - } private val _licenses = mutableObjectSetOf() override val licenses get() = _licenses.freeze() From b1eed11b81020c7dd48c29c4229dbe2dafbd3f0d Mon Sep 17 00:00:00 2001 From: Ammo Date: Sun, 17 Aug 2025 13:58:02 +0200 Subject: [PATCH 04/11] just saving --- build.gradle.kts | 15 +- gradle.properties | 8 +- gradle/libs.versions.toml | 19 + settings.gradle.kts | 14 +- .../surf-roleplay-mod-client/build.gradle.kts | 45 + .../slne/roleplay/mod/mixin/ExampleMixin.java | 15 + .../dev/slne/roleplay/mod/RoleplayMod.kt | 9 + .../roleplay/mod/RoleplayModDataGenerator.kt | 9 + .../roleplay/mod/keybind/KeybindAction.kt | 7 + .../roleplay/mod/keybind/KeybindCategory.kt | 7 + .../dev/slne/roleplay/mod/keybind/Keybinds.kt | 64 + .../src/main/resources/assets/lang/de_de.json | 5 + .../main/resources/assets/roleplay/icon.png | Bin 0 -> 3956 bytes .../src/main/resources/fabric.mod.json | 42 + .../src/main/resources/roleplay.mixins.json | 14 + .../surf-roleplay-mod-common/build.gradle.kts | 10 + .../mod/common/network/PacketRegistry.kt | 77 ++ .../mod/common/network/SurfRoleplayPacket.kt | 10 + .../common/network/connection/Connection.kt | 48 + .../network/listener/NetworkListener.kt | 38 + .../packets/RespondingRoleplayPacket.kt | 60 + .../network/packets/ResponseRoleplayPacket.kt | 17 + .../common/network/packets/RoleplayPacket.kt | 30 + .../mod/common/network/protocol/DefaultIds.kt | 7 + .../clientbound/ClientboundHandshakePacket.kt | 31 + .../serverbound/ServerboundHandshakePacket.kt | 34 + .../mod/common/network/utils/PacketFlow.kt | 20 + .../network/utils/RoleplayPacketHandler.kt | 5 + .../network/utils/RoleplayPacketListener.kt | 3 + .../mod/common/network/utils/SurfByteBuf.kt | 1058 +++++++++++++++++ .../common/network/utils/WrappedByteBuf.kt | 327 +++++ .../common/network/utils/codec/StreamCodec.kt | 367 ++++++ .../network/utils/codec/StreamDecoder.kt | 6 + .../network/utils/codec/StreamEncoder.kt | 6 + .../utils/codec/StreamMemberEncoder.kt | 6 + .../network/utils/codec/codec-util-util.kt | 17 + .../common/network/utils/codec/codec-util.kt | 300 +++++ .../codec/kotlinx/RoleplayBufSerializer.kt | 8 + .../codec/kotlinx/SurfCloudBufSerializer.kt | 28 + .../adventure/AdventureComponentSerializer.kt | 25 + .../kotlinx/java/BigDecimalSerializer.kt | 26 + .../kotlinx/java/BigIntegerSerializer.kt | 26 + .../codec/kotlinx/java/BitSetSerializer.kt | 27 + .../codec/kotlinx/java/UUIDSerializer.kt | 28 + .../codec/kotlinx/java/UtfStringSerializer.kt | 21 + .../codec/kotlinx/java/VarIntSerializer.kt | 21 + .../codec/kotlinx/java/VarLongSerializer.kt | 21 + .../kotlinx/java/ZonedDateTimeSerializer.kt | 28 + .../kotlinx/kotlin/DurationSerializer.kt | 25 + .../network/utils/decoder/DecodeFactory.kt | 45 + .../network/utils/ecoder/EncodeFactory.kt | 27 + .../common/network/utils/packet-extensions.kt | 16 + .../common/network/utils/types/Utf8String.kt | 83 ++ .../mod/common/network/utils/types/VarInt.kt | 101 ++ .../mod/common/network/utils/types/VarLong.kt | 85 ++ .../surf-roleplay-mod-server/build.gradle.kts | 12 + .../dev/slne/roleplay/mod/server/ModServer.kt | 21 + .../mod/server/listener/ListenerManager.kt | 9 + 58 files changed, 3427 insertions(+), 6 deletions(-) create mode 100644 surf-roleplay-mod/surf-roleplay-mod-client/build.gradle.kts create mode 100644 surf-roleplay-mod/surf-roleplay-mod-client/src/main/java/dev/slne/roleplay/mod/mixin/ExampleMixin.java create mode 100644 surf-roleplay-mod/surf-roleplay-mod-client/src/main/kotlin/dev/slne/roleplay/mod/RoleplayMod.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-client/src/main/kotlin/dev/slne/roleplay/mod/RoleplayModDataGenerator.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-client/src/main/kotlin/dev/slne/roleplay/mod/keybind/KeybindAction.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-client/src/main/kotlin/dev/slne/roleplay/mod/keybind/KeybindCategory.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-client/src/main/kotlin/dev/slne/roleplay/mod/keybind/Keybinds.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-client/src/main/resources/assets/lang/de_de.json create mode 100644 surf-roleplay-mod/surf-roleplay-mod-client/src/main/resources/assets/roleplay/icon.png create mode 100644 surf-roleplay-mod/surf-roleplay-mod-client/src/main/resources/fabric.mod.json create mode 100644 surf-roleplay-mod/surf-roleplay-mod-client/src/main/resources/roleplay.mixins.json create mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/build.gradle.kts create mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/PacketRegistry.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/SurfRoleplayPacket.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/connection/Connection.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/listener/NetworkListener.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/packets/RespondingRoleplayPacket.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/packets/ResponseRoleplayPacket.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/packets/RoleplayPacket.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/protocol/DefaultIds.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/protocol/clientbound/ClientboundHandshakePacket.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/protocol/serverbound/ServerboundHandshakePacket.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/PacketFlow.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/RoleplayPacketHandler.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/RoleplayPacketListener.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/SurfByteBuf.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/WrappedByteBuf.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/StreamCodec.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/StreamDecoder.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/StreamEncoder.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/StreamMemberEncoder.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/codec-util-util.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/codec-util.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/RoleplayBufSerializer.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/SurfCloudBufSerializer.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/adventure/AdventureComponentSerializer.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/java/BigDecimalSerializer.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/java/BigIntegerSerializer.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/java/BitSetSerializer.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/java/UUIDSerializer.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/java/UtfStringSerializer.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/java/VarIntSerializer.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/java/VarLongSerializer.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/java/ZonedDateTimeSerializer.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/kotlin/DurationSerializer.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/decoder/DecodeFactory.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/ecoder/EncodeFactory.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/packet-extensions.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/types/Utf8String.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/types/VarInt.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/types/VarLong.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-server/build.gradle.kts create mode 100644 surf-roleplay-mod/surf-roleplay-mod-server/src/main/kotlin/dev/slne/roleplay/mod/server/ModServer.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-server/src/main/kotlin/dev/slne/roleplay/mod/server/listener/ListenerManager.kt diff --git a/build.gradle.kts b/build.gradle.kts index 80d47f5..52c3671 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,7 +1,4 @@ -allprojects { - group = "dev.slne.surf.roleplay" - version = findProperty("version") as String -} +import dev.slne.surf.surfapi.gradle.util.slnePublic buildscript { repositories { @@ -13,6 +10,16 @@ buildscript { } } +allprojects { + group = "dev.slne.surf.roleplay" + version = findProperty("version") as String + + repositories { + slnePublic() + gradlePluginPortal() + } +} + subprojects { afterEvaluate { plugins.withType { diff --git a/gradle.properties b/gradle.properties index 804a362..86daac3 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,4 +3,10 @@ org.gradle.parallel=true org.gradle.caching=true kotlin.code.style=official kotlin.stdlib.default.dependency=false -version=1.21.7-1.0.0 \ No newline at end of file +version=1.21.7-1.0.0 +# Mod Properties +mod_version=1.0.0 +maven_group=dev.slne.roleplay.mod +archives_base_name=roleplay +# Dependencies +fabric_version=0.131.0+1.21.8 \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 545c5b2..83b0101 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,24 @@ [versions] surf-npc-api = "1.21.7-1.4.2-SNAPSHOT" +loom = "1.11-SNAPSHOT" +netty = "4.2.4.Final" +datafixerupper = "8.0.16" +bytebuddy = "1.15.10" +kotlin-byte-buf-serializer = "1.1.0" + +# Mod +minecraft = "1.21.8" +yarn-mappings = "1.21.8+build.1" +fabric-loader = "0.17.2" +fabric-kotlin = "1.13.5+kotlin.2.2.10" +fabric-api = "0.131.0+1.21.8" [libraries] surf-npc-api = { module = "dev.slne.surf.npc:surf-npc-api", version.ref = "surf-npc-api" } +netty = { module = "io.netty:netty-all", version.ref = "netty" } +datafixerupper = { module = "com.mojang:datafixerupper", version.ref = "datafixerupper" } +bytebuddy = { module = "net.bytebuddy:byte-buddy", version.ref = "bytebuddy" } +kotlin-byte-buf-serializer = { module = "dev.slne.surf:kotlin-byte-buf-serializer", version.ref = "kotlin-byte-buf-serializer" } + +[plugins] +loom = { id = "fabric-loom", version.ref = "loom" } diff --git a/settings.gradle.kts b/settings.gradle.kts index c25243f..e67b817 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,5 +1,13 @@ rootProject.name = "surf-roleplay" +pluginManagement { + repositories { + mavenCentral() + maven("https://maven.fabricmc.net") + gradlePluginPortal() + } +} + plugins { id("org.gradle.toolchains.foojay-resolver-convention") version "0.8.0" } @@ -14,4 +22,8 @@ include("surf-roleplay-core:surf-roleplay-core-common") include("surf-roleplay-core:surf-roleplay-core-client") include("surf-roleplay-paper") include("surf-roleplay-velocity") -include("surf-roleplay-server") \ No newline at end of file +include("surf-roleplay-server") + +include("surf-roleplay-mod:surf-roleplay-mod-common") +include("surf-roleplay-mod:surf-roleplay-mod-client") +include("surf-roleplay-mod:surf-roleplay-mod-server") \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-client/build.gradle.kts b/surf-roleplay-mod/surf-roleplay-mod-client/build.gradle.kts new file mode 100644 index 0000000..a248c14 --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-client/build.gradle.kts @@ -0,0 +1,45 @@ +plugins { + id("dev.slne.surf.surfapi.gradle.core") + alias(libs.plugins.loom) +} + +base { + archivesName.set(project.extra["archives_base_name"] as String) +} + +fabricApi { + configureDataGeneration { + client = true + } +} + +dependencies { + val minecraftVersion = libs.versions.minecraft.get() + val yarnMappings = libs.versions.yarn.mappings.get() + val loaderVersion = libs.versions.fabric.loader.get() + val fabricVersion = libs.versions.fabric.api.get() + val fabricKotlinVersion = libs.versions.fabric.kotlin.get() + + minecraft("com.mojang:minecraft:$minecraftVersion") + mappings("net.fabricmc:yarn:$yarnMappings:v2") + modImplementation("net.fabricmc:fabric-loader:$loaderVersion") + + modImplementation("net.fabricmc.fabric-api:fabric-api:$fabricVersion") + modImplementation("net.fabricmc:fabric-language-kotlin:$fabricKotlinVersion") +} + +tasks.processResources { + inputs.property("version", project.version) + + filesMatching("fabric.mod.json") { + expand("version" to inputs.properties["version"]) + } +} + +tasks.jar { + inputs.property("archivesName", base.archivesName.get()) + + from("LICENSE") { + rename { "${it}_${inputs.properties["archivesName"]}" } + } +} diff --git a/surf-roleplay-mod/surf-roleplay-mod-client/src/main/java/dev/slne/roleplay/mod/mixin/ExampleMixin.java b/surf-roleplay-mod/surf-roleplay-mod-client/src/main/java/dev/slne/roleplay/mod/mixin/ExampleMixin.java new file mode 100644 index 0000000..c0adbef --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-client/src/main/java/dev/slne/roleplay/mod/mixin/ExampleMixin.java @@ -0,0 +1,15 @@ +package dev.slne.roleplay.mod.mixin; + +import net.minecraft.server.MinecraftServer; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(MinecraftServer.class) +public class ExampleMixin { + @Inject(at = @At("HEAD"), method = "loadWorld") + private void init(CallbackInfo info) { + // This code is injected into the start of MinecraftServer.loadWorld()V + } +} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-client/src/main/kotlin/dev/slne/roleplay/mod/RoleplayMod.kt b/surf-roleplay-mod/surf-roleplay-mod-client/src/main/kotlin/dev/slne/roleplay/mod/RoleplayMod.kt new file mode 100644 index 0000000..a16c9d2 --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-client/src/main/kotlin/dev/slne/roleplay/mod/RoleplayMod.kt @@ -0,0 +1,9 @@ +package dev.slne.roleplay.mod + +import net.fabricmc.api.ClientModInitializer + +object RoleplayMod : ClientModInitializer { + override fun onInitializeClient() { +// Keybinds.registerKeybindings() + } +} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-client/src/main/kotlin/dev/slne/roleplay/mod/RoleplayModDataGenerator.kt b/surf-roleplay-mod/surf-roleplay-mod-client/src/main/kotlin/dev/slne/roleplay/mod/RoleplayModDataGenerator.kt new file mode 100644 index 0000000..a9651bd --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-client/src/main/kotlin/dev/slne/roleplay/mod/RoleplayModDataGenerator.kt @@ -0,0 +1,9 @@ +package dev.slne.roleplay.mod + +import net.fabricmc.fabric.api.datagen.v1.DataGeneratorEntrypoint +import net.fabricmc.fabric.api.datagen.v1.FabricDataGenerator + +object RoleplayModDataGenerator : DataGeneratorEntrypoint { + override fun onInitializeDataGenerator(fabricDataGenerator: FabricDataGenerator) { + } +} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-client/src/main/kotlin/dev/slne/roleplay/mod/keybind/KeybindAction.kt b/surf-roleplay-mod/surf-roleplay-mod-client/src/main/kotlin/dev/slne/roleplay/mod/keybind/KeybindAction.kt new file mode 100644 index 0000000..8e4916d --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-client/src/main/kotlin/dev/slne/roleplay/mod/keybind/KeybindAction.kt @@ -0,0 +1,7 @@ +package dev.slne.roleplay.mod.keybind + +import net.minecraft.client.network.ClientPlayerEntity + +fun interface KeybindAction { + fun handle(player: ClientPlayerEntity) +} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-client/src/main/kotlin/dev/slne/roleplay/mod/keybind/KeybindCategory.kt b/surf-roleplay-mod/surf-roleplay-mod-client/src/main/kotlin/dev/slne/roleplay/mod/keybind/KeybindCategory.kt new file mode 100644 index 0000000..dd65276 --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-client/src/main/kotlin/dev/slne/roleplay/mod/keybind/KeybindCategory.kt @@ -0,0 +1,7 @@ +package dev.slne.roleplay.mod.keybind + +enum class KeybindCategory(val translationKey: String) { + + TEST("key.category.roleplay.test") + +} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-client/src/main/kotlin/dev/slne/roleplay/mod/keybind/Keybinds.kt b/surf-roleplay-mod/surf-roleplay-mod-client/src/main/kotlin/dev/slne/roleplay/mod/keybind/Keybinds.kt new file mode 100644 index 0000000..cf06b51 --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-client/src/main/kotlin/dev/slne/roleplay/mod/keybind/Keybinds.kt @@ -0,0 +1,64 @@ +package dev.slne.roleplay.mod.keybind + +import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents +import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper +import net.minecraft.client.option.KeyBinding +import net.minecraft.client.util.InputUtil +import net.minecraft.text.Text +import org.lwjgl.glfw.GLFW + +enum class Keybinds( + val key: Int, + val translationKey: String, + val category: KeybindCategory, + val action: KeybindAction, + val actionExecutableInGui: Boolean = false, + val type: InputUtil.Type = InputUtil.Type.KEYSYM, +) { + TEST( + GLFW.GLFW_KEY_N, + "key.roleplay.test", + KeybindCategory.TEST, + { player -> + player.sendMessage(Text.literal("Test keybind pressed!"), false) + } + ), + TEST2( + GLFW.GLFW_KEY_Z, + "key.roleplay.test2", + KeybindCategory.TEST, + { player -> + player.sendMessage(Text.literal("Test2 keybind pressed!"), false) + } + ); + + companion object { + fun registerKeybindings() { + val registeredKeybinds = entries.associateWith { + KeyBindingHelper.registerKeyBinding( + KeyBinding( + it.translationKey, + it.type, + it.key, + it.category.translationKey + ) + ) + } + + ClientTickEvents.END_CLIENT_TICK.register { client -> + registeredKeybinds.forEach { (keybind, keybinding) -> + if (keybinding.wasPressed()) { + val player = client.player ?: return@forEach + + if (player.currentScreenHandler != player.playerScreenHandler && !keybind.actionExecutableInGui) { + return@forEach + } + + keybind.action.handle(player) + } + } + } + } + } + +} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-client/src/main/resources/assets/lang/de_de.json b/surf-roleplay-mod/surf-roleplay-mod-client/src/main/resources/assets/lang/de_de.json new file mode 100644 index 0000000..4925bfd --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-client/src/main/resources/assets/lang/de_de.json @@ -0,0 +1,5 @@ +{ + "key.roleplay.test": "Dies ist ein Testschlüssel", + "key.roleplay.test2": "Dies ist ein Testschlüssel2", + "key.category.roleplay.test": "Testkategorie" +} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-client/src/main/resources/assets/roleplay/icon.png b/surf-roleplay-mod/surf-roleplay-mod-client/src/main/resources/assets/roleplay/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..725f4dbcba02e0b1c19b575fa9b6d9e3ec86f054 GIT binary patch literal 3956 zcma)9_gfRZ7EUP?Wa9uVWrG7jnH4Cb2*{8n)(=!MMc?L5k;9rK(_2v z_K;C_izos`WW(*ff5H7B$&)-eIT>%xd)^o$11%OtI3oanMMqo1nA+n0TNq%}x>d!h z7XY@aIvQ#if5@*4x_BE+_NZdE-Bvb>qfOBoTKPX=s58IW&1ewpW?|$c5DMa8etr|c zzBaS2Zf+%cU-3itbhVouQ5+@Hu)S7sJXKd*d{RhSQ6)Xakm@ zOP*f35jz54xOgvtrQVw?Nq50&1q25{+Q$xQFx;)oZtYr#fN9bg?X8Io3EeQ7e6%@I#j9Dulaz5Jdt#;hXG;&AZ~j0GoO{>CkcRfGnd zxA6ULOH2!e+O<97ppY`$bjgIQ;507-9bBv9m2twpn>?^4BZ)&yZGy zWlLCC>oKMGM#Yp<@xJ@XKDn3k(UTYatqSB$n=sQi6B>DMxNCcG^}JWSdGOAd zCv`UCcH6Wl4ItAo7kCV0E3Xt4BvLdMmUH7J?fSR_sE1H4$o5}6VH+?T@`1>$`+Fikq7`)_Iw z<|cLoVb~`1JCBQUfFVwYaPx*h&A9Y;9BZ#l%+q$CI*KwVAO9Iy$#82N%5S4Wke`z~ z+cd3WGs}<2L2K5tcdO{}SML|9r$?3TUAPKOt6LBOtD92xw|qVdA$#xKXb?$ANT5tu zguMO*b%0Q!cwAH64*!f8GJzg05s{AP{5SOV_4nbfcY7tO%~TBYp*eWSj`xWE&F*WZ z^+NWU9#P_zebSBBc4t?cafOenUHc=RKU|-!tIkz09ejGYPCldrP%%LFuMQVu?~SH< z_Y3h81)QZ#CxMV>qiQ3(elvo}GF)EfPxn^>9=_MlxP)+P$0$tPq>W#*of#_7VnR8N z-8ZpiROPZ}h0Au4nSyI*zGe6;e?yToy(sB!kr)19PXriQ*;anyIsDwEj3F6*a@45%DFxht_b>o=#<^z;}TM9!R8Bq-!e7>a>URpSpSD=8K|&7shh?4aLU zPG@MXc>qId_~+d4ur+c{hG5u_%z%>cv|Cd{87|9rN{1NuQ{ua8-8z=%na1(H z-g5XusCxOtF^+b3SnE9BNIz}dgx*iX4M_0Kn_;>1>Kgn zuiB&HXUry!TVgn0(xjPtch=A1sRZsyiB2r9=qGyAzf*X}+MzZk!~qW+j#W8;bftIt zkIU9auu>2KlhF7(D)2!e2OyyyWV!5QzN7&p%iv5!@An8J1RW{n7z1p-+(cKpb4l7L z2F}Byd0&KFNl2TN&tu<73@nW0<1VliRoLAxvJtoznb^K%K)59kHwa=D<3LkOR`rTQ{gGzbo@8NE|^)M ztl0aUFJYEwp!h??g6mX-Mu1q9sT6NxKTOXOx+a))-sp3Y&YGmBK&JN;yE2mfN?mxn zr&%tCC8C@?W|8Doo6*#gA9}D2mxItD!@Y z-vs`xrm46|^j9~KU!dJccIrRE-5FCsRU!mw46-UGrNS4A((g`pE?GZU{%5nmC{ZmY zuUD~Fzx;O3na5tNH}OJ0-WuHnBKq7CagX*R<4YZK-pXpRuqGEJ)iN$NFUCja=^Q`2 z2kS2~J@9NxhJpk9{rS|oeNqP9pvI(>r9bS z9v}8koKpMLNHv5)X*)lIo9cj;W^Y1(eOJRSF{4K{k#XaVm+?aCw}Xk=d?^!2ybeBI z*12}&%_HrDEWfo6?@6T*jgq@DaO?V%JUwuZClN^ThA2w zp7%b7pQRFq1bzr>oXLQD8|BzrhTKt%O0q(tl!>R*7}$s zJU>csWe67pFPu+ZJZO`98TiSSsH%OAU3x+nODB&#`150l-)_?5<4~C}tNc7jf6qGj zag950Y2qgDGdV1ki_QN-Qoe@isNCwZG;J<Tzs7qEESy1dxJJ03|7!o%x}de2^FL&5Akqe=IfV1t}$^SUG_^~M<-XWjP1D zqdvRpF+D$4z^vC(Kkj5JcW1qN?x5JxSe-A^KTl(}cqr;!NE?S1gW;5tgkMi>^Q(i7 zUVI2XGvkcmfR4|Q@7`5^_x$*RV*8gk}oKcwSqpDmWu zeScq-SsNonv-~A@*WMy+Gmq~=dy*Br>-NRin5`7&YyX-3?u; zE-xQ?KY~3ANh-8%_@XxL!HiGY@p#pI+bHlmaIol4iDdx_tmUl?wQqMdb7OU)`O40i zW4AOn=tKV@1j~XS_!f|~bUs^S)b0BBk`sBm{1X~q)u*YRoL1mU^dm@ByWRYd7VkZO z-mTBcck&^*W{Gse**t7SJ<;fimZ%x8YSIW*@8B~T-)6mRG5kFi+&}g_=Q(PE@+Nnk zsU3zx*w<8g?GA_@2hlu*4hzx~0#Ep9WfucGvkbn@P-T=y{Cg7hr;a`vsd+b|c-Ql> z^WRQ4j;E)`el6uYAr43|suyt@@-LCo9eIJmUYJJRZqyy0nGRso`Axr47K(;nAM@aW zqIsEa_75`y$C~r#4BZ!&py<5)baxF5=POjC`@-@6>^9TgcccoT*ChA(B_2S-W%RCF z24K=#L!Y|=1~c^QO9Q~jk(FMh5hCCYxt~teQ|}ZIdwVb(nhqmT!3@S0y>qv@0nG)y zsxE1Oi5m$eSOW%(fl-#lm`wx%if^h%< literal 0 HcmV?d00001 diff --git a/surf-roleplay-mod/surf-roleplay-mod-client/src/main/resources/fabric.mod.json b/surf-roleplay-mod/surf-roleplay-mod-client/src/main/resources/fabric.mod.json new file mode 100644 index 0000000..ca7606b --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-client/src/main/resources/fabric.mod.json @@ -0,0 +1,42 @@ +{ + "schemaVersion": 1, + "id": "surf-roleplay", + "version": "${version}", + "name": "Surf Roleplay", + "description": "A roleplay mod for Surf", + "authors": [ + "Ammo" + ], + "contact": { + "homepage": "https://github.com/SLNE-Development/surf-roleplay", + "sources": "https://github.com/SLNE-Development/surf-roleplay" + }, + "license": "CC0-1.0", + "icon": "assets/roleplay/icon.png", + "environment": "client", + "entrypoints": { + "client": [ + { + "value": "dev.slne.roleplay.mod.RoleplayMod", + "adapter": "kotlin" + } + ], + "fabric-datagen": [ + { + "value": "dev.slne.roleplay.mod.RoleplayModDataGenerator", + "adapter": "kotlin" + } + ] + }, + "mixins": [ + "roleplay.mixins.json" + ], + "depends": { + "fabricloader": ">=0.17.2", + "minecraft": "~1.21.8", + "java": ">=21", + "fabric-api": "*", + "fabric-language-kotlin": "*", + "fabric-key-binding-api-v1": "*" + } +} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-client/src/main/resources/roleplay.mixins.json b/surf-roleplay-mod/surf-roleplay-mod-client/src/main/resources/roleplay.mixins.json new file mode 100644 index 0000000..748935e --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-client/src/main/resources/roleplay.mixins.json @@ -0,0 +1,14 @@ +{ + "required": true, + "package": "dev.slne.roleplay.mod.mixin", + "compatibilityLevel": "JAVA_21", + "mixins": [ + "ExampleMixin" + ], + "injectors": { + "defaultRequire": 1 + }, + "overwrites": { + "requireAnnotations": true + } +} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/build.gradle.kts b/surf-roleplay-mod/surf-roleplay-mod-common/build.gradle.kts new file mode 100644 index 0000000..163a977 --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-common/build.gradle.kts @@ -0,0 +1,10 @@ +plugins { + id("dev.slne.surf.surfapi.gradle.core") +} + +dependencies { + compileOnlyApi(libs.netty) + compileOnlyApi(libs.datafixerupper) + api(libs.bytebuddy) + api(libs.kotlin.byte.buf.serializer) +} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/PacketRegistry.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/PacketRegistry.kt new file mode 100644 index 0000000..2f250ae --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/PacketRegistry.kt @@ -0,0 +1,77 @@ +package dev.slne.roleplay.mod.common.network + +import dev.slne.roleplay.mod.common.network.packets.RoleplayPacket +import dev.slne.roleplay.mod.common.network.protocol.DefaultIds +import dev.slne.roleplay.mod.common.network.protocol.clientbound.ClientboundHandshakePacket +import dev.slne.roleplay.mod.common.network.protocol.serverbound.ServerboundHandshakePacket +import dev.slne.roleplay.mod.common.network.utils.RoleplayPacketHandler +import dev.slne.roleplay.mod.common.network.utils.RoleplayPacketListener +import dev.slne.roleplay.mod.common.network.utils.SurfByteBuf +import dev.slne.surf.surfapi.core.api.util.logger +import dev.slne.surf.surfapi.core.api.util.mutableObject2ObjectMapOf +import dev.slne.surf.surfapi.core.api.util.toObjectSet +import it.unimi.dsi.fastutil.objects.ObjectSet +import kotlin.reflect.KClass +import kotlin.reflect.KFunction +import kotlin.reflect.full.callSuspend +import kotlin.reflect.full.hasAnnotation +import kotlin.reflect.full.memberFunctions + +@Suppress("UNCHECKED_CAST") +object PacketRegistry { + + private val log = logger() + + private val packets = mutableObject2ObjectMapOf>() + private val listeners = + mutableObject2ObjectMapOf, KClass>>>() + + init { + registerPacket(DefaultIds.CLIENTBOUND_HANDSHAKE, ClientboundHandshakePacket::class) + registerPacket(DefaultIds.SERVERBOUND_HANDSHAKE, ServerboundHandshakePacket::class) + } + + fun registerPacket(packetId: String, packetClass: KClass) { + packets[packetId] = packetClass + } + + fun registerListener(listener: RoleplayPacketListener) { + val methods = listener::class.memberFunctions + .filter { it.hasAnnotation() } + .toObjectSet() + + val methodPairs = methods.map { method -> + method to method.parameters.firstOrNull()?.type?.classifier as? KClass + }.filter { it.second != null }.map { it.first to it.second!! }.toObjectSet() + + listeners[listener] = methodPairs + } + + fun getPacket(packetId: String) = packets[packetId] + + suspend fun callListeners(packetId: String, buffer: SurfByteBuf) { + val packetClass = packets[packetId] ?: error("Packet with ID '$packetId' is not registered") + val packet = packetClass.constructors.firstOrNull()?.call() + ?: error("Failed to create packet instance for ID '$packetId' (no default constructor?)") + + packet.read(buffer) + + listeners.forEach { (_, methods) -> + methods.forEach { (method, param) -> + if (param.isInstance(packetClass)) { + try { + if (method.isSuspend) { + method.callSuspend(packet) + } else { + method.call(packet) + } + } catch (exception: Exception) { + log.atSevere().withCause(exception) + .log("Error while calling packet listener method: ${method.name} for packet ID: $packetId") + } + } + } + } + } + +} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/SurfRoleplayPacket.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/SurfRoleplayPacket.kt new file mode 100644 index 0000000..2a8ca1a --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/SurfRoleplayPacket.kt @@ -0,0 +1,10 @@ +package dev.slne.roleplay.mod.common.network + +import dev.slne.roleplay.mod.common.network.utils.PacketFlow + +@Target(AnnotationTarget.CLASS) +@Retention(AnnotationRetention.RUNTIME) +annotation class SurfRoleplayPacket( + val id: String, + val flow: PacketFlow, +) \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/connection/Connection.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/connection/Connection.kt new file mode 100644 index 0000000..80e875c --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/connection/Connection.kt @@ -0,0 +1,48 @@ +package dev.slne.roleplay.mod.common.network.connection + +import dev.slne.roleplay.mod.common.network.packets.RoleplayPacket +import kotlinx.coroutines.CompletableDeferred + +interface Connection { + val receivedPackets: Int + val sentPackets: Int + val averageReceivedPackets: Float + val averageSentPackets: Float + + val latency: Int + + /** + * Sends a packet to the connection. + * + * @param packet The [RoleplayPacket] to send. + * @param flush Whether to flush the packet immediately. Defaults to `true`. + */ + fun send(packet: RoleplayPacket, flush: Boolean = true) + + /** + * Sends a packet with a sign of success, suspending until the operation completes. + * + * @param packet The [RoleplayPacket] to send. + * @param flush Whether to flush the packet immediately. Defaults to `true`. + * @param convertExceptions Whether to convert exceptions. + * @return `true` if the packet was sent successfully; `false` otherwise. + */ + suspend fun sendWithIndication( + packet: RoleplayPacket, + flush: Boolean = true, + convertExceptions: Boolean = true + ): Boolean + + /** + * Sends a packet with a [CompletableDeferred] indication of success. + * + * @param packet The [RoleplayPacket] to send. + * @param flush Whether to flush the packet immediately. Defaults to `true`. + * @param deferred The [CompletableDeferred] to complete upon success or failure. + */ + fun sendWithIndication( + packet: RoleplayPacket, + flush: Boolean = true, + deferred: CompletableDeferred + ) +} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/listener/NetworkListener.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/listener/NetworkListener.kt new file mode 100644 index 0000000..0b8b06c --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/listener/NetworkListener.kt @@ -0,0 +1,38 @@ +package dev.slne.roleplay.mod.common.network.listener + +import com.github.retrooper.packetevents.event.PacketListener +import com.github.retrooper.packetevents.event.PacketReceiveEvent +import com.github.retrooper.packetevents.protocol.packettype.PacketType +import dev.slne.roleplay.mod.common.network.PacketRegistry +import dev.slne.roleplay.mod.common.network.utils.SurfByteBuf +import dev.slne.surf.surfapi.core.api.util.logger +import io.netty.buffer.ByteBuf +import kotlinx.coroutines.* + +object NetworkListener : PacketListener { + + private val log = logger() + + private val supervisor = SupervisorJob() + private val exceptionHandler = CoroutineExceptionHandler { context, throwable -> + log.atSevere().withCause(throwable) + .log("Exception in network listener coroutine: ${context[CoroutineName]?.name ?: "unknown"}") + } + private val scope = + CoroutineScope(supervisor + CoroutineName("NetworkListener") + exceptionHandler) + + override fun onPacketReceive(event: PacketReceiveEvent) { + if (!(event.packetType == PacketType.Play.Server.PLUGIN_MESSAGE || + event.packetType == PacketType.Play.Client.PLUGIN_MESSAGE) + ) return + + val eventBuffer = event.byteBuf as ByteBuf + val buffer = SurfByteBuf(eventBuffer) + + val packetId = buffer.readUtf() + + scope.launch { + PacketRegistry.callListeners(packetId, buffer) + } + } +} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/packets/RespondingRoleplayPacket.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/packets/RespondingRoleplayPacket.kt new file mode 100644 index 0000000..230061f --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/packets/RespondingRoleplayPacket.kt @@ -0,0 +1,60 @@ +package dev.slne.roleplay.mod.common.network.packets + +import dev.slne.roleplay.mod.common.network.connection.Connection +import dev.slne.roleplay.mod.common.network.utils.SurfByteBuf +import kotlinx.coroutines.CompletableDeferred +import kotlinx.coroutines.withTimeout +import kotlinx.coroutines.withTimeoutOrNull +import java.util.* +import kotlin.time.Duration +import kotlin.time.Duration.Companion.seconds + +val DEFAULT_TIMEOUT = 15.seconds +val DEFAULT_URGENT_TIMEOUT = 5.seconds + +abstract class RespondingRoleplayPacket : RoleplayPacket() { + + private var uniqueSessionId: UUID? = null + lateinit var responseConnection: Connection + + val response = CompletableDeferred() + + suspend fun fireAndAwait( + connection: Connection, + timeout: Duration = DEFAULT_TIMEOUT + ): R? = withTimeoutOrNull(timeout) { + connection.send(this@RespondingRoleplayPacket) + response.await() + } + + suspend fun fireAndAwaitUrgent(connection: Connection): R? = + fireAndAwait(connection, DEFAULT_URGENT_TIMEOUT) + + suspend fun fireAndAwaitOrThrow( + connection: Connection, + timeout: Duration = DEFAULT_TIMEOUT + ): R = withTimeout(timeout) { + connection.send(this@RespondingRoleplayPacket) + response.await() + } + + suspend fun fireAndAwaitOrThrowUrgent(connection: Connection): R = + fireAndAwaitOrThrow(connection, DEFAULT_URGENT_TIMEOUT) + + fun respond(packet: R) { + packet.responseTo = uniqueSessionId + ?: error("Responding packet has no session id. Are you sure it was sent?") + responseConnection.send(packet) + } + + override fun write(buffer: SurfByteBuf) { + buffer.writeUuid(getUniqueSessionIdOrCreate()) + } + + override fun read(buffer: SurfByteBuf) { + uniqueSessionId = buffer.readUuid() + } + + fun getUniqueSessionIdOrCreate(): UUID = + uniqueSessionId ?: UUID.randomUUID().also { uniqueSessionId = it } +} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/packets/ResponseRoleplayPacket.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/packets/ResponseRoleplayPacket.kt new file mode 100644 index 0000000..f8c17a9 --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/packets/ResponseRoleplayPacket.kt @@ -0,0 +1,17 @@ +package dev.slne.roleplay.mod.common.network.packets + +import dev.slne.roleplay.mod.common.network.utils.SurfByteBuf +import java.util.* + +abstract class ResponseRoleplayPacket() : RoleplayPacket() { + + lateinit var responseTo: UUID + + override fun write(buffer: SurfByteBuf) { + buffer.writeUuid(responseTo) + } + + override fun read(buffer: SurfByteBuf) { + responseTo = buffer.readUuid() + } +} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/packets/RoleplayPacket.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/packets/RoleplayPacket.kt new file mode 100644 index 0000000..75208a3 --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/packets/RoleplayPacket.kt @@ -0,0 +1,30 @@ +package dev.slne.roleplay.mod.common.network.packets + +import dev.slne.roleplay.mod.common.network.utils.SurfByteBuf +import dev.slne.roleplay.mod.common.network.utils.codec.StreamCodec +import dev.slne.roleplay.mod.common.network.utils.codec.StreamDecoder +import dev.slne.roleplay.mod.common.network.utils.codec.StreamMemberEncoder +import dev.slne.roleplay.mod.common.network.utils.getPacketMeta +import io.netty.buffer.ByteBuf + +abstract class RoleplayPacket() { + + @Transient + private val meta = this::class.getPacketMeta() + + @Transient + val id = meta.id + + abstract fun write(buffer: SurfByteBuf) + + abstract fun read(buffer: SurfByteBuf) + + companion object { + @JvmStatic + fun codec( + encoder: StreamMemberEncoder, + decoder: StreamDecoder + ): StreamCodec = StreamCodec.ofMember(encoder, decoder) + } + +} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/protocol/DefaultIds.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/protocol/DefaultIds.kt new file mode 100644 index 0000000..9197f09 --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/protocol/DefaultIds.kt @@ -0,0 +1,7 @@ +package dev.slne.roleplay.mod.common.network.protocol + +object DefaultIds { + // Handshake + const val CLIENTBOUND_HANDSHAKE = "clientbound:handshake" + const val SERVERBOUND_HANDSHAKE = "serverbound:handshake" +} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/protocol/clientbound/ClientboundHandshakePacket.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/protocol/clientbound/ClientboundHandshakePacket.kt new file mode 100644 index 0000000..94fbb2c --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/protocol/clientbound/ClientboundHandshakePacket.kt @@ -0,0 +1,31 @@ +package dev.slne.roleplay.mod.common.network.protocol.clientbound + +import dev.slne.roleplay.mod.common.network.SurfRoleplayPacket +import dev.slne.roleplay.mod.common.network.packets.RespondingRoleplayPacket +import dev.slne.roleplay.mod.common.network.protocol.DefaultIds +import dev.slne.roleplay.mod.common.network.protocol.serverbound.ServerboundHandshakePacket +import dev.slne.roleplay.mod.common.network.utils.PacketFlow +import dev.slne.roleplay.mod.common.network.utils.SurfByteBuf +import java.util.* + +@SurfRoleplayPacket(id = DefaultIds.CLIENTBOUND_HANDSHAKE, flow = PacketFlow.CLIENTBOUND) +class ClientboundHandshakePacket() : RespondingRoleplayPacket() { + + lateinit var handshake: UUID + + constructor(handshake: UUID) : this() { + this.handshake = handshake + } + + override fun write(buffer: SurfByteBuf) { + super.write(buffer) + + buffer.writeUuid(handshake) + } + + override fun read(buffer: SurfByteBuf) { + super.read(buffer) + + handshake = buffer.readUuid() + } +} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/protocol/serverbound/ServerboundHandshakePacket.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/protocol/serverbound/ServerboundHandshakePacket.kt new file mode 100644 index 0000000..be7b52c --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/protocol/serverbound/ServerboundHandshakePacket.kt @@ -0,0 +1,34 @@ +package dev.slne.roleplay.mod.common.network.protocol.serverbound + +import dev.slne.roleplay.mod.common.network.SurfRoleplayPacket +import dev.slne.roleplay.mod.common.network.packets.ResponseRoleplayPacket +import dev.slne.roleplay.mod.common.network.protocol.DefaultIds +import dev.slne.roleplay.mod.common.network.utils.PacketFlow +import dev.slne.roleplay.mod.common.network.utils.SurfByteBuf +import java.util.* + +@SurfRoleplayPacket(id = DefaultIds.SERVERBOUND_HANDSHAKE, flow = PacketFlow.SERVERBOUND) +class ServerboundHandshakePacket() : ResponseRoleplayPacket() { + + lateinit var handshake: UUID + lateinit var clientVersion: String + + constructor(handshake: UUID, clientVersion: String) : this() { + this.handshake = handshake + this.clientVersion = clientVersion + } + + override fun write(buffer: SurfByteBuf) { + super.write(buffer) + + buffer.writeUuid(handshake) + buffer.writeUtf(clientVersion) + } + + override fun read(buffer: SurfByteBuf) { + super.read(buffer) + + handshake = buffer.readUuid() + clientVersion = buffer.readUtf() + } +} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/PacketFlow.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/PacketFlow.kt new file mode 100644 index 0000000..ba9a25c --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/PacketFlow.kt @@ -0,0 +1,20 @@ +package dev.slne.roleplay.mod.common.network.utils + +enum class PacketFlow { + CLIENTBOUND, + SERVERBOUND, + BIDIRECTIONAL; + + fun getOpposite(): PacketFlow { + if (this == BIDIRECTIONAL) throw IllegalStateException("Cannot get opposite of BOTH") + return if (this == CLIENTBOUND) SERVERBOUND else CLIENTBOUND + } + + fun displayName(): String { + return when (this) { + CLIENTBOUND -> "C -> S" + SERVERBOUND -> "S -> C" + BIDIRECTIONAL -> "C <-> S" + } + } +} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/RoleplayPacketHandler.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/RoleplayPacketHandler.kt new file mode 100644 index 0000000..15234ef --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/RoleplayPacketHandler.kt @@ -0,0 +1,5 @@ +package dev.slne.roleplay.mod.common.network.utils + +@Retention(AnnotationRetention.RUNTIME) +@Target(AnnotationTarget.FUNCTION) +annotation class RoleplayPacketHandler() diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/RoleplayPacketListener.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/RoleplayPacketListener.kt new file mode 100644 index 0000000..0c5ff35 --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/RoleplayPacketListener.kt @@ -0,0 +1,3 @@ +package dev.slne.roleplay.mod.common.network.utils + +interface RoleplayPacketListener \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/SurfByteBuf.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/SurfByteBuf.kt new file mode 100644 index 0000000..34e6c2f --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/SurfByteBuf.kt @@ -0,0 +1,1058 @@ +@file:OptIn(ExperimentalContracts::class) + +package dev.slne.roleplay.mod.common.network.utils + +import dev.slne.roleplay.mod.common.network.utils.SurfByteBuf.Companion +import dev.slne.roleplay.mod.common.network.utils.codec.ExtraCodecs +import dev.slne.roleplay.mod.common.network.utils.codec.StreamCodec +import dev.slne.roleplay.mod.common.network.utils.codec.kotlinx.SurfCloudBufSerializer +import dev.slne.roleplay.mod.common.network.utils.decoder.DecodeFactory +import dev.slne.roleplay.mod.common.network.utils.decoder.DecodeFactory.DecodeLongFactory +import dev.slne.roleplay.mod.common.network.utils.ecoder.EncodeFactory +import dev.slne.roleplay.mod.common.network.utils.ecoder.EncodeFactory.EncodeLongFactory +import dev.slne.roleplay.mod.common.network.utils.types.Utf8String +import dev.slne.roleplay.mod.common.network.utils.types.VarInt +import dev.slne.roleplay.mod.common.network.utils.types.VarLong +import io.netty.buffer.ByteBuf +import io.netty.buffer.ByteBufAllocator +import io.netty.buffer.PooledByteBufAllocator +import io.netty.buffer.WrappedByteBuf +import io.netty.handler.codec.DecoderException +import io.netty.handler.codec.EncoderException +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap +import it.unimi.dsi.fastutil.objects.ObjectArrayList +import kotlinx.serialization.KSerializer +import net.kyori.adventure.text.Component +import java.io.* +import java.math.BigDecimal +import java.math.BigInteger +import java.math.MathContext +import java.net.Inet4Address +import java.net.InetSocketAddress +import java.net.URI +import java.time.Instant +import java.time.ZoneId +import java.time.ZonedDateTime +import java.util.* +import java.util.function.Consumer +import kotlin.contracts.ExperimentalContracts +import kotlin.contracts.contract +import kotlin.reflect.KClass +import kotlin.time.Duration +import kotlin.time.Duration.Companion.milliseconds + +private const val NUMBER_BYTE: Byte = 0 +private const val NUMBER_SHORT: Byte = 1 +private const val NUMBER_INT: Byte = 2 +private const val NUMBER_LONG: Byte = 3 +private const val NUMBER_FLOAT: Byte = 4 +private const val NUMBER_DOUBLE: Byte = 5 + +/** + * Provides utilities for encoding and decoding data into a [ByteBuf] for network communication. + * + * ### Overview + * The `SurfByteBuf` and its companion object offer a wide range of functionality to serialize and deserialize + * primitives, collections, enums, and complex objects. These utilities are tailored for the Surf Cloud application + * to ensure efficient and reliable data transmission. + * + * ### Key Features + * - **Primitive Encoding/Decoding**: Supports all standard primitives and unsigned variants. + * - **Collection Support**: Read and write lists, maps, arrays, and custom collections. + * - **Custom Serialization**: Read and write custom objects, including JSON-encoded structures. + * - **Enum Handling**: Specialized methods for working with enums and enum sets. + * - **Optional and Nullable Support**: Methods for handling `Optional` and nullable values. + * - **Integration with Netty**: Extensions for Netty's [ByteBuf] provide a seamless interface. + * + * ### Example Usage + * #### Encoding and Decoding a String + * ```kotlin + * val buffer = Unpooled.buffer() + * SurfByteBuf.writeUtf(buffer, "Hello, Surf Cloud!") + * val result = SurfByteBuf.readUtf(buffer) + * println(result) // Output: "Hello, Surf Cloud!" + * ``` + * + * #### Working with Collections + * ```kotlin + * val buffer = Unpooled.buffer() + * val numbers = listOf(1, 2, 3, 4, 5) + * SurfByteBuf.writeCollection(buffer, numbers) { buf, value -> buf.writeVarInt(value) } + * val decodedNumbers = SurfByteBuf.readCollection(buffer, { ArrayList(it) }) { buf -> buf.readVarInt() } + * println(decodedNumbers) // Output: [1, 2, 3, 4, 5] + * ``` + * + * ### Extensibility + * Developers can extend the functionality by using the provided codecs or integrating new types. + * Custom objects can leverage `ExtraCodecs` or implement their serialization logic within the framework. + */ +open class SurfByteBuf(source: ByteBuf) : WrappedByteBuf(source) { + companion object { + val alloc: ByteBufAllocator = PooledByteBufAllocator.DEFAULT + + fun streamCodecFromKotlin(serializer: KSerializer): StreamCodec { + return SerializerCodec(serializer) + } + + private class SerializerCodec(private val serializer: KSerializer) : + StreamCodec { + override fun decode(buf: B): T { + return SurfCloudBufSerializer.serializer.decodeFromBuf(buf, serializer) + } + + override fun encode( + buf: B, + value: T + ) { + SurfCloudBufSerializer.serializer.encodeToBuf(buf, serializer, value) + } + } + + fun readComponent(buf: ByteBuf) = ExtraCodecs.COMPONENT_STREAM.decode(buf) + fun writeComponent(buf: ByteBuf, component: Component) = + ExtraCodecs.COMPONENT_STREAM.encode(buf, component) + + fun writeNumber(buf: ByteBuf, number: Number): Any = when (number) { + is Byte -> { + buf.writeByte(NUMBER_BYTE.toInt()) + buf.writeByte(number.toInt()) + } + + is Short -> { + buf.writeByte(NUMBER_SHORT.toInt()) + buf.writeShort(number.toInt()) + } + + is Int -> { + buf.writeByte(NUMBER_INT.toInt()) + writeVarInt(buf, number) + } + + is Long -> { + buf.writeByte(NUMBER_LONG.toInt()) + writeVarLong(buf, number) + } + + is Float -> { + buf.writeByte(NUMBER_FLOAT.toInt()) + buf.writeFloat(number) + } + + is Double -> { + buf.writeByte(NUMBER_DOUBLE.toInt()) + buf.writeDouble(number) + } + + else -> throw EncoderException("Unsupported number type: ${number.javaClass}") + } + + fun readNumber(buf: ByteBuf) = when (buf.readByte()) { + NUMBER_BYTE -> buf.readByte() + NUMBER_SHORT -> buf.readShort() + NUMBER_INT -> readVarInt(buf) + NUMBER_LONG -> readVarLong(buf) + NUMBER_FLOAT -> buf.readFloat() + NUMBER_DOUBLE -> buf.readDouble() + else -> throw DecoderException("Unknown number type") + } + + fun writeUnsigned(buf: ByteBuf, value: Byte) { + checkEncoded(value >= 0) { "Value must be positive" } + buf.writeByte(value.toInt() and 0xFF) + } + + fun writeUnsigned(buf: ByteBuf, value: Short) { + checkEncoded(value >= 0) { "Value must be positive" } + buf.writeShort(value.toInt() and 0xFFFF) + } + + fun writeUnsigned(buf: ByteBuf, value: Int) { + checkEncoded(value >= 0) { "Value must be positive" } + buf.writeInt(value and 0xFFFFFFFF.toInt()) + } + + fun writeUnsigned(buf: ByteBuf, value: Long) { + checkEncoded(value >= 0) { "Value must be positive" } + buf.writeLong(value) + } + + fun writeUnsigned(buf: ByteBuf, value: Float) { + checkEncoded(value >= 0) { "Value must be positive" } + buf.writeFloat(value) + } + + fun writeUnsigned(buf: ByteBuf, value: Double) { + checkEncoded(value >= 0) { "Value must be positive" } + buf.writeDouble(value) + } + + fun readUnsignedByte(buf: ByteBuf) = buf.readUnsignedByte() + fun readUnsignedShort(buf: ByteBuf) = buf.readUnsignedShort() + fun readUnsignedInt(buf: ByteBuf) = buf.readUnsignedInt() + fun readUnsignedLong(buf: ByteBuf) = buf.readLong() + fun readUnsignedFloat(buf: ByteBuf) = buf.readFloat() + fun readUnsignedDouble(buf: ByteBuf) = buf.readDouble() + + fun , B : ByteBuf> readCollection( + buf: B, + collectionFactory: (Int) -> C, + decodeFactory: DecodeFactory + ): C { + val size = buf.readVarInt() + val collection = collectionFactory(size) + + repeat(size) { collection.add(decodeFactory(buf)) } + + return collection + } + + fun writeCollection( + buf: B, + collection: Collection, + encodeFactory: EncodeFactory + ) { + buf.writeVarInt(collection.size) + + for (element in collection) { + encodeFactory(buf, element) + } + } + + inline fun readArray( + buf: B, + decodeFactory: DecodeFactory + ) = Array(buf.readVarInt()) { decodeFactory.invoke(buf) } + + fun readArray( + buf: B, + arrayFactory: (Int) -> Array, + decodeFactory: DecodeFactory + ): Array { + val size = buf.readVarInt() + val array = arrayFactory(size) + + for (i in 0 until size) { + array[i] = decodeFactory.invoke(buf) + } + + return array + } + + fun readIntArray(buf: B) = IntArray(buf.readVarInt()).apply { + for (i in indices) { + this[i] = buf.readVarInt() + } + } + + fun readLongArray(buf: B) = LongArray(buf.readVarInt()).apply { + for (i in indices) { + this[i] = buf.readLong() + } + } + + fun readFloatArray(buf: B) = FloatArray(buf.readVarInt()).apply { + for (i in indices) { + this[i] = buf.readFloat() + } + } + + fun readDoubleArray(buf: B) = DoubleArray(buf.readVarInt()).apply { + for (i in indices) { + this[i] = buf.readDouble() + } + } + + fun readBooleanArray(buf: B) = BooleanArray(buf.readVarInt()).apply { + for (i in indices) { + this[i] = buf.readBoolean() + } + } + + fun readByteArray(buf: B) = ByteArray(buf.readVarInt()).apply { + buf.readBytes(this) + } + + fun readShortArray(buf: B) = ShortArray(buf.readVarInt()).apply { + for (i in indices) { + this[i] = buf.readShort() + } + } + + fun readCharArray(buf: B) = CharArray(buf.readVarInt()).apply { + for (i in indices) { + this[i] = buf.readChar() + } + } + + fun readStringArray(buf: B) = Array(buf.readVarInt()) { readUtf(buf) } + fun readUuidArray(buf: B) = Array(buf.readVarInt()) { readUuid(buf) } + + fun writeArray( + buf: B, + array: Array, + encodeFactory: EncodeFactory + ) { + buf.writeVarInt(array.size) + + for (element in array) { + encodeFactory.invoke(buf, element) + } + } + + fun writeIntArray(buf: B, array: IntArray) { + buf.writeVarInt(array.size) + for (element in array) { + buf.writeVarInt(element) + } + } + + fun writeLongArray(buf: B, array: LongArray) { + buf.writeVarInt(array.size) + for (element in array) { + buf.writeLong(element) + } + } + + fun writeFloatArray(buf: B, array: FloatArray) { + buf.writeVarInt(array.size) + for (element in array) { + buf.writeFloat(element) + } + } + + fun writeDoubleArray(buf: B, array: DoubleArray) { + buf.writeVarInt(array.size) + for (element in array) { + buf.writeDouble(element) + } + } + + fun writeBooleanArray(buf: B, array: BooleanArray) { + buf.writeVarInt(array.size) + for (element in array) { + buf.writeBoolean(element) + } + } + + fun writeByteArray(buf: B, array: ByteArray) { + buf.writeVarInt(array.size) + buf.writeBytes(array) + } + + fun writeShortArray(buf: B, array: ShortArray) { + buf.writeVarInt(array.size) + for (element in array) { + buf.writeShort(element.toInt()) + } + } + + fun writeCharArray(buf: B, array: CharArray) { + buf.writeVarInt(array.size) + for (element in array) { + buf.writeChar(element.code) + } + } + + fun writeStringArray(buf: B, array: Array) { + buf.writeVarInt(array.size) + for (element in array) { + writeUtf(buf, element) + } + } + + fun writeUuidArray(buf: B, array: Array) { + buf.writeVarInt(array.size) + for (element in array) { + writeUuid(buf, element) + } + } + + fun readList( + buf: B, + decodeFactory: DecodeFactory + ) = readCollection(buf, { ObjectArrayList(it) }, decodeFactory) + + fun , B : ByteBuf> readMap( + buf: B, + mapFactory: (Int) -> M, + keyDecodeFactory: DecodeFactory, + valueDecodeFactory: DecodeFactory + ): M { + val size = buf.readVarInt() + val map = mapFactory(size) + + for (i in 0 until size) { + val key = keyDecodeFactory.invoke(buf) + val value = valueDecodeFactory.invoke(buf) + + map[key] = value + } + + return map + } + + fun readMap( + buf: B, + keyDecodeFactory: DecodeFactory, + valueDecodeFactory: DecodeFactory + ) = readMap(buf, { Object2ObjectOpenHashMap(it) }, keyDecodeFactory, valueDecodeFactory) + + fun writeMap( + buf: B, + map: Map, + keyEncodeFactory: EncodeFactory, + valueEncodeFactory: EncodeFactory + ) { + buf.writeVarInt(map.size) + + for ((key, value) in map) { + keyEncodeFactory.invoke(buf, key) + valueEncodeFactory.invoke(buf, value) + } + } + + inline fun > readEnumSet(buf: ByteBuf) = readEnumSet(buf, E::class.java) + fun > readEnumSet( + buf: ByteBuf, + enumClass: KClass + ) = readEnumSet(buf, enumClass.java) + + fun > readEnumSet( + buf: ByteBuf, + enumClass: Class + ): EnumSet { + val values = enumClass.enumConstants + val bitSet = readFixedBitSet(buf, values.size) + val enumSet = EnumSet.noneOf(enumClass) + + for (i in values.indices) { + if (bitSet[i]) { + enumSet.add(values[i]) + } + } + + return enumSet + } + + fun > writeEnumSet( + buf: ByteBuf, + enumSet: EnumSet, + enumClass: Class + ) { + val values = enumClass.enumConstants + val bitSet = BitSet(values.size) + + for (i in values.indices) { + bitSet[i] = enumSet.contains(values[i]) + } + + writeFixedBitSet(buf, bitSet, values.size) + } + + fun > writeEnumSet( + buf: ByteBuf, + enumSet: EnumSet, + enumClass: KClass + ) = writeEnumSet(buf, enumSet, enumClass.java) + + fun > readEnum(buf: ByteBuf, enumClass: Class): E = + enumClass.enumConstants[buf.readVarInt()] + + fun > writeEnum(buf: ByteBuf, value: E) = buf.writeVarInt(value.ordinal) + + fun writeUuid(buf: ByteBuf, uuid: UUID) { + buf.writeLong(uuid.mostSignificantBits) + buf.writeLong(uuid.leastSignificantBits) + } + + fun readUuid(buf: ByteBuf) = UUID(buf.readLong(), buf.readLong()) + fun readBitSet(buf: ByteBuf): BitSet = BitSet.valueOf(readLongArray(buf)) + fun writeBitSet(buf: ByteBuf, bitSet: BitSet) = + writeLongArray(buf, bitSet.toLongArray()) + + fun readFixedBitSet(buf: ByteBuf, size: Int): BitSet = + ByteArray(positiveCeilDiv(size, Byte.SIZE_BITS)).run { + buf.readBytes(this) + BitSet.valueOf(this) + } + + fun writeFixedBitSet(buf: ByteBuf, bitSet: BitSet, size: Int): ByteBuf = + bitSet.length().let { bitSetSize -> + checkEncoded(bitSetSize <= size) { "BitSet is larger than expected size ($bitSetSize>$size)" } + buf.writeBytes(bitSet.toByteArray().copyOf(positiveCeilDiv(size, Byte.SIZE_BITS))) + } + + @JvmOverloads + fun readUtf(buf: ByteBuf, maxLength: Int = Int.MAX_VALUE) = Utf8String.read(buf, maxLength) + + @JvmOverloads + fun writeUtf(buf: ByteBuf, string: String, maxLength: Int = Int.MAX_VALUE) = + Utf8String.write(buf, string, maxLength) + + fun readVarInt(buf: ByteBuf) = VarInt.readVarInt(buf) + fun writeVarInt(buf: ByteBuf, value: Int) = VarInt.writeVarInt(buf, value) + fun readVarLong(buf: ByteBuf) = VarLong.readVarLong(buf) + fun writeVarLong(buf: ByteBuf, value: Long) = VarLong.writeVarLong(buf, value) + + fun writeWithCount(buf: B, count: Int, writer: (B) -> Unit) = buf.run { + writeVarInt(count) + for (i in 0 until count) { + writer(this) + } + } + + fun writeWithCount(buf: B, count: Int, writer: Consumer) = + writeWithCount(buf, count) { writer.accept(it) } + + fun readWithCount(buf: B, reader: (B) -> Unit) = buf.run { + for (i in 0 until readVarInt()) { + reader(this) + } + } + + fun readWithCount(buf: B, reader: Consumer) = + readWithCount(buf) { reader.accept(it) } + + fun readNullable( + buf: B, + decodeFactory: DecodeFactory + ): T? = if (buf.readBoolean()) decodeFactory(buf) else null + + fun writeNullable( + buf: B, + value: T?, + encodeFactory: EncodeFactory + ) { + buf.writeBoolean(value != null) + + if (value != null) { + encodeFactory(buf, value) + } + } + + fun writeOptional( + buf: B, + optional: Optional, + encodeFactory: EncodeFactory + ) { + buf.writeBoolean(optional.isPresent) + optional.ifPresent { encodeFactory(buf, it) } + } + + fun readOptional( + buf: B, + decodeFactory: DecodeFactory + ) = if (buf.readBoolean()) Optional.of(decodeFactory(buf)) else Optional.empty() + + @JvmOverloads + fun writeOptionalLong( + buf: B, + optional: OptionalLong, + encodeFactory: EncodeLongFactory = + EncodeLongFactory { buf, value -> buf.writeLong(value) } + ) { + buf.writeBoolean(optional.isPresent) + optional.ifPresent { encodeFactory.encodeLong(buf, it) } + } + + @JvmOverloads + fun readOptionalLong( + buf: B, + decodeFactory: DecodeLongFactory = + DecodeLongFactory { buf -> buf.readLong() } + ): OptionalLong = + if (buf.readBoolean()) OptionalLong.of(decodeFactory.decodeLong(buf)) else OptionalLong.empty() + + + @Deprecated("Use codec instead") + fun writeSerializable(buf: B, serializable: Serializable): ByteBuf = + ByteArrayOutputStream().use { bout -> + ObjectOutputStream(bout).use { out -> + try { + out.writeObject(serializable) + out.flush() + + val bytes = bout.toByteArray() + buf.writeVarInt(bytes.size) + buf.writeBytes(bytes) + } catch (e: IOException) { + throw EncoderException("Failed to write serializable", e) + } + + } + } + + @Suppress("UNCHECKED_CAST") + @Deprecated("Use codec instead") + fun readSerializable( + buf: B, + clazz: Class + ): T { + val bytes = ByteArray(buf.readVarInt()) + buf.readBytes(bytes) + return try { + ObjectInputStream(ByteArrayInputStream(bytes)).use { it.readObject() as T } + } catch (e: IOException) { + throw DecoderException("Failed to read serializable", e) + } catch (e: ClassNotFoundException) { + throw DecoderException("Failed to read serializable", e) + } catch (e: ClassCastException) { + throw DecoderException("Failed to cast serializable! Expected: $clazz", e) + } + } + + @Suppress("DEPRECATION") + @Deprecated("Use codec instead") + inline fun readSerializable( + buf: B, + ): T = readSerializable(buf, T::class.java) + + fun writeURI(buf: B, uri: URI) { + writeUtf(buf, uri.toString()) + } + + fun readURI(buf: B) = URI(readUtf(buf)) + + fun writeInetSocketAddress(buf: B, address: InetSocketAddress) { + writeUtf(buf, address.hostString) + buf.writeVarInt(address.port) + } + + fun writeZonedDateTime(buf: B, time: ZonedDateTime) { + buf.writeLong(time.toInstant().toEpochMilli()) + writeUtf(buf, time.zone.id) + } + + fun readZonedDateTime(buf: B): ZonedDateTime { + val epoch = buf.readLong() + val zone = readUtf(buf) + return ZonedDateTime.ofInstant(Instant.ofEpochMilli(epoch), ZoneId.of(zone)) + } + + fun writeInet4Address(buf: B, address: Inet4Address) { + writeByteArray(buf, address.address) + } + + fun readInet4Address(buf: B): Inet4Address { + val address = readByteArray(buf) + return Inet4Address.getByAddress(address) as Inet4Address + } + + fun writeSingleton(buf: B, singleton: Any) { + require(singleton::class.objectInstance != null) { "Object must be a singleton" } + writeUtf(buf, singleton::class.qualifiedName!!) + } + + fun readSingleton(buf: B, classLoader: ClassLoader): Any { + val className = readUtf(buf) + return Class.forName(className, true, classLoader).kotlin.objectInstance + ?: throw DecoderException("Failed to read singleton: $className") + } + + fun writeDuration(buf: B, duration: Duration) { + buf.writeLong(duration.inWholeMilliseconds) + } + + fun readDuration(buf: B): Duration { + return buf.readLong().milliseconds + } + + fun writeBigInteger(buf: B, value: BigInteger) { + writeByteArray(buf, value.toByteArray()) + } + + fun readBigInteger(buf: B): BigInteger { + return BigInteger(readByteArray(buf)) + } + + fun writeBigDecimal(buf: B, value: BigDecimal) { + writeBigInteger(buf, value.unscaledValue()) + buf.writeVarInt(value.scale()) + buf.writeVarInt(value.precision()) + } + + fun readBigDecimal(buf: B): BigDecimal { + val unscaledValue = readBigInteger(buf) + val scale = buf.readVarInt() + val precision = buf.readVarInt() + return BigDecimal(unscaledValue, scale, MathContext(precision)) + } + } + + // @formatter:off + @Suppress("DEPRECATION") + @Deprecated("Use codec instead") + fun writeSerializable(serializable: Serializable) = writeSerializable(this, serializable) + @Suppress("DEPRECATION") + @Deprecated("Use codec instead") + fun readSerializable(clazz: Class) = readSerializable(this, clazz) + @Suppress("DEPRECATION") + @Deprecated("Use codec instead") + inline fun readSerializable() = readSerializable(this, T::class.java) + fun writeURI(uri: URI) = writeURI(this, uri) + fun readURI() = readURI(this) + fun readComponent() = readComponent(this) + fun writeComponent(component: Component) = writeComponent(this, component) + fun writeNumber(number: Number) = writeNumber(this, number) + fun readNumber() = readNumber(this) + fun writeUnsigned(value: Byte) = writeUnsigned(this, value) + fun writeUnsigned(value: Short) = writeUnsigned(this, value) + fun writeUnsigned(value: Int) = writeUnsigned(this, value) + fun writeUnsigned(value: Long) = writeUnsigned(this, value) + fun writeUnsigned(value: Float) = writeUnsigned(this, value) + fun writeUnsigned(value: Double) = writeUnsigned(this, value) + fun readUnsignedLong() = readUnsignedLong(this) + fun readUnsignedFloat() = readUnsignedFloat(this) + fun readUnsignedDouble() = readUnsignedDouble(this) + fun > readCollection(collectionFactory: (Int) -> C, decodeFactory: DecodeFactory) = readCollection(this, collectionFactory, decodeFactory) + fun writeCollection(collection: Collection, encodeFactory: EncodeFactory) = writeCollection(this, collection, encodeFactory) + inline fun readArray(decodeFactory: DecodeFactory) = readArray(this, decodeFactory) + fun readArray(arrayFactory: (Int) -> Array, decodeFactory: DecodeFactory) = readArray(this, arrayFactory, decodeFactory) + fun readIntArray() = readIntArray(this) + fun readLongArray() = readLongArray(this) + fun readFloatArray() = readFloatArray(this) + fun readDoubleArray() = readDoubleArray(this) + fun readBooleanArray() = readBooleanArray(this) + fun readByteArray() = readByteArray(this) + fun readShortArray() = readShortArray(this) + fun readCharArray() = readCharArray(this) + fun readStringArray() = readStringArray(this) + fun readUuidArray() = readUuidArray(this) + + fun writeArray(array: Array, encodeFactory: EncodeFactory) = writeArray(this, array, encodeFactory) + fun writeIntArray(array: IntArray) = writeIntArray(this, array) + fun writeLongArray(array: LongArray) = writeLongArray(this, array) + fun writeFloatArray(array: FloatArray) = writeFloatArray(this, array) + fun writeDoubleArray(array: DoubleArray) = writeDoubleArray(this, array) + fun writeBooleanArray(array: BooleanArray) = writeBooleanArray(this, array) + fun writeByteArray(array: ByteArray) = writeByteArray(this, array) + fun writeShortArray(array: ShortArray) = writeShortArray(this, array) + fun writeCharArray(array: CharArray) = writeCharArray(this, array) + fun writeStringArray(array: Array) = writeStringArray(this, array) + fun writeUuidArray(array: Array) = writeUuidArray(this, array) + + fun readList(decodeFactory: DecodeFactory) = readList(this, decodeFactory) + fun readMap(keyDecodeFactory: DecodeFactory, valueDecodeFactory: DecodeFactory) = readMap(this, keyDecodeFactory, valueDecodeFactory) + fun > readMap(mapFactory: (Int) -> M, keyDecodeFactory: DecodeFactory, valueDecodeFactory: DecodeFactory) = readMap(this, mapFactory, keyDecodeFactory, valueDecodeFactory) + fun writeMap(map: Map, keyEncodeFactory: EncodeFactory, valueEncodeFactory: EncodeFactory) = writeMap(this, map, keyEncodeFactory, valueEncodeFactory) + fun > readEnumSet(enumClass: Class) = readEnumSet(this, enumClass) + fun > readEnumSet(enumClass: KClass) = readEnumSet(this, enumClass) + fun > writeEnumSet(enumSet: EnumSet, enumClass: Class) = writeEnumSet(this, enumSet, enumClass) + fun > writeEnumSet(enumSet: EnumSet, enumClass: KClass) = writeEnumSet(this, enumSet, enumClass) + fun > readEnum(enumClass: Class) = readEnum(this, enumClass) + fun > readEnum(enumClass: KClass) = readEnum(enumClass.java) + fun > writeEnum(value: E) = writeEnum(this, value) + fun writeUuid(uuid: UUID) = writeUuid(this, uuid) + fun readUuid() = readUuid(this) + fun readBitSet() = readBitSet(this) + fun writeBitSet(bitSet: BitSet) = writeBitSet(this, bitSet) + fun readFixedBitSet(size: Int) = readFixedBitSet(this, size) + fun writeFixedBitSet(bitSet: BitSet, size: Int) = writeFixedBitSet(this, bitSet, size) + @JvmOverloads + fun readUtf(maxLength: Int = Int.MAX_VALUE) = readUtf(this, maxLength) + @JvmOverloads + fun writeUtf(string: String, maxLength: Int = Int.MAX_VALUE) = writeUtf(this, string, maxLength) + fun readVarInt() = readVarInt(this) + fun writeVarInt(value: Int) = writeVarInt(this, value) + fun readVarLong() = readVarLong(this) + fun writeVarLong(value: Long) = writeVarLong(this, value) + fun readNullable(decodeFactory: DecodeFactory) = readNullable(this, decodeFactory) + fun readNullableBoolean() = readNullable(this) { it.readBoolean() } + fun readNullableByte() = readNullable(this) { it.readByte() } + fun readNullableShort() = readNullable(this) { it.readShort() } + fun readNullableInt() = readNullable(this) { it.readVarInt() } + fun readNullableLong() = readNullable(this) { it.readLong() } + fun readNullableFloat() = readNullable(this) { it.readFloat() } + fun readNullableDouble() = readNullable(this) { it.readDouble() } + fun readNullableChar() = readNullable(this) { it.readChar() } + fun readNullableString() = readNullable(this) { readUtf(it) } + fun readNullableUuid() = readNullable(this) { readUuid(it) } + fun writeNullable(value: T?, encodeFactory: EncodeFactory) = writeNullable(this, value, encodeFactory) + fun writeNullable(value: Boolean?) = writeNullable(this, value) { buf, bool -> buf.writeBoolean(bool) } + fun writeNullable(value: Byte?) = writeNullable(this, value) { buf, byte -> buf.writeByte(byte.toInt()) } + fun writeNullable(value: Short?) = writeNullable(this, value) { buf, short -> buf.writeShort(short.toInt()) } + fun writeNullable(value: Int?) = writeNullable(this, value) { buf, int -> buf.writeVarInt(int) } + fun writeNullable(value: Long?) = writeNullable(this, value) { buf, long -> buf.writeLong(long) } + fun writeNullable(value: Float?) = writeNullable(this, value) { buf, float -> buf.writeFloat(float) } + fun writeNullable(value: Double?) = writeNullable(this, value) { buf, double -> buf.writeDouble(double) } + fun writeNullable(value: Char?) = writeNullable(this, value) { buf, char -> buf.writeChar(char.code) } + fun writeNullable(value: String?) = writeNullable(this, value) { buf, string -> writeUtf(buf, string) } + fun writeNullable(value: UUID?) = writeNullable(this, value) {buf, uuid -> writeUuid(buf, uuid) } + fun writeOptional(optional: Optional, encodeFactory: EncodeFactory) = writeOptional(this, optional, encodeFactory) + fun readOptional(decodeFactory: DecodeFactory) = readOptional(this, decodeFactory) + fun writeOptionalLong(optional: OptionalLong) = writeOptionalLong(this, optional) + fun readOptionalLong() = readOptionalLong(this) + fun writeWithCount(count: Int, writer: (SurfByteBuf) -> Unit) = writeWithCount(this, count, writer) + fun writeWithCount(count: Int, writer: Consumer) = writeWithCount(this, count, writer) + fun readWithCount(reader: (SurfByteBuf) -> Unit) = readWithCount(this, reader) + fun readWithCount(reader: Consumer) = readWithCount(this, reader) + fun writeInetSocketAddress(address: InetSocketAddress) = writeInetSocketAddress(this, address) + fun writeZonedDateTime(time: ZonedDateTime) = writeZonedDateTime(this, time) + fun readZonedDateTime() = readZonedDateTime(this) + fun writeInet4Address(address: Inet4Address) = writeInet4Address(this, address) + fun readInet4Address() = readInet4Address(this) + fun writeSingleton(singleton: Any) = writeSingleton(this, singleton) + fun readSingleton(classLoader: ClassLoader) = readSingleton(this, classLoader) + fun writeDuration(duration: Duration) = writeDuration(this, duration) + fun readDuration() = readDuration(this) + fun writeBigInteger(value: BigInteger) = writeBigInteger(this, value) + fun readBigInteger() = readBigInteger(this) + fun writeBigDecimal(value: BigDecimal) = writeBigDecimal(this, value) + fun readBigDecimal() = readBigDecimal(this) + // @formatter:on +// endregion + +} + +private fun positiveCeilDiv(a: Int, b: Int) = -Math.floorDiv(-a, b) + +// Preconditions +inline fun checkEncoded(value: Boolean, message: () -> Any) { + contract { + returns() implies value + } + + if (!value) throw EncoderException(message().toString()) +} + +inline fun checkDecoded(value: Boolean, message: () -> Any) { + contract { + returns() implies value + } + + if (!value) throw DecoderException(message().toString()) +} + +// region ByteBuf extensions +fun ByteBuf.writeVarInt(value: Int) = SurfByteBuf.writeVarInt(this, value) +fun ByteBuf.readVarInt() = SurfByteBuf.readVarInt(this) +fun ByteBuf.writeVarLong(value: Long) = SurfByteBuf.writeVarLong(this, value) +fun ByteBuf.readVarLong() = SurfByteBuf.readVarLong(this) + +fun ByteBuf.readComponent() = SurfByteBuf.readComponent(this) +fun ByteBuf.writeComponent(component: Component) = SurfByteBuf.writeComponent(this, component) +fun ByteBuf.writeNumber(number: Number) = SurfByteBuf.writeNumber(this, number) +fun ByteBuf.readNumber() = SurfByteBuf.readNumber(this) +fun ByteBuf.writeUnsigned(value: Byte) = SurfByteBuf.writeUnsigned(this, value) +fun ByteBuf.writeUnsigned(value: Short) = SurfByteBuf.writeUnsigned(this, value) +fun ByteBuf.writeUnsigned(value: Int) = SurfByteBuf.writeUnsigned(this, value) +fun ByteBuf.writeUnsigned(value: Long) = SurfByteBuf.writeUnsigned(this, value) +fun ByteBuf.writeUnsigned(value: Float) = SurfByteBuf.writeUnsigned(this, value) +fun ByteBuf.writeUnsigned(value: Double) = SurfByteBuf.writeUnsigned(this, value) +fun ByteBuf.readUnsignedLong() = SurfByteBuf.readUnsignedLong(this) +fun ByteBuf.readUnsignedFloat() = SurfByteBuf.readUnsignedFloat(this) +fun ByteBuf.readUnsignedDouble() = SurfByteBuf.readUnsignedDouble(this) +fun > B.readCollection( + collectionFactory: (Int) -> C, + decodeFactory: DecodeFactory +) = + SurfByteBuf.readCollection(this, collectionFactory, decodeFactory) + +fun B.writeCollection( + collection: Collection, + encodeFactory: EncodeFactory +) = + SurfByteBuf.writeCollection(this, collection, encodeFactory) + +inline fun B.readArray(decodeFactory: DecodeFactory) = + SurfByteBuf.readArray(this, decodeFactory) + +fun B.readArray( + arrayFactory: (Int) -> Array, + decodeFactory: DecodeFactory +) = + SurfByteBuf.readArray(this, arrayFactory, decodeFactory) + +fun ByteBuf.readIntArray() = SurfByteBuf.readIntArray(this) +fun ByteBuf.readLongArray() = SurfByteBuf.readLongArray(this) +fun ByteBuf.readFloatArray() = SurfByteBuf.readFloatArray(this) +fun ByteBuf.readDoubleArray() = SurfByteBuf.readDoubleArray(this) +fun ByteBuf.readBooleanArray() = SurfByteBuf.readBooleanArray(this) +fun ByteBuf.readByteArray() = SurfByteBuf.readByteArray(this) +fun ByteBuf.readShortArray() = SurfByteBuf.readShortArray(this) +fun ByteBuf.readCharArray() = SurfByteBuf.readCharArray(this) +fun ByteBuf.readStringArray() = SurfByteBuf.readStringArray(this) +fun ByteBuf.readUuidArray() = SurfByteBuf.readUuidArray(this) +fun B.writeArray(array: Array, encodeFactory: EncodeFactory) = + SurfByteBuf.writeArray(this, array, encodeFactory) + +fun ByteBuf.writeIntArray(array: IntArray) = SurfByteBuf.writeIntArray(this, array) +fun ByteBuf.writeLongArray(array: LongArray) = SurfByteBuf.writeLongArray(this, array) +fun ByteBuf.writeFloatArray(array: FloatArray) = SurfByteBuf.writeFloatArray(this, array) +fun ByteBuf.writeDoubleArray(array: DoubleArray) = SurfByteBuf.writeDoubleArray(this, array) +fun ByteBuf.writeBooleanArray(array: BooleanArray) = SurfByteBuf.writeBooleanArray(this, array) +fun ByteBuf.writeByteArray(array: ByteArray) = SurfByteBuf.writeByteArray(this, array) +fun ByteBuf.writeShortArray(array: ShortArray) = SurfByteBuf.writeShortArray(this, array) +fun ByteBuf.writeCharArray(array: CharArray) = SurfByteBuf.writeCharArray(this, array) +fun ByteBuf.writeStringArray(array: Array) = SurfByteBuf.writeStringArray(this, array) +fun ByteBuf.writeUuidArray(array: Array) = SurfByteBuf.writeUuidArray(this, array) +fun B.readList(decodeFactory: DecodeFactory) = + SurfByteBuf.readList(this, decodeFactory) + +fun B.readMap( + keyDecodeFactory: DecodeFactory, + valueDecodeFactory: DecodeFactory +) = + SurfByteBuf.readMap(this, keyDecodeFactory, valueDecodeFactory) + +fun > B.readMap( + mapFactory: (Int) -> M, + keyDecodeFactory: DecodeFactory, + valueDecodeFactory: DecodeFactory +) = + SurfByteBuf.readMap(this, mapFactory, keyDecodeFactory, valueDecodeFactory) + +fun B.writeMap( + map: Map, + keyEncodeFactory: EncodeFactory, + valueEncodeFactory: EncodeFactory +) = + SurfByteBuf.writeMap(this, map, keyEncodeFactory, valueEncodeFactory) + +fun > ByteBuf.readEnumSet(enumClass: Class) = + SurfByteBuf.readEnumSet(this, enumClass) + +fun > ByteBuf.readEnumSet(enumClass: KClass) = + SurfByteBuf.readEnumSet(this, enumClass) + +fun > ByteBuf.writeEnumSet(enumSet: EnumSet, enumClass: Class) = + SurfByteBuf.writeEnumSet(this, enumSet, enumClass) + +fun > ByteBuf.writeEnumSet(enumSet: EnumSet, enumClass: KClass) = + SurfByteBuf.writeEnumSet(this, enumSet, enumClass) + +fun > ByteBuf.readEnum(enumClass: Class) = SurfByteBuf.readEnum(this, enumClass) +inline fun > ByteBuf.readEnum() = SurfByteBuf.readEnum(this, E::class.java) +fun > ByteBuf.writeEnum(value: E) = SurfByteBuf.writeEnum(this, value) +fun ByteBuf.writeUuid(uuid: UUID) = SurfByteBuf.writeUuid(this, uuid) +fun ByteBuf.readUuid() = SurfByteBuf.readUuid(this) +fun ByteBuf.readBitSet() = SurfByteBuf.readBitSet(this) +fun ByteBuf.writeBitSet(bitSet: BitSet) = SurfByteBuf.writeBitSet(this, bitSet) +fun ByteBuf.readFixedBitSet(size: Int) = SurfByteBuf.readFixedBitSet(this, size) +fun ByteBuf.writeFixedBitSet(bitSet: BitSet, size: Int) = + SurfByteBuf.writeFixedBitSet(this, bitSet, size) + +fun ByteBuf.readUtf(maxLength: Int = Int.MAX_VALUE) = SurfByteBuf.readUtf(this, maxLength) +fun ByteBuf.writeUtf(string: String, maxLength: Int = Int.MAX_VALUE) = + SurfByteBuf.writeUtf(this, string, maxLength) + +fun B.readNullable(decodeFactory: DecodeFactory) = + SurfByteBuf.readNullable(this, decodeFactory) + +fun ByteBuf.readNullableBoolean() = SurfByteBuf.readNullable(this) { it.readBoolean() } +fun ByteBuf.readNullableByte() = SurfByteBuf.readNullable(this) { it.readByte() } +fun ByteBuf.readNullableShort() = SurfByteBuf.readNullable(this) { it.readShort() } + +@Deprecated("Use varInt instead", ReplaceWith("readNullableVarInt()")) +fun ByteBuf.readNullableInt() = SurfByteBuf.readNullable(this) { it.readInt() } +fun ByteBuf.readNullableVarInt() = SurfByteBuf.readNullable(this) { it.readVarInt() } +fun ByteBuf.readNullableLong() = SurfByteBuf.readNullable(this) { it.readLong() } +fun ByteBuf.readNullableFloat() = SurfByteBuf.readNullable(this) { it.readFloat() } +fun ByteBuf.readNullableDouble() = SurfByteBuf.readNullable(this) { it.readDouble() } +fun ByteBuf.readNullableChar() = SurfByteBuf.readNullable(this) { it.readChar() } +fun ByteBuf.readNullableString() = SurfByteBuf.readNullable(this) { SurfByteBuf.readUtf(it) } +fun ByteBuf.readNullableUuid() = SurfByteBuf.readNullable(this) { SurfByteBuf.readUuid(it) } +fun B.writeNullable(value: T?, encodeFactory: EncodeFactory) = + SurfByteBuf.writeNullable(this, value, encodeFactory) + +fun ByteBuf.writeNullableBoolean(value: Boolean?) = + SurfByteBuf.writeNullable(this, value) { buf, bool -> buf.writeBoolean(bool) } + +fun ByteBuf.writeNullableByte(value: Byte?) = + SurfByteBuf.writeNullable(this, value) { buf, byte -> buf.writeByte(byte.toInt()) } + +fun ByteBuf.writeNullableShort(value: Short?) = + SurfByteBuf.writeNullable(this, value) { buf, short -> buf.writeShort(short.toInt()) } + +@Deprecated("Use varInt instead", ReplaceWith("writeNullableVarInt(value)")) +fun ByteBuf.writeNullableInt(value: Int?) = + SurfByteBuf.writeNullable(this, value) { buf, int -> buf.writeVarInt(int) } + +fun ByteBuf.writeNullableVarInt(value: Int?) = + SurfByteBuf.writeNullable(this, value) { buf, int -> buf.writeVarInt(int) } + +fun ByteBuf.writeNullableLong(value: Long?) = + SurfByteBuf.writeNullable(this, value) { buf, long -> buf.writeLong(long) } + +fun ByteBuf.writeNullableFloat(value: Float?) = + SurfByteBuf.writeNullable(this, value) { buf, float -> buf.writeFloat(float) } + +fun ByteBuf.writeNullableDouble(value: Double?) = + SurfByteBuf.writeNullable(this, value) { buf, double -> buf.writeDouble(double) } + +fun ByteBuf.writeNullableChar(value: Char?) = + SurfByteBuf.writeNullable(this, value) { buf, char -> buf.writeChar(char.code) } + +fun ByteBuf.writeNullableString(value: String?) = + SurfByteBuf.writeNullable(this, value) { buf, string -> SurfByteBuf.writeUtf(buf, string) } + +fun ByteBuf.writeNullableUuid(value: UUID?) = + SurfByteBuf.writeNullable(this, value) { buf, uuid -> SurfByteBuf.writeUuid(buf, uuid) } + +fun B.writeOptional(optional: Optional, encodeFactory: EncodeFactory) = + SurfByteBuf.writeOptional(this, optional, encodeFactory) + +fun B.readOptional(decodeFactory: DecodeFactory) = + SurfByteBuf.readOptional(this, decodeFactory) + +fun ByteBuf.writeOptionalLong(optional: OptionalLong) = + SurfByteBuf.writeOptionalLong(this, optional) + +fun ByteBuf.readOptionalLong() = SurfByteBuf.readOptionalLong(this) +fun B.writeWithCount(count: Int, writer: (B) -> Unit) = + SurfByteBuf.writeWithCount(this, count, writer) + +fun B.writeWithCount(count: Int, writer: Consumer) = + Companion.writeWithCount(this, count, writer) + +fun B.readWithCount(reader: (B) -> Unit) = SurfByteBuf.readWithCount(this, reader) +fun B.readWithCount(reader: Consumer) = Companion.readWithCount(this, reader) + +fun B.readURI() = SurfByteBuf.readURI(this) +fun B.writeURI(uri: URI) = SurfByteBuf.writeURI(this, uri) + +fun B.writeInetSocketAddress(address: InetSocketAddress) = + SurfByteBuf.writeInetSocketAddress(this, address) + +fun B.readZonedDateTime() = SurfByteBuf.readZonedDateTime(this) +fun B.writeZonedDateTime(time: ZonedDateTime) = + SurfByteBuf.writeZonedDateTime(this, time) + +fun B.readInet4Address() = SurfByteBuf.readInet4Address(this) +fun B.writeInet4Address(address: Inet4Address) = + SurfByteBuf.writeInet4Address(this, address) + +fun B.readSingleton(classLoader: ClassLoader) = + SurfByteBuf.readSingleton(this, classLoader) + +fun B.writeSingleton(singleton: Any) = SurfByteBuf.writeSingleton(this, singleton) + +fun B.writeDuration(duration: Duration) = SurfByteBuf.writeDuration(this, duration) +fun B.readDuration() = SurfByteBuf.readDuration(this) + +fun B.writeBigInteger(value: BigInteger) = SurfByteBuf.writeBigInteger(this, value) +fun B.readBigInteger() = SurfByteBuf.readBigInteger(this) +fun B.writeBigDecimal(value: BigDecimal) = SurfByteBuf.writeBigDecimal(this, value) +fun B.readBigDecimal() = SurfByteBuf.readBigDecimal(this) + +fun ByteBuf.wrap() = SurfByteBuf(this) +// endregion + +/** + * Reads a byte array from the buffer. + * If the buffer has an array, it will return the array directly. + * Otherwise, it will copy the bytes into a new array. + * + * @return The byte array + * @receiver The buffer + */ +fun ByteBuf.toByteArraySafe(): ByteArray { + if (hasArray()) { + return array() + } + + val bytes = ByteArray(readableBytes()) + getBytes(readerIndex(), bytes) + + return bytes +} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/WrappedByteBuf.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/WrappedByteBuf.kt new file mode 100644 index 0000000..77da2b9 --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/WrappedByteBuf.kt @@ -0,0 +1,327 @@ +package dev.slne.roleplay.mod.common.network.utils + +import io.netty.buffer.ByteBuf +import io.netty.buffer.ByteBufAllocator +import io.netty.util.ByteProcessor +import java.io.IOException +import java.io.InputStream +import java.io.OutputStream +import java.nio.ByteBuffer +import java.nio.ByteOrder +import java.nio.channels.FileChannel +import java.nio.channels.GatheringByteChannel +import java.nio.channels.ScatteringByteChannel +import java.nio.charset.Charset + +/** + * A wrapper class for Netty's [ByteBuf] that delegates all operations to the underlying instance. + * + * This class provides an abstraction over the [ByteBuf] to allow monitoring, interception, or + * extension of its functionality without altering the original buffer's behavior. + * + * ### Key Features + * - Delegates all standard [ByteBuf] operations to the underlying [ByteBuf] instance. + * - Allows for customization or additional behavior by subclassing and overriding methods. + * - Fully compatible with Netty's ecosystem and extensions. + * + * ### Example Use Case + * #### Adding Monitoring + * ```kotlin + * class MonitoringByteBuf(buf: ByteBuf) : WrappedByteBuf(buf) { + * override fun writeByte(value: Int): ByteBuf { + * println("Writing byte: $value") + * return super.writeByte(value) + * } + * } + * ``` + * + * ### Important Notes + * - This class is open for extension, allowing custom behaviors to be added. + * - All operations are delegated to the wrapped buffer, ensuring consistent behavior. + * + * @property buf The underlying [ByteBuf] instance. + */ +open class WrappedByteBuf(private val buf: ByteBuf) : ByteBuf() { + override fun alloc(): ByteBufAllocator = buf.alloc() + override fun array(): ByteArray = buf.array() + override fun arrayOffset(): Int = buf.arrayOffset() + override fun asByteBuf(): ByteBuf = buf.asByteBuf() + override fun asReadOnly(): ByteBuf = buf.asReadOnly() + override fun bytesBefore(index: Int, length: Int, value: Byte): Int = + buf.bytesBefore(index, length, value) + + override fun bytesBefore(length: Int, value: Byte): Int = buf.bytesBefore(length, value) + override fun bytesBefore(value: Byte): Int = buf.bytesBefore(value) + override fun capacity(): Int = buf.capacity() + override fun capacity(newCapacity: Int): ByteBuf = buf.capacity(newCapacity) + override fun clear(): ByteBuf = buf.clear() + override fun compareTo(buffer: ByteBuf): Int = buf.compareTo(buffer) + override fun copy(): ByteBuf = buf.copy() + override fun copy(index: Int, length: Int): ByteBuf = buf.copy(index, length) + override fun discardReadBytes(): ByteBuf = buf.discardReadBytes() + override fun discardSomeReadBytes(): ByteBuf = buf.discardSomeReadBytes() + override fun duplicate(): ByteBuf = buf.duplicate() + override fun ensureWritable(minWritableBytes: Int): ByteBuf = + buf.ensureWritable(minWritableBytes) + + override fun ensureWritable(minWritableBytes: Int, force: Boolean): Int = + buf.ensureWritable(minWritableBytes, force) + + override fun equals(other: Any?): Boolean = buf == other + override fun forEachByte(index: Int, length: Int, processor: ByteProcessor): Int = + buf.forEachByte(index, length, processor) + + override fun forEachByte(processor: ByteProcessor): Int = buf.forEachByte(processor) + override fun forEachByteDesc(index: Int, length: Int, processor: ByteProcessor): Int = + buf.forEachByteDesc(index, length, processor) + + override fun forEachByteDesc(processor: ByteProcessor): Int = buf.forEachByteDesc(processor) + override fun getBoolean(index: Int): Boolean = buf.getBoolean(index) + override fun getByte(index: Int): Byte = buf.getByte(index) + override fun getBytes(index: Int, dst: ByteArray): ByteBuf = buf.getBytes(index, dst) + override fun getBytes(index: Int, dst: ByteArray, dstIndex: Int, length: Int): ByteBuf = + buf.getBytes(index, dst, dstIndex, length) + + override fun getBytes(index: Int, dst: ByteBuf): ByteBuf = buf.getBytes(index, dst) + override fun getBytes(index: Int, dst: ByteBuf, dstIndex: Int, length: Int): ByteBuf = + buf.getBytes(index, dst, dstIndex, length) + + override fun getBytes(index: Int, dst: ByteBuf, length: Int): ByteBuf = + buf.getBytes(index, dst, length) + + override fun getBytes(index: Int, dst: ByteBuffer): ByteBuf = buf.getBytes(index, dst) + + @Throws(IOException::class) + override fun getBytes(index: Int, out: FileChannel, position: Long, length: Int): Int = + buf.getBytes(index, out, position, length) + + @Throws(IOException::class) + override fun getBytes(index: Int, out: GatheringByteChannel, length: Int): Int = + buf.getBytes(index, out, length) + + @Throws(IOException::class) + override fun getBytes(index: Int, out: OutputStream, length: Int): ByteBuf = + buf.getBytes(index, out, length) + + override fun getChar(index: Int): Char = buf.getChar(index) + override fun getCharSequence(index: Int, length: Int, charset: Charset): CharSequence = + buf.getCharSequence(index, length, charset) + + override fun getDouble(index: Int): Double = buf.getDouble(index) + override fun getDoubleLE(index: Int): Double = buf.getDoubleLE(index) + override fun getFloat(index: Int): Float = buf.getFloat(index) + override fun getFloatLE(index: Int): Float = buf.getFloatLE(index) + override fun getInt(index: Int): Int = buf.getInt(index) + override fun getIntLE(index: Int): Int = buf.getIntLE(index) + override fun getLong(index: Int): Long = buf.getLong(index) + override fun getLongLE(index: Int): Long = buf.getLongLE(index) + override fun getMedium(index: Int): Int = buf.getMedium(index) + override fun getMediumLE(index: Int): Int = buf.getMediumLE(index) + override fun getShort(index: Int): Short = buf.getShort(index) + override fun getShortLE(index: Int): Short = buf.getShortLE(index) + override fun getUnsignedByte(index: Int): Short = buf.getUnsignedByte(index) + override fun getUnsignedInt(index: Int): Long = buf.getUnsignedInt(index) + override fun getUnsignedIntLE(index: Int): Long = buf.getUnsignedIntLE(index) + override fun getUnsignedMedium(index: Int): Int = buf.getUnsignedMedium(index) + override fun getUnsignedMediumLE(index: Int): Int = buf.getUnsignedMediumLE(index) + override fun getUnsignedShort(index: Int): Int = buf.getUnsignedShort(index) + override fun getUnsignedShortLE(index: Int): Int = buf.getUnsignedShortLE(index) + override fun hasArray(): Boolean = buf.hasArray() + override fun hashCode(): Int = buf.hashCode() + override fun hasMemoryAddress(): Boolean = buf.hasMemoryAddress() + override fun indexOf(fromIndex: Int, toIndex: Int, value: Byte): Int = + buf.indexOf(fromIndex, toIndex, value) + + override fun internalNioBuffer(index: Int, length: Int): ByteBuffer = + buf.internalNioBuffer(index, length) + + override fun isContiguous(): Boolean = buf.isContiguous + override fun isDirect(): Boolean = buf.isDirect + override fun isReadable(): Boolean = buf.isReadable + override fun isReadable(size: Int): Boolean = buf.isReadable(size) + override fun isReadOnly(): Boolean = buf.isReadOnly + override fun isWritable(): Boolean = buf.isWritable + override fun isWritable(size: Int): Boolean = buf.isWritable(size) + override fun markReaderIndex(): ByteBuf = buf.markReaderIndex() + override fun markWriterIndex(): ByteBuf = buf.markWriterIndex() + override fun maxCapacity(): Int = buf.maxCapacity() + override fun maxFastWritableBytes(): Int = buf.maxFastWritableBytes() + override fun maxWritableBytes(): Int = buf.maxWritableBytes() + override fun memoryAddress(): Long = buf.memoryAddress() + override fun nioBuffer(): ByteBuffer = buf.nioBuffer() + override fun nioBuffer(index: Int, length: Int): ByteBuffer = buf.nioBuffer(index, length) + override fun nioBufferCount(): Int = buf.nioBufferCount() + override fun nioBuffers(): Array = buf.nioBuffers() + override fun nioBuffers(index: Int, length: Int): Array = + buf.nioBuffers(index, length) + + @Deprecated("") + override fun order(): ByteOrder = buf.order() + + @Deprecated("") + override fun order(endianness: ByteOrder): ByteBuf = buf.order(endianness) + override fun readableBytes(): Int = buf.readableBytes() + override fun readBoolean(): Boolean = buf.readBoolean() + override fun readByte(): Byte = buf.readByte() + override fun readBytes(dst: ByteArray): ByteBuf = buf.readBytes(dst) + override fun readBytes(dst: ByteArray, dstIndex: Int, length: Int): ByteBuf = + buf.readBytes(dst, dstIndex, length) + + override fun readBytes(dst: ByteBuf): ByteBuf = buf.readBytes(dst) + override fun readBytes(dst: ByteBuf, dstIndex: Int, length: Int): ByteBuf = + buf.readBytes(dst, dstIndex, length) + + override fun readBytes(dst: ByteBuf, length: Int): ByteBuf = buf.readBytes(dst, length) + override fun readBytes(dst: ByteBuffer): ByteBuf = buf.readBytes(dst) + override fun readBytes(length: Int): ByteBuf = buf.readBytes(length) + + @Throws(IOException::class) + override fun readBytes(out: FileChannel, position: Long, length: Int): Int = + buf.readBytes(out, position, length) + + @Throws(IOException::class) + override fun readBytes(out: GatheringByteChannel, length: Int): Int = buf.readBytes(out, length) + + @Throws(IOException::class) + override fun readBytes(out: OutputStream, length: Int): ByteBuf = buf.readBytes(out, length) + override fun readChar(): Char = buf.readChar() + override fun readCharSequence(length: Int, charset: Charset): CharSequence = + buf.readCharSequence(length, charset) + + override fun readDouble(): Double = buf.readDouble() + override fun readDoubleLE(): Double = buf.readDoubleLE() + override fun readerIndex(): Int = buf.readerIndex() + override fun readerIndex(readerIndex: Int): ByteBuf = buf.readerIndex(readerIndex) + override fun readFloat(): Float = buf.readFloat() + override fun readFloatLE(): Float = buf.readFloatLE() + override fun readInt(): Int = buf.readInt() + override fun readIntLE(): Int = buf.readIntLE() + override fun readLong(): Long = buf.readLong() + override fun readLongLE(): Long = buf.readLongLE() + override fun readMedium(): Int = buf.readMedium() + override fun readMediumLE(): Int = buf.readMediumLE() + override fun readRetainedSlice(length: Int): ByteBuf = buf.readRetainedSlice(length) + override fun readShort(): Short = buf.readShort() + override fun readShortLE(): Short = buf.readShortLE() + override fun readSlice(length: Int): ByteBuf = buf.readSlice(length) + override fun readUnsignedByte(): Short = buf.readUnsignedByte() + override fun readUnsignedInt(): Long = buf.readUnsignedInt() + override fun readUnsignedIntLE(): Long = buf.readUnsignedIntLE() + override fun readUnsignedMedium(): Int = buf.readUnsignedMedium() + override fun readUnsignedMediumLE(): Int = buf.readUnsignedMediumLE() + override fun readUnsignedShort(): Int = buf.readUnsignedShort() + override fun readUnsignedShortLE(): Int = buf.readUnsignedShortLE() + override fun resetReaderIndex(): ByteBuf = buf.resetReaderIndex() + override fun resetWriterIndex(): ByteBuf = buf.resetWriterIndex() + override fun retain(): ByteBuf = buf.retain() + override fun retain(increment: Int): ByteBuf = buf.retain(increment) + override fun retainedDuplicate(): ByteBuf = buf.retainedDuplicate() + override fun retainedSlice(): ByteBuf = buf.retainedSlice() + override fun retainedSlice(index: Int, length: Int): ByteBuf = buf.retainedSlice(index, length) + override fun setBoolean(index: Int, value: Boolean): ByteBuf = buf.setBoolean(index, value) + override fun setByte(index: Int, value: Int): ByteBuf = buf.setByte(index, value) + + @Throws(IOException::class) + override fun setBytes(index: Int, `in`: FileChannel, position: Long, length: Int): Int = + buf.setBytes(index, `in`, position, length) + + @Throws(IOException::class) + override fun setBytes(index: Int, `in`: InputStream, length: Int): Int = + buf.setBytes(index, `in`, length) + + @Throws(IOException::class) + override fun setBytes(index: Int, `in`: ScatteringByteChannel, length: Int): Int = + buf.setBytes(index, `in`, length) + + override fun setBytes(index: Int, src: ByteArray): ByteBuf = buf.setBytes(index, src) + override fun setBytes(index: Int, src: ByteArray, srcIndex: Int, length: Int): ByteBuf = + buf.setBytes(index, src, srcIndex, length) + + override fun setBytes(index: Int, src: ByteBuf): ByteBuf = buf.setBytes(index, src) + override fun setBytes(index: Int, src: ByteBuf, length: Int): ByteBuf = + buf.setBytes(index, src, length) + + override fun setBytes(index: Int, src: ByteBuf, srcIndex: Int, length: Int): ByteBuf = + buf.setBytes(index, src, srcIndex, length) + + override fun setBytes(index: Int, src: ByteBuffer): ByteBuf = buf.setBytes(index, src) + override fun setChar(index: Int, value: Int): ByteBuf = buf.setChar(index, value) + override fun setCharSequence(index: Int, sequence: CharSequence, charset: Charset): Int = + buf.setCharSequence(index, sequence, charset) + + override fun setDouble(index: Int, value: Double): ByteBuf = buf.setDouble(index, value) + override fun setDoubleLE(index: Int, value: Double): ByteBuf = buf.setDoubleLE(index, value) + override fun setFloat(index: Int, value: Float): ByteBuf = buf.setFloat(index, value) + override fun setFloatLE(index: Int, value: Float): ByteBuf = buf.setFloatLE(index, value) + override fun setIndex(readerIndex: Int, writerIndex: Int): ByteBuf = + buf.setIndex(readerIndex, writerIndex) + + override fun setInt(index: Int, value: Int): ByteBuf = buf.setInt(index, value) + override fun setIntLE(index: Int, value: Int): ByteBuf = buf.setIntLE(index, value) + override fun setLong(index: Int, value: Long): ByteBuf = buf.setLong(index, value) + override fun setLongLE(index: Int, value: Long): ByteBuf = buf.setLongLE(index, value) + override fun setMedium(index: Int, value: Int): ByteBuf = buf.setMedium(index, value) + override fun setMediumLE(index: Int, value: Int): ByteBuf = buf.setMediumLE(index, value) + override fun setShort(index: Int, value: Int): ByteBuf = buf.setShort(index, value) + override fun setShortLE(index: Int, value: Int): ByteBuf = buf.setShortLE(index, value) + override fun setZero(index: Int, length: Int): ByteBuf = buf.setZero(index, length) + override fun skipBytes(length: Int): ByteBuf = buf.skipBytes(length) + override fun slice(): ByteBuf = buf.slice() + override fun slice(index: Int, length: Int): ByteBuf = buf.slice(index, length) + override fun toString(): String = buf.toString() + override fun toString(charset: Charset): String = buf.toString(charset) + override fun toString(index: Int, length: Int, charset: Charset): String = + buf.toString(index, length, charset) + + override fun touch(): ByteBuf = buf.touch() + override fun touch(hint: Any): ByteBuf = buf.touch(hint) + override fun unwrap(): ByteBuf = buf.unwrap() + override fun writableBytes(): Int = buf.writableBytes() + override fun writeBoolean(value: Boolean): ByteBuf = buf.writeBoolean(value) + override fun writeByte(value: Int): ByteBuf = buf.writeByte(value) + + @Throws(IOException::class) + override fun writeBytes(`in`: FileChannel, position: Long, length: Int): Int = + buf.writeBytes(`in`, position, length) + + @Throws(IOException::class) + override fun writeBytes(`in`: InputStream, length: Int): Int = buf.writeBytes(`in`, length) + + @Throws(IOException::class) + override fun writeBytes(`in`: ScatteringByteChannel, length: Int): Int = + buf.writeBytes(`in`, length) + + override fun writeBytes(src: ByteArray): ByteBuf = buf.writeBytes(src) + override fun writeBytes(src: ByteArray, srcIndex: Int, length: Int): ByteBuf = + buf.writeBytes(src, srcIndex, length) + + override fun writeBytes(src: ByteBuf): ByteBuf = buf.writeBytes(src) + override fun writeBytes(src: ByteBuf, length: Int): ByteBuf = buf.writeBytes(src, length) + override fun writeBytes(src: ByteBuf, srcIndex: Int, length: Int): ByteBuf = + buf.writeBytes(src, srcIndex, length) + + override fun writeBytes(src: ByteBuffer): ByteBuf = buf.writeBytes(src) + override fun writeChar(value: Int): ByteBuf = buf.writeChar(value) + override fun writeCharSequence(sequence: CharSequence, charset: Charset): Int = + buf.writeCharSequence(sequence, charset) + + override fun writeDouble(value: Double): ByteBuf = buf.writeDouble(value) + override fun writeDoubleLE(value: Double): ByteBuf = buf.writeDoubleLE(value) + override fun writeFloat(value: Float): ByteBuf = buf.writeFloat(value) + override fun writeFloatLE(value: Float): ByteBuf = buf.writeFloatLE(value) + override fun writeInt(value: Int): ByteBuf = buf.writeInt(value) + override fun writeIntLE(value: Int): ByteBuf = buf.writeIntLE(value) + override fun writeLong(value: Long): ByteBuf = buf.writeLong(value) + override fun writeLongLE(value: Long): ByteBuf = buf.writeLongLE(value) + override fun writeMedium(value: Int): ByteBuf = buf.writeMedium(value) + override fun writeMediumLE(value: Int): ByteBuf = buf.writeMediumLE(value) + override fun writerIndex(): Int = buf.writerIndex() + override fun writerIndex(writerIndex: Int): ByteBuf = buf.writerIndex(writerIndex) + override fun writeShort(value: Int): ByteBuf = buf.writeShort(value) + override fun writeShortLE(value: Int): ByteBuf = buf.writeShortLE(value) + override fun writeZero(length: Int): ByteBuf = buf.writeZero(length) + override fun refCnt(): Int = buf.refCnt() + override fun release(): Boolean = buf.release() + override fun release(decrement: Int): Boolean = buf.release(decrement) +} + diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/StreamCodec.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/StreamCodec.kt new file mode 100644 index 0000000..51ee72d --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/StreamCodec.kt @@ -0,0 +1,367 @@ +package dev.slne.roleplay.mod.common.network.utils.codec + +import com.mojang.datafixers.util.Function3 +import com.mojang.datafixers.util.Function4 +import com.mojang.datafixers.util.Function5 +import com.mojang.datafixers.util.Function6 +import io.netty.buffer.ByteBuf +import java.util.function.BiFunction +import java.util.function.Function +import java.util.function.UnaryOperator + +interface StreamCodec : StreamDecoder, StreamEncoder { + fun apply(function: CodecOperation) = function.apply(this) + + fun map( + to: Function, + from: Function + ): StreamCodec = object : StreamCodec { + override fun decode(buf: B): O = to.apply(this@StreamCodec.decode(buf)) + override fun encode(buf: B, value: O) = this@StreamCodec.encode(buf, from.apply(value)) + } + + fun mapStream(function: Function): StreamCodec = + object : StreamCodec { + override fun decode(buf: O): V = this@StreamCodec.decode(function.apply(buf)) + override fun encode(buf: O, value: V) = + this@StreamCodec.encode(function.apply(buf), value) + } + + fun dispatch( + type: Function, + codec: Function> + ): StreamCodec = object : StreamCodec { + override fun decode(buf: B): U = codec.apply(this@StreamCodec.decode(buf)).decode(buf) + override fun encode(buf: B, value: U) { + val obj = type.apply(value) + val streamCodec = codec.apply(obj) as StreamCodec + this@StreamCodec.encode(buf, obj) + streamCodec.encode(buf, value) + } + } + + companion object { + @JvmStatic + fun of( + encoder: StreamEncoder, + decoder: StreamDecoder + ): StreamCodec = object : StreamCodec { + override fun decode(buf: B): V = decoder.decode(buf) + override fun encode(buf: B, value: V) = encoder.encode(buf, value) + } + + @JvmStatic + fun ofMember( + encoder: StreamMemberEncoder, + decoder: StreamDecoder + ): StreamCodec = object : StreamCodec { + override fun decode(buf: B): V = decoder.decode(buf) + override fun encode(buf: B, value: V) = encoder.encode(value, buf) + } + + @JvmStatic + fun unit(value: V): StreamCodec { + return object : StreamCodec { + override fun decode(buf: B): V = value + override fun encode(buf: B, otherValue: V) { + check(value == otherValue) { "Can't encode '$otherValue', expected '$value'" } + } + } + } + + @JvmStatic + fun composite( + codec: StreamCodec, + from: Function, + to: Function + ): StreamCodec = object : StreamCodec { + override fun decode(buf: B): C = to.apply(codec.decode(buf)) + override fun encode(buf: B, value: C) = codec.encode(buf, from.apply(value)) + } + + + fun composite( + codec1: StreamCodec, + from1: Function, + codec2: StreamCodec, + from2: Function, + to: BiFunction + ): StreamCodec = object : StreamCodec { + override fun decode(buf: B): C = to.apply(codec1.decode(buf), codec2.decode(buf)) + override fun encode(buf: B, value: C) { + codec1.encode(buf, from1.apply(value)) + codec2.encode(buf, from2.apply(value)) + } + } + + + fun composite( + codec1: StreamCodec, + from1: Function, + codec2: StreamCodec, + from2: Function, + codec3: StreamCodec, + from3: Function, + to: Function3 + ): StreamCodec = object : StreamCodec { + override fun decode(buf: B): C { + return to.apply(codec1.decode(buf), codec2.decode(buf), codec3.decode(buf)) + } + + override fun encode(buf: B, value: C) { + codec1.encode(buf, from1.apply(value)) + codec2.encode(buf, from2.apply(value)) + codec3.encode(buf, from3.apply(value)) + } + } + + fun composite( + codec1: StreamCodec, + from1: Function, + codec2: StreamCodec, + from2: Function, + codec3: StreamCodec, + from3: Function, + codec4: StreamCodec, + from4: Function, + to: Function4 + ): StreamCodec { + return object : StreamCodec { + override fun decode(buf: B): C { + val `object`: T1 = codec1.decode(buf) + val object2: T2 = codec2.decode(buf) + val object3: T3 = codec3.decode(buf) + val object4: T4 = codec4.decode(buf) + return to.apply(`object`, object2, object3, object4) + } + + override fun encode(buf: B, value: C) { + codec1.encode(buf, from1.apply(value)) + codec2.encode(buf, from2.apply(value)) + codec3.encode(buf, from3.apply(value)) + codec4.encode(buf, from4.apply(value)) + } + } + } + + fun composite( + codec1: StreamCodec, + from1: Function, + codec2: StreamCodec, + from2: Function, + codec3: StreamCodec, + from3: Function, + codec4: StreamCodec, + from4: Function, + codec5: StreamCodec, + from5: Function, + to: Function5 + ): StreamCodec { + return object : StreamCodec { + override fun decode(buf: B): C { + val `object`: T1 = codec1.decode(buf) + val object2: T2 = codec2.decode(buf) + val object3: T3 = codec3.decode(buf) + val object4: T4 = codec4.decode(buf) + val object5: T5 = codec5.decode(buf) + return to.apply(`object`, object2, object3, object4, object5) + } + + override fun encode(buf: B, value: C) { + codec1.encode(buf, from1.apply(value)) + codec2.encode(buf, from2.apply(value)) + codec3.encode(buf, from3.apply(value)) + codec4.encode(buf, from4.apply(value)) + codec5.encode(buf, from5.apply(value)) + } + } + } + + fun composite( + codec1: StreamCodec, + from1: Function, + codec2: StreamCodec, + from2: Function, + codec3: StreamCodec, + from3: Function, + codec4: StreamCodec, + from4: Function, + codec5: StreamCodec, + from5: Function, + codec6: StreamCodec, + from6: Function, + to: Function6 + ): StreamCodec { + return object : StreamCodec { + override fun decode(buf: B): C { + val `object`: T1 = codec1.decode(buf) + val object2: T2 = codec2.decode(buf) + val object3: T3 = codec3.decode(buf) + val object4: T4 = codec4.decode(buf) + val object5: T5 = codec5.decode(buf) + val object6: T6 = codec6.decode(buf) + return to.apply(`object`, object2, object3, object4, object5, object6) + } + + override fun encode(buf: B, value: C) { + codec1.encode(buf, from1.apply(value)) + codec2.encode(buf, from2.apply(value)) + codec3.encode(buf, from3.apply(value)) + codec4.encode(buf, from4.apply(value)) + codec5.encode(buf, from5.apply(value)) + codec6.encode(buf, from6.apply(value)) + } + } + } + + fun recursive(codecGetter: UnaryOperator>) = + object : StreamCodec { + private val inner by lazy { codecGetter.apply(this) } + override fun decode(buf: B): T = inner.decode(buf) + override fun encode(buf: B, value: T) = inner.encode(buf, value) + } + } +} + +@FunctionalInterface +fun interface CodecOperation { + fun apply(codec: StreamCodec): StreamCodec +} + +fun StreamCodec.apply(operation: (StreamCodec) -> StreamCodec) = + operation(this) + +fun StreamCodec.map( + to: (V) -> O, + from: (O) -> V +) = map({ to(it) }, { from(it) }) + +fun StreamCodec.mapStream(function: (O) -> B) = + mapStream(Function { function(it) }) + + +fun streamCodec( + encoder: (B, V) -> Unit, + decoder: (B) -> V +) = StreamCodec.of(encoder, decoder) + +fun streamCodecMember( + encoder: (V, B) -> Unit, + decoder: (B) -> V +) = StreamCodec.ofMember(encoder, decoder) + +fun streamCodecUnit(value: V) = StreamCodec.unit(value) +fun streamCodecUnitSimple(value: V) = StreamCodec.unit(value) + +fun streamCodecComposite( + codec: StreamCodec, + from: (C) -> T1, + to: (T1) -> C +) = StreamCodec.composite(codec, { from(it) }, { to(it) }) + +fun streamCodecComposite( + codec1: StreamCodec, + from1: (C) -> T1, + codec2: StreamCodec, + from2: (C) -> T2, + to: (T1, T2) -> C +) = StreamCodec.composite(codec1, { from1(it) }, codec2, { from2(it) }, { t1, t2 -> to(t1, t2) }) + +fun streamCodecComposite( + codec1: StreamCodec, + from1: (C) -> T1, + codec2: StreamCodec, + from2: (C) -> T2, + codec3: StreamCodec, + from3: (C) -> T3, + to: (T1, T2, T3) -> C +) = StreamCodec.composite( + codec1, + { from1(it) }, + codec2, + { from2(it) }, + codec3, + { from3(it) }, + { t1, t2, t3 -> to(t1, t2, t3) } +) + +fun streamCodecComposite( + codec1: StreamCodec, + from1: (C) -> T1, + codec2: StreamCodec, + from2: (C) -> T2, + codec3: StreamCodec, + from3: (C) -> T3, + codec4: StreamCodec, + from4: (C) -> T4, + to: (T1, T2, T3, T4) -> C +) = StreamCodec.composite( + codec1, + { from1(it) }, + codec2, + { from2(it) }, + codec3, + { from3(it) }, + codec4, + { from4(it) }, + { t1, t2, t3, t4 -> to(t1, t2, t3, t4) } +) + +fun streamCodecComposite( + codec1: StreamCodec, + from1: (C) -> T1, + codec2: StreamCodec, + from2: (C) -> T2, + codec3: StreamCodec, + from3: (C) -> T3, + codec4: StreamCodec, + from4: (C) -> T4, + codec5: StreamCodec, + from5: (C) -> T5, + to: (T1, T2, T3, T4, T5) -> C +) = StreamCodec.composite( + codec1, + { from1(it) }, + codec2, + { from2(it) }, + codec3, + { from3(it) }, + codec4, + { from4(it) }, + codec5, + { from5(it) }, + { t1, t2, t3, t4, t5 -> to(t1, t2, t3, t4, t5) } +) + +fun streamCodecComposite( + codec1: StreamCodec, + from1: (C) -> T1, + codec2: StreamCodec, + from2: (C) -> T2, + codec3: StreamCodec, + from3: (C) -> T3, + codec4: StreamCodec, + from4: (C) -> T4, + codec5: StreamCodec, + from5: (C) -> T5, + codec6: StreamCodec, + from6: (C) -> T6, + to: (T1, T2, T3, T4, T5, T6) -> C +) = StreamCodec.composite( + codec1, + { from1(it) }, + codec2, + { from2(it) }, + codec3, + { from3(it) }, + codec4, + { from4(it) }, + codec5, + { from5(it) }, + codec6, + { from6(it) }, + { t1, t2, t3, t4, t5, t6 -> to(t1, t2, t3, t4, t5, t6) } +) + +fun streamCodecRecursive(codecGetter: (StreamCodec) -> StreamCodec) = + StreamCodec.recursive(codecGetter) \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/StreamDecoder.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/StreamDecoder.kt new file mode 100644 index 0000000..076016e --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/StreamDecoder.kt @@ -0,0 +1,6 @@ +package dev.slne.roleplay.mod.common.network.utils.codec + +@FunctionalInterface +fun interface StreamDecoder { + fun decode(buf: I): T +} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/StreamEncoder.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/StreamEncoder.kt new file mode 100644 index 0000000..abf00c3 --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/StreamEncoder.kt @@ -0,0 +1,6 @@ +package dev.slne.roleplay.mod.common.network.utils.codec + +@FunctionalInterface +fun interface StreamEncoder { + fun encode(buf: O, value: T) +} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/StreamMemberEncoder.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/StreamMemberEncoder.kt new file mode 100644 index 0000000..98891f5 --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/StreamMemberEncoder.kt @@ -0,0 +1,6 @@ +package dev.slne.roleplay.mod.common.network.utils.codec + +@FunctionalInterface +fun interface StreamMemberEncoder { + fun encode(value: T, buf: O) +} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/codec-util-util.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/codec-util-util.kt new file mode 100644 index 0000000..528a25a --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/codec-util-util.kt @@ -0,0 +1,17 @@ +package dev.slne.surf.cloud.api.common.util.codec + +import com.mojang.serialization.DataResult +import java.util.stream.IntStream + +fun fixedSize(stream: IntStream, length: Int): DataResult { + val ints = stream.limit((length + 1).toLong()).toArray() + if (ints.size != length) { + val error = { "Input is not a list of $length ints" } + return if (ints.size >= length) DataResult.error( + error, + ints.copyOf(length) + ) else DataResult.error(error) + } else { + return DataResult.success(ints) + } +} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/codec-util.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/codec-util.kt new file mode 100644 index 0000000..ac4334c --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/codec-util.kt @@ -0,0 +1,300 @@ +@file:OptIn(ExperimentalContracts::class, ExperimentalStdlibApi::class) + +package dev.slne.roleplay.mod.common.network.utils.codec + +import com.mojang.datafixers.kinds.App +import com.mojang.datafixers.util.Pair +import com.mojang.serialization.* +import com.mojang.serialization.codecs.RecordCodecBuilder +import dev.slne.roleplay.mod.common.network.utils.readUtf +import dev.slne.roleplay.mod.common.network.utils.writeUtf +import dev.slne.surf.cloud.api.common.util.codec.fixedSize +import io.netty.buffer.ByteBuf +import net.kyori.adventure.text.Component +import net.kyori.adventure.text.TextComponent +import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer +import java.time.Duration +import java.util.* +import java.util.function.Function +import java.util.stream.Stream +import kotlin.contracts.ExperimentalContracts +import kotlin.contracts.InvocationKind +import kotlin.contracts.contract +import kotlin.enums.EnumEntries +import kotlin.enums.enumEntries + +fun UUID.toIntArray() = leastMostToIntArray(mostSignificantBits, leastSignificantBits) + +private fun leastMostToIntArray(uuidMost: Long, uuidLeast: Long): IntArray { + return intArrayOf( + (uuidMost shr 32).toInt(), + uuidMost.toInt(), + (uuidLeast shr 32).toInt(), + uuidLeast.toInt() + ) +} + +fun IntArray.toUuid(): UUID { + return UUID( + this[0].toLong() shl 32 or (this[1].toLong() and 0xFFFFFFFF), + this[2].toLong() shl 32 or (this[3].toLong() and 0xFFFFFFFF) + ) +} + +@DslMarker +annotation class RecordCodecDsl + +fun createRecordCodec(@RecordCodecDsl block: RecordCodecBuilder.Instance.() -> App, T>): Codec { + contract { + callsInPlace(block, InvocationKind.EXACTLY_ONCE) + } + + return RecordCodecBuilder.create(block) +} + +fun createRecordMapCodec(@RecordCodecDsl block: RecordCodecBuilder.Instance.() -> App, T>): MapCodec { + contract { + callsInPlace(block, InvocationKind.EXACTLY_ONCE) + } + + return RecordCodecBuilder.mapCodec(block) +} + +fun MapCodec.getter(getter: O.() -> A): RecordCodecBuilder = + this.forGetter(Function(getter)) + +@Suppress("UnusedReceiverParameter") +fun RecordCodecBuilder.Instance.int(fieldName: String, getter: T.() -> Int) = + Codec.INT.fieldOf(fieldName).getter(getter) + +@Suppress("UnusedReceiverParameter") +fun RecordCodecBuilder.Instance.bool(fieldName: String, getter: T.() -> Boolean) = + Codec.BOOL.fieldOf(fieldName).getter(getter) + +@Suppress("UnusedReceiverParameter") +fun RecordCodecBuilder.Instance.string(fieldName: String, getter: T.() -> String) = + Codec.STRING.fieldOf(fieldName).getter(getter) + +@Suppress("UnusedReceiverParameter") +fun RecordCodecBuilder.Instance.stringOptionalLenient( + fieldName: String, + getter: T.() -> String? +) = + Codec.STRING.lenientOptionalFieldOf(fieldName).forGetter { Optional.ofNullable(getter(it)) } + +@Suppress("UnusedReceiverParameter") +fun RecordCodecBuilder.Instance.float(fieldName: String, getter: T.() -> Float) = + Codec.FLOAT.fieldOf(fieldName).getter(getter) + +@Suppress("UnusedReceiverParameter") +fun RecordCodecBuilder.Instance.double(fieldName: String, getter: T.() -> Double) = + Codec.DOUBLE.fieldOf(fieldName).getter(getter) + +@Suppress("UnusedReceiverParameter") +fun RecordCodecBuilder.Instance.long(fieldName: String, getter: T.() -> Long) = + Codec.LONG.fieldOf(fieldName).getter(getter) + +@Suppress("UnusedReceiverParameter") +fun RecordCodecBuilder.Instance.byte(fieldName: String, getter: T.() -> Byte) = + Codec.BYTE.fieldOf(fieldName).getter(getter) + +@Suppress("UnusedReceiverParameter") +fun RecordCodecBuilder.Instance.short(fieldName: String, getter: T.() -> Short) = + Codec.SHORT.fieldOf(fieldName).getter(getter) + +@Suppress("UnusedReceiverParameter") +inline fun > RecordCodecBuilder.Instance.enum( + fieldName: String, + noinline getter: T.() -> E +) = + ExtraCodecs.enumCodec(enumEntries()).fieldOf(fieldName).getter(getter) + +object ExtraCodecs { + val JAVA = converter(JavaOps.INSTANCE) + val UUID_CODEC: Codec = Codec.INT_STREAM.comapFlatMap( + { uuidStream -> fixedSize(uuidStream, 4).map { it.toUuid() } }, + { Arrays.stream(it.toIntArray()) } + ) + val UUID_STRING_CODEC: Codec = Codec.STRING.comapFlatMap( + { + runCatching { UUID.fromString(it) }.fold( + { DataResult.success(it) }, + { DataResult.error { "Invalid UUID: $it" } }) + }, + { it.toString() }) + val UUID_LENIENT_CODEC = Codec.withAlternative(UUID_CODEC, UUID_STRING_CODEC) + + fun converter(ops: DynamicOps): Codec = + Codec.PASSTHROUGH.xmap({ it.convert(ops).value }, { Dynamic(ops, it as T) }) + + + fun > enumCodec(entries: EnumEntries) = Codec.STRING.validate { input -> + if (entries.any { it.name == input }) + DataResult.success(input) + else DataResult.error { "Invalid enum value: $input" } + }.xmap({ input -> entries.first { it.name == input } }, { it.name }) + + fun orCompressed(uncompressedCodec: Codec, compressedCodec: Codec): Codec { + return object : Codec { + override fun encode( + obj: E, + dynamicOps: DynamicOps, + obj2: T + ): DataResult = if (dynamicOps.compressMaps()) compressedCodec.encode( + obj, + dynamicOps, + obj2 + ) else uncompressedCodec.encode(obj, dynamicOps, obj2) + + + override fun decode( + dynamicOps: DynamicOps, + obj: T + ): DataResult> = if (dynamicOps.compressMaps()) compressedCodec.decode( + dynamicOps, + obj + ) else uncompressedCodec.decode(dynamicOps, obj) + + + override fun toString(): String { + return "$uncompressedCodec orCompressed $compressedCodec" + } + } + } + + fun orCompressed( + uncompressedCodec: MapCodec, + compressedCodec: MapCodec + ): MapCodec { + return object : MapCodec() { + override fun encode( + obj: E, + dynamicOps: DynamicOps, + recordBuilder: RecordBuilder + ): RecordBuilder = if (dynamicOps.compressMaps()) compressedCodec.encode( + obj, + dynamicOps, + recordBuilder + ) else uncompressedCodec.encode(obj, dynamicOps, recordBuilder) + + + override fun decode(dynamicOps: DynamicOps, mapLike: MapLike): DataResult = + if (dynamicOps.compressMaps()) compressedCodec.decode( + dynamicOps, + mapLike + ) else uncompressedCodec.decode(dynamicOps, mapLike) + + + override fun keys(dynamicOps: DynamicOps): Stream { + return compressedCodec.keys(dynamicOps) + } + + override fun toString(): String { + return "$uncompressedCodec orCompressed $compressedCodec" + } + } + } + + fun nonEmptyList(originalCodec: Codec>): Codec> = originalCodec.validate { + if (it.isEmpty()) DataResult.error { "List must have contents" } else DataResult.success(it) + } + + val DURATION_STREAM_CODEC = streamCodec({ buf, duration -> + buf.writeLong(duration.toMillis()) + }, { buf -> + Duration.ofMillis(buf.readLong()) + }) + + // region adventure + val COMPONENT = Codec.STRING.comapFlatMap( + { + runCatching { GsonComponentSerializer.gson().deserialize(it) }.fold( + { DataResult.success(it) }, + { DataResult.error { "Invalid component: $it" } }) + }, + { GsonComponentSerializer.gson().serialize(it) } + ) + + val COMPONENT_STREAM = streamCodec({ buf, comp -> + val str = GsonComponentSerializer.gson().serialize(comp) + buf.writeUtf(str) + }, { buf -> + val str = buf.readUtf() + GsonComponentSerializer.gson().deserialize(str) + }) + +} + +fun tryCollapseToString(component: Component): String? { + if (component is TextComponent) { + if (component.children().isEmpty() && component.style().isEmpty) { + return component.content() + } + } + return null +} + +class FuzzyCodec( + private val codecs: List>, + private val encoderGetter: (T) -> MapEncoder +) : MapCodec() { + + @Suppress("UNCHECKED_CAST") + override fun decode(dynamicOps: DynamicOps, mapLike: MapLike): DataResult { + for (mapDecoder in this.codecs) { + val dataResult = mapDecoder.decode(dynamicOps, mapLike) + if (dataResult.result().isPresent) { + return dataResult as DataResult + } + } + + return DataResult.error { "No matching codec found" } + } + + @Suppress("UNCHECKED_CAST") + override fun encode( + obj: T, + dynamicOps: DynamicOps, + recordBuilder: RecordBuilder + ): RecordBuilder { + val mapEncoder = encoderGetter(obj) as MapEncoder + return mapEncoder.encode(obj, dynamicOps, recordBuilder) + } + + override fun keys(dynamicOps: DynamicOps): Stream = codecs.stream() + .flatMap { it.keys(dynamicOps) } + .distinct() + + + override fun toString(): String { + return "FuzzyCodec[" + this.codecs + "]" + } +} + +class StrictEither( + private val typeFieldName: String, + private val typed: MapCodec, + private val fuzzy: MapCodec +) : MapCodec() { + override fun decode(dynamicOps: DynamicOps, mapLike: MapLike): DataResult { + return if (mapLike[typeFieldName] != null) typed.decode( + dynamicOps, + mapLike + ) else fuzzy.decode(dynamicOps, mapLike) + } + + override fun encode( + obj: T, + dynamicOps: DynamicOps, + recordBuilder: RecordBuilder + ): RecordBuilder { + return fuzzy.encode(obj, dynamicOps, recordBuilder) + } + + override fun keys(dynamicOps: DynamicOps): Stream { + return Stream.concat( + typed.keys(dynamicOps), + fuzzy.keys(dynamicOps) + ).distinct() + } +} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/RoleplayBufSerializer.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/RoleplayBufSerializer.kt new file mode 100644 index 0000000..f055c8b --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/RoleplayBufSerializer.kt @@ -0,0 +1,8 @@ +package dev.slne.roleplay.mod.common.network.utils.codec.kotlinx + +import dev.slne.roleplay.mod.common.network.utils.SurfByteBuf +import dev.slne.surf.bytebufserializer.KBufSerializer + +abstract class RoleplayBufSerializer : KBufSerializer { + override val bufClass = SurfByteBuf::class +} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/SurfCloudBufSerializer.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/SurfCloudBufSerializer.kt new file mode 100644 index 0000000..1a72354 --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/SurfCloudBufSerializer.kt @@ -0,0 +1,28 @@ +package dev.slne.roleplay.mod.common.network.utils.codec.kotlinx + +import dev.slne.roleplay.mod.common.network.utils.codec.kotlinx.adventure.AdventureComponentSerializer +import dev.slne.roleplay.mod.common.network.utils.codec.kotlinx.java.* +import dev.slne.roleplay.mod.common.network.utils.codec.kotlinx.kotlin.DurationSerializer +import dev.slne.surf.bytebufserializer.Buf +import kotlinx.serialization.modules.SerializersModule +import kotlinx.serialization.modules.contextual + +object SurfCloudBufSerializer { + val serializerModule = SerializersModule { + // Adventure + contextual(AdventureComponentSerializer) + + // Java + contextual(UUIDSerializer) + contextual(BitSetSerializer) + contextual(UtfStringSerializer) + contextual(ZonedDateTimeSerializer) + contextual(BigDecimalSerializer) + contextual(BigIntegerSerializer) + + // Kotlin + contextual(DurationSerializer) + } + + val serializer = Buf(serializerModule) +} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/adventure/AdventureComponentSerializer.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/adventure/AdventureComponentSerializer.kt new file mode 100644 index 0000000..9428a3a --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/adventure/AdventureComponentSerializer.kt @@ -0,0 +1,25 @@ +package dev.slne.roleplay.mod.common.network.utils.codec.kotlinx.adventure + +import dev.slne.roleplay.mod.common.network.utils.SurfByteBuf +import dev.slne.roleplay.mod.common.network.utils.codec.kotlinx.RoleplayBufSerializer +import kotlinx.serialization.Serializable +import kotlinx.serialization.descriptors.PrimitiveKind +import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor +import net.kyori.adventure.text.Component + +typealias SerializableComponent = @Serializable(with = AdventureComponentSerializer::class) Component + +object AdventureComponentSerializer : RoleplayBufSerializer() { + override val descriptor = PrimitiveSerialDescriptor("Component", PrimitiveKind.STRING) + + override fun serialize0( + buf: SurfByteBuf, + value: Component + ) { + buf.writeComponent(value) + } + + override fun deserialize0(buf: SurfByteBuf): Component { + return buf.readComponent() + } +} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/java/BigDecimalSerializer.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/java/BigDecimalSerializer.kt new file mode 100644 index 0000000..cab515f --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/java/BigDecimalSerializer.kt @@ -0,0 +1,26 @@ +package dev.slne.roleplay.mod.common.network.utils.codec.kotlinx.java + +import dev.slne.roleplay.mod.common.network.utils.SurfByteBuf +import dev.slne.roleplay.mod.common.network.utils.codec.kotlinx.RoleplayBufSerializer +import kotlinx.serialization.Serializable +import kotlinx.serialization.descriptors.buildClassSerialDescriptor +import kotlinx.serialization.descriptors.element +import java.math.BigDecimal + +typealias SerializableBigDecimal = @Serializable(with = BigDecimalSerializer::class) BigDecimal + +object BigDecimalSerializer : RoleplayBufSerializer() { + override val descriptor = buildClassSerialDescriptor("dev.slne.surf.cloud.BigDecimal") { + element("unscaledValue") + element("scale") + element("precision") + } + + override fun serialize0(buf: SurfByteBuf, value: BigDecimal) { + buf.writeBigDecimal(value) + } + + override fun deserialize0(buf: SurfByteBuf): BigDecimal { + return buf.readBigDecimal() + } +} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/java/BigIntegerSerializer.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/java/BigIntegerSerializer.kt new file mode 100644 index 0000000..1d72ec3 --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/java/BigIntegerSerializer.kt @@ -0,0 +1,26 @@ +package dev.slne.roleplay.mod.common.network.utils.codec.kotlinx.java + +import kotlinx.serialization.KSerializer +import kotlinx.serialization.Serializable +import kotlinx.serialization.descriptors.PrimitiveKind +import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder +import java.math.BigInteger + +typealias SerializableBigInteger = @Serializable(with = BigIntegerSerializer::class) BigInteger + +object BigIntegerSerializer : KSerializer { + override val descriptor = PrimitiveSerialDescriptor("BigInteger", PrimitiveKind.STRING) + + override fun serialize( + encoder: Encoder, + value: BigInteger + ) { + encoder.encodeString(value.toString()) + } + + override fun deserialize(decoder: Decoder): BigInteger { + return BigInteger(decoder.decodeString()) + } +} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/java/BitSetSerializer.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/java/BitSetSerializer.kt new file mode 100644 index 0000000..45adbdb --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/java/BitSetSerializer.kt @@ -0,0 +1,27 @@ +package dev.slne.roleplay.mod.common.network.utils.codec.kotlinx.java + +import dev.slne.roleplay.mod.common.network.utils.SurfByteBuf +import dev.slne.roleplay.mod.common.network.utils.codec.kotlinx.RoleplayBufSerializer +import kotlinx.serialization.Serializable +import kotlinx.serialization.descriptors.buildClassSerialDescriptor +import kotlinx.serialization.descriptors.element +import java.util.* + +typealias SerializableBitSet = @Serializable(with = BitSetSerializer::class) BitSet + +object BitSetSerializer : RoleplayBufSerializer() { + override val descriptor = buildClassSerialDescriptor("BitSet") { + element("longArray") + } + + override fun serialize0( + buf: SurfByteBuf, + value: BitSet + ) { + buf.writeBitSet(value) + } + + override fun deserialize0(buf: SurfByteBuf): BitSet { + return buf.readBitSet() + } +} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/java/UUIDSerializer.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/java/UUIDSerializer.kt new file mode 100644 index 0000000..ca29a5f --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/java/UUIDSerializer.kt @@ -0,0 +1,28 @@ +package dev.slne.roleplay.mod.common.network.utils.codec.kotlinx.java + +import dev.slne.roleplay.mod.common.network.utils.SurfByteBuf +import dev.slne.roleplay.mod.common.network.utils.codec.kotlinx.RoleplayBufSerializer +import kotlinx.serialization.Serializable +import kotlinx.serialization.descriptors.buildClassSerialDescriptor +import kotlinx.serialization.descriptors.element +import java.util.* + +typealias SerializableUUID = @Serializable(with = UUIDSerializer::class) UUID + +object UUIDSerializer : RoleplayBufSerializer() { + override val descriptor = buildClassSerialDescriptor("UUID") { + element("mostSignificantBits") + element("leastSignificantBits") + } + + override fun serialize0( + buf: SurfByteBuf, + value: UUID + ) { + buf.writeUuid(value) + } + + override fun deserialize0(buf: SurfByteBuf): UUID { + return buf.readUuid() + } +} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/java/UtfStringSerializer.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/java/UtfStringSerializer.kt new file mode 100644 index 0000000..fd6cee1 --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/java/UtfStringSerializer.kt @@ -0,0 +1,21 @@ +package dev.slne.roleplay.mod.common.network.utils.codec.kotlinx.java + +import dev.slne.roleplay.mod.common.network.utils.SurfByteBuf +import dev.slne.roleplay.mod.common.network.utils.codec.kotlinx.RoleplayBufSerializer +import kotlinx.serialization.Serializable +import kotlinx.serialization.descriptors.PrimitiveKind +import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor + +typealias SerializableUtfString = @Serializable(with = UtfStringSerializer::class) String + +object UtfStringSerializer : RoleplayBufSerializer() { + override val descriptor = PrimitiveSerialDescriptor("Utf8String", PrimitiveKind.STRING) + + override fun serialize0(buf: SurfByteBuf, value: String) { + buf.writeUtf(value) + } + + override fun deserialize0(buf: SurfByteBuf): String { + return buf.readUtf() + } +} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/java/VarIntSerializer.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/java/VarIntSerializer.kt new file mode 100644 index 0000000..8de54eb --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/java/VarIntSerializer.kt @@ -0,0 +1,21 @@ +package dev.slne.roleplay.mod.common.network.utils.codec.kotlinx.java + +import dev.slne.roleplay.mod.common.network.utils.SurfByteBuf +import dev.slne.roleplay.mod.common.network.utils.codec.kotlinx.RoleplayBufSerializer +import kotlinx.serialization.Serializable +import kotlinx.serialization.descriptors.PrimitiveKind +import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor + +typealias IntAsVarInt = @Serializable(with = VarIntSerializer::class) Int + +object VarIntSerializer : RoleplayBufSerializer() { + override val descriptor = PrimitiveSerialDescriptor("VarInt", PrimitiveKind.INT) + + override fun serialize0(buf: SurfByteBuf, value: Int) { + buf.writeVarInt(value) + } + + override fun deserialize0(buf: SurfByteBuf): Int { + return buf.readVarInt() + } +} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/java/VarLongSerializer.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/java/VarLongSerializer.kt new file mode 100644 index 0000000..9a47e8e --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/java/VarLongSerializer.kt @@ -0,0 +1,21 @@ +package dev.slne.roleplay.mod.common.network.utils.codec.kotlinx.java + +import dev.slne.roleplay.mod.common.network.utils.SurfByteBuf +import dev.slne.roleplay.mod.common.network.utils.codec.kotlinx.RoleplayBufSerializer +import kotlinx.serialization.Serializable +import kotlinx.serialization.descriptors.PrimitiveKind +import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor + +typealias LongAsVarLong = @Serializable(with = VarLongSerializer::class) Long + +object VarLongSerializer : RoleplayBufSerializer() { + override val descriptor = PrimitiveSerialDescriptor("VarLong", PrimitiveKind.LONG) + + override fun serialize0(buf: SurfByteBuf, value: Long) { + buf.writeVarLong(value) + } + + override fun deserialize0(buf: SurfByteBuf): Long { + return buf.readVarLong() + } +} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/java/ZonedDateTimeSerializer.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/java/ZonedDateTimeSerializer.kt new file mode 100644 index 0000000..a620795 --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/java/ZonedDateTimeSerializer.kt @@ -0,0 +1,28 @@ +package dev.slne.roleplay.mod.common.network.utils.codec.kotlinx.java + +import dev.slne.roleplay.mod.common.network.utils.SurfByteBuf +import dev.slne.roleplay.mod.common.network.utils.codec.kotlinx.RoleplayBufSerializer +import kotlinx.serialization.Serializable +import kotlinx.serialization.descriptors.buildClassSerialDescriptor +import kotlinx.serialization.descriptors.element +import java.time.ZonedDateTime + +typealias SerializableZonedDateTime = @Serializable(with = ZonedDateTimeSerializer::class) ZonedDateTime + +object ZonedDateTimeSerializer : RoleplayBufSerializer() { + override val descriptor = buildClassSerialDescriptor("ZonedDateTime") { + element("epochMillis") + element("zoneId") + } + + override fun deserialize0(buf: SurfByteBuf): ZonedDateTime { + return buf.readZonedDateTime() + } + + override fun serialize0( + buf: SurfByteBuf, + value: ZonedDateTime + ) { + buf.writeZonedDateTime(value) + } +} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/kotlin/DurationSerializer.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/kotlin/DurationSerializer.kt new file mode 100644 index 0000000..719ef0d --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/kotlin/DurationSerializer.kt @@ -0,0 +1,25 @@ +package dev.slne.roleplay.mod.common.network.utils.codec.kotlinx.kotlin + +import dev.slne.roleplay.mod.common.network.utils.SurfByteBuf +import dev.slne.roleplay.mod.common.network.utils.codec.kotlinx.RoleplayBufSerializer +import kotlinx.serialization.Serializable +import kotlinx.serialization.descriptors.PrimitiveKind +import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor +import kotlin.time.Duration + +typealias SerializableDuration = @Serializable(with = DurationSerializer::class) Duration + +object DurationSerializer : RoleplayBufSerializer() { + override val descriptor = PrimitiveSerialDescriptor("Duration", PrimitiveKind.LONG) + + override fun serialize0( + buf: SurfByteBuf, + value: Duration + ) { + buf.writeDuration(value) + } + + override fun deserialize0(buf: SurfByteBuf): Duration { + return buf.readDuration() + } +} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/decoder/DecodeFactory.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/decoder/DecodeFactory.kt new file mode 100644 index 0000000..8c9445d --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/decoder/DecodeFactory.kt @@ -0,0 +1,45 @@ +package dev.slne.roleplay.mod.common.network.utils.decoder + +import io.netty.buffer.ByteBuf + +/** + * Functional interface representing a factory for decoding values of type [T] from a buffer of type [B]. + * + * @param B The type of the buffer (e.g., [ByteBuf]). + * @param T The type of the value to decode. + */ +fun interface DecodeFactory { + /** + * Decodes a value of type [T] from the given buffer. + * + * @param buffer The buffer from which to decode the value. + * @return The decoded value of type [T]. + */ + operator fun invoke(buffer: B): T + + /** + * Functional interface representing a factory for decoding [Long] values from a buffer of type [B]. + * + * @param B The type of the buffer (e.g., [ByteBuf]). + */ + @FunctionalInterface + fun interface DecodeLongFactory : DecodeFactory { + + /** + * Decodes a [Long] value from the given buffer. + * + * @param buffer The buffer from which to decode the value. + * @return The decoded [Long] value. + */ + @Deprecated("Use decodeLong instead", ReplaceWith("decodeLong(buffer)")) + override operator fun invoke(buffer: B) = decodeLong(buffer) + + /** + * Decodes a [Long] value from the given buffer. + * + * @param buffer The buffer from which to decode the value. + * @return The decoded [Long] value. + */ + fun decodeLong(buffer: B): Long + } +} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/ecoder/EncodeFactory.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/ecoder/EncodeFactory.kt new file mode 100644 index 0000000..9c158b1 --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/ecoder/EncodeFactory.kt @@ -0,0 +1,27 @@ +package dev.slne.roleplay.mod.common.network.utils.ecoder + +import io.netty.buffer.ByteBuf + +/** + * The interface Encode factory. + * + * @param the type parameter + * @param the type parameter + */ +fun interface EncodeFactory { + /** + * Encode. + * + * @param buffer the buffer + * @param value the value + */ + operator fun invoke(buffer: B, value: T) + + @FunctionalInterface + fun interface EncodeLongFactory : EncodeFactory { + @Deprecated("Use encodeLong instead", ReplaceWith("encodeLong(buffer, value)")) + override operator fun invoke(buffer: B, value: Long) = encodeLong(buffer, value) + fun encodeLong(buffer: B, value: Long) + } +} + diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/packet-extensions.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/packet-extensions.kt new file mode 100644 index 0000000..63a006c --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/packet-extensions.kt @@ -0,0 +1,16 @@ +package dev.slne.roleplay.mod.common.network.utils + +import dev.slne.roleplay.mod.common.network.SurfRoleplayPacket +import dev.slne.roleplay.mod.common.network.packets.RoleplayPacket +import dev.slne.surf.surfapi.core.api.util.mutableObject2ObjectMapOf +import kotlin.reflect.KClass +import kotlin.reflect.full.findAnnotation + +private val metaCache = + mutableObject2ObjectMapOf, SurfRoleplayPacket>(512) + +fun KClass.getPacketMeta() = getPacketMetaOrNull() + ?: error("NettyPacket class '$qualifiedName' must be annotated with @${SurfRoleplayPacket::class.simpleName}") + +fun KClass.getPacketMetaOrNull() = + metaCache[this] ?: findAnnotation()?.also { metaCache[this] = it } diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/types/Utf8String.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/types/Utf8String.kt new file mode 100644 index 0000000..da84107 --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/types/Utf8String.kt @@ -0,0 +1,83 @@ +package dev.slne.roleplay.mod.common.network.utils.types + +import dev.slne.roleplay.mod.common.network.utils.checkDecoded +import dev.slne.roleplay.mod.common.network.utils.checkEncoded +import dev.slne.roleplay.mod.common.network.utils.readVarInt +import dev.slne.roleplay.mod.common.network.utils.writeVarInt +import io.netty.buffer.ByteBuf +import io.netty.buffer.ByteBufUtil +import java.nio.charset.StandardCharsets + +/** + * Utility object for handling UTF-8 encoded strings in a [ByteBuf]. + * + * This utility provides methods for reading and writing UTF-8 strings, ensuring that string lengths + * and encoding constraints are enforced to prevent errors or buffer overflows. + */ +object Utf8String { + + /** + * Reads a UTF-8 encoded string from the specified [ByteBuf]. + * + * The string is preceded by its length, encoded as a VarInt. + * The method ensures that the + * length does not exceed the maximum allowable length + * and that the buffer contains sufficient + * data to decode the string. + * + * @param buf The [ByteBuf] to read the string from. + * @param maxLength The maximum allowable character length of the decoded string. + * @return The decoded string. + * @throws IllegalArgumentException If the string's UTF-8 length exceeds the maximum allowed length + * or is inconsistent with the buffer's readable bytes. + */ + fun read(buf: ByteBuf, maxLength: Int): String { + val utf8MaxLength = ByteBufUtil.utf8MaxBytes(maxLength) + val utf8Length = buf.readVarInt() + + checkDecoded(utf8Length <= utf8MaxLength) { "String too long (max $maxLength): $utf8Length" } + checkDecoded(utf8Length >= 0) { "String length is negative: $utf8Length" } + + val readableBytes = buf.readableBytes() + + checkDecoded(utf8Length <= readableBytes) { "String length is longer than readable bytes: $utf8Length > $readableBytes" } + + val string = buf.toString(buf.readerIndex(), utf8Length, StandardCharsets.UTF_8) + buf.readerIndex(buf.readerIndex() + utf8Length) + + checkDecoded(string.length <= maxLength) { "String too long (max $maxLength): ${string.length}" } + + return string + } + + /** + * Writes a UTF-8 encoded string to the specified [ByteBuf]. + * + * The string's length is written first as a VarInt, followed by the UTF-8 encoded bytes of the string. + * The method validates that the string length does not exceed the specified maximum length. + * + * @param buf The [ByteBuf] to write the string to. + * @param string The string to encode and write. + * @param maxLength The maximum allowable character length of the string. + * @throws IllegalArgumentException If the string's length exceeds the specified maximum length. + */ + fun write(buf: ByteBuf, string: CharSequence, maxLength: Int) { + checkEncoded(string.length <= maxLength) { "String too long (max $maxLength): ${string.length}" } + + val utf8Length = ByteBufUtil.utf8MaxBytes(string) + val utf8Buffer = buf.alloc().buffer(utf8Length) + + try { + val bytesWritten = ByteBufUtil.writeUtf8(utf8Buffer, string) + val utf8MaxLength = ByteBufUtil.utf8MaxBytes(maxLength) + + checkEncoded(bytesWritten <= utf8MaxLength) { "String too long (max $maxLength): $bytesWritten" } + + buf.writeVarInt(bytesWritten) + buf.writeBytes(utf8Buffer) + } finally { + utf8Buffer.release() + } + } +} + diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/types/VarInt.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/types/VarInt.kt new file mode 100644 index 0000000..0390dc2 --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/types/VarInt.kt @@ -0,0 +1,101 @@ +package dev.slne.roleplay.mod.common.network.utils.types + +import dev.slne.roleplay.mod.common.network.utils.checkDecoded +import io.netty.buffer.ByteBuf +import kotlin.math.ceil + +/** + * Utility object for encoding and decoding VarInt values using a space-efficient variable-length representation. + * + * VarInt is a common format in network protocols to represent integers compactly, with smaller values + * consuming fewer bytes. This implementation supports reading and writing VarInts to [ByteBuf]. + */ +object VarInt { + private const val MAX_VARINT_SIZE = 5 + private const val DATA_BITS_MASK = 0x7F + private const val CONTINUATION_BIT_MASK = 0x80 + private const val DATA_BITS_PER_BYTE = 7 + + private val varIntByteLengths = + IntArray(33) { if (it == 32) 1 else ceil((31.0 - (it - 1)) / DATA_BITS_PER_BYTE).toInt() } + + /** + * Calculates the number of bytes required to encode the given integer as a VarInt. + * + * @param value The integer value to encode. + * @return The number of bytes needed to represent the value as a VarInt. + */ + fun getEncodedSize(value: Int): Int = varIntByteLengths[Integer.numberOfLeadingZeros(value)] + + /** + * Determines if the given byte has the continuation bit set. + * + * @param byte The byte to check. + * @return `true` if the continuation bit is set, otherwise `false`. + */ + fun hasContinuationBit(byte: Byte): Boolean = + (byte.toInt() and CONTINUATION_BIT_MASK) == CONTINUATION_BIT_MASK + + /** + * Decodes a VarInt from the specified [ByteBuf]. + * + * @param buf The [ByteBuf] to read from. + * @return The decoded integer value. + * @throws RuntimeException If the VarInt exceeds the maximum size. + */ + fun readVarInt(buf: ByteBuf): Int { + var result = 0 + var shift = 0 + + var currentByte: Byte + do { + currentByte = buf.readByte() + result = + result or ((currentByte.toInt() and DATA_BITS_MASK) shl (shift++ * DATA_BITS_PER_BYTE)) + checkDecoded(shift <= MAX_VARINT_SIZE) { "VarInt too big" } + } while (hasContinuationBit(currentByte)) + + return result + } + + /** + * Encodes the given integer as a VarInt and writes it to the specified [ByteBuf]. + * + * @param buffer The [ByteBuf] to write to. + * @param value The integer value to encode. + * @return The same [ByteBuf] instance for chaining. + */ + fun writeVarInt(buffer: ByteBuf, value: Int): ByteBuf { + // Handle one and two byte cases explicitly for improved performance in common cases. + if ((value and ((0xFFFFFFFF.toInt() shl DATA_BITS_PER_BYTE))) == 0) { + buffer.writeByte(value) + } else if ((value and (0xFFFFFFFF.toInt() shl (DATA_BITS_PER_BYTE * 2))) == 0) { + val combinedValue = + (value and DATA_BITS_MASK or CONTINUATION_BIT_MASK) shl 8 or (value ushr DATA_BITS_PER_BYTE) + buffer.writeShort(combinedValue) + } else { + writeComplexVarInt(buffer, value) + } + + return buffer + } + + /** + * Encodes a larger integer value as a VarInt and writes it to the [ByteBuf]. + * This method handles cases where more than two bytes are required for encoding. + * + * @param buffer The [ByteBuf] to write to. + * @param value The integer value to encode. + * @return The same [ByteBuf] instance for chaining. + */ + private fun writeComplexVarInt(buffer: ByteBuf, value: Int): ByteBuf { + var value = value + while ((value and -CONTINUATION_BIT_MASK) != 0) { + buffer.writeByte(value and DATA_BITS_MASK or CONTINUATION_BIT_MASK) + value = value ushr DATA_BITS_PER_BYTE + } + + buffer.writeByte(value) + return buffer + } +} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/types/VarLong.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/types/VarLong.kt new file mode 100644 index 0000000..0df3fd8 --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/types/VarLong.kt @@ -0,0 +1,85 @@ +package dev.slne.roleplay.mod.common.network.utils.types + +import dev.slne.roleplay.mod.common.network.utils.checkDecoded +import io.netty.buffer.ByteBuf + +/** + * Utility object for encoding and decoding VarLong values using a variable-length representation. + * + * VarLong is a compact format for encoding long integers, where smaller values use fewer bytes. + * It is particularly useful in network protocols to optimize bandwidth usage. + */ +object VarLong { + private const val MAX_VARLONG_SIZE = 10 + private const val DATA_BITS_MASK = 0x7F + private const val CONTINUATION_BIT_MASK = 0x80 + private const val DATA_BITS_PER_BYTE = 7 + + /** + * Calculates the number of bytes required to encode the given long value as a VarLong. + * + * @param value The long value to encode. + * @return The number of bytes needed to represent the value as a VarLong. + */ + fun getEncodedSize(value: Long): Int { + for (i in 1 until MAX_VARLONG_SIZE) { + if ((value and -1L shl i * DATA_BITS_PER_BYTE) == 0L) { + return i + } + } + + return MAX_VARLONG_SIZE + } + + /** + * Determines if the given byte has the continuation bit set. + * + * @param byte The byte to check. + * @return `true` if the continuation bit is set, otherwise `false`. + */ + fun hasContinuationBit(byte: Byte): Boolean = + (byte.toInt() and CONTINUATION_BIT_MASK) == CONTINUATION_BIT_MASK + + /** + * Decodes a VarLong from the specified [ByteBuf]. + * + * @param buf The [ByteBuf] to read from. + * @return The decoded long value. + * @throws RuntimeException If the VarLong exceeds the maximum size. + */ + fun readVarLong(buf: ByteBuf): Long { + var result = 0L + var shift = 0 + + var currentByte: Byte + do { + currentByte = buf.readByte() + result = + result or ((currentByte.toLong() and DATA_BITS_MASK.toLong()) shl (shift++ * DATA_BITS_PER_BYTE)) + shift += DATA_BITS_PER_BYTE + + checkDecoded(shift <= MAX_VARLONG_SIZE) { "VarLong too big" } + } while (currentByte.toInt() and CONTINUATION_BIT_MASK == CONTINUATION_BIT_MASK) + + return result + } + + /** + * Encodes the given long value as a VarLong and writes it to the specified [ByteBuf]. + * + * @param buf The [ByteBuf] to write to. + * @param value The long value to encode. + * @return The same [ByteBuf] instance for chaining. + */ + fun writeVarLong(buf: ByteBuf, value: Long): ByteBuf { + var value = value + + while ((value and -CONTINUATION_BIT_MASK.toLong()) != 0L) { + buf.writeByte((value and DATA_BITS_MASK.toLong()).toInt() or CONTINUATION_BIT_MASK) + value = value ushr DATA_BITS_PER_BYTE + } + buf.writeByte(value.toInt()) + + return buf + } +} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-server/build.gradle.kts b/surf-roleplay-mod/surf-roleplay-mod-server/build.gradle.kts new file mode 100644 index 0000000..931a7b0 --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-server/build.gradle.kts @@ -0,0 +1,12 @@ +plugins { + id("dev.slne.surf.surfapi.gradle.paper-plugin") +} + +surfPaperPluginApi { + mainClass("dev.slne.surf.roleplay.mod.server.ModServer") + foliaSupported(true) +} + +dependencies { + api(project(":surf-roleplay-mod:surf-roleplay-mod-common")) +} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-server/src/main/kotlin/dev/slne/roleplay/mod/server/ModServer.kt b/surf-roleplay-mod/surf-roleplay-mod-server/src/main/kotlin/dev/slne/roleplay/mod/server/ModServer.kt new file mode 100644 index 0000000..61eff03 --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-server/src/main/kotlin/dev/slne/roleplay/mod/server/ModServer.kt @@ -0,0 +1,21 @@ +package dev.slne.roleplay.mod.server + +import com.github.shynixn.mccoroutine.folia.SuspendingJavaPlugin +import dev.slne.roleplay.mod.server.listener.ListenerManager +import org.bukkit.plugin.java.JavaPlugin + +val plugin get() = JavaPlugin.getPlugin(ModServer::class.java) + +class ModServer : SuspendingJavaPlugin() { + override suspend fun onLoadAsync() { + + } + + override suspend fun onEnableAsync() { + ListenerManager.register() + } + + override suspend fun onDisableAsync() { + + } +} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-server/src/main/kotlin/dev/slne/roleplay/mod/server/listener/ListenerManager.kt b/surf-roleplay-mod/surf-roleplay-mod-server/src/main/kotlin/dev/slne/roleplay/mod/server/listener/ListenerManager.kt new file mode 100644 index 0000000..e0faa87 --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-server/src/main/kotlin/dev/slne/roleplay/mod/server/listener/ListenerManager.kt @@ -0,0 +1,9 @@ +package dev.slne.roleplay.mod.server.listener + +object ListenerManager { + + fun register() { + + } + +} \ No newline at end of file From f5ea9a8bc0e04e69f4b3b4c8868f10caaab8b6cc Mon Sep 17 00:00:00 2001 From: Ammo Date: Sun, 17 Aug 2025 18:55:01 +0200 Subject: [PATCH 05/11] Add initial implementation of network protocol and packet handling: create base packet handlers, login packet listeners, and handshake packets --- gradle.properties | 8 +- gradle/libs.versions.toml | 12 +- settings.gradle.kts | 9 +- .../build.gradle.kts | 50 + .../roleplay/mod/mixin/ExampleMixin.java | 11 +- .../dev/slne/surf/roleplay/mod/RoleplayMod.kt | 34 + .../roleplay/mod/RoleplayModDataGenerator.kt | 2 +- .../roleplay/mod/keybind/KeybindAction.kt | 2 +- .../roleplay/mod/keybind/KeybindCategory.kt | 2 +- .../surf}/roleplay/mod/keybind/Keybinds.kt | 2 +- .../network/ClientLoginPacketListenerImpl.kt | 21 + .../mod/network/ClientNetworkBridgeImpl.kt | 24 + .../mod/network/user/ClientProtoUser.kt | 10 + .../network/user/ClientProtoUserManager.kt | 18 + .../src/main/resources/assets/lang/de_de.json | 0 .../main/resources/assets/roleplay/icon.png | Bin .../src/main/resources/fabric.mod.json | 7 +- .../src/main/resources/roleplay.mixins.json | 14 + .../surf-roleplay-mod-client/.gitignore | 119 ++ .../surf-roleplay-mod-client/build.gradle.kts | 49 +- .../common/build.gradle.kts | 16 + .../surf/roleplay/mod/common/RoleplayMod.java | 10 + .../src/main/resources/roleplay.mixins.json | 13 + .../fabric/build.gradle.kts | 73 ++ .../mod/fabric/RoleplayFabricMod.java | 11 + .../fabric/src/main/resources/fabric.mod.json | 31 + .../neoforge/build.gradle.kts | 70 ++ .../neoforge/gradle.properties | 1 + .../mod/neoforge/RoleplayNeoforgeMod.kt | 12 + .../resources/META-INF/neoforge.mods.toml | 24 + .../dev/slne/roleplay/mod/RoleplayMod.kt | 9 - .../src/main/resources/roleplay.mixins.json | 14 - .../surf-roleplay-mod-common/build.gradle.kts | 5 +- .../mod/common/network/PacketRegistry.kt | 77 -- .../mod/common/network/SurfRoleplayPacket.kt | 10 - .../common/network/connection/Connection.kt | 48 - .../network/listener/NetworkListener.kt | 38 - .../packets/RespondingRoleplayPacket.kt | 60 - .../network/packets/ResponseRoleplayPacket.kt | 17 - .../common/network/packets/RoleplayPacket.kt | 30 - .../clientbound/ClientboundHandshakePacket.kt | 31 - .../serverbound/ServerboundHandshakePacket.kt | 34 - .../mod/common/network/utils/PacketFlow.kt | 20 - .../network/utils/RoleplayPacketListener.kt | 3 - .../mod/common/network/utils/SurfByteBuf.kt | 1058 ----------------- .../common/network/utils/WrappedByteBuf.kt | 327 ----- .../common/network/utils/codec/StreamCodec.kt | 367 ------ .../network/utils/codec/StreamDecoder.kt | 6 - .../network/utils/codec/StreamEncoder.kt | 6 - .../utils/codec/StreamMemberEncoder.kt | 6 - .../network/utils/codec/codec-util-util.kt | 17 - .../common/network/utils/codec/codec-util.kt | 300 ----- .../codec/kotlinx/RoleplayBufSerializer.kt | 8 - .../codec/kotlinx/SurfCloudBufSerializer.kt | 28 - .../adventure/AdventureComponentSerializer.kt | 25 - .../kotlinx/java/BigDecimalSerializer.kt | 26 - .../kotlinx/java/BigIntegerSerializer.kt | 26 - .../codec/kotlinx/java/BitSetSerializer.kt | 27 - .../codec/kotlinx/java/UUIDSerializer.kt | 28 - .../codec/kotlinx/java/UtfStringSerializer.kt | 21 - .../codec/kotlinx/java/VarIntSerializer.kt | 21 - .../codec/kotlinx/java/VarLongSerializer.kt | 21 - .../kotlinx/java/ZonedDateTimeSerializer.kt | 28 - .../kotlinx/kotlin/DurationSerializer.kt | 25 - .../network/utils/decoder/DecodeFactory.kt | 45 - .../network/utils/ecoder/EncodeFactory.kt | 27 - .../common/network/utils/packet-extensions.kt | 16 - .../common/network/utils/types/Utf8String.kt | 83 -- .../mod/common/network/utils/types/VarInt.kt | 101 -- .../mod/common/network/utils/types/VarLong.kt | 85 -- .../mod/common/network/NetworkBridge.kt | 22 + .../mod/common/network/PacketRegistry.kt | 37 + .../mod/common/network/SurfRoleplayPacket.kt | 7 + .../common/network/packet/RoleplayPacket.kt | 15 + .../login/ClientboundRoleplayLoginPacket.kt | 6 + .../login/ServerboundRoleplayLoginPacket.kt | 6 + .../mod/common/network/protocol/DefaultIds.kt | 2 +- .../clientbound/ClientboundHandshakePacket.kt | 16 + .../protocol/listener/PacketListener.kt | 8 + .../listener/TickablePacketListener.kt | 5 + .../login/ClientLoginPacketListener.kt | 8 + .../login/ServerLoginPacketListener.kt | 8 + .../listener/packet/BasePacketHandler.kt | 31 + .../packet/login/ClientLoginPacketHandler.kt | 19 + .../serverbound/ServerboundHandshakePacket.kt | 18 + .../mod/common/network/user/ProtoUser.kt | 11 + .../common/network/user/ProtoUserManager.kt | 27 + .../network/utils/RoleplayPacketHandler.kt | 2 +- .../network/utils/RoleplayPacketListener.kt | 3 + .../surf-roleplay-mod-server/build.gradle.kts | 17 + .../roleplay/mod/server/ModServer.kt | 8 +- .../mod/server/listener/ListenerManager.kt | 3 +- .../network/ServerLoginPacketHandler.kt | 24 + .../server/network/ServerNetworkBridgeImpl.kt | 21 + .../listener/ServerLoginPacketListenerImpl.kt | 44 + .../server/network/user/ServerProtoUser.kt | 8 + .../network/user/ServerProtoUserManager.kt | 14 + 97 files changed, 988 insertions(+), 3181 deletions(-) create mode 100644 surf-roleplay-mod/surf-roleplay-mod-client-old/build.gradle.kts rename surf-roleplay-mod/{surf-roleplay-mod-client/src/main/java/dev/slne => surf-roleplay-mod-client-old/src/main/java/dev/slne/surf}/roleplay/mod/mixin/ExampleMixin.java (58%) create mode 100644 surf-roleplay-mod/surf-roleplay-mod-client-old/src/main/kotlin/dev/slne/surf/roleplay/mod/RoleplayMod.kt rename surf-roleplay-mod/{surf-roleplay-mod-client/src/main/kotlin/dev/slne => surf-roleplay-mod-client-old/src/main/kotlin/dev/slne/surf}/roleplay/mod/RoleplayModDataGenerator.kt (89%) rename surf-roleplay-mod/{surf-roleplay-mod-client/src/main/kotlin/dev/slne => surf-roleplay-mod-client-old/src/main/kotlin/dev/slne/surf}/roleplay/mod/keybind/KeybindAction.kt (75%) rename surf-roleplay-mod/{surf-roleplay-mod-client/src/main/kotlin/dev/slne => surf-roleplay-mod-client-old/src/main/kotlin/dev/slne/surf}/roleplay/mod/keybind/KeybindCategory.kt (69%) rename surf-roleplay-mod/{surf-roleplay-mod-client/src/main/kotlin/dev/slne => surf-roleplay-mod-client-old/src/main/kotlin/dev/slne/surf}/roleplay/mod/keybind/Keybinds.kt (97%) create mode 100644 surf-roleplay-mod/surf-roleplay-mod-client-old/src/main/kotlin/dev/slne/surf/roleplay/mod/network/ClientLoginPacketListenerImpl.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-client-old/src/main/kotlin/dev/slne/surf/roleplay/mod/network/ClientNetworkBridgeImpl.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-client-old/src/main/kotlin/dev/slne/surf/roleplay/mod/network/user/ClientProtoUser.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-client-old/src/main/kotlin/dev/slne/surf/roleplay/mod/network/user/ClientProtoUserManager.kt rename surf-roleplay-mod/{surf-roleplay-mod-client => surf-roleplay-mod-client-old}/src/main/resources/assets/lang/de_de.json (100%) rename surf-roleplay-mod/{surf-roleplay-mod-client => surf-roleplay-mod-client-old}/src/main/resources/assets/roleplay/icon.png (100%) rename surf-roleplay-mod/{surf-roleplay-mod-client => surf-roleplay-mod-client-old}/src/main/resources/fabric.mod.json (80%) create mode 100644 surf-roleplay-mod/surf-roleplay-mod-client-old/src/main/resources/roleplay.mixins.json create mode 100644 surf-roleplay-mod/surf-roleplay-mod-client/.gitignore create mode 100644 surf-roleplay-mod/surf-roleplay-mod-client/common/build.gradle.kts create mode 100644 surf-roleplay-mod/surf-roleplay-mod-client/common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/RoleplayMod.java create mode 100644 surf-roleplay-mod/surf-roleplay-mod-client/common/src/main/resources/roleplay.mixins.json create mode 100644 surf-roleplay-mod/surf-roleplay-mod-client/fabric/build.gradle.kts create mode 100644 surf-roleplay-mod/surf-roleplay-mod-client/fabric/src/main/kotlin/dev/slne/surf/roleplay/mod/fabric/RoleplayFabricMod.java create mode 100644 surf-roleplay-mod/surf-roleplay-mod-client/fabric/src/main/resources/fabric.mod.json create mode 100644 surf-roleplay-mod/surf-roleplay-mod-client/neoforge/build.gradle.kts create mode 100644 surf-roleplay-mod/surf-roleplay-mod-client/neoforge/gradle.properties create mode 100644 surf-roleplay-mod/surf-roleplay-mod-client/neoforge/src/main/kotlin/dev/slne/surf/roleplay/mod/neoforge/RoleplayNeoforgeMod.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-client/neoforge/src/main/resources/META-INF/neoforge.mods.toml delete mode 100644 surf-roleplay-mod/surf-roleplay-mod-client/src/main/kotlin/dev/slne/roleplay/mod/RoleplayMod.kt delete mode 100644 surf-roleplay-mod/surf-roleplay-mod-client/src/main/resources/roleplay.mixins.json delete mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/PacketRegistry.kt delete mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/SurfRoleplayPacket.kt delete mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/connection/Connection.kt delete mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/listener/NetworkListener.kt delete mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/packets/RespondingRoleplayPacket.kt delete mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/packets/ResponseRoleplayPacket.kt delete mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/packets/RoleplayPacket.kt delete mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/protocol/clientbound/ClientboundHandshakePacket.kt delete mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/protocol/serverbound/ServerboundHandshakePacket.kt delete mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/PacketFlow.kt delete mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/RoleplayPacketListener.kt delete mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/SurfByteBuf.kt delete mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/WrappedByteBuf.kt delete mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/StreamCodec.kt delete mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/StreamDecoder.kt delete mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/StreamEncoder.kt delete mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/StreamMemberEncoder.kt delete mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/codec-util-util.kt delete mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/codec-util.kt delete mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/RoleplayBufSerializer.kt delete mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/SurfCloudBufSerializer.kt delete mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/adventure/AdventureComponentSerializer.kt delete mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/java/BigDecimalSerializer.kt delete mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/java/BigIntegerSerializer.kt delete mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/java/BitSetSerializer.kt delete mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/java/UUIDSerializer.kt delete mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/java/UtfStringSerializer.kt delete mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/java/VarIntSerializer.kt delete mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/java/VarLongSerializer.kt delete mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/java/ZonedDateTimeSerializer.kt delete mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/kotlin/DurationSerializer.kt delete mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/decoder/DecodeFactory.kt delete mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/ecoder/EncodeFactory.kt delete mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/packet-extensions.kt delete mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/types/Utf8String.kt delete mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/types/VarInt.kt delete mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/types/VarLong.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/NetworkBridge.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/PacketRegistry.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/SurfRoleplayPacket.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/packet/RoleplayPacket.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/packet/login/ClientboundRoleplayLoginPacket.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/packet/login/ServerboundRoleplayLoginPacket.kt rename surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/{ => surf}/roleplay/mod/common/network/protocol/DefaultIds.kt (73%) create mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/protocol/clientbound/ClientboundHandshakePacket.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/protocol/listener/PacketListener.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/protocol/listener/TickablePacketListener.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/protocol/listener/login/ClientLoginPacketListener.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/protocol/listener/login/ServerLoginPacketListener.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/protocol/listener/packet/BasePacketHandler.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/protocol/listener/packet/login/ClientLoginPacketHandler.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/protocol/serverbound/ServerboundHandshakePacket.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/user/ProtoUser.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/user/ProtoUserManager.kt rename surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/{ => surf}/roleplay/mod/common/network/utils/RoleplayPacketHandler.kt (67%) create mode 100644 surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/utils/RoleplayPacketListener.kt rename surf-roleplay-mod/surf-roleplay-mod-server/src/main/kotlin/dev/slne/{ => surf}/roleplay/mod/server/ModServer.kt (70%) rename surf-roleplay-mod/surf-roleplay-mod-server/src/main/kotlin/dev/slne/{ => surf}/roleplay/mod/server/listener/ListenerManager.kt (50%) create mode 100644 surf-roleplay-mod/surf-roleplay-mod-server/src/main/kotlin/dev/slne/surf/roleplay/mod/server/network/ServerLoginPacketHandler.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-server/src/main/kotlin/dev/slne/surf/roleplay/mod/server/network/ServerNetworkBridgeImpl.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-server/src/main/kotlin/dev/slne/surf/roleplay/mod/server/network/listener/ServerLoginPacketListenerImpl.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-server/src/main/kotlin/dev/slne/surf/roleplay/mod/server/network/user/ServerProtoUser.kt create mode 100644 surf-roleplay-mod/surf-roleplay-mod-server/src/main/kotlin/dev/slne/surf/roleplay/mod/server/network/user/ServerProtoUserManager.kt diff --git a/gradle.properties b/gradle.properties index 86daac3..cc97c39 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,8 +5,10 @@ kotlin.code.style=official kotlin.stdlib.default.dependency=false version=1.21.7-1.0.0 # Mod Properties -mod_version=1.0.0 +mod_version=1.21.8-1.0.0-SNAPSHOT maven_group=dev.slne.roleplay.mod -archives_base_name=roleplay +archives_name=roleplay +enabled_platforms=fabric,neoforge # Dependencies -fabric_version=0.131.0+1.21.8 \ No newline at end of file +fabric_version=0.131.0+1.21.8 +org.gradle.jvmargs=-Xmx8G diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 83b0101..cf845d5 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -5,13 +5,18 @@ netty = "4.2.4.Final" datafixerupper = "8.0.16" bytebuddy = "1.15.10" kotlin-byte-buf-serializer = "1.1.0" +protoweaver = "1.4.9" +architectury-base = "3.4.161" +architectury-loom = "1.10.433" +architectury-api = "17.0.8" +neoforge = "21.8.32" # Mod minecraft = "1.21.8" yarn-mappings = "1.21.8+build.1" fabric-loader = "0.17.2" fabric-kotlin = "1.13.5+kotlin.2.2.10" -fabric-api = "0.131.0+1.21.8" +fabric-api = "0.132.0+1.21.8" [libraries] surf-npc-api = { module = "dev.slne.surf.npc:surf-npc-api", version.ref = "surf-npc-api" } @@ -19,6 +24,11 @@ netty = { module = "io.netty:netty-all", version.ref = "netty" } datafixerupper = { module = "com.mojang:datafixerupper", version.ref = "datafixerupper" } bytebuddy = { module = "net.bytebuddy:byte-buddy", version.ref = "bytebuddy" } kotlin-byte-buf-serializer = { module = "dev.slne.surf:kotlin-byte-buf-serializer", version.ref = "kotlin-byte-buf-serializer" } +protoweaver-common = { module = "me.mrnavastar.protoweaver:common", version.ref = "protoweaver" } +protoweaver-fabric = { module = "me.mrnavastar.protoweaver:client", version.ref = "protoweaver" } +protoweaver-paper = { module = "me.mrnavastar.protoweaver:common", version.ref = "protoweaver" } [plugins] loom = { id = "fabric-loom", version.ref = "loom" } +architectury-base = { id = "architectury-plugin", version.ref = "architectury-base" } +architectury-loom = { id = "dev.architectury.loom", version.ref = "architectury-loom" } diff --git a/settings.gradle.kts b/settings.gradle.kts index e67b817..38b54dd 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -4,6 +4,8 @@ pluginManagement { repositories { mavenCentral() maven("https://maven.fabricmc.net") + maven("https://maven.architectury.dev") + maven("https://files.minecraftforge.net/maven") gradlePluginPortal() } } @@ -25,5 +27,8 @@ include("surf-roleplay-velocity") include("surf-roleplay-server") include("surf-roleplay-mod:surf-roleplay-mod-common") -include("surf-roleplay-mod:surf-roleplay-mod-client") -include("surf-roleplay-mod:surf-roleplay-mod-server") \ No newline at end of file +include("surf-roleplay-mod:surf-roleplay-mod-server") + +include("surf-roleplay-mod:surf-roleplay-mod-client:common") +include("surf-roleplay-mod:surf-roleplay-mod-client:fabric") +//include("surf-roleplay-mod:surf-roleplay-mod-client:neoforge") diff --git a/surf-roleplay-mod/surf-roleplay-mod-client-old/build.gradle.kts b/surf-roleplay-mod/surf-roleplay-mod-client-old/build.gradle.kts new file mode 100644 index 0000000..6b8745c --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-client-old/build.gradle.kts @@ -0,0 +1,50 @@ +plugins { + id("dev.slne.surf.surfapi.gradle.core") + alias(libs.plugins.loom) +} + +base { + archivesName.set(project.extra["archives_base_name"] as String) +} + +fabricApi { + configureDataGeneration { + client = true + } +} + +dependencies { + val minecraftVersion = libs.versions.minecraft.get() + val yarnMappings = libs.versions.yarn.mappings.get() + val loaderVersion = libs.versions.fabric.loader.get() + val fabricVersion = libs.versions.fabric.api.get() + val fabricKotlinVersion = libs.versions.fabric.kotlin.get() + + minecraft("com.mojang:minecraft:$minecraftVersion") + mappings("net.fabricmc:yarn:$yarnMappings:v2") + modImplementation("net.fabricmc:fabric-loader:$loaderVersion") + + implementation(project(":surf-roleplay-mod:surf-roleplay-mod-common")) + implementation(libs.protoweaver.fabric) + + modImplementation("net.fabricmc.fabric-api:fabric-api:$fabricVersion") + modImplementation("net.fabricmc:fabric-language-kotlin:$fabricKotlinVersion") +} + +tasks.processResources { + from(project.project(":surf-roleplay-mod:surf-roleplay-mod-common").sourceSets.main.get().resources) + + inputs.property("version", project.version) + + filesMatching("fabric.mod.json") { + expand("version" to inputs.properties["version"]) + } +} + +tasks.jar { + inputs.property("archivesName", base.archivesName.get()) + + from("LICENSE") { + rename { "${it}_${inputs.properties["archivesName"]}" } + } +} diff --git a/surf-roleplay-mod/surf-roleplay-mod-client/src/main/java/dev/slne/roleplay/mod/mixin/ExampleMixin.java b/surf-roleplay-mod/surf-roleplay-mod-client-old/src/main/java/dev/slne/surf/roleplay/mod/mixin/ExampleMixin.java similarity index 58% rename from surf-roleplay-mod/surf-roleplay-mod-client/src/main/java/dev/slne/roleplay/mod/mixin/ExampleMixin.java rename to surf-roleplay-mod/surf-roleplay-mod-client-old/src/main/java/dev/slne/surf/roleplay/mod/mixin/ExampleMixin.java index c0adbef..80f2310 100644 --- a/surf-roleplay-mod/surf-roleplay-mod-client/src/main/java/dev/slne/roleplay/mod/mixin/ExampleMixin.java +++ b/surf-roleplay-mod/surf-roleplay-mod-client-old/src/main/java/dev/slne/surf/roleplay/mod/mixin/ExampleMixin.java @@ -1,4 +1,4 @@ -package dev.slne.roleplay.mod.mixin; +package dev.slne.surf.roleplay.mod.mixin; import net.minecraft.server.MinecraftServer; import org.spongepowered.asm.mixin.Mixin; @@ -8,8 +8,9 @@ @Mixin(MinecraftServer.class) public class ExampleMixin { - @Inject(at = @At("HEAD"), method = "loadWorld") - private void init(CallbackInfo info) { - // This code is injected into the start of MinecraftServer.loadWorld()V - } + + @Inject(at = @At("HEAD"), method = "loadWorld") + private void init(CallbackInfo info) { + // This code is injected into the start of MinecraftServer.loadWorld()V + } } \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-client-old/src/main/kotlin/dev/slne/surf/roleplay/mod/RoleplayMod.kt b/surf-roleplay-mod/surf-roleplay-mod-client-old/src/main/kotlin/dev/slne/surf/roleplay/mod/RoleplayMod.kt new file mode 100644 index 0000000..eb30465 --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-client-old/src/main/kotlin/dev/slne/surf/roleplay/mod/RoleplayMod.kt @@ -0,0 +1,34 @@ +package dev.slne.surf.roleplay.mod + +import dev.slne.surf.roleplay.mod.common.network.PacketRegistry +import dev.slne.surf.roleplay.mod.common.network.user.userManager +import dev.slne.surf.roleplay.mod.keybind.Keybinds +import me.mrnavastar.protoweaver.client.ProtoClient +import net.fabricmc.api.ClientModInitializer +import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents +import net.minecraft.client.MinecraftClient +import java.util.* + +object RoleplayMod : ClientModInitializer { + var client: ProtoClient? = null + + val uuid: UUID get() = MinecraftClient.getInstance().gameProfile.id + + override fun onInitializeClient() { + Keybinds.registerKeybindings() + + ClientPlayConnectionEvents.JOIN.register { handler, sender, client -> + val server = client.server!! + this.client = ProtoClient(server.serverIp, server.serverPort).also { + it.connect(PacketRegistry.loginProtocol) + userManager.init(uuid, it.connection) + } + } + + ClientPlayConnectionEvents.DISCONNECT.register { handler, client -> + this.client?.disconnect() + this.client = null + userManager.destroy(uuid) + } + } +} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-client/src/main/kotlin/dev/slne/roleplay/mod/RoleplayModDataGenerator.kt b/surf-roleplay-mod/surf-roleplay-mod-client-old/src/main/kotlin/dev/slne/surf/roleplay/mod/RoleplayModDataGenerator.kt similarity index 89% rename from surf-roleplay-mod/surf-roleplay-mod-client/src/main/kotlin/dev/slne/roleplay/mod/RoleplayModDataGenerator.kt rename to surf-roleplay-mod/surf-roleplay-mod-client-old/src/main/kotlin/dev/slne/surf/roleplay/mod/RoleplayModDataGenerator.kt index a9651bd..65485b1 100644 --- a/surf-roleplay-mod/surf-roleplay-mod-client/src/main/kotlin/dev/slne/roleplay/mod/RoleplayModDataGenerator.kt +++ b/surf-roleplay-mod/surf-roleplay-mod-client-old/src/main/kotlin/dev/slne/surf/roleplay/mod/RoleplayModDataGenerator.kt @@ -1,4 +1,4 @@ -package dev.slne.roleplay.mod +package dev.slne.surf.roleplay.mod import net.fabricmc.fabric.api.datagen.v1.DataGeneratorEntrypoint import net.fabricmc.fabric.api.datagen.v1.FabricDataGenerator diff --git a/surf-roleplay-mod/surf-roleplay-mod-client/src/main/kotlin/dev/slne/roleplay/mod/keybind/KeybindAction.kt b/surf-roleplay-mod/surf-roleplay-mod-client-old/src/main/kotlin/dev/slne/surf/roleplay/mod/keybind/KeybindAction.kt similarity index 75% rename from surf-roleplay-mod/surf-roleplay-mod-client/src/main/kotlin/dev/slne/roleplay/mod/keybind/KeybindAction.kt rename to surf-roleplay-mod/surf-roleplay-mod-client-old/src/main/kotlin/dev/slne/surf/roleplay/mod/keybind/KeybindAction.kt index 8e4916d..3c9d760 100644 --- a/surf-roleplay-mod/surf-roleplay-mod-client/src/main/kotlin/dev/slne/roleplay/mod/keybind/KeybindAction.kt +++ b/surf-roleplay-mod/surf-roleplay-mod-client-old/src/main/kotlin/dev/slne/surf/roleplay/mod/keybind/KeybindAction.kt @@ -1,4 +1,4 @@ -package dev.slne.roleplay.mod.keybind +package dev.slne.surf.roleplay.mod.keybind import net.minecraft.client.network.ClientPlayerEntity diff --git a/surf-roleplay-mod/surf-roleplay-mod-client/src/main/kotlin/dev/slne/roleplay/mod/keybind/KeybindCategory.kt b/surf-roleplay-mod/surf-roleplay-mod-client-old/src/main/kotlin/dev/slne/surf/roleplay/mod/keybind/KeybindCategory.kt similarity index 69% rename from surf-roleplay-mod/surf-roleplay-mod-client/src/main/kotlin/dev/slne/roleplay/mod/keybind/KeybindCategory.kt rename to surf-roleplay-mod/surf-roleplay-mod-client-old/src/main/kotlin/dev/slne/surf/roleplay/mod/keybind/KeybindCategory.kt index dd65276..820c9df 100644 --- a/surf-roleplay-mod/surf-roleplay-mod-client/src/main/kotlin/dev/slne/roleplay/mod/keybind/KeybindCategory.kt +++ b/surf-roleplay-mod/surf-roleplay-mod-client-old/src/main/kotlin/dev/slne/surf/roleplay/mod/keybind/KeybindCategory.kt @@ -1,4 +1,4 @@ -package dev.slne.roleplay.mod.keybind +package dev.slne.surf.roleplay.mod.keybind enum class KeybindCategory(val translationKey: String) { diff --git a/surf-roleplay-mod/surf-roleplay-mod-client/src/main/kotlin/dev/slne/roleplay/mod/keybind/Keybinds.kt b/surf-roleplay-mod/surf-roleplay-mod-client-old/src/main/kotlin/dev/slne/surf/roleplay/mod/keybind/Keybinds.kt similarity index 97% rename from surf-roleplay-mod/surf-roleplay-mod-client/src/main/kotlin/dev/slne/roleplay/mod/keybind/Keybinds.kt rename to surf-roleplay-mod/surf-roleplay-mod-client-old/src/main/kotlin/dev/slne/surf/roleplay/mod/keybind/Keybinds.kt index cf06b51..2ee7729 100644 --- a/surf-roleplay-mod/surf-roleplay-mod-client/src/main/kotlin/dev/slne/roleplay/mod/keybind/Keybinds.kt +++ b/surf-roleplay-mod/surf-roleplay-mod-client-old/src/main/kotlin/dev/slne/surf/roleplay/mod/keybind/Keybinds.kt @@ -1,4 +1,4 @@ -package dev.slne.roleplay.mod.keybind +package dev.slne.surf.roleplay.mod.keybind import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper diff --git a/surf-roleplay-mod/surf-roleplay-mod-client-old/src/main/kotlin/dev/slne/surf/roleplay/mod/network/ClientLoginPacketListenerImpl.kt b/surf-roleplay-mod/surf-roleplay-mod-client-old/src/main/kotlin/dev/slne/surf/roleplay/mod/network/ClientLoginPacketListenerImpl.kt new file mode 100644 index 0000000..eb05935 --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-client-old/src/main/kotlin/dev/slne/surf/roleplay/mod/network/ClientLoginPacketListenerImpl.kt @@ -0,0 +1,21 @@ +package dev.slne.surf.roleplay.mod.network + +import dev.slne.surf.roleplay.mod.RoleplayMod +import dev.slne.surf.roleplay.mod.common.network.protocol.clientbound.ClientboundHandshakePacket +import dev.slne.surf.roleplay.mod.common.network.protocol.listener.login.ClientLoginPacketListener +import dev.slne.surf.roleplay.mod.common.network.protocol.serverbound.ServerboundHandshakePacket + +object ClientLoginPacketListenerImpl : ClientLoginPacketListener { + private val connection + get() = RoleplayMod.client?.connection ?: error("Not connected to a roleplay server") + + override fun handleHandshake(packet: ClientboundHandshakePacket) { + connection.send( + ServerboundHandshakePacket( + handshake = packet.handshake, + uuid = RoleplayMod.uuid, + clientVersion = "1" + ) + ) + } +} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-client-old/src/main/kotlin/dev/slne/surf/roleplay/mod/network/ClientNetworkBridgeImpl.kt b/surf-roleplay-mod/surf-roleplay-mod-client-old/src/main/kotlin/dev/slne/surf/roleplay/mod/network/ClientNetworkBridgeImpl.kt new file mode 100644 index 0000000..ee4da73 --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-client-old/src/main/kotlin/dev/slne/surf/roleplay/mod/network/ClientNetworkBridgeImpl.kt @@ -0,0 +1,24 @@ +package dev.slne.surf.roleplay.mod.network + +import com.google.auto.service.AutoService +import dev.slne.surf.roleplay.mod.RoleplayMod +import dev.slne.surf.roleplay.mod.common.network.NetworkBridge +import dev.slne.surf.roleplay.mod.common.network.protocol.listener.login.ClientLoginPacketListener +import dev.slne.surf.roleplay.mod.common.network.protocol.listener.login.ServerLoginPacketListener +import dev.slne.surf.roleplay.mod.common.network.protocol.listener.packet.login.ClientLoginPacketHandler +import me.mrnavastar.protoweaver.api.netty.ProtoConnection + +@AutoService(NetworkBridge::class) +class ClientNetworkBridgeImpl : NetworkBridge { + override val serverLoginPacketHandlerClass = null + override val clientLoginPacketHandlerClass = ClientLoginPacketHandler::class.java + + override fun createServerLoginPacketHandler(connection: ProtoConnection): ServerLoginPacketListener { + error("Client login packet handler is not implemented on the client side") + } + + override fun createClientLoginPacketHandler(connection: ProtoConnection): ClientLoginPacketListener { + require(connection == RoleplayMod.client?.connection) { "Connection mismatch" } + return ClientLoginPacketListenerImpl + } +} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-client-old/src/main/kotlin/dev/slne/surf/roleplay/mod/network/user/ClientProtoUser.kt b/surf-roleplay-mod/surf-roleplay-mod-client-old/src/main/kotlin/dev/slne/surf/roleplay/mod/network/user/ClientProtoUser.kt new file mode 100644 index 0000000..9349c6e --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-client-old/src/main/kotlin/dev/slne/surf/roleplay/mod/network/user/ClientProtoUser.kt @@ -0,0 +1,10 @@ +package dev.slne.surf.roleplay.mod.network.user + +import dev.slne.surf.roleplay.mod.RoleplayMod +import dev.slne.surf.roleplay.mod.common.network.user.ProtoUser +import me.mrnavastar.protoweaver.api.netty.ProtoConnection + +object ClientProtoUser : ProtoUser(RoleplayMod.uuid) { + override val connection: ProtoConnection + get() = RoleplayMod.client?.connection ?: error("Not connected to a roleplay server") +} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-client-old/src/main/kotlin/dev/slne/surf/roleplay/mod/network/user/ClientProtoUserManager.kt b/surf-roleplay-mod/surf-roleplay-mod-client-old/src/main/kotlin/dev/slne/surf/roleplay/mod/network/user/ClientProtoUserManager.kt new file mode 100644 index 0000000..1db2ca8 --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-client-old/src/main/kotlin/dev/slne/surf/roleplay/mod/network/user/ClientProtoUserManager.kt @@ -0,0 +1,18 @@ +package dev.slne.surf.roleplay.mod.network.user + +import com.google.auto.service.AutoService +import dev.slne.surf.roleplay.mod.common.network.user.ProtoUser +import dev.slne.surf.roleplay.mod.common.network.user.ProtoUserManager +import me.mrnavastar.protoweaver.api.netty.ProtoConnection +import java.util.* + +@AutoService(ProtoUserManager::class) +class ClientProtoUserManager : ProtoUserManager() { + override fun createUser( + uuid: UUID, + connection: ProtoConnection + ): ProtoUser { + require(uuid == ClientProtoUser.uuid) { "UUID mismatch: expected ${ClientProtoUser.uuid}, got $uuid" } + return ClientProtoUser + } +} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-client/src/main/resources/assets/lang/de_de.json b/surf-roleplay-mod/surf-roleplay-mod-client-old/src/main/resources/assets/lang/de_de.json similarity index 100% rename from surf-roleplay-mod/surf-roleplay-mod-client/src/main/resources/assets/lang/de_de.json rename to surf-roleplay-mod/surf-roleplay-mod-client-old/src/main/resources/assets/lang/de_de.json diff --git a/surf-roleplay-mod/surf-roleplay-mod-client/src/main/resources/assets/roleplay/icon.png b/surf-roleplay-mod/surf-roleplay-mod-client-old/src/main/resources/assets/roleplay/icon.png similarity index 100% rename from surf-roleplay-mod/surf-roleplay-mod-client/src/main/resources/assets/roleplay/icon.png rename to surf-roleplay-mod/surf-roleplay-mod-client-old/src/main/resources/assets/roleplay/icon.png diff --git a/surf-roleplay-mod/surf-roleplay-mod-client/src/main/resources/fabric.mod.json b/surf-roleplay-mod/surf-roleplay-mod-client-old/src/main/resources/fabric.mod.json similarity index 80% rename from surf-roleplay-mod/surf-roleplay-mod-client/src/main/resources/fabric.mod.json rename to surf-roleplay-mod/surf-roleplay-mod-client-old/src/main/resources/fabric.mod.json index ca7606b..3a70a33 100644 --- a/surf-roleplay-mod/surf-roleplay-mod-client/src/main/resources/fabric.mod.json +++ b/surf-roleplay-mod/surf-roleplay-mod-client-old/src/main/resources/fabric.mod.json @@ -17,13 +17,13 @@ "entrypoints": { "client": [ { - "value": "dev.slne.roleplay.mod.RoleplayMod", + "value": "dev.slne.surf.roleplay.mod.RoleplayMod", "adapter": "kotlin" } ], "fabric-datagen": [ { - "value": "dev.slne.roleplay.mod.RoleplayModDataGenerator", + "value": "dev.slne.surf.roleplay.mod.RoleplayModDataGenerator", "adapter": "kotlin" } ] @@ -37,6 +37,7 @@ "java": ">=21", "fabric-api": "*", "fabric-language-kotlin": "*", - "fabric-key-binding-api-v1": "*" + "fabric-key-binding-api-v1": "*", + "protoweaver": ">=1.4.9" } } \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-client-old/src/main/resources/roleplay.mixins.json b/surf-roleplay-mod/surf-roleplay-mod-client-old/src/main/resources/roleplay.mixins.json new file mode 100644 index 0000000..80d5464 --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-client-old/src/main/resources/roleplay.mixins.json @@ -0,0 +1,14 @@ +{ + "required": true, + "package": "dev.slne.roleplay.mod.mixin", + "compatibilityLevel": "JAVA_21", + "mixins": [ + "dev.slne.surf.roleplay.mod.mixin.ExampleMixin" + ], + "injectors": { + "defaultRequire": 1 + }, + "overwrites": { + "requireAnnotations": true + } +} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-client/.gitignore b/surf-roleplay-mod/surf-roleplay-mod-client/.gitignore new file mode 100644 index 0000000..d5f737e --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-client/.gitignore @@ -0,0 +1,119 @@ +# User-specific stuff +.idea/ + +*.iml +*.ipr +*.iws + +# IntelliJ +out/ +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Package Files # +*.jar +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* + +*~ + +# temporary files which can be created if a process still has a handle open of a deleted file +.fuse_hidden* + +# KDE directory preferences +.directory + +# Linux trash folder which might appear on any partition or disk +.Trash-* + +# .nfs files are created when an open file is removed but is still being accessed +.nfs* + +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +# Windows thumbnail cache files +Thumbs.db +Thumbs.db:encryptable +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk + +.gradle +build/ + +# Ignore Gradle GUI config +gradle-app.setting + +# Cache of project +.gradletasknamecache + +**/build/ + +# Common working directory +run/ +runs/ + +# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored) +!gradle-wrapper.jar diff --git a/surf-roleplay-mod/surf-roleplay-mod-client/build.gradle.kts b/surf-roleplay-mod/surf-roleplay-mod-client/build.gradle.kts index a248c14..b7a408a 100644 --- a/surf-roleplay-mod/surf-roleplay-mod-client/build.gradle.kts +++ b/surf-roleplay-mod/surf-roleplay-mod-client/build.gradle.kts @@ -1,45 +1,34 @@ +import net.fabricmc.loom.api.LoomGradleExtensionAPI + plugins { id("dev.slne.surf.surfapi.gradle.core") - alias(libs.plugins.loom) + alias(libs.plugins.architectury.base) + alias(libs.plugins.architectury.loom) apply false } -base { - archivesName.set(project.extra["archives_base_name"] as String) -} +val minecraftVersion = libs.versions.minecraft.get() +val modName = rootProject.findProperty("archives_name") as String -fabricApi { - configureDataGeneration { - client = true - } +architectury { + minecraft = minecraftVersion } -dependencies { - val minecraftVersion = libs.versions.minecraft.get() - val yarnMappings = libs.versions.yarn.mappings.get() - val loaderVersion = libs.versions.fabric.loader.get() - val fabricVersion = libs.versions.fabric.api.get() - val fabricKotlinVersion = libs.versions.fabric.kotlin.get() - - minecraft("com.mojang:minecraft:$minecraftVersion") - mappings("net.fabricmc:yarn:$yarnMappings:v2") - modImplementation("net.fabricmc:fabric-loader:$loaderVersion") - - modImplementation("net.fabricmc.fabric-api:fabric-api:$fabricVersion") - modImplementation("net.fabricmc:fabric-language-kotlin:$fabricKotlinVersion") +repositories { + maven("https://maven.neoforged.net/releases") } -tasks.processResources { - inputs.property("version", project.version) +subprojects { + apply(plugin = "dev.architectury.loom") + apply(plugin = "architectury-plugin") - filesMatching("fabric.mod.json") { - expand("version" to inputs.properties["version"]) + base { + archivesName = "$modName-${project.name}" } -} -tasks.jar { - inputs.property("archivesName", base.archivesName.get()) + val loomExtension = extensions.getByType() - from("LICENSE") { - rename { "${it}_${inputs.properties["archivesName"]}" } + dependencies { + "minecraft"("net.minecraft:minecraft:$minecraftVersion") + "mappings"(loomExtension.officialMojangMappings()) } } diff --git a/surf-roleplay-mod/surf-roleplay-mod-client/common/build.gradle.kts b/surf-roleplay-mod/surf-roleplay-mod-client/common/build.gradle.kts new file mode 100644 index 0000000..c5249a3 --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-client/common/build.gradle.kts @@ -0,0 +1,16 @@ +plugins { + id("dev.slne.surf.surfapi.gradle.core") +} + +architectury { + val enabledPlatforms = findProperty("enabled_platforms") as String + common(enabledPlatforms.split(',')) +} + +val fabricLoaderVersion = libs.versions.fabric.loader.get() +val architecturyApiVersion = libs.versions.architectury.api.get() + +dependencies { + modImplementation("net.fabricmc:fabric-loader:$fabricLoaderVersion") + modImplementation("dev.architectury:architectury:$architecturyApiVersion") +} diff --git a/surf-roleplay-mod/surf-roleplay-mod-client/common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/RoleplayMod.java b/surf-roleplay-mod/surf-roleplay-mod-client/common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/RoleplayMod.java new file mode 100644 index 0000000..65a8f04 --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-client/common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/RoleplayMod.java @@ -0,0 +1,10 @@ +package dev.slne.testmod3; + +public final class RoleplayMod { + + public static final String MOD_ID = "surf-roleplay"; + + public static void init() { + // Write common init code here. + } +} diff --git a/surf-roleplay-mod/surf-roleplay-mod-client/common/src/main/resources/roleplay.mixins.json b/surf-roleplay-mod/surf-roleplay-mod-client/common/src/main/resources/roleplay.mixins.json new file mode 100644 index 0000000..6261f7c --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-client/common/src/main/resources/roleplay.mixins.json @@ -0,0 +1,13 @@ +{ + "required": true, + "package": "dev.slne.surf.roleplay.mixin", + "compatibilityLevel": "JAVA_24", + "minVersion": "0.8", + "client": [ + ], + "mixins": [ + ], + "injectors": { + "defaultRequire": 1 + } +} diff --git a/surf-roleplay-mod/surf-roleplay-mod-client/fabric/build.gradle.kts b/surf-roleplay-mod/surf-roleplay-mod-client/fabric/build.gradle.kts new file mode 100644 index 0000000..c237daa --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-client/fabric/build.gradle.kts @@ -0,0 +1,73 @@ +import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar +import net.fabricmc.loom.task.RemapJarTask + +plugins { + id("dev.slne.surf.surfapi.gradle.core") +} + +architectury { + platformSetupLoomIde() + fabric() +} + +configurations { + create("common") { + isCanBeResolved = true + isCanBeConsumed = false + } + + named("compileClasspath").get().extendsFrom(configurations.getByName("common")) + named("runtimeClasspath").get().extendsFrom(configurations.getByName("common")) + named("developmentFabric").get().extendsFrom(configurations.getByName("common")) + + create("shadowBundle") { + isCanBeResolved = true + isCanBeConsumed = false + } +} + + +val fabricLoaderVersion = libs.versions.fabric.loader.get() +val fabricApiVersion = libs.versions.fabric.api.get() +val architecturyApiVersion = libs.versions.architectury.api.get() + +dependencies { + modImplementation("net.fabricmc:fabric-loader:$fabricLoaderVersion") + modImplementation("net.fabricmc.fabric-api:fabric-api:$fabricApiVersion") + modImplementation("dev.architectury:architectury-fabric:$architecturyApiVersion") + + add( + "common", project( + mapOf( + "path" to ":surf-roleplay-mod:surf-roleplay-mod-client:common", + "configuration" to "namedElements" + ) + ) + ) + + add( + "shadowBundle", project( + mapOf( + "path" to ":surf-roleplay-mod:surf-roleplay-mod-client:common", + "configuration" to "transformProductionFabric" + ) + ) + ) +} + +tasks.processResources { + inputs.property("version", project.version) + + filesMatching("fabric.mod.json") { + expand("version" to project.version) + } +} + +tasks.withType { + configurations = listOf(project.configurations.getByName("shadowBundle")) + archiveClassifier.set("dev-shadow") +} + +tasks.withType { + input.set(tasks.withType()["shadowJar"].archiveFile) +} diff --git a/surf-roleplay-mod/surf-roleplay-mod-client/fabric/src/main/kotlin/dev/slne/surf/roleplay/mod/fabric/RoleplayFabricMod.java b/surf-roleplay-mod/surf-roleplay-mod-client/fabric/src/main/kotlin/dev/slne/surf/roleplay/mod/fabric/RoleplayFabricMod.java new file mode 100644 index 0000000..0329b09 --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-client/fabric/src/main/kotlin/dev/slne/surf/roleplay/mod/fabric/RoleplayFabricMod.java @@ -0,0 +1,11 @@ +package dev.slne.surf.roleplay.mod.fabric; + +import net.fabricmc.api.ClientModInitializer; + +public final class RoleplayFabricMod implements ClientModInitializer { + + @Override + public void onInitializeClient() { + // This entrypoint is suitable for setting up client-specific logic, such as rendering. + } +} diff --git a/surf-roleplay-mod/surf-roleplay-mod-client/fabric/src/main/resources/fabric.mod.json b/surf-roleplay-mod/surf-roleplay-mod-client/fabric/src/main/resources/fabric.mod.json new file mode 100644 index 0000000..230af70 --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-client/fabric/src/main/resources/fabric.mod.json @@ -0,0 +1,31 @@ +{ + "schemaVersion": 1, + "id": "surf-roleplay", + "version": "${version}", + "name": "surf-roleplay", + "description": "", + "authors": [ + "SLNE Development" + ], + "contact": { + "homepage": "" + }, + "license": "All-Rights-Reserved", + "icon": "assets/roleplay/icon.png", + "environment": "*", + "entrypoints": { + "client": [ + "dev.slne.surf.roleplay.mod.fabric.RoleplayFabricMod" + ] + }, + "mixins": [ + "roleplay.mixins.json" + ], + "depends": { + "fabricloader": ">=0.17.2", + "minecraft": "~1.21", + "java": ">=21", + "architectury": ">=13.0.8", + "fabric-api": "*" + } +} diff --git a/surf-roleplay-mod/surf-roleplay-mod-client/neoforge/build.gradle.kts b/surf-roleplay-mod/surf-roleplay-mod-client/neoforge/build.gradle.kts new file mode 100644 index 0000000..72e6327 --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-client/neoforge/build.gradle.kts @@ -0,0 +1,70 @@ +import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar +import net.fabricmc.loom.task.RemapJarTask + +plugins { + id("dev.slne.surf.surfapi.gradle.core") +} + +architectury { + platformSetupLoomIde() + neoForge() +} + +configurations { + create("common") { + isCanBeResolved = true + isCanBeConsumed = false + } + + named("compileClasspath").get().extendsFrom(configurations.getByName("common")) + named("runtimeClasspath").get().extendsFrom(configurations.getByName("common")) + named("developmentNeoForge").get().extendsFrom(configurations.getByName("common")) + + create("shadowBundle") { + isCanBeResolved = true + isCanBeConsumed = false + } +} + +val neoForgeVersion = libs.versions.neoforge.get() +val architecturyApiVersion = libs.versions.architectury.api.get() + +dependencies { + neoForge("net.neoforged:neoforge:$neoForgeVersion") + modImplementation("dev.architectury:architectury-neoforge:$architecturyApiVersion") + + add( + "common", project( + mapOf( + "path" to ":surf-roleplay-mod:surf-roleplay-mod-client:common", + "configuration" to "namedElements" + ) + ) + ) + + add( + "shadowBundle", project( + mapOf( + "path" to ":surf-roleplay-mod:surf-roleplay-mod-client:common", + "configuration" to "transformProductionNeoForge" + ) + ) + ) +} + +tasks.processResources { + inputs.property("version", project.version) + + filesMatching("META-INF/neoforge.mods.toml") { + expand("version" to project.version) + } +} + +tasks.withType { + configurations = listOf(project.configurations.getByName("shadowBundle")) + archiveClassifier.set("dev-shadow") +} + +tasks.withType { + input.set(tasks.withType()["shadowJar"].archiveFile) +} diff --git a/surf-roleplay-mod/surf-roleplay-mod-client/neoforge/gradle.properties b/surf-roleplay-mod/surf-roleplay-mod-client/neoforge/gradle.properties new file mode 100644 index 0000000..7da18ea --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-client/neoforge/gradle.properties @@ -0,0 +1 @@ +loom.platform=neoforge diff --git a/surf-roleplay-mod/surf-roleplay-mod-client/neoforge/src/main/kotlin/dev/slne/surf/roleplay/mod/neoforge/RoleplayNeoforgeMod.kt b/surf-roleplay-mod/surf-roleplay-mod-client/neoforge/src/main/kotlin/dev/slne/surf/roleplay/mod/neoforge/RoleplayNeoforgeMod.kt new file mode 100644 index 0000000..6d09167 --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-client/neoforge/src/main/kotlin/dev/slne/surf/roleplay/mod/neoforge/RoleplayNeoforgeMod.kt @@ -0,0 +1,12 @@ +package dev.slne.surf.roleplay.mod.neoforge + +import dev.slne.surf.roleplay.mod.common.RoleplayMod +import net.neoforged.fml.common.Mod + +@Mod(RoleplayMod.MOD_ID) +class RoleplayNeoForgeModa { + init { + // Run our common setup. + RoleplayMod.init() + } +} diff --git a/surf-roleplay-mod/surf-roleplay-mod-client/neoforge/src/main/resources/META-INF/neoforge.mods.toml b/surf-roleplay-mod/surf-roleplay-mod-client/neoforge/src/main/resources/META-INF/neoforge.mods.toml new file mode 100644 index 0000000..76280d6 --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-client/neoforge/src/main/resources/META-INF/neoforge.mods.toml @@ -0,0 +1,24 @@ +modLoader = "javafml" +loaderVersion = "[2,)" +#issueTrackerURL = "" +license = "All Rights Reserved" + +[[mods]] +modId = "surf-roleplay" +version = "${version}" +displayName = "surf-roleplay" +authors = "SLNE Development" +description = ''' + +''' +#logoFile = "" + +#[[dependencies.testmod3]] +#modId = "neoforge" +#type = "required" +#versionRange = "[21,)" +#ordering = "NONE" +#side = "BOTH" + +[[mixins]] +config = "roleplay.mixins.json" diff --git a/surf-roleplay-mod/surf-roleplay-mod-client/src/main/kotlin/dev/slne/roleplay/mod/RoleplayMod.kt b/surf-roleplay-mod/surf-roleplay-mod-client/src/main/kotlin/dev/slne/roleplay/mod/RoleplayMod.kt deleted file mode 100644 index a16c9d2..0000000 --- a/surf-roleplay-mod/surf-roleplay-mod-client/src/main/kotlin/dev/slne/roleplay/mod/RoleplayMod.kt +++ /dev/null @@ -1,9 +0,0 @@ -package dev.slne.roleplay.mod - -import net.fabricmc.api.ClientModInitializer - -object RoleplayMod : ClientModInitializer { - override fun onInitializeClient() { -// Keybinds.registerKeybindings() - } -} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-client/src/main/resources/roleplay.mixins.json b/surf-roleplay-mod/surf-roleplay-mod-client/src/main/resources/roleplay.mixins.json deleted file mode 100644 index 748935e..0000000 --- a/surf-roleplay-mod/surf-roleplay-mod-client/src/main/resources/roleplay.mixins.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "required": true, - "package": "dev.slne.roleplay.mod.mixin", - "compatibilityLevel": "JAVA_21", - "mixins": [ - "ExampleMixin" - ], - "injectors": { - "defaultRequire": 1 - }, - "overwrites": { - "requireAnnotations": true - } -} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/build.gradle.kts b/surf-roleplay-mod/surf-roleplay-mod-common/build.gradle.kts index 163a977..65e13dc 100644 --- a/surf-roleplay-mod/surf-roleplay-mod-common/build.gradle.kts +++ b/surf-roleplay-mod/surf-roleplay-mod-common/build.gradle.kts @@ -3,8 +3,5 @@ plugins { } dependencies { - compileOnlyApi(libs.netty) - compileOnlyApi(libs.datafixerupper) - api(libs.bytebuddy) - api(libs.kotlin.byte.buf.serializer) + compileOnlyApi(libs.protoweaver.common) } \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/PacketRegistry.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/PacketRegistry.kt deleted file mode 100644 index 2f250ae..0000000 --- a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/PacketRegistry.kt +++ /dev/null @@ -1,77 +0,0 @@ -package dev.slne.roleplay.mod.common.network - -import dev.slne.roleplay.mod.common.network.packets.RoleplayPacket -import dev.slne.roleplay.mod.common.network.protocol.DefaultIds -import dev.slne.roleplay.mod.common.network.protocol.clientbound.ClientboundHandshakePacket -import dev.slne.roleplay.mod.common.network.protocol.serverbound.ServerboundHandshakePacket -import dev.slne.roleplay.mod.common.network.utils.RoleplayPacketHandler -import dev.slne.roleplay.mod.common.network.utils.RoleplayPacketListener -import dev.slne.roleplay.mod.common.network.utils.SurfByteBuf -import dev.slne.surf.surfapi.core.api.util.logger -import dev.slne.surf.surfapi.core.api.util.mutableObject2ObjectMapOf -import dev.slne.surf.surfapi.core.api.util.toObjectSet -import it.unimi.dsi.fastutil.objects.ObjectSet -import kotlin.reflect.KClass -import kotlin.reflect.KFunction -import kotlin.reflect.full.callSuspend -import kotlin.reflect.full.hasAnnotation -import kotlin.reflect.full.memberFunctions - -@Suppress("UNCHECKED_CAST") -object PacketRegistry { - - private val log = logger() - - private val packets = mutableObject2ObjectMapOf>() - private val listeners = - mutableObject2ObjectMapOf, KClass>>>() - - init { - registerPacket(DefaultIds.CLIENTBOUND_HANDSHAKE, ClientboundHandshakePacket::class) - registerPacket(DefaultIds.SERVERBOUND_HANDSHAKE, ServerboundHandshakePacket::class) - } - - fun registerPacket(packetId: String, packetClass: KClass) { - packets[packetId] = packetClass - } - - fun registerListener(listener: RoleplayPacketListener) { - val methods = listener::class.memberFunctions - .filter { it.hasAnnotation() } - .toObjectSet() - - val methodPairs = methods.map { method -> - method to method.parameters.firstOrNull()?.type?.classifier as? KClass - }.filter { it.second != null }.map { it.first to it.second!! }.toObjectSet() - - listeners[listener] = methodPairs - } - - fun getPacket(packetId: String) = packets[packetId] - - suspend fun callListeners(packetId: String, buffer: SurfByteBuf) { - val packetClass = packets[packetId] ?: error("Packet with ID '$packetId' is not registered") - val packet = packetClass.constructors.firstOrNull()?.call() - ?: error("Failed to create packet instance for ID '$packetId' (no default constructor?)") - - packet.read(buffer) - - listeners.forEach { (_, methods) -> - methods.forEach { (method, param) -> - if (param.isInstance(packetClass)) { - try { - if (method.isSuspend) { - method.callSuspend(packet) - } else { - method.call(packet) - } - } catch (exception: Exception) { - log.atSevere().withCause(exception) - .log("Error while calling packet listener method: ${method.name} for packet ID: $packetId") - } - } - } - } - } - -} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/SurfRoleplayPacket.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/SurfRoleplayPacket.kt deleted file mode 100644 index 2a8ca1a..0000000 --- a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/SurfRoleplayPacket.kt +++ /dev/null @@ -1,10 +0,0 @@ -package dev.slne.roleplay.mod.common.network - -import dev.slne.roleplay.mod.common.network.utils.PacketFlow - -@Target(AnnotationTarget.CLASS) -@Retention(AnnotationRetention.RUNTIME) -annotation class SurfRoleplayPacket( - val id: String, - val flow: PacketFlow, -) \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/connection/Connection.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/connection/Connection.kt deleted file mode 100644 index 80e875c..0000000 --- a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/connection/Connection.kt +++ /dev/null @@ -1,48 +0,0 @@ -package dev.slne.roleplay.mod.common.network.connection - -import dev.slne.roleplay.mod.common.network.packets.RoleplayPacket -import kotlinx.coroutines.CompletableDeferred - -interface Connection { - val receivedPackets: Int - val sentPackets: Int - val averageReceivedPackets: Float - val averageSentPackets: Float - - val latency: Int - - /** - * Sends a packet to the connection. - * - * @param packet The [RoleplayPacket] to send. - * @param flush Whether to flush the packet immediately. Defaults to `true`. - */ - fun send(packet: RoleplayPacket, flush: Boolean = true) - - /** - * Sends a packet with a sign of success, suspending until the operation completes. - * - * @param packet The [RoleplayPacket] to send. - * @param flush Whether to flush the packet immediately. Defaults to `true`. - * @param convertExceptions Whether to convert exceptions. - * @return `true` if the packet was sent successfully; `false` otherwise. - */ - suspend fun sendWithIndication( - packet: RoleplayPacket, - flush: Boolean = true, - convertExceptions: Boolean = true - ): Boolean - - /** - * Sends a packet with a [CompletableDeferred] indication of success. - * - * @param packet The [RoleplayPacket] to send. - * @param flush Whether to flush the packet immediately. Defaults to `true`. - * @param deferred The [CompletableDeferred] to complete upon success or failure. - */ - fun sendWithIndication( - packet: RoleplayPacket, - flush: Boolean = true, - deferred: CompletableDeferred - ) -} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/listener/NetworkListener.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/listener/NetworkListener.kt deleted file mode 100644 index 0b8b06c..0000000 --- a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/listener/NetworkListener.kt +++ /dev/null @@ -1,38 +0,0 @@ -package dev.slne.roleplay.mod.common.network.listener - -import com.github.retrooper.packetevents.event.PacketListener -import com.github.retrooper.packetevents.event.PacketReceiveEvent -import com.github.retrooper.packetevents.protocol.packettype.PacketType -import dev.slne.roleplay.mod.common.network.PacketRegistry -import dev.slne.roleplay.mod.common.network.utils.SurfByteBuf -import dev.slne.surf.surfapi.core.api.util.logger -import io.netty.buffer.ByteBuf -import kotlinx.coroutines.* - -object NetworkListener : PacketListener { - - private val log = logger() - - private val supervisor = SupervisorJob() - private val exceptionHandler = CoroutineExceptionHandler { context, throwable -> - log.atSevere().withCause(throwable) - .log("Exception in network listener coroutine: ${context[CoroutineName]?.name ?: "unknown"}") - } - private val scope = - CoroutineScope(supervisor + CoroutineName("NetworkListener") + exceptionHandler) - - override fun onPacketReceive(event: PacketReceiveEvent) { - if (!(event.packetType == PacketType.Play.Server.PLUGIN_MESSAGE || - event.packetType == PacketType.Play.Client.PLUGIN_MESSAGE) - ) return - - val eventBuffer = event.byteBuf as ByteBuf - val buffer = SurfByteBuf(eventBuffer) - - val packetId = buffer.readUtf() - - scope.launch { - PacketRegistry.callListeners(packetId, buffer) - } - } -} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/packets/RespondingRoleplayPacket.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/packets/RespondingRoleplayPacket.kt deleted file mode 100644 index 230061f..0000000 --- a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/packets/RespondingRoleplayPacket.kt +++ /dev/null @@ -1,60 +0,0 @@ -package dev.slne.roleplay.mod.common.network.packets - -import dev.slne.roleplay.mod.common.network.connection.Connection -import dev.slne.roleplay.mod.common.network.utils.SurfByteBuf -import kotlinx.coroutines.CompletableDeferred -import kotlinx.coroutines.withTimeout -import kotlinx.coroutines.withTimeoutOrNull -import java.util.* -import kotlin.time.Duration -import kotlin.time.Duration.Companion.seconds - -val DEFAULT_TIMEOUT = 15.seconds -val DEFAULT_URGENT_TIMEOUT = 5.seconds - -abstract class RespondingRoleplayPacket : RoleplayPacket() { - - private var uniqueSessionId: UUID? = null - lateinit var responseConnection: Connection - - val response = CompletableDeferred() - - suspend fun fireAndAwait( - connection: Connection, - timeout: Duration = DEFAULT_TIMEOUT - ): R? = withTimeoutOrNull(timeout) { - connection.send(this@RespondingRoleplayPacket) - response.await() - } - - suspend fun fireAndAwaitUrgent(connection: Connection): R? = - fireAndAwait(connection, DEFAULT_URGENT_TIMEOUT) - - suspend fun fireAndAwaitOrThrow( - connection: Connection, - timeout: Duration = DEFAULT_TIMEOUT - ): R = withTimeout(timeout) { - connection.send(this@RespondingRoleplayPacket) - response.await() - } - - suspend fun fireAndAwaitOrThrowUrgent(connection: Connection): R = - fireAndAwaitOrThrow(connection, DEFAULT_URGENT_TIMEOUT) - - fun respond(packet: R) { - packet.responseTo = uniqueSessionId - ?: error("Responding packet has no session id. Are you sure it was sent?") - responseConnection.send(packet) - } - - override fun write(buffer: SurfByteBuf) { - buffer.writeUuid(getUniqueSessionIdOrCreate()) - } - - override fun read(buffer: SurfByteBuf) { - uniqueSessionId = buffer.readUuid() - } - - fun getUniqueSessionIdOrCreate(): UUID = - uniqueSessionId ?: UUID.randomUUID().also { uniqueSessionId = it } -} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/packets/ResponseRoleplayPacket.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/packets/ResponseRoleplayPacket.kt deleted file mode 100644 index f8c17a9..0000000 --- a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/packets/ResponseRoleplayPacket.kt +++ /dev/null @@ -1,17 +0,0 @@ -package dev.slne.roleplay.mod.common.network.packets - -import dev.slne.roleplay.mod.common.network.utils.SurfByteBuf -import java.util.* - -abstract class ResponseRoleplayPacket() : RoleplayPacket() { - - lateinit var responseTo: UUID - - override fun write(buffer: SurfByteBuf) { - buffer.writeUuid(responseTo) - } - - override fun read(buffer: SurfByteBuf) { - responseTo = buffer.readUuid() - } -} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/packets/RoleplayPacket.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/packets/RoleplayPacket.kt deleted file mode 100644 index 75208a3..0000000 --- a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/packets/RoleplayPacket.kt +++ /dev/null @@ -1,30 +0,0 @@ -package dev.slne.roleplay.mod.common.network.packets - -import dev.slne.roleplay.mod.common.network.utils.SurfByteBuf -import dev.slne.roleplay.mod.common.network.utils.codec.StreamCodec -import dev.slne.roleplay.mod.common.network.utils.codec.StreamDecoder -import dev.slne.roleplay.mod.common.network.utils.codec.StreamMemberEncoder -import dev.slne.roleplay.mod.common.network.utils.getPacketMeta -import io.netty.buffer.ByteBuf - -abstract class RoleplayPacket() { - - @Transient - private val meta = this::class.getPacketMeta() - - @Transient - val id = meta.id - - abstract fun write(buffer: SurfByteBuf) - - abstract fun read(buffer: SurfByteBuf) - - companion object { - @JvmStatic - fun codec( - encoder: StreamMemberEncoder, - decoder: StreamDecoder - ): StreamCodec = StreamCodec.ofMember(encoder, decoder) - } - -} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/protocol/clientbound/ClientboundHandshakePacket.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/protocol/clientbound/ClientboundHandshakePacket.kt deleted file mode 100644 index 94fbb2c..0000000 --- a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/protocol/clientbound/ClientboundHandshakePacket.kt +++ /dev/null @@ -1,31 +0,0 @@ -package dev.slne.roleplay.mod.common.network.protocol.clientbound - -import dev.slne.roleplay.mod.common.network.SurfRoleplayPacket -import dev.slne.roleplay.mod.common.network.packets.RespondingRoleplayPacket -import dev.slne.roleplay.mod.common.network.protocol.DefaultIds -import dev.slne.roleplay.mod.common.network.protocol.serverbound.ServerboundHandshakePacket -import dev.slne.roleplay.mod.common.network.utils.PacketFlow -import dev.slne.roleplay.mod.common.network.utils.SurfByteBuf -import java.util.* - -@SurfRoleplayPacket(id = DefaultIds.CLIENTBOUND_HANDSHAKE, flow = PacketFlow.CLIENTBOUND) -class ClientboundHandshakePacket() : RespondingRoleplayPacket() { - - lateinit var handshake: UUID - - constructor(handshake: UUID) : this() { - this.handshake = handshake - } - - override fun write(buffer: SurfByteBuf) { - super.write(buffer) - - buffer.writeUuid(handshake) - } - - override fun read(buffer: SurfByteBuf) { - super.read(buffer) - - handshake = buffer.readUuid() - } -} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/protocol/serverbound/ServerboundHandshakePacket.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/protocol/serverbound/ServerboundHandshakePacket.kt deleted file mode 100644 index be7b52c..0000000 --- a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/protocol/serverbound/ServerboundHandshakePacket.kt +++ /dev/null @@ -1,34 +0,0 @@ -package dev.slne.roleplay.mod.common.network.protocol.serverbound - -import dev.slne.roleplay.mod.common.network.SurfRoleplayPacket -import dev.slne.roleplay.mod.common.network.packets.ResponseRoleplayPacket -import dev.slne.roleplay.mod.common.network.protocol.DefaultIds -import dev.slne.roleplay.mod.common.network.utils.PacketFlow -import dev.slne.roleplay.mod.common.network.utils.SurfByteBuf -import java.util.* - -@SurfRoleplayPacket(id = DefaultIds.SERVERBOUND_HANDSHAKE, flow = PacketFlow.SERVERBOUND) -class ServerboundHandshakePacket() : ResponseRoleplayPacket() { - - lateinit var handshake: UUID - lateinit var clientVersion: String - - constructor(handshake: UUID, clientVersion: String) : this() { - this.handshake = handshake - this.clientVersion = clientVersion - } - - override fun write(buffer: SurfByteBuf) { - super.write(buffer) - - buffer.writeUuid(handshake) - buffer.writeUtf(clientVersion) - } - - override fun read(buffer: SurfByteBuf) { - super.read(buffer) - - handshake = buffer.readUuid() - clientVersion = buffer.readUtf() - } -} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/PacketFlow.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/PacketFlow.kt deleted file mode 100644 index ba9a25c..0000000 --- a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/PacketFlow.kt +++ /dev/null @@ -1,20 +0,0 @@ -package dev.slne.roleplay.mod.common.network.utils - -enum class PacketFlow { - CLIENTBOUND, - SERVERBOUND, - BIDIRECTIONAL; - - fun getOpposite(): PacketFlow { - if (this == BIDIRECTIONAL) throw IllegalStateException("Cannot get opposite of BOTH") - return if (this == CLIENTBOUND) SERVERBOUND else CLIENTBOUND - } - - fun displayName(): String { - return when (this) { - CLIENTBOUND -> "C -> S" - SERVERBOUND -> "S -> C" - BIDIRECTIONAL -> "C <-> S" - } - } -} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/RoleplayPacketListener.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/RoleplayPacketListener.kt deleted file mode 100644 index 0c5ff35..0000000 --- a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/RoleplayPacketListener.kt +++ /dev/null @@ -1,3 +0,0 @@ -package dev.slne.roleplay.mod.common.network.utils - -interface RoleplayPacketListener \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/SurfByteBuf.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/SurfByteBuf.kt deleted file mode 100644 index 34e6c2f..0000000 --- a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/SurfByteBuf.kt +++ /dev/null @@ -1,1058 +0,0 @@ -@file:OptIn(ExperimentalContracts::class) - -package dev.slne.roleplay.mod.common.network.utils - -import dev.slne.roleplay.mod.common.network.utils.SurfByteBuf.Companion -import dev.slne.roleplay.mod.common.network.utils.codec.ExtraCodecs -import dev.slne.roleplay.mod.common.network.utils.codec.StreamCodec -import dev.slne.roleplay.mod.common.network.utils.codec.kotlinx.SurfCloudBufSerializer -import dev.slne.roleplay.mod.common.network.utils.decoder.DecodeFactory -import dev.slne.roleplay.mod.common.network.utils.decoder.DecodeFactory.DecodeLongFactory -import dev.slne.roleplay.mod.common.network.utils.ecoder.EncodeFactory -import dev.slne.roleplay.mod.common.network.utils.ecoder.EncodeFactory.EncodeLongFactory -import dev.slne.roleplay.mod.common.network.utils.types.Utf8String -import dev.slne.roleplay.mod.common.network.utils.types.VarInt -import dev.slne.roleplay.mod.common.network.utils.types.VarLong -import io.netty.buffer.ByteBuf -import io.netty.buffer.ByteBufAllocator -import io.netty.buffer.PooledByteBufAllocator -import io.netty.buffer.WrappedByteBuf -import io.netty.handler.codec.DecoderException -import io.netty.handler.codec.EncoderException -import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap -import it.unimi.dsi.fastutil.objects.ObjectArrayList -import kotlinx.serialization.KSerializer -import net.kyori.adventure.text.Component -import java.io.* -import java.math.BigDecimal -import java.math.BigInteger -import java.math.MathContext -import java.net.Inet4Address -import java.net.InetSocketAddress -import java.net.URI -import java.time.Instant -import java.time.ZoneId -import java.time.ZonedDateTime -import java.util.* -import java.util.function.Consumer -import kotlin.contracts.ExperimentalContracts -import kotlin.contracts.contract -import kotlin.reflect.KClass -import kotlin.time.Duration -import kotlin.time.Duration.Companion.milliseconds - -private const val NUMBER_BYTE: Byte = 0 -private const val NUMBER_SHORT: Byte = 1 -private const val NUMBER_INT: Byte = 2 -private const val NUMBER_LONG: Byte = 3 -private const val NUMBER_FLOAT: Byte = 4 -private const val NUMBER_DOUBLE: Byte = 5 - -/** - * Provides utilities for encoding and decoding data into a [ByteBuf] for network communication. - * - * ### Overview - * The `SurfByteBuf` and its companion object offer a wide range of functionality to serialize and deserialize - * primitives, collections, enums, and complex objects. These utilities are tailored for the Surf Cloud application - * to ensure efficient and reliable data transmission. - * - * ### Key Features - * - **Primitive Encoding/Decoding**: Supports all standard primitives and unsigned variants. - * - **Collection Support**: Read and write lists, maps, arrays, and custom collections. - * - **Custom Serialization**: Read and write custom objects, including JSON-encoded structures. - * - **Enum Handling**: Specialized methods for working with enums and enum sets. - * - **Optional and Nullable Support**: Methods for handling `Optional` and nullable values. - * - **Integration with Netty**: Extensions for Netty's [ByteBuf] provide a seamless interface. - * - * ### Example Usage - * #### Encoding and Decoding a String - * ```kotlin - * val buffer = Unpooled.buffer() - * SurfByteBuf.writeUtf(buffer, "Hello, Surf Cloud!") - * val result = SurfByteBuf.readUtf(buffer) - * println(result) // Output: "Hello, Surf Cloud!" - * ``` - * - * #### Working with Collections - * ```kotlin - * val buffer = Unpooled.buffer() - * val numbers = listOf(1, 2, 3, 4, 5) - * SurfByteBuf.writeCollection(buffer, numbers) { buf, value -> buf.writeVarInt(value) } - * val decodedNumbers = SurfByteBuf.readCollection(buffer, { ArrayList(it) }) { buf -> buf.readVarInt() } - * println(decodedNumbers) // Output: [1, 2, 3, 4, 5] - * ``` - * - * ### Extensibility - * Developers can extend the functionality by using the provided codecs or integrating new types. - * Custom objects can leverage `ExtraCodecs` or implement their serialization logic within the framework. - */ -open class SurfByteBuf(source: ByteBuf) : WrappedByteBuf(source) { - companion object { - val alloc: ByteBufAllocator = PooledByteBufAllocator.DEFAULT - - fun streamCodecFromKotlin(serializer: KSerializer): StreamCodec { - return SerializerCodec(serializer) - } - - private class SerializerCodec(private val serializer: KSerializer) : - StreamCodec { - override fun decode(buf: B): T { - return SurfCloudBufSerializer.serializer.decodeFromBuf(buf, serializer) - } - - override fun encode( - buf: B, - value: T - ) { - SurfCloudBufSerializer.serializer.encodeToBuf(buf, serializer, value) - } - } - - fun readComponent(buf: ByteBuf) = ExtraCodecs.COMPONENT_STREAM.decode(buf) - fun writeComponent(buf: ByteBuf, component: Component) = - ExtraCodecs.COMPONENT_STREAM.encode(buf, component) - - fun writeNumber(buf: ByteBuf, number: Number): Any = when (number) { - is Byte -> { - buf.writeByte(NUMBER_BYTE.toInt()) - buf.writeByte(number.toInt()) - } - - is Short -> { - buf.writeByte(NUMBER_SHORT.toInt()) - buf.writeShort(number.toInt()) - } - - is Int -> { - buf.writeByte(NUMBER_INT.toInt()) - writeVarInt(buf, number) - } - - is Long -> { - buf.writeByte(NUMBER_LONG.toInt()) - writeVarLong(buf, number) - } - - is Float -> { - buf.writeByte(NUMBER_FLOAT.toInt()) - buf.writeFloat(number) - } - - is Double -> { - buf.writeByte(NUMBER_DOUBLE.toInt()) - buf.writeDouble(number) - } - - else -> throw EncoderException("Unsupported number type: ${number.javaClass}") - } - - fun readNumber(buf: ByteBuf) = when (buf.readByte()) { - NUMBER_BYTE -> buf.readByte() - NUMBER_SHORT -> buf.readShort() - NUMBER_INT -> readVarInt(buf) - NUMBER_LONG -> readVarLong(buf) - NUMBER_FLOAT -> buf.readFloat() - NUMBER_DOUBLE -> buf.readDouble() - else -> throw DecoderException("Unknown number type") - } - - fun writeUnsigned(buf: ByteBuf, value: Byte) { - checkEncoded(value >= 0) { "Value must be positive" } - buf.writeByte(value.toInt() and 0xFF) - } - - fun writeUnsigned(buf: ByteBuf, value: Short) { - checkEncoded(value >= 0) { "Value must be positive" } - buf.writeShort(value.toInt() and 0xFFFF) - } - - fun writeUnsigned(buf: ByteBuf, value: Int) { - checkEncoded(value >= 0) { "Value must be positive" } - buf.writeInt(value and 0xFFFFFFFF.toInt()) - } - - fun writeUnsigned(buf: ByteBuf, value: Long) { - checkEncoded(value >= 0) { "Value must be positive" } - buf.writeLong(value) - } - - fun writeUnsigned(buf: ByteBuf, value: Float) { - checkEncoded(value >= 0) { "Value must be positive" } - buf.writeFloat(value) - } - - fun writeUnsigned(buf: ByteBuf, value: Double) { - checkEncoded(value >= 0) { "Value must be positive" } - buf.writeDouble(value) - } - - fun readUnsignedByte(buf: ByteBuf) = buf.readUnsignedByte() - fun readUnsignedShort(buf: ByteBuf) = buf.readUnsignedShort() - fun readUnsignedInt(buf: ByteBuf) = buf.readUnsignedInt() - fun readUnsignedLong(buf: ByteBuf) = buf.readLong() - fun readUnsignedFloat(buf: ByteBuf) = buf.readFloat() - fun readUnsignedDouble(buf: ByteBuf) = buf.readDouble() - - fun , B : ByteBuf> readCollection( - buf: B, - collectionFactory: (Int) -> C, - decodeFactory: DecodeFactory - ): C { - val size = buf.readVarInt() - val collection = collectionFactory(size) - - repeat(size) { collection.add(decodeFactory(buf)) } - - return collection - } - - fun writeCollection( - buf: B, - collection: Collection, - encodeFactory: EncodeFactory - ) { - buf.writeVarInt(collection.size) - - for (element in collection) { - encodeFactory(buf, element) - } - } - - inline fun readArray( - buf: B, - decodeFactory: DecodeFactory - ) = Array(buf.readVarInt()) { decodeFactory.invoke(buf) } - - fun readArray( - buf: B, - arrayFactory: (Int) -> Array, - decodeFactory: DecodeFactory - ): Array { - val size = buf.readVarInt() - val array = arrayFactory(size) - - for (i in 0 until size) { - array[i] = decodeFactory.invoke(buf) - } - - return array - } - - fun readIntArray(buf: B) = IntArray(buf.readVarInt()).apply { - for (i in indices) { - this[i] = buf.readVarInt() - } - } - - fun readLongArray(buf: B) = LongArray(buf.readVarInt()).apply { - for (i in indices) { - this[i] = buf.readLong() - } - } - - fun readFloatArray(buf: B) = FloatArray(buf.readVarInt()).apply { - for (i in indices) { - this[i] = buf.readFloat() - } - } - - fun readDoubleArray(buf: B) = DoubleArray(buf.readVarInt()).apply { - for (i in indices) { - this[i] = buf.readDouble() - } - } - - fun readBooleanArray(buf: B) = BooleanArray(buf.readVarInt()).apply { - for (i in indices) { - this[i] = buf.readBoolean() - } - } - - fun readByteArray(buf: B) = ByteArray(buf.readVarInt()).apply { - buf.readBytes(this) - } - - fun readShortArray(buf: B) = ShortArray(buf.readVarInt()).apply { - for (i in indices) { - this[i] = buf.readShort() - } - } - - fun readCharArray(buf: B) = CharArray(buf.readVarInt()).apply { - for (i in indices) { - this[i] = buf.readChar() - } - } - - fun readStringArray(buf: B) = Array(buf.readVarInt()) { readUtf(buf) } - fun readUuidArray(buf: B) = Array(buf.readVarInt()) { readUuid(buf) } - - fun writeArray( - buf: B, - array: Array, - encodeFactory: EncodeFactory - ) { - buf.writeVarInt(array.size) - - for (element in array) { - encodeFactory.invoke(buf, element) - } - } - - fun writeIntArray(buf: B, array: IntArray) { - buf.writeVarInt(array.size) - for (element in array) { - buf.writeVarInt(element) - } - } - - fun writeLongArray(buf: B, array: LongArray) { - buf.writeVarInt(array.size) - for (element in array) { - buf.writeLong(element) - } - } - - fun writeFloatArray(buf: B, array: FloatArray) { - buf.writeVarInt(array.size) - for (element in array) { - buf.writeFloat(element) - } - } - - fun writeDoubleArray(buf: B, array: DoubleArray) { - buf.writeVarInt(array.size) - for (element in array) { - buf.writeDouble(element) - } - } - - fun writeBooleanArray(buf: B, array: BooleanArray) { - buf.writeVarInt(array.size) - for (element in array) { - buf.writeBoolean(element) - } - } - - fun writeByteArray(buf: B, array: ByteArray) { - buf.writeVarInt(array.size) - buf.writeBytes(array) - } - - fun writeShortArray(buf: B, array: ShortArray) { - buf.writeVarInt(array.size) - for (element in array) { - buf.writeShort(element.toInt()) - } - } - - fun writeCharArray(buf: B, array: CharArray) { - buf.writeVarInt(array.size) - for (element in array) { - buf.writeChar(element.code) - } - } - - fun writeStringArray(buf: B, array: Array) { - buf.writeVarInt(array.size) - for (element in array) { - writeUtf(buf, element) - } - } - - fun writeUuidArray(buf: B, array: Array) { - buf.writeVarInt(array.size) - for (element in array) { - writeUuid(buf, element) - } - } - - fun readList( - buf: B, - decodeFactory: DecodeFactory - ) = readCollection(buf, { ObjectArrayList(it) }, decodeFactory) - - fun , B : ByteBuf> readMap( - buf: B, - mapFactory: (Int) -> M, - keyDecodeFactory: DecodeFactory, - valueDecodeFactory: DecodeFactory - ): M { - val size = buf.readVarInt() - val map = mapFactory(size) - - for (i in 0 until size) { - val key = keyDecodeFactory.invoke(buf) - val value = valueDecodeFactory.invoke(buf) - - map[key] = value - } - - return map - } - - fun readMap( - buf: B, - keyDecodeFactory: DecodeFactory, - valueDecodeFactory: DecodeFactory - ) = readMap(buf, { Object2ObjectOpenHashMap(it) }, keyDecodeFactory, valueDecodeFactory) - - fun writeMap( - buf: B, - map: Map, - keyEncodeFactory: EncodeFactory, - valueEncodeFactory: EncodeFactory - ) { - buf.writeVarInt(map.size) - - for ((key, value) in map) { - keyEncodeFactory.invoke(buf, key) - valueEncodeFactory.invoke(buf, value) - } - } - - inline fun > readEnumSet(buf: ByteBuf) = readEnumSet(buf, E::class.java) - fun > readEnumSet( - buf: ByteBuf, - enumClass: KClass - ) = readEnumSet(buf, enumClass.java) - - fun > readEnumSet( - buf: ByteBuf, - enumClass: Class - ): EnumSet { - val values = enumClass.enumConstants - val bitSet = readFixedBitSet(buf, values.size) - val enumSet = EnumSet.noneOf(enumClass) - - for (i in values.indices) { - if (bitSet[i]) { - enumSet.add(values[i]) - } - } - - return enumSet - } - - fun > writeEnumSet( - buf: ByteBuf, - enumSet: EnumSet, - enumClass: Class - ) { - val values = enumClass.enumConstants - val bitSet = BitSet(values.size) - - for (i in values.indices) { - bitSet[i] = enumSet.contains(values[i]) - } - - writeFixedBitSet(buf, bitSet, values.size) - } - - fun > writeEnumSet( - buf: ByteBuf, - enumSet: EnumSet, - enumClass: KClass - ) = writeEnumSet(buf, enumSet, enumClass.java) - - fun > readEnum(buf: ByteBuf, enumClass: Class): E = - enumClass.enumConstants[buf.readVarInt()] - - fun > writeEnum(buf: ByteBuf, value: E) = buf.writeVarInt(value.ordinal) - - fun writeUuid(buf: ByteBuf, uuid: UUID) { - buf.writeLong(uuid.mostSignificantBits) - buf.writeLong(uuid.leastSignificantBits) - } - - fun readUuid(buf: ByteBuf) = UUID(buf.readLong(), buf.readLong()) - fun readBitSet(buf: ByteBuf): BitSet = BitSet.valueOf(readLongArray(buf)) - fun writeBitSet(buf: ByteBuf, bitSet: BitSet) = - writeLongArray(buf, bitSet.toLongArray()) - - fun readFixedBitSet(buf: ByteBuf, size: Int): BitSet = - ByteArray(positiveCeilDiv(size, Byte.SIZE_BITS)).run { - buf.readBytes(this) - BitSet.valueOf(this) - } - - fun writeFixedBitSet(buf: ByteBuf, bitSet: BitSet, size: Int): ByteBuf = - bitSet.length().let { bitSetSize -> - checkEncoded(bitSetSize <= size) { "BitSet is larger than expected size ($bitSetSize>$size)" } - buf.writeBytes(bitSet.toByteArray().copyOf(positiveCeilDiv(size, Byte.SIZE_BITS))) - } - - @JvmOverloads - fun readUtf(buf: ByteBuf, maxLength: Int = Int.MAX_VALUE) = Utf8String.read(buf, maxLength) - - @JvmOverloads - fun writeUtf(buf: ByteBuf, string: String, maxLength: Int = Int.MAX_VALUE) = - Utf8String.write(buf, string, maxLength) - - fun readVarInt(buf: ByteBuf) = VarInt.readVarInt(buf) - fun writeVarInt(buf: ByteBuf, value: Int) = VarInt.writeVarInt(buf, value) - fun readVarLong(buf: ByteBuf) = VarLong.readVarLong(buf) - fun writeVarLong(buf: ByteBuf, value: Long) = VarLong.writeVarLong(buf, value) - - fun writeWithCount(buf: B, count: Int, writer: (B) -> Unit) = buf.run { - writeVarInt(count) - for (i in 0 until count) { - writer(this) - } - } - - fun writeWithCount(buf: B, count: Int, writer: Consumer) = - writeWithCount(buf, count) { writer.accept(it) } - - fun readWithCount(buf: B, reader: (B) -> Unit) = buf.run { - for (i in 0 until readVarInt()) { - reader(this) - } - } - - fun readWithCount(buf: B, reader: Consumer) = - readWithCount(buf) { reader.accept(it) } - - fun readNullable( - buf: B, - decodeFactory: DecodeFactory - ): T? = if (buf.readBoolean()) decodeFactory(buf) else null - - fun writeNullable( - buf: B, - value: T?, - encodeFactory: EncodeFactory - ) { - buf.writeBoolean(value != null) - - if (value != null) { - encodeFactory(buf, value) - } - } - - fun writeOptional( - buf: B, - optional: Optional, - encodeFactory: EncodeFactory - ) { - buf.writeBoolean(optional.isPresent) - optional.ifPresent { encodeFactory(buf, it) } - } - - fun readOptional( - buf: B, - decodeFactory: DecodeFactory - ) = if (buf.readBoolean()) Optional.of(decodeFactory(buf)) else Optional.empty() - - @JvmOverloads - fun writeOptionalLong( - buf: B, - optional: OptionalLong, - encodeFactory: EncodeLongFactory = - EncodeLongFactory { buf, value -> buf.writeLong(value) } - ) { - buf.writeBoolean(optional.isPresent) - optional.ifPresent { encodeFactory.encodeLong(buf, it) } - } - - @JvmOverloads - fun readOptionalLong( - buf: B, - decodeFactory: DecodeLongFactory = - DecodeLongFactory { buf -> buf.readLong() } - ): OptionalLong = - if (buf.readBoolean()) OptionalLong.of(decodeFactory.decodeLong(buf)) else OptionalLong.empty() - - - @Deprecated("Use codec instead") - fun writeSerializable(buf: B, serializable: Serializable): ByteBuf = - ByteArrayOutputStream().use { bout -> - ObjectOutputStream(bout).use { out -> - try { - out.writeObject(serializable) - out.flush() - - val bytes = bout.toByteArray() - buf.writeVarInt(bytes.size) - buf.writeBytes(bytes) - } catch (e: IOException) { - throw EncoderException("Failed to write serializable", e) - } - - } - } - - @Suppress("UNCHECKED_CAST") - @Deprecated("Use codec instead") - fun readSerializable( - buf: B, - clazz: Class - ): T { - val bytes = ByteArray(buf.readVarInt()) - buf.readBytes(bytes) - return try { - ObjectInputStream(ByteArrayInputStream(bytes)).use { it.readObject() as T } - } catch (e: IOException) { - throw DecoderException("Failed to read serializable", e) - } catch (e: ClassNotFoundException) { - throw DecoderException("Failed to read serializable", e) - } catch (e: ClassCastException) { - throw DecoderException("Failed to cast serializable! Expected: $clazz", e) - } - } - - @Suppress("DEPRECATION") - @Deprecated("Use codec instead") - inline fun readSerializable( - buf: B, - ): T = readSerializable(buf, T::class.java) - - fun writeURI(buf: B, uri: URI) { - writeUtf(buf, uri.toString()) - } - - fun readURI(buf: B) = URI(readUtf(buf)) - - fun writeInetSocketAddress(buf: B, address: InetSocketAddress) { - writeUtf(buf, address.hostString) - buf.writeVarInt(address.port) - } - - fun writeZonedDateTime(buf: B, time: ZonedDateTime) { - buf.writeLong(time.toInstant().toEpochMilli()) - writeUtf(buf, time.zone.id) - } - - fun readZonedDateTime(buf: B): ZonedDateTime { - val epoch = buf.readLong() - val zone = readUtf(buf) - return ZonedDateTime.ofInstant(Instant.ofEpochMilli(epoch), ZoneId.of(zone)) - } - - fun writeInet4Address(buf: B, address: Inet4Address) { - writeByteArray(buf, address.address) - } - - fun readInet4Address(buf: B): Inet4Address { - val address = readByteArray(buf) - return Inet4Address.getByAddress(address) as Inet4Address - } - - fun writeSingleton(buf: B, singleton: Any) { - require(singleton::class.objectInstance != null) { "Object must be a singleton" } - writeUtf(buf, singleton::class.qualifiedName!!) - } - - fun readSingleton(buf: B, classLoader: ClassLoader): Any { - val className = readUtf(buf) - return Class.forName(className, true, classLoader).kotlin.objectInstance - ?: throw DecoderException("Failed to read singleton: $className") - } - - fun writeDuration(buf: B, duration: Duration) { - buf.writeLong(duration.inWholeMilliseconds) - } - - fun readDuration(buf: B): Duration { - return buf.readLong().milliseconds - } - - fun writeBigInteger(buf: B, value: BigInteger) { - writeByteArray(buf, value.toByteArray()) - } - - fun readBigInteger(buf: B): BigInteger { - return BigInteger(readByteArray(buf)) - } - - fun writeBigDecimal(buf: B, value: BigDecimal) { - writeBigInteger(buf, value.unscaledValue()) - buf.writeVarInt(value.scale()) - buf.writeVarInt(value.precision()) - } - - fun readBigDecimal(buf: B): BigDecimal { - val unscaledValue = readBigInteger(buf) - val scale = buf.readVarInt() - val precision = buf.readVarInt() - return BigDecimal(unscaledValue, scale, MathContext(precision)) - } - } - - // @formatter:off - @Suppress("DEPRECATION") - @Deprecated("Use codec instead") - fun writeSerializable(serializable: Serializable) = writeSerializable(this, serializable) - @Suppress("DEPRECATION") - @Deprecated("Use codec instead") - fun readSerializable(clazz: Class) = readSerializable(this, clazz) - @Suppress("DEPRECATION") - @Deprecated("Use codec instead") - inline fun readSerializable() = readSerializable(this, T::class.java) - fun writeURI(uri: URI) = writeURI(this, uri) - fun readURI() = readURI(this) - fun readComponent() = readComponent(this) - fun writeComponent(component: Component) = writeComponent(this, component) - fun writeNumber(number: Number) = writeNumber(this, number) - fun readNumber() = readNumber(this) - fun writeUnsigned(value: Byte) = writeUnsigned(this, value) - fun writeUnsigned(value: Short) = writeUnsigned(this, value) - fun writeUnsigned(value: Int) = writeUnsigned(this, value) - fun writeUnsigned(value: Long) = writeUnsigned(this, value) - fun writeUnsigned(value: Float) = writeUnsigned(this, value) - fun writeUnsigned(value: Double) = writeUnsigned(this, value) - fun readUnsignedLong() = readUnsignedLong(this) - fun readUnsignedFloat() = readUnsignedFloat(this) - fun readUnsignedDouble() = readUnsignedDouble(this) - fun > readCollection(collectionFactory: (Int) -> C, decodeFactory: DecodeFactory) = readCollection(this, collectionFactory, decodeFactory) - fun writeCollection(collection: Collection, encodeFactory: EncodeFactory) = writeCollection(this, collection, encodeFactory) - inline fun readArray(decodeFactory: DecodeFactory) = readArray(this, decodeFactory) - fun readArray(arrayFactory: (Int) -> Array, decodeFactory: DecodeFactory) = readArray(this, arrayFactory, decodeFactory) - fun readIntArray() = readIntArray(this) - fun readLongArray() = readLongArray(this) - fun readFloatArray() = readFloatArray(this) - fun readDoubleArray() = readDoubleArray(this) - fun readBooleanArray() = readBooleanArray(this) - fun readByteArray() = readByteArray(this) - fun readShortArray() = readShortArray(this) - fun readCharArray() = readCharArray(this) - fun readStringArray() = readStringArray(this) - fun readUuidArray() = readUuidArray(this) - - fun writeArray(array: Array, encodeFactory: EncodeFactory) = writeArray(this, array, encodeFactory) - fun writeIntArray(array: IntArray) = writeIntArray(this, array) - fun writeLongArray(array: LongArray) = writeLongArray(this, array) - fun writeFloatArray(array: FloatArray) = writeFloatArray(this, array) - fun writeDoubleArray(array: DoubleArray) = writeDoubleArray(this, array) - fun writeBooleanArray(array: BooleanArray) = writeBooleanArray(this, array) - fun writeByteArray(array: ByteArray) = writeByteArray(this, array) - fun writeShortArray(array: ShortArray) = writeShortArray(this, array) - fun writeCharArray(array: CharArray) = writeCharArray(this, array) - fun writeStringArray(array: Array) = writeStringArray(this, array) - fun writeUuidArray(array: Array) = writeUuidArray(this, array) - - fun readList(decodeFactory: DecodeFactory) = readList(this, decodeFactory) - fun readMap(keyDecodeFactory: DecodeFactory, valueDecodeFactory: DecodeFactory) = readMap(this, keyDecodeFactory, valueDecodeFactory) - fun > readMap(mapFactory: (Int) -> M, keyDecodeFactory: DecodeFactory, valueDecodeFactory: DecodeFactory) = readMap(this, mapFactory, keyDecodeFactory, valueDecodeFactory) - fun writeMap(map: Map, keyEncodeFactory: EncodeFactory, valueEncodeFactory: EncodeFactory) = writeMap(this, map, keyEncodeFactory, valueEncodeFactory) - fun > readEnumSet(enumClass: Class) = readEnumSet(this, enumClass) - fun > readEnumSet(enumClass: KClass) = readEnumSet(this, enumClass) - fun > writeEnumSet(enumSet: EnumSet, enumClass: Class) = writeEnumSet(this, enumSet, enumClass) - fun > writeEnumSet(enumSet: EnumSet, enumClass: KClass) = writeEnumSet(this, enumSet, enumClass) - fun > readEnum(enumClass: Class) = readEnum(this, enumClass) - fun > readEnum(enumClass: KClass) = readEnum(enumClass.java) - fun > writeEnum(value: E) = writeEnum(this, value) - fun writeUuid(uuid: UUID) = writeUuid(this, uuid) - fun readUuid() = readUuid(this) - fun readBitSet() = readBitSet(this) - fun writeBitSet(bitSet: BitSet) = writeBitSet(this, bitSet) - fun readFixedBitSet(size: Int) = readFixedBitSet(this, size) - fun writeFixedBitSet(bitSet: BitSet, size: Int) = writeFixedBitSet(this, bitSet, size) - @JvmOverloads - fun readUtf(maxLength: Int = Int.MAX_VALUE) = readUtf(this, maxLength) - @JvmOverloads - fun writeUtf(string: String, maxLength: Int = Int.MAX_VALUE) = writeUtf(this, string, maxLength) - fun readVarInt() = readVarInt(this) - fun writeVarInt(value: Int) = writeVarInt(this, value) - fun readVarLong() = readVarLong(this) - fun writeVarLong(value: Long) = writeVarLong(this, value) - fun readNullable(decodeFactory: DecodeFactory) = readNullable(this, decodeFactory) - fun readNullableBoolean() = readNullable(this) { it.readBoolean() } - fun readNullableByte() = readNullable(this) { it.readByte() } - fun readNullableShort() = readNullable(this) { it.readShort() } - fun readNullableInt() = readNullable(this) { it.readVarInt() } - fun readNullableLong() = readNullable(this) { it.readLong() } - fun readNullableFloat() = readNullable(this) { it.readFloat() } - fun readNullableDouble() = readNullable(this) { it.readDouble() } - fun readNullableChar() = readNullable(this) { it.readChar() } - fun readNullableString() = readNullable(this) { readUtf(it) } - fun readNullableUuid() = readNullable(this) { readUuid(it) } - fun writeNullable(value: T?, encodeFactory: EncodeFactory) = writeNullable(this, value, encodeFactory) - fun writeNullable(value: Boolean?) = writeNullable(this, value) { buf, bool -> buf.writeBoolean(bool) } - fun writeNullable(value: Byte?) = writeNullable(this, value) { buf, byte -> buf.writeByte(byte.toInt()) } - fun writeNullable(value: Short?) = writeNullable(this, value) { buf, short -> buf.writeShort(short.toInt()) } - fun writeNullable(value: Int?) = writeNullable(this, value) { buf, int -> buf.writeVarInt(int) } - fun writeNullable(value: Long?) = writeNullable(this, value) { buf, long -> buf.writeLong(long) } - fun writeNullable(value: Float?) = writeNullable(this, value) { buf, float -> buf.writeFloat(float) } - fun writeNullable(value: Double?) = writeNullable(this, value) { buf, double -> buf.writeDouble(double) } - fun writeNullable(value: Char?) = writeNullable(this, value) { buf, char -> buf.writeChar(char.code) } - fun writeNullable(value: String?) = writeNullable(this, value) { buf, string -> writeUtf(buf, string) } - fun writeNullable(value: UUID?) = writeNullable(this, value) {buf, uuid -> writeUuid(buf, uuid) } - fun writeOptional(optional: Optional, encodeFactory: EncodeFactory) = writeOptional(this, optional, encodeFactory) - fun readOptional(decodeFactory: DecodeFactory) = readOptional(this, decodeFactory) - fun writeOptionalLong(optional: OptionalLong) = writeOptionalLong(this, optional) - fun readOptionalLong() = readOptionalLong(this) - fun writeWithCount(count: Int, writer: (SurfByteBuf) -> Unit) = writeWithCount(this, count, writer) - fun writeWithCount(count: Int, writer: Consumer) = writeWithCount(this, count, writer) - fun readWithCount(reader: (SurfByteBuf) -> Unit) = readWithCount(this, reader) - fun readWithCount(reader: Consumer) = readWithCount(this, reader) - fun writeInetSocketAddress(address: InetSocketAddress) = writeInetSocketAddress(this, address) - fun writeZonedDateTime(time: ZonedDateTime) = writeZonedDateTime(this, time) - fun readZonedDateTime() = readZonedDateTime(this) - fun writeInet4Address(address: Inet4Address) = writeInet4Address(this, address) - fun readInet4Address() = readInet4Address(this) - fun writeSingleton(singleton: Any) = writeSingleton(this, singleton) - fun readSingleton(classLoader: ClassLoader) = readSingleton(this, classLoader) - fun writeDuration(duration: Duration) = writeDuration(this, duration) - fun readDuration() = readDuration(this) - fun writeBigInteger(value: BigInteger) = writeBigInteger(this, value) - fun readBigInteger() = readBigInteger(this) - fun writeBigDecimal(value: BigDecimal) = writeBigDecimal(this, value) - fun readBigDecimal() = readBigDecimal(this) - // @formatter:on -// endregion - -} - -private fun positiveCeilDiv(a: Int, b: Int) = -Math.floorDiv(-a, b) - -// Preconditions -inline fun checkEncoded(value: Boolean, message: () -> Any) { - contract { - returns() implies value - } - - if (!value) throw EncoderException(message().toString()) -} - -inline fun checkDecoded(value: Boolean, message: () -> Any) { - contract { - returns() implies value - } - - if (!value) throw DecoderException(message().toString()) -} - -// region ByteBuf extensions -fun ByteBuf.writeVarInt(value: Int) = SurfByteBuf.writeVarInt(this, value) -fun ByteBuf.readVarInt() = SurfByteBuf.readVarInt(this) -fun ByteBuf.writeVarLong(value: Long) = SurfByteBuf.writeVarLong(this, value) -fun ByteBuf.readVarLong() = SurfByteBuf.readVarLong(this) - -fun ByteBuf.readComponent() = SurfByteBuf.readComponent(this) -fun ByteBuf.writeComponent(component: Component) = SurfByteBuf.writeComponent(this, component) -fun ByteBuf.writeNumber(number: Number) = SurfByteBuf.writeNumber(this, number) -fun ByteBuf.readNumber() = SurfByteBuf.readNumber(this) -fun ByteBuf.writeUnsigned(value: Byte) = SurfByteBuf.writeUnsigned(this, value) -fun ByteBuf.writeUnsigned(value: Short) = SurfByteBuf.writeUnsigned(this, value) -fun ByteBuf.writeUnsigned(value: Int) = SurfByteBuf.writeUnsigned(this, value) -fun ByteBuf.writeUnsigned(value: Long) = SurfByteBuf.writeUnsigned(this, value) -fun ByteBuf.writeUnsigned(value: Float) = SurfByteBuf.writeUnsigned(this, value) -fun ByteBuf.writeUnsigned(value: Double) = SurfByteBuf.writeUnsigned(this, value) -fun ByteBuf.readUnsignedLong() = SurfByteBuf.readUnsignedLong(this) -fun ByteBuf.readUnsignedFloat() = SurfByteBuf.readUnsignedFloat(this) -fun ByteBuf.readUnsignedDouble() = SurfByteBuf.readUnsignedDouble(this) -fun > B.readCollection( - collectionFactory: (Int) -> C, - decodeFactory: DecodeFactory -) = - SurfByteBuf.readCollection(this, collectionFactory, decodeFactory) - -fun B.writeCollection( - collection: Collection, - encodeFactory: EncodeFactory -) = - SurfByteBuf.writeCollection(this, collection, encodeFactory) - -inline fun B.readArray(decodeFactory: DecodeFactory) = - SurfByteBuf.readArray(this, decodeFactory) - -fun B.readArray( - arrayFactory: (Int) -> Array, - decodeFactory: DecodeFactory -) = - SurfByteBuf.readArray(this, arrayFactory, decodeFactory) - -fun ByteBuf.readIntArray() = SurfByteBuf.readIntArray(this) -fun ByteBuf.readLongArray() = SurfByteBuf.readLongArray(this) -fun ByteBuf.readFloatArray() = SurfByteBuf.readFloatArray(this) -fun ByteBuf.readDoubleArray() = SurfByteBuf.readDoubleArray(this) -fun ByteBuf.readBooleanArray() = SurfByteBuf.readBooleanArray(this) -fun ByteBuf.readByteArray() = SurfByteBuf.readByteArray(this) -fun ByteBuf.readShortArray() = SurfByteBuf.readShortArray(this) -fun ByteBuf.readCharArray() = SurfByteBuf.readCharArray(this) -fun ByteBuf.readStringArray() = SurfByteBuf.readStringArray(this) -fun ByteBuf.readUuidArray() = SurfByteBuf.readUuidArray(this) -fun B.writeArray(array: Array, encodeFactory: EncodeFactory) = - SurfByteBuf.writeArray(this, array, encodeFactory) - -fun ByteBuf.writeIntArray(array: IntArray) = SurfByteBuf.writeIntArray(this, array) -fun ByteBuf.writeLongArray(array: LongArray) = SurfByteBuf.writeLongArray(this, array) -fun ByteBuf.writeFloatArray(array: FloatArray) = SurfByteBuf.writeFloatArray(this, array) -fun ByteBuf.writeDoubleArray(array: DoubleArray) = SurfByteBuf.writeDoubleArray(this, array) -fun ByteBuf.writeBooleanArray(array: BooleanArray) = SurfByteBuf.writeBooleanArray(this, array) -fun ByteBuf.writeByteArray(array: ByteArray) = SurfByteBuf.writeByteArray(this, array) -fun ByteBuf.writeShortArray(array: ShortArray) = SurfByteBuf.writeShortArray(this, array) -fun ByteBuf.writeCharArray(array: CharArray) = SurfByteBuf.writeCharArray(this, array) -fun ByteBuf.writeStringArray(array: Array) = SurfByteBuf.writeStringArray(this, array) -fun ByteBuf.writeUuidArray(array: Array) = SurfByteBuf.writeUuidArray(this, array) -fun B.readList(decodeFactory: DecodeFactory) = - SurfByteBuf.readList(this, decodeFactory) - -fun B.readMap( - keyDecodeFactory: DecodeFactory, - valueDecodeFactory: DecodeFactory -) = - SurfByteBuf.readMap(this, keyDecodeFactory, valueDecodeFactory) - -fun > B.readMap( - mapFactory: (Int) -> M, - keyDecodeFactory: DecodeFactory, - valueDecodeFactory: DecodeFactory -) = - SurfByteBuf.readMap(this, mapFactory, keyDecodeFactory, valueDecodeFactory) - -fun B.writeMap( - map: Map, - keyEncodeFactory: EncodeFactory, - valueEncodeFactory: EncodeFactory -) = - SurfByteBuf.writeMap(this, map, keyEncodeFactory, valueEncodeFactory) - -fun > ByteBuf.readEnumSet(enumClass: Class) = - SurfByteBuf.readEnumSet(this, enumClass) - -fun > ByteBuf.readEnumSet(enumClass: KClass) = - SurfByteBuf.readEnumSet(this, enumClass) - -fun > ByteBuf.writeEnumSet(enumSet: EnumSet, enumClass: Class) = - SurfByteBuf.writeEnumSet(this, enumSet, enumClass) - -fun > ByteBuf.writeEnumSet(enumSet: EnumSet, enumClass: KClass) = - SurfByteBuf.writeEnumSet(this, enumSet, enumClass) - -fun > ByteBuf.readEnum(enumClass: Class) = SurfByteBuf.readEnum(this, enumClass) -inline fun > ByteBuf.readEnum() = SurfByteBuf.readEnum(this, E::class.java) -fun > ByteBuf.writeEnum(value: E) = SurfByteBuf.writeEnum(this, value) -fun ByteBuf.writeUuid(uuid: UUID) = SurfByteBuf.writeUuid(this, uuid) -fun ByteBuf.readUuid() = SurfByteBuf.readUuid(this) -fun ByteBuf.readBitSet() = SurfByteBuf.readBitSet(this) -fun ByteBuf.writeBitSet(bitSet: BitSet) = SurfByteBuf.writeBitSet(this, bitSet) -fun ByteBuf.readFixedBitSet(size: Int) = SurfByteBuf.readFixedBitSet(this, size) -fun ByteBuf.writeFixedBitSet(bitSet: BitSet, size: Int) = - SurfByteBuf.writeFixedBitSet(this, bitSet, size) - -fun ByteBuf.readUtf(maxLength: Int = Int.MAX_VALUE) = SurfByteBuf.readUtf(this, maxLength) -fun ByteBuf.writeUtf(string: String, maxLength: Int = Int.MAX_VALUE) = - SurfByteBuf.writeUtf(this, string, maxLength) - -fun B.readNullable(decodeFactory: DecodeFactory) = - SurfByteBuf.readNullable(this, decodeFactory) - -fun ByteBuf.readNullableBoolean() = SurfByteBuf.readNullable(this) { it.readBoolean() } -fun ByteBuf.readNullableByte() = SurfByteBuf.readNullable(this) { it.readByte() } -fun ByteBuf.readNullableShort() = SurfByteBuf.readNullable(this) { it.readShort() } - -@Deprecated("Use varInt instead", ReplaceWith("readNullableVarInt()")) -fun ByteBuf.readNullableInt() = SurfByteBuf.readNullable(this) { it.readInt() } -fun ByteBuf.readNullableVarInt() = SurfByteBuf.readNullable(this) { it.readVarInt() } -fun ByteBuf.readNullableLong() = SurfByteBuf.readNullable(this) { it.readLong() } -fun ByteBuf.readNullableFloat() = SurfByteBuf.readNullable(this) { it.readFloat() } -fun ByteBuf.readNullableDouble() = SurfByteBuf.readNullable(this) { it.readDouble() } -fun ByteBuf.readNullableChar() = SurfByteBuf.readNullable(this) { it.readChar() } -fun ByteBuf.readNullableString() = SurfByteBuf.readNullable(this) { SurfByteBuf.readUtf(it) } -fun ByteBuf.readNullableUuid() = SurfByteBuf.readNullable(this) { SurfByteBuf.readUuid(it) } -fun B.writeNullable(value: T?, encodeFactory: EncodeFactory) = - SurfByteBuf.writeNullable(this, value, encodeFactory) - -fun ByteBuf.writeNullableBoolean(value: Boolean?) = - SurfByteBuf.writeNullable(this, value) { buf, bool -> buf.writeBoolean(bool) } - -fun ByteBuf.writeNullableByte(value: Byte?) = - SurfByteBuf.writeNullable(this, value) { buf, byte -> buf.writeByte(byte.toInt()) } - -fun ByteBuf.writeNullableShort(value: Short?) = - SurfByteBuf.writeNullable(this, value) { buf, short -> buf.writeShort(short.toInt()) } - -@Deprecated("Use varInt instead", ReplaceWith("writeNullableVarInt(value)")) -fun ByteBuf.writeNullableInt(value: Int?) = - SurfByteBuf.writeNullable(this, value) { buf, int -> buf.writeVarInt(int) } - -fun ByteBuf.writeNullableVarInt(value: Int?) = - SurfByteBuf.writeNullable(this, value) { buf, int -> buf.writeVarInt(int) } - -fun ByteBuf.writeNullableLong(value: Long?) = - SurfByteBuf.writeNullable(this, value) { buf, long -> buf.writeLong(long) } - -fun ByteBuf.writeNullableFloat(value: Float?) = - SurfByteBuf.writeNullable(this, value) { buf, float -> buf.writeFloat(float) } - -fun ByteBuf.writeNullableDouble(value: Double?) = - SurfByteBuf.writeNullable(this, value) { buf, double -> buf.writeDouble(double) } - -fun ByteBuf.writeNullableChar(value: Char?) = - SurfByteBuf.writeNullable(this, value) { buf, char -> buf.writeChar(char.code) } - -fun ByteBuf.writeNullableString(value: String?) = - SurfByteBuf.writeNullable(this, value) { buf, string -> SurfByteBuf.writeUtf(buf, string) } - -fun ByteBuf.writeNullableUuid(value: UUID?) = - SurfByteBuf.writeNullable(this, value) { buf, uuid -> SurfByteBuf.writeUuid(buf, uuid) } - -fun B.writeOptional(optional: Optional, encodeFactory: EncodeFactory) = - SurfByteBuf.writeOptional(this, optional, encodeFactory) - -fun B.readOptional(decodeFactory: DecodeFactory) = - SurfByteBuf.readOptional(this, decodeFactory) - -fun ByteBuf.writeOptionalLong(optional: OptionalLong) = - SurfByteBuf.writeOptionalLong(this, optional) - -fun ByteBuf.readOptionalLong() = SurfByteBuf.readOptionalLong(this) -fun B.writeWithCount(count: Int, writer: (B) -> Unit) = - SurfByteBuf.writeWithCount(this, count, writer) - -fun B.writeWithCount(count: Int, writer: Consumer) = - Companion.writeWithCount(this, count, writer) - -fun B.readWithCount(reader: (B) -> Unit) = SurfByteBuf.readWithCount(this, reader) -fun B.readWithCount(reader: Consumer) = Companion.readWithCount(this, reader) - -fun B.readURI() = SurfByteBuf.readURI(this) -fun B.writeURI(uri: URI) = SurfByteBuf.writeURI(this, uri) - -fun B.writeInetSocketAddress(address: InetSocketAddress) = - SurfByteBuf.writeInetSocketAddress(this, address) - -fun B.readZonedDateTime() = SurfByteBuf.readZonedDateTime(this) -fun B.writeZonedDateTime(time: ZonedDateTime) = - SurfByteBuf.writeZonedDateTime(this, time) - -fun B.readInet4Address() = SurfByteBuf.readInet4Address(this) -fun B.writeInet4Address(address: Inet4Address) = - SurfByteBuf.writeInet4Address(this, address) - -fun B.readSingleton(classLoader: ClassLoader) = - SurfByteBuf.readSingleton(this, classLoader) - -fun B.writeSingleton(singleton: Any) = SurfByteBuf.writeSingleton(this, singleton) - -fun B.writeDuration(duration: Duration) = SurfByteBuf.writeDuration(this, duration) -fun B.readDuration() = SurfByteBuf.readDuration(this) - -fun B.writeBigInteger(value: BigInteger) = SurfByteBuf.writeBigInteger(this, value) -fun B.readBigInteger() = SurfByteBuf.readBigInteger(this) -fun B.writeBigDecimal(value: BigDecimal) = SurfByteBuf.writeBigDecimal(this, value) -fun B.readBigDecimal() = SurfByteBuf.readBigDecimal(this) - -fun ByteBuf.wrap() = SurfByteBuf(this) -// endregion - -/** - * Reads a byte array from the buffer. - * If the buffer has an array, it will return the array directly. - * Otherwise, it will copy the bytes into a new array. - * - * @return The byte array - * @receiver The buffer - */ -fun ByteBuf.toByteArraySafe(): ByteArray { - if (hasArray()) { - return array() - } - - val bytes = ByteArray(readableBytes()) - getBytes(readerIndex(), bytes) - - return bytes -} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/WrappedByteBuf.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/WrappedByteBuf.kt deleted file mode 100644 index 77da2b9..0000000 --- a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/WrappedByteBuf.kt +++ /dev/null @@ -1,327 +0,0 @@ -package dev.slne.roleplay.mod.common.network.utils - -import io.netty.buffer.ByteBuf -import io.netty.buffer.ByteBufAllocator -import io.netty.util.ByteProcessor -import java.io.IOException -import java.io.InputStream -import java.io.OutputStream -import java.nio.ByteBuffer -import java.nio.ByteOrder -import java.nio.channels.FileChannel -import java.nio.channels.GatheringByteChannel -import java.nio.channels.ScatteringByteChannel -import java.nio.charset.Charset - -/** - * A wrapper class for Netty's [ByteBuf] that delegates all operations to the underlying instance. - * - * This class provides an abstraction over the [ByteBuf] to allow monitoring, interception, or - * extension of its functionality without altering the original buffer's behavior. - * - * ### Key Features - * - Delegates all standard [ByteBuf] operations to the underlying [ByteBuf] instance. - * - Allows for customization or additional behavior by subclassing and overriding methods. - * - Fully compatible with Netty's ecosystem and extensions. - * - * ### Example Use Case - * #### Adding Monitoring - * ```kotlin - * class MonitoringByteBuf(buf: ByteBuf) : WrappedByteBuf(buf) { - * override fun writeByte(value: Int): ByteBuf { - * println("Writing byte: $value") - * return super.writeByte(value) - * } - * } - * ``` - * - * ### Important Notes - * - This class is open for extension, allowing custom behaviors to be added. - * - All operations are delegated to the wrapped buffer, ensuring consistent behavior. - * - * @property buf The underlying [ByteBuf] instance. - */ -open class WrappedByteBuf(private val buf: ByteBuf) : ByteBuf() { - override fun alloc(): ByteBufAllocator = buf.alloc() - override fun array(): ByteArray = buf.array() - override fun arrayOffset(): Int = buf.arrayOffset() - override fun asByteBuf(): ByteBuf = buf.asByteBuf() - override fun asReadOnly(): ByteBuf = buf.asReadOnly() - override fun bytesBefore(index: Int, length: Int, value: Byte): Int = - buf.bytesBefore(index, length, value) - - override fun bytesBefore(length: Int, value: Byte): Int = buf.bytesBefore(length, value) - override fun bytesBefore(value: Byte): Int = buf.bytesBefore(value) - override fun capacity(): Int = buf.capacity() - override fun capacity(newCapacity: Int): ByteBuf = buf.capacity(newCapacity) - override fun clear(): ByteBuf = buf.clear() - override fun compareTo(buffer: ByteBuf): Int = buf.compareTo(buffer) - override fun copy(): ByteBuf = buf.copy() - override fun copy(index: Int, length: Int): ByteBuf = buf.copy(index, length) - override fun discardReadBytes(): ByteBuf = buf.discardReadBytes() - override fun discardSomeReadBytes(): ByteBuf = buf.discardSomeReadBytes() - override fun duplicate(): ByteBuf = buf.duplicate() - override fun ensureWritable(minWritableBytes: Int): ByteBuf = - buf.ensureWritable(minWritableBytes) - - override fun ensureWritable(minWritableBytes: Int, force: Boolean): Int = - buf.ensureWritable(minWritableBytes, force) - - override fun equals(other: Any?): Boolean = buf == other - override fun forEachByte(index: Int, length: Int, processor: ByteProcessor): Int = - buf.forEachByte(index, length, processor) - - override fun forEachByte(processor: ByteProcessor): Int = buf.forEachByte(processor) - override fun forEachByteDesc(index: Int, length: Int, processor: ByteProcessor): Int = - buf.forEachByteDesc(index, length, processor) - - override fun forEachByteDesc(processor: ByteProcessor): Int = buf.forEachByteDesc(processor) - override fun getBoolean(index: Int): Boolean = buf.getBoolean(index) - override fun getByte(index: Int): Byte = buf.getByte(index) - override fun getBytes(index: Int, dst: ByteArray): ByteBuf = buf.getBytes(index, dst) - override fun getBytes(index: Int, dst: ByteArray, dstIndex: Int, length: Int): ByteBuf = - buf.getBytes(index, dst, dstIndex, length) - - override fun getBytes(index: Int, dst: ByteBuf): ByteBuf = buf.getBytes(index, dst) - override fun getBytes(index: Int, dst: ByteBuf, dstIndex: Int, length: Int): ByteBuf = - buf.getBytes(index, dst, dstIndex, length) - - override fun getBytes(index: Int, dst: ByteBuf, length: Int): ByteBuf = - buf.getBytes(index, dst, length) - - override fun getBytes(index: Int, dst: ByteBuffer): ByteBuf = buf.getBytes(index, dst) - - @Throws(IOException::class) - override fun getBytes(index: Int, out: FileChannel, position: Long, length: Int): Int = - buf.getBytes(index, out, position, length) - - @Throws(IOException::class) - override fun getBytes(index: Int, out: GatheringByteChannel, length: Int): Int = - buf.getBytes(index, out, length) - - @Throws(IOException::class) - override fun getBytes(index: Int, out: OutputStream, length: Int): ByteBuf = - buf.getBytes(index, out, length) - - override fun getChar(index: Int): Char = buf.getChar(index) - override fun getCharSequence(index: Int, length: Int, charset: Charset): CharSequence = - buf.getCharSequence(index, length, charset) - - override fun getDouble(index: Int): Double = buf.getDouble(index) - override fun getDoubleLE(index: Int): Double = buf.getDoubleLE(index) - override fun getFloat(index: Int): Float = buf.getFloat(index) - override fun getFloatLE(index: Int): Float = buf.getFloatLE(index) - override fun getInt(index: Int): Int = buf.getInt(index) - override fun getIntLE(index: Int): Int = buf.getIntLE(index) - override fun getLong(index: Int): Long = buf.getLong(index) - override fun getLongLE(index: Int): Long = buf.getLongLE(index) - override fun getMedium(index: Int): Int = buf.getMedium(index) - override fun getMediumLE(index: Int): Int = buf.getMediumLE(index) - override fun getShort(index: Int): Short = buf.getShort(index) - override fun getShortLE(index: Int): Short = buf.getShortLE(index) - override fun getUnsignedByte(index: Int): Short = buf.getUnsignedByte(index) - override fun getUnsignedInt(index: Int): Long = buf.getUnsignedInt(index) - override fun getUnsignedIntLE(index: Int): Long = buf.getUnsignedIntLE(index) - override fun getUnsignedMedium(index: Int): Int = buf.getUnsignedMedium(index) - override fun getUnsignedMediumLE(index: Int): Int = buf.getUnsignedMediumLE(index) - override fun getUnsignedShort(index: Int): Int = buf.getUnsignedShort(index) - override fun getUnsignedShortLE(index: Int): Int = buf.getUnsignedShortLE(index) - override fun hasArray(): Boolean = buf.hasArray() - override fun hashCode(): Int = buf.hashCode() - override fun hasMemoryAddress(): Boolean = buf.hasMemoryAddress() - override fun indexOf(fromIndex: Int, toIndex: Int, value: Byte): Int = - buf.indexOf(fromIndex, toIndex, value) - - override fun internalNioBuffer(index: Int, length: Int): ByteBuffer = - buf.internalNioBuffer(index, length) - - override fun isContiguous(): Boolean = buf.isContiguous - override fun isDirect(): Boolean = buf.isDirect - override fun isReadable(): Boolean = buf.isReadable - override fun isReadable(size: Int): Boolean = buf.isReadable(size) - override fun isReadOnly(): Boolean = buf.isReadOnly - override fun isWritable(): Boolean = buf.isWritable - override fun isWritable(size: Int): Boolean = buf.isWritable(size) - override fun markReaderIndex(): ByteBuf = buf.markReaderIndex() - override fun markWriterIndex(): ByteBuf = buf.markWriterIndex() - override fun maxCapacity(): Int = buf.maxCapacity() - override fun maxFastWritableBytes(): Int = buf.maxFastWritableBytes() - override fun maxWritableBytes(): Int = buf.maxWritableBytes() - override fun memoryAddress(): Long = buf.memoryAddress() - override fun nioBuffer(): ByteBuffer = buf.nioBuffer() - override fun nioBuffer(index: Int, length: Int): ByteBuffer = buf.nioBuffer(index, length) - override fun nioBufferCount(): Int = buf.nioBufferCount() - override fun nioBuffers(): Array = buf.nioBuffers() - override fun nioBuffers(index: Int, length: Int): Array = - buf.nioBuffers(index, length) - - @Deprecated("") - override fun order(): ByteOrder = buf.order() - - @Deprecated("") - override fun order(endianness: ByteOrder): ByteBuf = buf.order(endianness) - override fun readableBytes(): Int = buf.readableBytes() - override fun readBoolean(): Boolean = buf.readBoolean() - override fun readByte(): Byte = buf.readByte() - override fun readBytes(dst: ByteArray): ByteBuf = buf.readBytes(dst) - override fun readBytes(dst: ByteArray, dstIndex: Int, length: Int): ByteBuf = - buf.readBytes(dst, dstIndex, length) - - override fun readBytes(dst: ByteBuf): ByteBuf = buf.readBytes(dst) - override fun readBytes(dst: ByteBuf, dstIndex: Int, length: Int): ByteBuf = - buf.readBytes(dst, dstIndex, length) - - override fun readBytes(dst: ByteBuf, length: Int): ByteBuf = buf.readBytes(dst, length) - override fun readBytes(dst: ByteBuffer): ByteBuf = buf.readBytes(dst) - override fun readBytes(length: Int): ByteBuf = buf.readBytes(length) - - @Throws(IOException::class) - override fun readBytes(out: FileChannel, position: Long, length: Int): Int = - buf.readBytes(out, position, length) - - @Throws(IOException::class) - override fun readBytes(out: GatheringByteChannel, length: Int): Int = buf.readBytes(out, length) - - @Throws(IOException::class) - override fun readBytes(out: OutputStream, length: Int): ByteBuf = buf.readBytes(out, length) - override fun readChar(): Char = buf.readChar() - override fun readCharSequence(length: Int, charset: Charset): CharSequence = - buf.readCharSequence(length, charset) - - override fun readDouble(): Double = buf.readDouble() - override fun readDoubleLE(): Double = buf.readDoubleLE() - override fun readerIndex(): Int = buf.readerIndex() - override fun readerIndex(readerIndex: Int): ByteBuf = buf.readerIndex(readerIndex) - override fun readFloat(): Float = buf.readFloat() - override fun readFloatLE(): Float = buf.readFloatLE() - override fun readInt(): Int = buf.readInt() - override fun readIntLE(): Int = buf.readIntLE() - override fun readLong(): Long = buf.readLong() - override fun readLongLE(): Long = buf.readLongLE() - override fun readMedium(): Int = buf.readMedium() - override fun readMediumLE(): Int = buf.readMediumLE() - override fun readRetainedSlice(length: Int): ByteBuf = buf.readRetainedSlice(length) - override fun readShort(): Short = buf.readShort() - override fun readShortLE(): Short = buf.readShortLE() - override fun readSlice(length: Int): ByteBuf = buf.readSlice(length) - override fun readUnsignedByte(): Short = buf.readUnsignedByte() - override fun readUnsignedInt(): Long = buf.readUnsignedInt() - override fun readUnsignedIntLE(): Long = buf.readUnsignedIntLE() - override fun readUnsignedMedium(): Int = buf.readUnsignedMedium() - override fun readUnsignedMediumLE(): Int = buf.readUnsignedMediumLE() - override fun readUnsignedShort(): Int = buf.readUnsignedShort() - override fun readUnsignedShortLE(): Int = buf.readUnsignedShortLE() - override fun resetReaderIndex(): ByteBuf = buf.resetReaderIndex() - override fun resetWriterIndex(): ByteBuf = buf.resetWriterIndex() - override fun retain(): ByteBuf = buf.retain() - override fun retain(increment: Int): ByteBuf = buf.retain(increment) - override fun retainedDuplicate(): ByteBuf = buf.retainedDuplicate() - override fun retainedSlice(): ByteBuf = buf.retainedSlice() - override fun retainedSlice(index: Int, length: Int): ByteBuf = buf.retainedSlice(index, length) - override fun setBoolean(index: Int, value: Boolean): ByteBuf = buf.setBoolean(index, value) - override fun setByte(index: Int, value: Int): ByteBuf = buf.setByte(index, value) - - @Throws(IOException::class) - override fun setBytes(index: Int, `in`: FileChannel, position: Long, length: Int): Int = - buf.setBytes(index, `in`, position, length) - - @Throws(IOException::class) - override fun setBytes(index: Int, `in`: InputStream, length: Int): Int = - buf.setBytes(index, `in`, length) - - @Throws(IOException::class) - override fun setBytes(index: Int, `in`: ScatteringByteChannel, length: Int): Int = - buf.setBytes(index, `in`, length) - - override fun setBytes(index: Int, src: ByteArray): ByteBuf = buf.setBytes(index, src) - override fun setBytes(index: Int, src: ByteArray, srcIndex: Int, length: Int): ByteBuf = - buf.setBytes(index, src, srcIndex, length) - - override fun setBytes(index: Int, src: ByteBuf): ByteBuf = buf.setBytes(index, src) - override fun setBytes(index: Int, src: ByteBuf, length: Int): ByteBuf = - buf.setBytes(index, src, length) - - override fun setBytes(index: Int, src: ByteBuf, srcIndex: Int, length: Int): ByteBuf = - buf.setBytes(index, src, srcIndex, length) - - override fun setBytes(index: Int, src: ByteBuffer): ByteBuf = buf.setBytes(index, src) - override fun setChar(index: Int, value: Int): ByteBuf = buf.setChar(index, value) - override fun setCharSequence(index: Int, sequence: CharSequence, charset: Charset): Int = - buf.setCharSequence(index, sequence, charset) - - override fun setDouble(index: Int, value: Double): ByteBuf = buf.setDouble(index, value) - override fun setDoubleLE(index: Int, value: Double): ByteBuf = buf.setDoubleLE(index, value) - override fun setFloat(index: Int, value: Float): ByteBuf = buf.setFloat(index, value) - override fun setFloatLE(index: Int, value: Float): ByteBuf = buf.setFloatLE(index, value) - override fun setIndex(readerIndex: Int, writerIndex: Int): ByteBuf = - buf.setIndex(readerIndex, writerIndex) - - override fun setInt(index: Int, value: Int): ByteBuf = buf.setInt(index, value) - override fun setIntLE(index: Int, value: Int): ByteBuf = buf.setIntLE(index, value) - override fun setLong(index: Int, value: Long): ByteBuf = buf.setLong(index, value) - override fun setLongLE(index: Int, value: Long): ByteBuf = buf.setLongLE(index, value) - override fun setMedium(index: Int, value: Int): ByteBuf = buf.setMedium(index, value) - override fun setMediumLE(index: Int, value: Int): ByteBuf = buf.setMediumLE(index, value) - override fun setShort(index: Int, value: Int): ByteBuf = buf.setShort(index, value) - override fun setShortLE(index: Int, value: Int): ByteBuf = buf.setShortLE(index, value) - override fun setZero(index: Int, length: Int): ByteBuf = buf.setZero(index, length) - override fun skipBytes(length: Int): ByteBuf = buf.skipBytes(length) - override fun slice(): ByteBuf = buf.slice() - override fun slice(index: Int, length: Int): ByteBuf = buf.slice(index, length) - override fun toString(): String = buf.toString() - override fun toString(charset: Charset): String = buf.toString(charset) - override fun toString(index: Int, length: Int, charset: Charset): String = - buf.toString(index, length, charset) - - override fun touch(): ByteBuf = buf.touch() - override fun touch(hint: Any): ByteBuf = buf.touch(hint) - override fun unwrap(): ByteBuf = buf.unwrap() - override fun writableBytes(): Int = buf.writableBytes() - override fun writeBoolean(value: Boolean): ByteBuf = buf.writeBoolean(value) - override fun writeByte(value: Int): ByteBuf = buf.writeByte(value) - - @Throws(IOException::class) - override fun writeBytes(`in`: FileChannel, position: Long, length: Int): Int = - buf.writeBytes(`in`, position, length) - - @Throws(IOException::class) - override fun writeBytes(`in`: InputStream, length: Int): Int = buf.writeBytes(`in`, length) - - @Throws(IOException::class) - override fun writeBytes(`in`: ScatteringByteChannel, length: Int): Int = - buf.writeBytes(`in`, length) - - override fun writeBytes(src: ByteArray): ByteBuf = buf.writeBytes(src) - override fun writeBytes(src: ByteArray, srcIndex: Int, length: Int): ByteBuf = - buf.writeBytes(src, srcIndex, length) - - override fun writeBytes(src: ByteBuf): ByteBuf = buf.writeBytes(src) - override fun writeBytes(src: ByteBuf, length: Int): ByteBuf = buf.writeBytes(src, length) - override fun writeBytes(src: ByteBuf, srcIndex: Int, length: Int): ByteBuf = - buf.writeBytes(src, srcIndex, length) - - override fun writeBytes(src: ByteBuffer): ByteBuf = buf.writeBytes(src) - override fun writeChar(value: Int): ByteBuf = buf.writeChar(value) - override fun writeCharSequence(sequence: CharSequence, charset: Charset): Int = - buf.writeCharSequence(sequence, charset) - - override fun writeDouble(value: Double): ByteBuf = buf.writeDouble(value) - override fun writeDoubleLE(value: Double): ByteBuf = buf.writeDoubleLE(value) - override fun writeFloat(value: Float): ByteBuf = buf.writeFloat(value) - override fun writeFloatLE(value: Float): ByteBuf = buf.writeFloatLE(value) - override fun writeInt(value: Int): ByteBuf = buf.writeInt(value) - override fun writeIntLE(value: Int): ByteBuf = buf.writeIntLE(value) - override fun writeLong(value: Long): ByteBuf = buf.writeLong(value) - override fun writeLongLE(value: Long): ByteBuf = buf.writeLongLE(value) - override fun writeMedium(value: Int): ByteBuf = buf.writeMedium(value) - override fun writeMediumLE(value: Int): ByteBuf = buf.writeMediumLE(value) - override fun writerIndex(): Int = buf.writerIndex() - override fun writerIndex(writerIndex: Int): ByteBuf = buf.writerIndex(writerIndex) - override fun writeShort(value: Int): ByteBuf = buf.writeShort(value) - override fun writeShortLE(value: Int): ByteBuf = buf.writeShortLE(value) - override fun writeZero(length: Int): ByteBuf = buf.writeZero(length) - override fun refCnt(): Int = buf.refCnt() - override fun release(): Boolean = buf.release() - override fun release(decrement: Int): Boolean = buf.release(decrement) -} - diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/StreamCodec.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/StreamCodec.kt deleted file mode 100644 index 51ee72d..0000000 --- a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/StreamCodec.kt +++ /dev/null @@ -1,367 +0,0 @@ -package dev.slne.roleplay.mod.common.network.utils.codec - -import com.mojang.datafixers.util.Function3 -import com.mojang.datafixers.util.Function4 -import com.mojang.datafixers.util.Function5 -import com.mojang.datafixers.util.Function6 -import io.netty.buffer.ByteBuf -import java.util.function.BiFunction -import java.util.function.Function -import java.util.function.UnaryOperator - -interface StreamCodec : StreamDecoder, StreamEncoder { - fun apply(function: CodecOperation) = function.apply(this) - - fun map( - to: Function, - from: Function - ): StreamCodec = object : StreamCodec { - override fun decode(buf: B): O = to.apply(this@StreamCodec.decode(buf)) - override fun encode(buf: B, value: O) = this@StreamCodec.encode(buf, from.apply(value)) - } - - fun mapStream(function: Function): StreamCodec = - object : StreamCodec { - override fun decode(buf: O): V = this@StreamCodec.decode(function.apply(buf)) - override fun encode(buf: O, value: V) = - this@StreamCodec.encode(function.apply(buf), value) - } - - fun dispatch( - type: Function, - codec: Function> - ): StreamCodec = object : StreamCodec { - override fun decode(buf: B): U = codec.apply(this@StreamCodec.decode(buf)).decode(buf) - override fun encode(buf: B, value: U) { - val obj = type.apply(value) - val streamCodec = codec.apply(obj) as StreamCodec - this@StreamCodec.encode(buf, obj) - streamCodec.encode(buf, value) - } - } - - companion object { - @JvmStatic - fun of( - encoder: StreamEncoder, - decoder: StreamDecoder - ): StreamCodec = object : StreamCodec { - override fun decode(buf: B): V = decoder.decode(buf) - override fun encode(buf: B, value: V) = encoder.encode(buf, value) - } - - @JvmStatic - fun ofMember( - encoder: StreamMemberEncoder, - decoder: StreamDecoder - ): StreamCodec = object : StreamCodec { - override fun decode(buf: B): V = decoder.decode(buf) - override fun encode(buf: B, value: V) = encoder.encode(value, buf) - } - - @JvmStatic - fun unit(value: V): StreamCodec { - return object : StreamCodec { - override fun decode(buf: B): V = value - override fun encode(buf: B, otherValue: V) { - check(value == otherValue) { "Can't encode '$otherValue', expected '$value'" } - } - } - } - - @JvmStatic - fun composite( - codec: StreamCodec, - from: Function, - to: Function - ): StreamCodec = object : StreamCodec { - override fun decode(buf: B): C = to.apply(codec.decode(buf)) - override fun encode(buf: B, value: C) = codec.encode(buf, from.apply(value)) - } - - - fun composite( - codec1: StreamCodec, - from1: Function, - codec2: StreamCodec, - from2: Function, - to: BiFunction - ): StreamCodec = object : StreamCodec { - override fun decode(buf: B): C = to.apply(codec1.decode(buf), codec2.decode(buf)) - override fun encode(buf: B, value: C) { - codec1.encode(buf, from1.apply(value)) - codec2.encode(buf, from2.apply(value)) - } - } - - - fun composite( - codec1: StreamCodec, - from1: Function, - codec2: StreamCodec, - from2: Function, - codec3: StreamCodec, - from3: Function, - to: Function3 - ): StreamCodec = object : StreamCodec { - override fun decode(buf: B): C { - return to.apply(codec1.decode(buf), codec2.decode(buf), codec3.decode(buf)) - } - - override fun encode(buf: B, value: C) { - codec1.encode(buf, from1.apply(value)) - codec2.encode(buf, from2.apply(value)) - codec3.encode(buf, from3.apply(value)) - } - } - - fun composite( - codec1: StreamCodec, - from1: Function, - codec2: StreamCodec, - from2: Function, - codec3: StreamCodec, - from3: Function, - codec4: StreamCodec, - from4: Function, - to: Function4 - ): StreamCodec { - return object : StreamCodec { - override fun decode(buf: B): C { - val `object`: T1 = codec1.decode(buf) - val object2: T2 = codec2.decode(buf) - val object3: T3 = codec3.decode(buf) - val object4: T4 = codec4.decode(buf) - return to.apply(`object`, object2, object3, object4) - } - - override fun encode(buf: B, value: C) { - codec1.encode(buf, from1.apply(value)) - codec2.encode(buf, from2.apply(value)) - codec3.encode(buf, from3.apply(value)) - codec4.encode(buf, from4.apply(value)) - } - } - } - - fun composite( - codec1: StreamCodec, - from1: Function, - codec2: StreamCodec, - from2: Function, - codec3: StreamCodec, - from3: Function, - codec4: StreamCodec, - from4: Function, - codec5: StreamCodec, - from5: Function, - to: Function5 - ): StreamCodec { - return object : StreamCodec { - override fun decode(buf: B): C { - val `object`: T1 = codec1.decode(buf) - val object2: T2 = codec2.decode(buf) - val object3: T3 = codec3.decode(buf) - val object4: T4 = codec4.decode(buf) - val object5: T5 = codec5.decode(buf) - return to.apply(`object`, object2, object3, object4, object5) - } - - override fun encode(buf: B, value: C) { - codec1.encode(buf, from1.apply(value)) - codec2.encode(buf, from2.apply(value)) - codec3.encode(buf, from3.apply(value)) - codec4.encode(buf, from4.apply(value)) - codec5.encode(buf, from5.apply(value)) - } - } - } - - fun composite( - codec1: StreamCodec, - from1: Function, - codec2: StreamCodec, - from2: Function, - codec3: StreamCodec, - from3: Function, - codec4: StreamCodec, - from4: Function, - codec5: StreamCodec, - from5: Function, - codec6: StreamCodec, - from6: Function, - to: Function6 - ): StreamCodec { - return object : StreamCodec { - override fun decode(buf: B): C { - val `object`: T1 = codec1.decode(buf) - val object2: T2 = codec2.decode(buf) - val object3: T3 = codec3.decode(buf) - val object4: T4 = codec4.decode(buf) - val object5: T5 = codec5.decode(buf) - val object6: T6 = codec6.decode(buf) - return to.apply(`object`, object2, object3, object4, object5, object6) - } - - override fun encode(buf: B, value: C) { - codec1.encode(buf, from1.apply(value)) - codec2.encode(buf, from2.apply(value)) - codec3.encode(buf, from3.apply(value)) - codec4.encode(buf, from4.apply(value)) - codec5.encode(buf, from5.apply(value)) - codec6.encode(buf, from6.apply(value)) - } - } - } - - fun recursive(codecGetter: UnaryOperator>) = - object : StreamCodec { - private val inner by lazy { codecGetter.apply(this) } - override fun decode(buf: B): T = inner.decode(buf) - override fun encode(buf: B, value: T) = inner.encode(buf, value) - } - } -} - -@FunctionalInterface -fun interface CodecOperation { - fun apply(codec: StreamCodec): StreamCodec -} - -fun StreamCodec.apply(operation: (StreamCodec) -> StreamCodec) = - operation(this) - -fun StreamCodec.map( - to: (V) -> O, - from: (O) -> V -) = map({ to(it) }, { from(it) }) - -fun StreamCodec.mapStream(function: (O) -> B) = - mapStream(Function { function(it) }) - - -fun streamCodec( - encoder: (B, V) -> Unit, - decoder: (B) -> V -) = StreamCodec.of(encoder, decoder) - -fun streamCodecMember( - encoder: (V, B) -> Unit, - decoder: (B) -> V -) = StreamCodec.ofMember(encoder, decoder) - -fun streamCodecUnit(value: V) = StreamCodec.unit(value) -fun streamCodecUnitSimple(value: V) = StreamCodec.unit(value) - -fun streamCodecComposite( - codec: StreamCodec, - from: (C) -> T1, - to: (T1) -> C -) = StreamCodec.composite(codec, { from(it) }, { to(it) }) - -fun streamCodecComposite( - codec1: StreamCodec, - from1: (C) -> T1, - codec2: StreamCodec, - from2: (C) -> T2, - to: (T1, T2) -> C -) = StreamCodec.composite(codec1, { from1(it) }, codec2, { from2(it) }, { t1, t2 -> to(t1, t2) }) - -fun streamCodecComposite( - codec1: StreamCodec, - from1: (C) -> T1, - codec2: StreamCodec, - from2: (C) -> T2, - codec3: StreamCodec, - from3: (C) -> T3, - to: (T1, T2, T3) -> C -) = StreamCodec.composite( - codec1, - { from1(it) }, - codec2, - { from2(it) }, - codec3, - { from3(it) }, - { t1, t2, t3 -> to(t1, t2, t3) } -) - -fun streamCodecComposite( - codec1: StreamCodec, - from1: (C) -> T1, - codec2: StreamCodec, - from2: (C) -> T2, - codec3: StreamCodec, - from3: (C) -> T3, - codec4: StreamCodec, - from4: (C) -> T4, - to: (T1, T2, T3, T4) -> C -) = StreamCodec.composite( - codec1, - { from1(it) }, - codec2, - { from2(it) }, - codec3, - { from3(it) }, - codec4, - { from4(it) }, - { t1, t2, t3, t4 -> to(t1, t2, t3, t4) } -) - -fun streamCodecComposite( - codec1: StreamCodec, - from1: (C) -> T1, - codec2: StreamCodec, - from2: (C) -> T2, - codec3: StreamCodec, - from3: (C) -> T3, - codec4: StreamCodec, - from4: (C) -> T4, - codec5: StreamCodec, - from5: (C) -> T5, - to: (T1, T2, T3, T4, T5) -> C -) = StreamCodec.composite( - codec1, - { from1(it) }, - codec2, - { from2(it) }, - codec3, - { from3(it) }, - codec4, - { from4(it) }, - codec5, - { from5(it) }, - { t1, t2, t3, t4, t5 -> to(t1, t2, t3, t4, t5) } -) - -fun streamCodecComposite( - codec1: StreamCodec, - from1: (C) -> T1, - codec2: StreamCodec, - from2: (C) -> T2, - codec3: StreamCodec, - from3: (C) -> T3, - codec4: StreamCodec, - from4: (C) -> T4, - codec5: StreamCodec, - from5: (C) -> T5, - codec6: StreamCodec, - from6: (C) -> T6, - to: (T1, T2, T3, T4, T5, T6) -> C -) = StreamCodec.composite( - codec1, - { from1(it) }, - codec2, - { from2(it) }, - codec3, - { from3(it) }, - codec4, - { from4(it) }, - codec5, - { from5(it) }, - codec6, - { from6(it) }, - { t1, t2, t3, t4, t5, t6 -> to(t1, t2, t3, t4, t5, t6) } -) - -fun streamCodecRecursive(codecGetter: (StreamCodec) -> StreamCodec) = - StreamCodec.recursive(codecGetter) \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/StreamDecoder.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/StreamDecoder.kt deleted file mode 100644 index 076016e..0000000 --- a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/StreamDecoder.kt +++ /dev/null @@ -1,6 +0,0 @@ -package dev.slne.roleplay.mod.common.network.utils.codec - -@FunctionalInterface -fun interface StreamDecoder { - fun decode(buf: I): T -} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/StreamEncoder.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/StreamEncoder.kt deleted file mode 100644 index abf00c3..0000000 --- a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/StreamEncoder.kt +++ /dev/null @@ -1,6 +0,0 @@ -package dev.slne.roleplay.mod.common.network.utils.codec - -@FunctionalInterface -fun interface StreamEncoder { - fun encode(buf: O, value: T) -} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/StreamMemberEncoder.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/StreamMemberEncoder.kt deleted file mode 100644 index 98891f5..0000000 --- a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/StreamMemberEncoder.kt +++ /dev/null @@ -1,6 +0,0 @@ -package dev.slne.roleplay.mod.common.network.utils.codec - -@FunctionalInterface -fun interface StreamMemberEncoder { - fun encode(value: T, buf: O) -} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/codec-util-util.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/codec-util-util.kt deleted file mode 100644 index 528a25a..0000000 --- a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/codec-util-util.kt +++ /dev/null @@ -1,17 +0,0 @@ -package dev.slne.surf.cloud.api.common.util.codec - -import com.mojang.serialization.DataResult -import java.util.stream.IntStream - -fun fixedSize(stream: IntStream, length: Int): DataResult { - val ints = stream.limit((length + 1).toLong()).toArray() - if (ints.size != length) { - val error = { "Input is not a list of $length ints" } - return if (ints.size >= length) DataResult.error( - error, - ints.copyOf(length) - ) else DataResult.error(error) - } else { - return DataResult.success(ints) - } -} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/codec-util.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/codec-util.kt deleted file mode 100644 index ac4334c..0000000 --- a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/codec-util.kt +++ /dev/null @@ -1,300 +0,0 @@ -@file:OptIn(ExperimentalContracts::class, ExperimentalStdlibApi::class) - -package dev.slne.roleplay.mod.common.network.utils.codec - -import com.mojang.datafixers.kinds.App -import com.mojang.datafixers.util.Pair -import com.mojang.serialization.* -import com.mojang.serialization.codecs.RecordCodecBuilder -import dev.slne.roleplay.mod.common.network.utils.readUtf -import dev.slne.roleplay.mod.common.network.utils.writeUtf -import dev.slne.surf.cloud.api.common.util.codec.fixedSize -import io.netty.buffer.ByteBuf -import net.kyori.adventure.text.Component -import net.kyori.adventure.text.TextComponent -import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer -import java.time.Duration -import java.util.* -import java.util.function.Function -import java.util.stream.Stream -import kotlin.contracts.ExperimentalContracts -import kotlin.contracts.InvocationKind -import kotlin.contracts.contract -import kotlin.enums.EnumEntries -import kotlin.enums.enumEntries - -fun UUID.toIntArray() = leastMostToIntArray(mostSignificantBits, leastSignificantBits) - -private fun leastMostToIntArray(uuidMost: Long, uuidLeast: Long): IntArray { - return intArrayOf( - (uuidMost shr 32).toInt(), - uuidMost.toInt(), - (uuidLeast shr 32).toInt(), - uuidLeast.toInt() - ) -} - -fun IntArray.toUuid(): UUID { - return UUID( - this[0].toLong() shl 32 or (this[1].toLong() and 0xFFFFFFFF), - this[2].toLong() shl 32 or (this[3].toLong() and 0xFFFFFFFF) - ) -} - -@DslMarker -annotation class RecordCodecDsl - -fun createRecordCodec(@RecordCodecDsl block: RecordCodecBuilder.Instance.() -> App, T>): Codec { - contract { - callsInPlace(block, InvocationKind.EXACTLY_ONCE) - } - - return RecordCodecBuilder.create(block) -} - -fun createRecordMapCodec(@RecordCodecDsl block: RecordCodecBuilder.Instance.() -> App, T>): MapCodec { - contract { - callsInPlace(block, InvocationKind.EXACTLY_ONCE) - } - - return RecordCodecBuilder.mapCodec(block) -} - -fun MapCodec.getter(getter: O.() -> A): RecordCodecBuilder = - this.forGetter(Function(getter)) - -@Suppress("UnusedReceiverParameter") -fun RecordCodecBuilder.Instance.int(fieldName: String, getter: T.() -> Int) = - Codec.INT.fieldOf(fieldName).getter(getter) - -@Suppress("UnusedReceiverParameter") -fun RecordCodecBuilder.Instance.bool(fieldName: String, getter: T.() -> Boolean) = - Codec.BOOL.fieldOf(fieldName).getter(getter) - -@Suppress("UnusedReceiverParameter") -fun RecordCodecBuilder.Instance.string(fieldName: String, getter: T.() -> String) = - Codec.STRING.fieldOf(fieldName).getter(getter) - -@Suppress("UnusedReceiverParameter") -fun RecordCodecBuilder.Instance.stringOptionalLenient( - fieldName: String, - getter: T.() -> String? -) = - Codec.STRING.lenientOptionalFieldOf(fieldName).forGetter { Optional.ofNullable(getter(it)) } - -@Suppress("UnusedReceiverParameter") -fun RecordCodecBuilder.Instance.float(fieldName: String, getter: T.() -> Float) = - Codec.FLOAT.fieldOf(fieldName).getter(getter) - -@Suppress("UnusedReceiverParameter") -fun RecordCodecBuilder.Instance.double(fieldName: String, getter: T.() -> Double) = - Codec.DOUBLE.fieldOf(fieldName).getter(getter) - -@Suppress("UnusedReceiverParameter") -fun RecordCodecBuilder.Instance.long(fieldName: String, getter: T.() -> Long) = - Codec.LONG.fieldOf(fieldName).getter(getter) - -@Suppress("UnusedReceiverParameter") -fun RecordCodecBuilder.Instance.byte(fieldName: String, getter: T.() -> Byte) = - Codec.BYTE.fieldOf(fieldName).getter(getter) - -@Suppress("UnusedReceiverParameter") -fun RecordCodecBuilder.Instance.short(fieldName: String, getter: T.() -> Short) = - Codec.SHORT.fieldOf(fieldName).getter(getter) - -@Suppress("UnusedReceiverParameter") -inline fun > RecordCodecBuilder.Instance.enum( - fieldName: String, - noinline getter: T.() -> E -) = - ExtraCodecs.enumCodec(enumEntries()).fieldOf(fieldName).getter(getter) - -object ExtraCodecs { - val JAVA = converter(JavaOps.INSTANCE) - val UUID_CODEC: Codec = Codec.INT_STREAM.comapFlatMap( - { uuidStream -> fixedSize(uuidStream, 4).map { it.toUuid() } }, - { Arrays.stream(it.toIntArray()) } - ) - val UUID_STRING_CODEC: Codec = Codec.STRING.comapFlatMap( - { - runCatching { UUID.fromString(it) }.fold( - { DataResult.success(it) }, - { DataResult.error { "Invalid UUID: $it" } }) - }, - { it.toString() }) - val UUID_LENIENT_CODEC = Codec.withAlternative(UUID_CODEC, UUID_STRING_CODEC) - - fun converter(ops: DynamicOps): Codec = - Codec.PASSTHROUGH.xmap({ it.convert(ops).value }, { Dynamic(ops, it as T) }) - - - fun > enumCodec(entries: EnumEntries) = Codec.STRING.validate { input -> - if (entries.any { it.name == input }) - DataResult.success(input) - else DataResult.error { "Invalid enum value: $input" } - }.xmap({ input -> entries.first { it.name == input } }, { it.name }) - - fun orCompressed(uncompressedCodec: Codec, compressedCodec: Codec): Codec { - return object : Codec { - override fun encode( - obj: E, - dynamicOps: DynamicOps, - obj2: T - ): DataResult = if (dynamicOps.compressMaps()) compressedCodec.encode( - obj, - dynamicOps, - obj2 - ) else uncompressedCodec.encode(obj, dynamicOps, obj2) - - - override fun decode( - dynamicOps: DynamicOps, - obj: T - ): DataResult> = if (dynamicOps.compressMaps()) compressedCodec.decode( - dynamicOps, - obj - ) else uncompressedCodec.decode(dynamicOps, obj) - - - override fun toString(): String { - return "$uncompressedCodec orCompressed $compressedCodec" - } - } - } - - fun orCompressed( - uncompressedCodec: MapCodec, - compressedCodec: MapCodec - ): MapCodec { - return object : MapCodec() { - override fun encode( - obj: E, - dynamicOps: DynamicOps, - recordBuilder: RecordBuilder - ): RecordBuilder = if (dynamicOps.compressMaps()) compressedCodec.encode( - obj, - dynamicOps, - recordBuilder - ) else uncompressedCodec.encode(obj, dynamicOps, recordBuilder) - - - override fun decode(dynamicOps: DynamicOps, mapLike: MapLike): DataResult = - if (dynamicOps.compressMaps()) compressedCodec.decode( - dynamicOps, - mapLike - ) else uncompressedCodec.decode(dynamicOps, mapLike) - - - override fun keys(dynamicOps: DynamicOps): Stream { - return compressedCodec.keys(dynamicOps) - } - - override fun toString(): String { - return "$uncompressedCodec orCompressed $compressedCodec" - } - } - } - - fun nonEmptyList(originalCodec: Codec>): Codec> = originalCodec.validate { - if (it.isEmpty()) DataResult.error { "List must have contents" } else DataResult.success(it) - } - - val DURATION_STREAM_CODEC = streamCodec({ buf, duration -> - buf.writeLong(duration.toMillis()) - }, { buf -> - Duration.ofMillis(buf.readLong()) - }) - - // region adventure - val COMPONENT = Codec.STRING.comapFlatMap( - { - runCatching { GsonComponentSerializer.gson().deserialize(it) }.fold( - { DataResult.success(it) }, - { DataResult.error { "Invalid component: $it" } }) - }, - { GsonComponentSerializer.gson().serialize(it) } - ) - - val COMPONENT_STREAM = streamCodec({ buf, comp -> - val str = GsonComponentSerializer.gson().serialize(comp) - buf.writeUtf(str) - }, { buf -> - val str = buf.readUtf() - GsonComponentSerializer.gson().deserialize(str) - }) - -} - -fun tryCollapseToString(component: Component): String? { - if (component is TextComponent) { - if (component.children().isEmpty() && component.style().isEmpty) { - return component.content() - } - } - return null -} - -class FuzzyCodec( - private val codecs: List>, - private val encoderGetter: (T) -> MapEncoder -) : MapCodec() { - - @Suppress("UNCHECKED_CAST") - override fun decode(dynamicOps: DynamicOps, mapLike: MapLike): DataResult { - for (mapDecoder in this.codecs) { - val dataResult = mapDecoder.decode(dynamicOps, mapLike) - if (dataResult.result().isPresent) { - return dataResult as DataResult - } - } - - return DataResult.error { "No matching codec found" } - } - - @Suppress("UNCHECKED_CAST") - override fun encode( - obj: T, - dynamicOps: DynamicOps, - recordBuilder: RecordBuilder - ): RecordBuilder { - val mapEncoder = encoderGetter(obj) as MapEncoder - return mapEncoder.encode(obj, dynamicOps, recordBuilder) - } - - override fun keys(dynamicOps: DynamicOps): Stream = codecs.stream() - .flatMap { it.keys(dynamicOps) } - .distinct() - - - override fun toString(): String { - return "FuzzyCodec[" + this.codecs + "]" - } -} - -class StrictEither( - private val typeFieldName: String, - private val typed: MapCodec, - private val fuzzy: MapCodec -) : MapCodec() { - override fun decode(dynamicOps: DynamicOps, mapLike: MapLike): DataResult { - return if (mapLike[typeFieldName] != null) typed.decode( - dynamicOps, - mapLike - ) else fuzzy.decode(dynamicOps, mapLike) - } - - override fun encode( - obj: T, - dynamicOps: DynamicOps, - recordBuilder: RecordBuilder - ): RecordBuilder { - return fuzzy.encode(obj, dynamicOps, recordBuilder) - } - - override fun keys(dynamicOps: DynamicOps): Stream { - return Stream.concat( - typed.keys(dynamicOps), - fuzzy.keys(dynamicOps) - ).distinct() - } -} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/RoleplayBufSerializer.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/RoleplayBufSerializer.kt deleted file mode 100644 index f055c8b..0000000 --- a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/RoleplayBufSerializer.kt +++ /dev/null @@ -1,8 +0,0 @@ -package dev.slne.roleplay.mod.common.network.utils.codec.kotlinx - -import dev.slne.roleplay.mod.common.network.utils.SurfByteBuf -import dev.slne.surf.bytebufserializer.KBufSerializer - -abstract class RoleplayBufSerializer : KBufSerializer { - override val bufClass = SurfByteBuf::class -} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/SurfCloudBufSerializer.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/SurfCloudBufSerializer.kt deleted file mode 100644 index 1a72354..0000000 --- a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/SurfCloudBufSerializer.kt +++ /dev/null @@ -1,28 +0,0 @@ -package dev.slne.roleplay.mod.common.network.utils.codec.kotlinx - -import dev.slne.roleplay.mod.common.network.utils.codec.kotlinx.adventure.AdventureComponentSerializer -import dev.slne.roleplay.mod.common.network.utils.codec.kotlinx.java.* -import dev.slne.roleplay.mod.common.network.utils.codec.kotlinx.kotlin.DurationSerializer -import dev.slne.surf.bytebufserializer.Buf -import kotlinx.serialization.modules.SerializersModule -import kotlinx.serialization.modules.contextual - -object SurfCloudBufSerializer { - val serializerModule = SerializersModule { - // Adventure - contextual(AdventureComponentSerializer) - - // Java - contextual(UUIDSerializer) - contextual(BitSetSerializer) - contextual(UtfStringSerializer) - contextual(ZonedDateTimeSerializer) - contextual(BigDecimalSerializer) - contextual(BigIntegerSerializer) - - // Kotlin - contextual(DurationSerializer) - } - - val serializer = Buf(serializerModule) -} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/adventure/AdventureComponentSerializer.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/adventure/AdventureComponentSerializer.kt deleted file mode 100644 index 9428a3a..0000000 --- a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/adventure/AdventureComponentSerializer.kt +++ /dev/null @@ -1,25 +0,0 @@ -package dev.slne.roleplay.mod.common.network.utils.codec.kotlinx.adventure - -import dev.slne.roleplay.mod.common.network.utils.SurfByteBuf -import dev.slne.roleplay.mod.common.network.utils.codec.kotlinx.RoleplayBufSerializer -import kotlinx.serialization.Serializable -import kotlinx.serialization.descriptors.PrimitiveKind -import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor -import net.kyori.adventure.text.Component - -typealias SerializableComponent = @Serializable(with = AdventureComponentSerializer::class) Component - -object AdventureComponentSerializer : RoleplayBufSerializer() { - override val descriptor = PrimitiveSerialDescriptor("Component", PrimitiveKind.STRING) - - override fun serialize0( - buf: SurfByteBuf, - value: Component - ) { - buf.writeComponent(value) - } - - override fun deserialize0(buf: SurfByteBuf): Component { - return buf.readComponent() - } -} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/java/BigDecimalSerializer.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/java/BigDecimalSerializer.kt deleted file mode 100644 index cab515f..0000000 --- a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/java/BigDecimalSerializer.kt +++ /dev/null @@ -1,26 +0,0 @@ -package dev.slne.roleplay.mod.common.network.utils.codec.kotlinx.java - -import dev.slne.roleplay.mod.common.network.utils.SurfByteBuf -import dev.slne.roleplay.mod.common.network.utils.codec.kotlinx.RoleplayBufSerializer -import kotlinx.serialization.Serializable -import kotlinx.serialization.descriptors.buildClassSerialDescriptor -import kotlinx.serialization.descriptors.element -import java.math.BigDecimal - -typealias SerializableBigDecimal = @Serializable(with = BigDecimalSerializer::class) BigDecimal - -object BigDecimalSerializer : RoleplayBufSerializer() { - override val descriptor = buildClassSerialDescriptor("dev.slne.surf.cloud.BigDecimal") { - element("unscaledValue") - element("scale") - element("precision") - } - - override fun serialize0(buf: SurfByteBuf, value: BigDecimal) { - buf.writeBigDecimal(value) - } - - override fun deserialize0(buf: SurfByteBuf): BigDecimal { - return buf.readBigDecimal() - } -} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/java/BigIntegerSerializer.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/java/BigIntegerSerializer.kt deleted file mode 100644 index 1d72ec3..0000000 --- a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/java/BigIntegerSerializer.kt +++ /dev/null @@ -1,26 +0,0 @@ -package dev.slne.roleplay.mod.common.network.utils.codec.kotlinx.java - -import kotlinx.serialization.KSerializer -import kotlinx.serialization.Serializable -import kotlinx.serialization.descriptors.PrimitiveKind -import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor -import kotlinx.serialization.encoding.Decoder -import kotlinx.serialization.encoding.Encoder -import java.math.BigInteger - -typealias SerializableBigInteger = @Serializable(with = BigIntegerSerializer::class) BigInteger - -object BigIntegerSerializer : KSerializer { - override val descriptor = PrimitiveSerialDescriptor("BigInteger", PrimitiveKind.STRING) - - override fun serialize( - encoder: Encoder, - value: BigInteger - ) { - encoder.encodeString(value.toString()) - } - - override fun deserialize(decoder: Decoder): BigInteger { - return BigInteger(decoder.decodeString()) - } -} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/java/BitSetSerializer.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/java/BitSetSerializer.kt deleted file mode 100644 index 45adbdb..0000000 --- a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/java/BitSetSerializer.kt +++ /dev/null @@ -1,27 +0,0 @@ -package dev.slne.roleplay.mod.common.network.utils.codec.kotlinx.java - -import dev.slne.roleplay.mod.common.network.utils.SurfByteBuf -import dev.slne.roleplay.mod.common.network.utils.codec.kotlinx.RoleplayBufSerializer -import kotlinx.serialization.Serializable -import kotlinx.serialization.descriptors.buildClassSerialDescriptor -import kotlinx.serialization.descriptors.element -import java.util.* - -typealias SerializableBitSet = @Serializable(with = BitSetSerializer::class) BitSet - -object BitSetSerializer : RoleplayBufSerializer() { - override val descriptor = buildClassSerialDescriptor("BitSet") { - element("longArray") - } - - override fun serialize0( - buf: SurfByteBuf, - value: BitSet - ) { - buf.writeBitSet(value) - } - - override fun deserialize0(buf: SurfByteBuf): BitSet { - return buf.readBitSet() - } -} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/java/UUIDSerializer.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/java/UUIDSerializer.kt deleted file mode 100644 index ca29a5f..0000000 --- a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/java/UUIDSerializer.kt +++ /dev/null @@ -1,28 +0,0 @@ -package dev.slne.roleplay.mod.common.network.utils.codec.kotlinx.java - -import dev.slne.roleplay.mod.common.network.utils.SurfByteBuf -import dev.slne.roleplay.mod.common.network.utils.codec.kotlinx.RoleplayBufSerializer -import kotlinx.serialization.Serializable -import kotlinx.serialization.descriptors.buildClassSerialDescriptor -import kotlinx.serialization.descriptors.element -import java.util.* - -typealias SerializableUUID = @Serializable(with = UUIDSerializer::class) UUID - -object UUIDSerializer : RoleplayBufSerializer() { - override val descriptor = buildClassSerialDescriptor("UUID") { - element("mostSignificantBits") - element("leastSignificantBits") - } - - override fun serialize0( - buf: SurfByteBuf, - value: UUID - ) { - buf.writeUuid(value) - } - - override fun deserialize0(buf: SurfByteBuf): UUID { - return buf.readUuid() - } -} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/java/UtfStringSerializer.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/java/UtfStringSerializer.kt deleted file mode 100644 index fd6cee1..0000000 --- a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/java/UtfStringSerializer.kt +++ /dev/null @@ -1,21 +0,0 @@ -package dev.slne.roleplay.mod.common.network.utils.codec.kotlinx.java - -import dev.slne.roleplay.mod.common.network.utils.SurfByteBuf -import dev.slne.roleplay.mod.common.network.utils.codec.kotlinx.RoleplayBufSerializer -import kotlinx.serialization.Serializable -import kotlinx.serialization.descriptors.PrimitiveKind -import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor - -typealias SerializableUtfString = @Serializable(with = UtfStringSerializer::class) String - -object UtfStringSerializer : RoleplayBufSerializer() { - override val descriptor = PrimitiveSerialDescriptor("Utf8String", PrimitiveKind.STRING) - - override fun serialize0(buf: SurfByteBuf, value: String) { - buf.writeUtf(value) - } - - override fun deserialize0(buf: SurfByteBuf): String { - return buf.readUtf() - } -} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/java/VarIntSerializer.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/java/VarIntSerializer.kt deleted file mode 100644 index 8de54eb..0000000 --- a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/java/VarIntSerializer.kt +++ /dev/null @@ -1,21 +0,0 @@ -package dev.slne.roleplay.mod.common.network.utils.codec.kotlinx.java - -import dev.slne.roleplay.mod.common.network.utils.SurfByteBuf -import dev.slne.roleplay.mod.common.network.utils.codec.kotlinx.RoleplayBufSerializer -import kotlinx.serialization.Serializable -import kotlinx.serialization.descriptors.PrimitiveKind -import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor - -typealias IntAsVarInt = @Serializable(with = VarIntSerializer::class) Int - -object VarIntSerializer : RoleplayBufSerializer() { - override val descriptor = PrimitiveSerialDescriptor("VarInt", PrimitiveKind.INT) - - override fun serialize0(buf: SurfByteBuf, value: Int) { - buf.writeVarInt(value) - } - - override fun deserialize0(buf: SurfByteBuf): Int { - return buf.readVarInt() - } -} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/java/VarLongSerializer.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/java/VarLongSerializer.kt deleted file mode 100644 index 9a47e8e..0000000 --- a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/java/VarLongSerializer.kt +++ /dev/null @@ -1,21 +0,0 @@ -package dev.slne.roleplay.mod.common.network.utils.codec.kotlinx.java - -import dev.slne.roleplay.mod.common.network.utils.SurfByteBuf -import dev.slne.roleplay.mod.common.network.utils.codec.kotlinx.RoleplayBufSerializer -import kotlinx.serialization.Serializable -import kotlinx.serialization.descriptors.PrimitiveKind -import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor - -typealias LongAsVarLong = @Serializable(with = VarLongSerializer::class) Long - -object VarLongSerializer : RoleplayBufSerializer() { - override val descriptor = PrimitiveSerialDescriptor("VarLong", PrimitiveKind.LONG) - - override fun serialize0(buf: SurfByteBuf, value: Long) { - buf.writeVarLong(value) - } - - override fun deserialize0(buf: SurfByteBuf): Long { - return buf.readVarLong() - } -} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/java/ZonedDateTimeSerializer.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/java/ZonedDateTimeSerializer.kt deleted file mode 100644 index a620795..0000000 --- a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/java/ZonedDateTimeSerializer.kt +++ /dev/null @@ -1,28 +0,0 @@ -package dev.slne.roleplay.mod.common.network.utils.codec.kotlinx.java - -import dev.slne.roleplay.mod.common.network.utils.SurfByteBuf -import dev.slne.roleplay.mod.common.network.utils.codec.kotlinx.RoleplayBufSerializer -import kotlinx.serialization.Serializable -import kotlinx.serialization.descriptors.buildClassSerialDescriptor -import kotlinx.serialization.descriptors.element -import java.time.ZonedDateTime - -typealias SerializableZonedDateTime = @Serializable(with = ZonedDateTimeSerializer::class) ZonedDateTime - -object ZonedDateTimeSerializer : RoleplayBufSerializer() { - override val descriptor = buildClassSerialDescriptor("ZonedDateTime") { - element("epochMillis") - element("zoneId") - } - - override fun deserialize0(buf: SurfByteBuf): ZonedDateTime { - return buf.readZonedDateTime() - } - - override fun serialize0( - buf: SurfByteBuf, - value: ZonedDateTime - ) { - buf.writeZonedDateTime(value) - } -} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/kotlin/DurationSerializer.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/kotlin/DurationSerializer.kt deleted file mode 100644 index 719ef0d..0000000 --- a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/codec/kotlinx/kotlin/DurationSerializer.kt +++ /dev/null @@ -1,25 +0,0 @@ -package dev.slne.roleplay.mod.common.network.utils.codec.kotlinx.kotlin - -import dev.slne.roleplay.mod.common.network.utils.SurfByteBuf -import dev.slne.roleplay.mod.common.network.utils.codec.kotlinx.RoleplayBufSerializer -import kotlinx.serialization.Serializable -import kotlinx.serialization.descriptors.PrimitiveKind -import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor -import kotlin.time.Duration - -typealias SerializableDuration = @Serializable(with = DurationSerializer::class) Duration - -object DurationSerializer : RoleplayBufSerializer() { - override val descriptor = PrimitiveSerialDescriptor("Duration", PrimitiveKind.LONG) - - override fun serialize0( - buf: SurfByteBuf, - value: Duration - ) { - buf.writeDuration(value) - } - - override fun deserialize0(buf: SurfByteBuf): Duration { - return buf.readDuration() - } -} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/decoder/DecodeFactory.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/decoder/DecodeFactory.kt deleted file mode 100644 index 8c9445d..0000000 --- a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/decoder/DecodeFactory.kt +++ /dev/null @@ -1,45 +0,0 @@ -package dev.slne.roleplay.mod.common.network.utils.decoder - -import io.netty.buffer.ByteBuf - -/** - * Functional interface representing a factory for decoding values of type [T] from a buffer of type [B]. - * - * @param B The type of the buffer (e.g., [ByteBuf]). - * @param T The type of the value to decode. - */ -fun interface DecodeFactory { - /** - * Decodes a value of type [T] from the given buffer. - * - * @param buffer The buffer from which to decode the value. - * @return The decoded value of type [T]. - */ - operator fun invoke(buffer: B): T - - /** - * Functional interface representing a factory for decoding [Long] values from a buffer of type [B]. - * - * @param B The type of the buffer (e.g., [ByteBuf]). - */ - @FunctionalInterface - fun interface DecodeLongFactory : DecodeFactory { - - /** - * Decodes a [Long] value from the given buffer. - * - * @param buffer The buffer from which to decode the value. - * @return The decoded [Long] value. - */ - @Deprecated("Use decodeLong instead", ReplaceWith("decodeLong(buffer)")) - override operator fun invoke(buffer: B) = decodeLong(buffer) - - /** - * Decodes a [Long] value from the given buffer. - * - * @param buffer The buffer from which to decode the value. - * @return The decoded [Long] value. - */ - fun decodeLong(buffer: B): Long - } -} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/ecoder/EncodeFactory.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/ecoder/EncodeFactory.kt deleted file mode 100644 index 9c158b1..0000000 --- a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/ecoder/EncodeFactory.kt +++ /dev/null @@ -1,27 +0,0 @@ -package dev.slne.roleplay.mod.common.network.utils.ecoder - -import io.netty.buffer.ByteBuf - -/** - * The interface Encode factory. - * - * @param the type parameter - * @param the type parameter - */ -fun interface EncodeFactory { - /** - * Encode. - * - * @param buffer the buffer - * @param value the value - */ - operator fun invoke(buffer: B, value: T) - - @FunctionalInterface - fun interface EncodeLongFactory : EncodeFactory { - @Deprecated("Use encodeLong instead", ReplaceWith("encodeLong(buffer, value)")) - override operator fun invoke(buffer: B, value: Long) = encodeLong(buffer, value) - fun encodeLong(buffer: B, value: Long) - } -} - diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/packet-extensions.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/packet-extensions.kt deleted file mode 100644 index 63a006c..0000000 --- a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/packet-extensions.kt +++ /dev/null @@ -1,16 +0,0 @@ -package dev.slne.roleplay.mod.common.network.utils - -import dev.slne.roleplay.mod.common.network.SurfRoleplayPacket -import dev.slne.roleplay.mod.common.network.packets.RoleplayPacket -import dev.slne.surf.surfapi.core.api.util.mutableObject2ObjectMapOf -import kotlin.reflect.KClass -import kotlin.reflect.full.findAnnotation - -private val metaCache = - mutableObject2ObjectMapOf, SurfRoleplayPacket>(512) - -fun KClass.getPacketMeta() = getPacketMetaOrNull() - ?: error("NettyPacket class '$qualifiedName' must be annotated with @${SurfRoleplayPacket::class.simpleName}") - -fun KClass.getPacketMetaOrNull() = - metaCache[this] ?: findAnnotation()?.also { metaCache[this] = it } diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/types/Utf8String.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/types/Utf8String.kt deleted file mode 100644 index da84107..0000000 --- a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/types/Utf8String.kt +++ /dev/null @@ -1,83 +0,0 @@ -package dev.slne.roleplay.mod.common.network.utils.types - -import dev.slne.roleplay.mod.common.network.utils.checkDecoded -import dev.slne.roleplay.mod.common.network.utils.checkEncoded -import dev.slne.roleplay.mod.common.network.utils.readVarInt -import dev.slne.roleplay.mod.common.network.utils.writeVarInt -import io.netty.buffer.ByteBuf -import io.netty.buffer.ByteBufUtil -import java.nio.charset.StandardCharsets - -/** - * Utility object for handling UTF-8 encoded strings in a [ByteBuf]. - * - * This utility provides methods for reading and writing UTF-8 strings, ensuring that string lengths - * and encoding constraints are enforced to prevent errors or buffer overflows. - */ -object Utf8String { - - /** - * Reads a UTF-8 encoded string from the specified [ByteBuf]. - * - * The string is preceded by its length, encoded as a VarInt. - * The method ensures that the - * length does not exceed the maximum allowable length - * and that the buffer contains sufficient - * data to decode the string. - * - * @param buf The [ByteBuf] to read the string from. - * @param maxLength The maximum allowable character length of the decoded string. - * @return The decoded string. - * @throws IllegalArgumentException If the string's UTF-8 length exceeds the maximum allowed length - * or is inconsistent with the buffer's readable bytes. - */ - fun read(buf: ByteBuf, maxLength: Int): String { - val utf8MaxLength = ByteBufUtil.utf8MaxBytes(maxLength) - val utf8Length = buf.readVarInt() - - checkDecoded(utf8Length <= utf8MaxLength) { "String too long (max $maxLength): $utf8Length" } - checkDecoded(utf8Length >= 0) { "String length is negative: $utf8Length" } - - val readableBytes = buf.readableBytes() - - checkDecoded(utf8Length <= readableBytes) { "String length is longer than readable bytes: $utf8Length > $readableBytes" } - - val string = buf.toString(buf.readerIndex(), utf8Length, StandardCharsets.UTF_8) - buf.readerIndex(buf.readerIndex() + utf8Length) - - checkDecoded(string.length <= maxLength) { "String too long (max $maxLength): ${string.length}" } - - return string - } - - /** - * Writes a UTF-8 encoded string to the specified [ByteBuf]. - * - * The string's length is written first as a VarInt, followed by the UTF-8 encoded bytes of the string. - * The method validates that the string length does not exceed the specified maximum length. - * - * @param buf The [ByteBuf] to write the string to. - * @param string The string to encode and write. - * @param maxLength The maximum allowable character length of the string. - * @throws IllegalArgumentException If the string's length exceeds the specified maximum length. - */ - fun write(buf: ByteBuf, string: CharSequence, maxLength: Int) { - checkEncoded(string.length <= maxLength) { "String too long (max $maxLength): ${string.length}" } - - val utf8Length = ByteBufUtil.utf8MaxBytes(string) - val utf8Buffer = buf.alloc().buffer(utf8Length) - - try { - val bytesWritten = ByteBufUtil.writeUtf8(utf8Buffer, string) - val utf8MaxLength = ByteBufUtil.utf8MaxBytes(maxLength) - - checkEncoded(bytesWritten <= utf8MaxLength) { "String too long (max $maxLength): $bytesWritten" } - - buf.writeVarInt(bytesWritten) - buf.writeBytes(utf8Buffer) - } finally { - utf8Buffer.release() - } - } -} - diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/types/VarInt.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/types/VarInt.kt deleted file mode 100644 index 0390dc2..0000000 --- a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/types/VarInt.kt +++ /dev/null @@ -1,101 +0,0 @@ -package dev.slne.roleplay.mod.common.network.utils.types - -import dev.slne.roleplay.mod.common.network.utils.checkDecoded -import io.netty.buffer.ByteBuf -import kotlin.math.ceil - -/** - * Utility object for encoding and decoding VarInt values using a space-efficient variable-length representation. - * - * VarInt is a common format in network protocols to represent integers compactly, with smaller values - * consuming fewer bytes. This implementation supports reading and writing VarInts to [ByteBuf]. - */ -object VarInt { - private const val MAX_VARINT_SIZE = 5 - private const val DATA_BITS_MASK = 0x7F - private const val CONTINUATION_BIT_MASK = 0x80 - private const val DATA_BITS_PER_BYTE = 7 - - private val varIntByteLengths = - IntArray(33) { if (it == 32) 1 else ceil((31.0 - (it - 1)) / DATA_BITS_PER_BYTE).toInt() } - - /** - * Calculates the number of bytes required to encode the given integer as a VarInt. - * - * @param value The integer value to encode. - * @return The number of bytes needed to represent the value as a VarInt. - */ - fun getEncodedSize(value: Int): Int = varIntByteLengths[Integer.numberOfLeadingZeros(value)] - - /** - * Determines if the given byte has the continuation bit set. - * - * @param byte The byte to check. - * @return `true` if the continuation bit is set, otherwise `false`. - */ - fun hasContinuationBit(byte: Byte): Boolean = - (byte.toInt() and CONTINUATION_BIT_MASK) == CONTINUATION_BIT_MASK - - /** - * Decodes a VarInt from the specified [ByteBuf]. - * - * @param buf The [ByteBuf] to read from. - * @return The decoded integer value. - * @throws RuntimeException If the VarInt exceeds the maximum size. - */ - fun readVarInt(buf: ByteBuf): Int { - var result = 0 - var shift = 0 - - var currentByte: Byte - do { - currentByte = buf.readByte() - result = - result or ((currentByte.toInt() and DATA_BITS_MASK) shl (shift++ * DATA_BITS_PER_BYTE)) - checkDecoded(shift <= MAX_VARINT_SIZE) { "VarInt too big" } - } while (hasContinuationBit(currentByte)) - - return result - } - - /** - * Encodes the given integer as a VarInt and writes it to the specified [ByteBuf]. - * - * @param buffer The [ByteBuf] to write to. - * @param value The integer value to encode. - * @return The same [ByteBuf] instance for chaining. - */ - fun writeVarInt(buffer: ByteBuf, value: Int): ByteBuf { - // Handle one and two byte cases explicitly for improved performance in common cases. - if ((value and ((0xFFFFFFFF.toInt() shl DATA_BITS_PER_BYTE))) == 0) { - buffer.writeByte(value) - } else if ((value and (0xFFFFFFFF.toInt() shl (DATA_BITS_PER_BYTE * 2))) == 0) { - val combinedValue = - (value and DATA_BITS_MASK or CONTINUATION_BIT_MASK) shl 8 or (value ushr DATA_BITS_PER_BYTE) - buffer.writeShort(combinedValue) - } else { - writeComplexVarInt(buffer, value) - } - - return buffer - } - - /** - * Encodes a larger integer value as a VarInt and writes it to the [ByteBuf]. - * This method handles cases where more than two bytes are required for encoding. - * - * @param buffer The [ByteBuf] to write to. - * @param value The integer value to encode. - * @return The same [ByteBuf] instance for chaining. - */ - private fun writeComplexVarInt(buffer: ByteBuf, value: Int): ByteBuf { - var value = value - while ((value and -CONTINUATION_BIT_MASK) != 0) { - buffer.writeByte(value and DATA_BITS_MASK or CONTINUATION_BIT_MASK) - value = value ushr DATA_BITS_PER_BYTE - } - - buffer.writeByte(value) - return buffer - } -} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/types/VarLong.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/types/VarLong.kt deleted file mode 100644 index 0df3fd8..0000000 --- a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/types/VarLong.kt +++ /dev/null @@ -1,85 +0,0 @@ -package dev.slne.roleplay.mod.common.network.utils.types - -import dev.slne.roleplay.mod.common.network.utils.checkDecoded -import io.netty.buffer.ByteBuf - -/** - * Utility object for encoding and decoding VarLong values using a variable-length representation. - * - * VarLong is a compact format for encoding long integers, where smaller values use fewer bytes. - * It is particularly useful in network protocols to optimize bandwidth usage. - */ -object VarLong { - private const val MAX_VARLONG_SIZE = 10 - private const val DATA_BITS_MASK = 0x7F - private const val CONTINUATION_BIT_MASK = 0x80 - private const val DATA_BITS_PER_BYTE = 7 - - /** - * Calculates the number of bytes required to encode the given long value as a VarLong. - * - * @param value The long value to encode. - * @return The number of bytes needed to represent the value as a VarLong. - */ - fun getEncodedSize(value: Long): Int { - for (i in 1 until MAX_VARLONG_SIZE) { - if ((value and -1L shl i * DATA_BITS_PER_BYTE) == 0L) { - return i - } - } - - return MAX_VARLONG_SIZE - } - - /** - * Determines if the given byte has the continuation bit set. - * - * @param byte The byte to check. - * @return `true` if the continuation bit is set, otherwise `false`. - */ - fun hasContinuationBit(byte: Byte): Boolean = - (byte.toInt() and CONTINUATION_BIT_MASK) == CONTINUATION_BIT_MASK - - /** - * Decodes a VarLong from the specified [ByteBuf]. - * - * @param buf The [ByteBuf] to read from. - * @return The decoded long value. - * @throws RuntimeException If the VarLong exceeds the maximum size. - */ - fun readVarLong(buf: ByteBuf): Long { - var result = 0L - var shift = 0 - - var currentByte: Byte - do { - currentByte = buf.readByte() - result = - result or ((currentByte.toLong() and DATA_BITS_MASK.toLong()) shl (shift++ * DATA_BITS_PER_BYTE)) - shift += DATA_BITS_PER_BYTE - - checkDecoded(shift <= MAX_VARLONG_SIZE) { "VarLong too big" } - } while (currentByte.toInt() and CONTINUATION_BIT_MASK == CONTINUATION_BIT_MASK) - - return result - } - - /** - * Encodes the given long value as a VarLong and writes it to the specified [ByteBuf]. - * - * @param buf The [ByteBuf] to write to. - * @param value The long value to encode. - * @return The same [ByteBuf] instance for chaining. - */ - fun writeVarLong(buf: ByteBuf, value: Long): ByteBuf { - var value = value - - while ((value and -CONTINUATION_BIT_MASK.toLong()) != 0L) { - buf.writeByte((value and DATA_BITS_MASK.toLong()).toInt() or CONTINUATION_BIT_MASK) - value = value ushr DATA_BITS_PER_BYTE - } - buf.writeByte(value.toInt()) - - return buf - } -} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/NetworkBridge.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/NetworkBridge.kt new file mode 100644 index 0000000..27bf381 --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/NetworkBridge.kt @@ -0,0 +1,22 @@ +package dev.slne.surf.roleplay.mod.common.network + +import dev.slne.surf.roleplay.mod.common.network.protocol.listener.login.ClientLoginPacketListener +import dev.slne.surf.roleplay.mod.common.network.protocol.listener.login.ServerLoginPacketListener +import dev.slne.surf.surfapi.core.api.util.requiredService +import me.mrnavastar.protoweaver.api.ProtoConnectionHandler +import me.mrnavastar.protoweaver.api.netty.ProtoConnection + +private val networkBridge = requiredService() + +interface NetworkBridge { + + val serverLoginPacketHandlerClass: Class? + val clientLoginPacketHandlerClass: Class? + + fun createServerLoginPacketHandler(connection: ProtoConnection): ServerLoginPacketListener + fun createClientLoginPacketHandler(connection: ProtoConnection): ClientLoginPacketListener + + companion object : NetworkBridge by networkBridge { + val INSTANCE: NetworkBridge get() = networkBridge + } +} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/PacketRegistry.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/PacketRegistry.kt new file mode 100644 index 0000000..dbab34c --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/PacketRegistry.kt @@ -0,0 +1,37 @@ +package dev.slne.surf.roleplay.mod.common.network + +import dev.slne.surf.roleplay.mod.common.network.protocol.clientbound.ClientboundHandshakePacket +import dev.slne.surf.roleplay.mod.common.network.protocol.serverbound.ServerboundHandshakePacket +import me.mrnavastar.protoweaver.api.ProtoWeaver +import me.mrnavastar.protoweaver.api.protocol.CompressionType +import me.mrnavastar.protoweaver.api.protocol.Protocol + +@Suppress("UNCHECKED_CAST") +object PacketRegistry { + + val loginProtocol: Protocol = registerLoginProtocol() + val playProtocol: Protocol = registerPlayProtocol() + + init { + ProtoWeaver.load(loginProtocol) +// ProtoWeaver.load(playProtocol) + } + + private fun getBaseProtocol(protocolName: String) = + Protocol.create("surf-roleplay", protocolName) + .setCompression(CompressionType.GZIP) + + private fun registerLoginProtocol() = getBaseProtocol("login") + .apply { + NetworkBridge.clientLoginPacketHandlerClass?.let { setServerHandler(it) } + NetworkBridge.serverLoginPacketHandlerClass?.let { setClientHandler(it) } + } + .addPacket(ClientboundHandshakePacket::class.java) + .addPacket(ServerboundHandshakePacket::class.java) + .build() + + private fun registerPlayProtocol() = getBaseProtocol("play") +// .setServerHandler() +// .setClientHandler() + .build() +} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/SurfRoleplayPacket.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/SurfRoleplayPacket.kt new file mode 100644 index 0000000..6a4dfb0 --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/SurfRoleplayPacket.kt @@ -0,0 +1,7 @@ +package dev.slne.surf.roleplay.mod.common.network + +@Target(AnnotationTarget.CLASS) +@Retention(AnnotationRetention.RUNTIME) +annotation class SurfRoleplayPacket( + val id: String, +) \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/packet/RoleplayPacket.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/packet/RoleplayPacket.kt new file mode 100644 index 0000000..08a6f76 --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/packet/RoleplayPacket.kt @@ -0,0 +1,15 @@ +package dev.slne.surf.roleplay.mod.common.network.packet + +import dev.slne.surf.roleplay.mod.common.network.SurfRoleplayPacket +import dev.slne.surf.roleplay.mod.common.network.protocol.listener.PacketListener + +interface RoleplayPacket { + + val meta: SurfRoleplayPacket + get() = javaClass.getDeclaredAnnotation(SurfRoleplayPacket::class.java) + + val id: String get() = meta.id + + fun handle(listener: L) + +} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/packet/login/ClientboundRoleplayLoginPacket.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/packet/login/ClientboundRoleplayLoginPacket.kt new file mode 100644 index 0000000..50ab90e --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/packet/login/ClientboundRoleplayLoginPacket.kt @@ -0,0 +1,6 @@ +package dev.slne.surf.roleplay.mod.common.network.packet.login + +import dev.slne.surf.roleplay.mod.common.network.packet.RoleplayPacket +import dev.slne.surf.roleplay.mod.common.network.protocol.listener.login.ClientLoginPacketListener + +interface ClientboundRoleplayLoginPacket : RoleplayPacket \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/packet/login/ServerboundRoleplayLoginPacket.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/packet/login/ServerboundRoleplayLoginPacket.kt new file mode 100644 index 0000000..643724d --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/packet/login/ServerboundRoleplayLoginPacket.kt @@ -0,0 +1,6 @@ +package dev.slne.surf.roleplay.mod.common.network.packet.login + +import dev.slne.surf.roleplay.mod.common.network.packet.RoleplayPacket +import dev.slne.surf.roleplay.mod.common.network.protocol.listener.login.ServerLoginPacketListener + +interface ServerboundRoleplayLoginPacket : RoleplayPacket \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/protocol/DefaultIds.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/protocol/DefaultIds.kt similarity index 73% rename from surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/protocol/DefaultIds.kt rename to surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/protocol/DefaultIds.kt index 9197f09..7c195f9 100644 --- a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/protocol/DefaultIds.kt +++ b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/protocol/DefaultIds.kt @@ -1,4 +1,4 @@ -package dev.slne.roleplay.mod.common.network.protocol +package dev.slne.surf.roleplay.mod.common.network.protocol object DefaultIds { // Handshake diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/protocol/clientbound/ClientboundHandshakePacket.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/protocol/clientbound/ClientboundHandshakePacket.kt new file mode 100644 index 0000000..6942ea4 --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/protocol/clientbound/ClientboundHandshakePacket.kt @@ -0,0 +1,16 @@ +package dev.slne.surf.roleplay.mod.common.network.protocol.clientbound + +import dev.slne.surf.roleplay.mod.common.network.SurfRoleplayPacket +import dev.slne.surf.roleplay.mod.common.network.packet.login.ClientboundRoleplayLoginPacket +import dev.slne.surf.roleplay.mod.common.network.protocol.DefaultIds +import dev.slne.surf.roleplay.mod.common.network.protocol.listener.login.ClientLoginPacketListener +import java.util.* + +@SurfRoleplayPacket(id = DefaultIds.CLIENTBOUND_HANDSHAKE) +class ClientboundHandshakePacket( + val handshake: UUID +) : ClientboundRoleplayLoginPacket { + override fun handle(listener: ClientLoginPacketListener) { + listener.handleHandshake(this) + } +} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/protocol/listener/PacketListener.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/protocol/listener/PacketListener.kt new file mode 100644 index 0000000..b132701 --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/protocol/listener/PacketListener.kt @@ -0,0 +1,8 @@ +package dev.slne.surf.roleplay.mod.common.network.protocol.listener + +sealed interface PacketListener { + + interface LoginPacketListener : PacketListener + interface PlayPacketListener : PacketListener + +} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/protocol/listener/TickablePacketListener.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/protocol/listener/TickablePacketListener.kt new file mode 100644 index 0000000..ce5d5a1 --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/protocol/listener/TickablePacketListener.kt @@ -0,0 +1,5 @@ +package dev.slne.surf.roleplay.mod.common.network.protocol.listener + +interface TickablePacketListener { + fun tick() +} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/protocol/listener/login/ClientLoginPacketListener.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/protocol/listener/login/ClientLoginPacketListener.kt new file mode 100644 index 0000000..94eb79d --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/protocol/listener/login/ClientLoginPacketListener.kt @@ -0,0 +1,8 @@ +package dev.slne.surf.roleplay.mod.common.network.protocol.listener.login + +import dev.slne.surf.roleplay.mod.common.network.protocol.clientbound.ClientboundHandshakePacket +import dev.slne.surf.roleplay.mod.common.network.protocol.listener.PacketListener + +interface ClientLoginPacketListener : PacketListener.LoginPacketListener { + fun handleHandshake(packet: ClientboundHandshakePacket) +} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/protocol/listener/login/ServerLoginPacketListener.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/protocol/listener/login/ServerLoginPacketListener.kt new file mode 100644 index 0000000..a0b0d80 --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/protocol/listener/login/ServerLoginPacketListener.kt @@ -0,0 +1,8 @@ +package dev.slne.surf.roleplay.mod.common.network.protocol.listener.login + +import dev.slne.surf.roleplay.mod.common.network.protocol.listener.PacketListener +import dev.slne.surf.roleplay.mod.common.network.protocol.serverbound.ServerboundHandshakePacket + +interface ServerLoginPacketListener : PacketListener.LoginPacketListener { + fun handleHandshake(packet: ServerboundHandshakePacket) +} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/protocol/listener/packet/BasePacketHandler.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/protocol/listener/packet/BasePacketHandler.kt new file mode 100644 index 0000000..b59c2fa --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/protocol/listener/packet/BasePacketHandler.kt @@ -0,0 +1,31 @@ +package dev.slne.surf.roleplay.mod.common.network.protocol.listener.packet + +import dev.slne.surf.roleplay.mod.common.network.protocol.listener.PacketListener +import dev.slne.surf.surfapi.core.api.util.logger +import me.mrnavastar.protoweaver.api.ProtoConnectionHandler +import me.mrnavastar.protoweaver.api.netty.ProtoConnection +import java.util.concurrent.ConcurrentHashMap + +abstract class BasePacketHandler

( + private val packetListenerFactory: (ProtoConnection) -> P +) : ProtoConnectionHandler { + + private val log = logger() + + private val _handlers = ConcurrentHashMap() + protected val handlers get() = _handlers.toMap() + + fun getHandlerOrThrow(connection: ProtoConnection) = + _handlers[connection] ?: error("Unknown connection type: ${connection.remoteAddress}") + + override fun onReady(connection: ProtoConnection) { + log.atInfo().log("New connection from ${connection.remoteAddress}") + _handlers[connection] = packetListenerFactory(connection) + } + + override fun onDisconnect(connection: ProtoConnection) { + log.atInfo().log("Connection from ${connection.remoteAddress} disconnected") + + _handlers.remove(connection) + } +} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/protocol/listener/packet/login/ClientLoginPacketHandler.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/protocol/listener/packet/login/ClientLoginPacketHandler.kt new file mode 100644 index 0000000..02e182d --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/protocol/listener/packet/login/ClientLoginPacketHandler.kt @@ -0,0 +1,19 @@ +package dev.slne.surf.roleplay.mod.common.network.protocol.listener.packet.login + +import dev.slne.surf.roleplay.mod.common.network.NetworkBridge +import dev.slne.surf.roleplay.mod.common.network.packet.login.ClientboundRoleplayLoginPacket +import dev.slne.surf.roleplay.mod.common.network.protocol.listener.login.ClientLoginPacketListener +import dev.slne.surf.roleplay.mod.common.network.protocol.listener.packet.BasePacketHandler +import me.mrnavastar.protoweaver.api.netty.ProtoConnection + +class ClientLoginPacketHandler : BasePacketHandler( + { NetworkBridge.createClientLoginPacketHandler(it) } +) { + override fun handlePacket(connection: ProtoConnection, packet: Any) { + val handler = getHandlerOrThrow(connection) + + if (packet is ClientboundRoleplayLoginPacket) { + packet.handle(handler) + } + } +} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/protocol/serverbound/ServerboundHandshakePacket.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/protocol/serverbound/ServerboundHandshakePacket.kt new file mode 100644 index 0000000..423cccf --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/protocol/serverbound/ServerboundHandshakePacket.kt @@ -0,0 +1,18 @@ +package dev.slne.surf.roleplay.mod.common.network.protocol.serverbound + +import dev.slne.surf.roleplay.mod.common.network.SurfRoleplayPacket +import dev.slne.surf.roleplay.mod.common.network.packet.login.ServerboundRoleplayLoginPacket +import dev.slne.surf.roleplay.mod.common.network.protocol.DefaultIds +import dev.slne.surf.roleplay.mod.common.network.protocol.listener.login.ServerLoginPacketListener +import java.util.* + +@SurfRoleplayPacket(id = DefaultIds.SERVERBOUND_HANDSHAKE) +class ServerboundHandshakePacket( + val handshake: UUID, + val uuid: UUID, + val clientVersion: String, +) : ServerboundRoleplayLoginPacket { + override fun handle(listener: ServerLoginPacketListener) { + listener.handleHandshake(this) + } +} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/user/ProtoUser.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/user/ProtoUser.kt new file mode 100644 index 0000000..d5f12b1 --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/user/ProtoUser.kt @@ -0,0 +1,11 @@ +package dev.slne.surf.roleplay.mod.common.network.user + +import me.mrnavastar.protoweaver.api.netty.ProtoConnection +import java.util.* + +abstract class ProtoUser( + val uuid: UUID, +) { + abstract val connection: ProtoConnection + +} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/user/ProtoUserManager.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/user/ProtoUserManager.kt new file mode 100644 index 0000000..b439c09 --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/user/ProtoUserManager.kt @@ -0,0 +1,27 @@ +package dev.slne.surf.roleplay.mod.common.network.user + +import com.github.benmanes.caffeine.cache.Caffeine +import dev.slne.surf.surfapi.core.api.util.requiredService +import me.mrnavastar.protoweaver.api.netty.ProtoConnection +import java.util.* + +val userManager = requiredService() + +abstract class ProtoUserManager { + private val users = Caffeine.newBuilder() + .build() + + + fun init(uuid: UUID, connection: ProtoConnection) { + users.put(uuid, createUser(uuid, connection)) + } + + fun destroy(uuid: UUID) { + users.invalidate(uuid) + } + + protected abstract fun createUser(uuid: UUID, connection: ProtoConnection): ProtoUser + + operator fun get(uuid: UUID): ProtoUser = + users.getIfPresent(uuid) ?: error("No user exists for $uuid") +} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/RoleplayPacketHandler.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/utils/RoleplayPacketHandler.kt similarity index 67% rename from surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/RoleplayPacketHandler.kt rename to surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/utils/RoleplayPacketHandler.kt index 15234ef..3702f67 100644 --- a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/roleplay/mod/common/network/utils/RoleplayPacketHandler.kt +++ b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/utils/RoleplayPacketHandler.kt @@ -1,4 +1,4 @@ -package dev.slne.roleplay.mod.common.network.utils +package dev.slne.surf.roleplay.mod.common.network.utils @Retention(AnnotationRetention.RUNTIME) @Target(AnnotationTarget.FUNCTION) diff --git a/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/utils/RoleplayPacketListener.kt b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/utils/RoleplayPacketListener.kt new file mode 100644 index 0000000..a4e9dac --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-common/src/main/kotlin/dev/slne/surf/roleplay/mod/common/network/utils/RoleplayPacketListener.kt @@ -0,0 +1,3 @@ +package dev.slne.surf.roleplay.mod.common.network.utils + +interface RoleplayPacketListener \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-server/build.gradle.kts b/surf-roleplay-mod/surf-roleplay-mod-server/build.gradle.kts index 931a7b0..b579e25 100644 --- a/surf-roleplay-mod/surf-roleplay-mod-server/build.gradle.kts +++ b/surf-roleplay-mod/surf-roleplay-mod-server/build.gradle.kts @@ -1,3 +1,6 @@ +import dev.slne.surf.surfapi.gradle.util.registerRequired +import dev.slne.surf.surfapi.gradle.util.withSurfApiBukkit + plugins { id("dev.slne.surf.surfapi.gradle.paper-plugin") } @@ -5,8 +8,22 @@ plugins { surfPaperPluginApi { mainClass("dev.slne.surf.roleplay.mod.server.ModServer") foliaSupported(true) + generateLibraryLoader(false) + + serverDependencies { + registerRequired("ProtoWeaver") + } + + runServer { + withSurfApiBukkit() + + downloadPlugins { + modrinth("protoweaver", "FUBheaaQ") + } + } } dependencies { api(project(":surf-roleplay-mod:surf-roleplay-mod-common")) + compileOnlyApi(libs.protoweaver.paper) } \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-server/src/main/kotlin/dev/slne/roleplay/mod/server/ModServer.kt b/surf-roleplay-mod/surf-roleplay-mod-server/src/main/kotlin/dev/slne/surf/roleplay/mod/server/ModServer.kt similarity index 70% rename from surf-roleplay-mod/surf-roleplay-mod-server/src/main/kotlin/dev/slne/roleplay/mod/server/ModServer.kt rename to surf-roleplay-mod/surf-roleplay-mod-server/src/main/kotlin/dev/slne/surf/roleplay/mod/server/ModServer.kt index 61eff03..e13a86e 100644 --- a/surf-roleplay-mod/surf-roleplay-mod-server/src/main/kotlin/dev/slne/roleplay/mod/server/ModServer.kt +++ b/surf-roleplay-mod/surf-roleplay-mod-server/src/main/kotlin/dev/slne/surf/roleplay/mod/server/ModServer.kt @@ -1,21 +1,17 @@ -package dev.slne.roleplay.mod.server +package dev.slne.surf.roleplay.mod.server import com.github.shynixn.mccoroutine.folia.SuspendingJavaPlugin -import dev.slne.roleplay.mod.server.listener.ListenerManager +import dev.slne.surf.roleplay.mod.server.listener.ListenerManager import org.bukkit.plugin.java.JavaPlugin val plugin get() = JavaPlugin.getPlugin(ModServer::class.java) class ModServer : SuspendingJavaPlugin() { - override suspend fun onLoadAsync() { - - } override suspend fun onEnableAsync() { ListenerManager.register() } override suspend fun onDisableAsync() { - } } \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-server/src/main/kotlin/dev/slne/roleplay/mod/server/listener/ListenerManager.kt b/surf-roleplay-mod/surf-roleplay-mod-server/src/main/kotlin/dev/slne/surf/roleplay/mod/server/listener/ListenerManager.kt similarity index 50% rename from surf-roleplay-mod/surf-roleplay-mod-server/src/main/kotlin/dev/slne/roleplay/mod/server/listener/ListenerManager.kt rename to surf-roleplay-mod/surf-roleplay-mod-server/src/main/kotlin/dev/slne/surf/roleplay/mod/server/listener/ListenerManager.kt index e0faa87..3541e5f 100644 --- a/surf-roleplay-mod/surf-roleplay-mod-server/src/main/kotlin/dev/slne/roleplay/mod/server/listener/ListenerManager.kt +++ b/surf-roleplay-mod/surf-roleplay-mod-server/src/main/kotlin/dev/slne/surf/roleplay/mod/server/listener/ListenerManager.kt @@ -1,9 +1,8 @@ -package dev.slne.roleplay.mod.server.listener +package dev.slne.surf.roleplay.mod.server.listener object ListenerManager { fun register() { - } } \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-server/src/main/kotlin/dev/slne/surf/roleplay/mod/server/network/ServerLoginPacketHandler.kt b/surf-roleplay-mod/surf-roleplay-mod-server/src/main/kotlin/dev/slne/surf/roleplay/mod/server/network/ServerLoginPacketHandler.kt new file mode 100644 index 0000000..ddbc171 --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-server/src/main/kotlin/dev/slne/surf/roleplay/mod/server/network/ServerLoginPacketHandler.kt @@ -0,0 +1,24 @@ +package dev.slne.surf.roleplay.mod.server.network + +import dev.slne.surf.roleplay.mod.common.network.packet.login.ServerboundRoleplayLoginPacket +import dev.slne.surf.roleplay.mod.common.network.protocol.listener.packet.BasePacketHandler +import dev.slne.surf.roleplay.mod.server.network.listener.ServerLoginPacketListenerImpl +import me.mrnavastar.protoweaver.api.netty.ProtoConnection + +class ServerLoginPacketHandler : BasePacketHandler( + { ServerLoginPacketListenerImpl(it) } +) { + + override fun onReady(connection: ProtoConnection) { + super.onReady(connection) + getHandlerOrThrow(connection).startVerifying() + } + + override fun handlePacket(connection: ProtoConnection, packet: Any) { + val handler = getHandlerOrThrow(connection) + + if (packet is ServerboundRoleplayLoginPacket) { + packet.handle(handler) + } + } +} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-server/src/main/kotlin/dev/slne/surf/roleplay/mod/server/network/ServerNetworkBridgeImpl.kt b/surf-roleplay-mod/surf-roleplay-mod-server/src/main/kotlin/dev/slne/surf/roleplay/mod/server/network/ServerNetworkBridgeImpl.kt new file mode 100644 index 0000000..e87c499 --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-server/src/main/kotlin/dev/slne/surf/roleplay/mod/server/network/ServerNetworkBridgeImpl.kt @@ -0,0 +1,21 @@ +package dev.slne.surf.roleplay.mod.server.network + +import com.google.auto.service.AutoService +import dev.slne.surf.roleplay.mod.common.network.NetworkBridge +import dev.slne.surf.roleplay.mod.common.network.protocol.listener.login.ClientLoginPacketListener +import dev.slne.surf.roleplay.mod.server.network.listener.ServerLoginPacketListenerImpl +import me.mrnavastar.protoweaver.api.netty.ProtoConnection + +@AutoService(NetworkBridge::class) +class ServerNetworkBridgeImpl : NetworkBridge { + + override val serverLoginPacketHandlerClass = ServerLoginPacketHandler::class.java + override val clientLoginPacketHandlerClass = null + + override fun createServerLoginPacketHandler(connection: ProtoConnection) = + ServerLoginPacketListenerImpl(connection) + + override fun createClientLoginPacketHandler(connection: ProtoConnection): ClientLoginPacketListener { + error("Client login packet handler is not implemented on the server side") + } +} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-server/src/main/kotlin/dev/slne/surf/roleplay/mod/server/network/listener/ServerLoginPacketListenerImpl.kt b/surf-roleplay-mod/surf-roleplay-mod-server/src/main/kotlin/dev/slne/surf/roleplay/mod/server/network/listener/ServerLoginPacketListenerImpl.kt new file mode 100644 index 0000000..6544b36 --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-server/src/main/kotlin/dev/slne/surf/roleplay/mod/server/network/listener/ServerLoginPacketListenerImpl.kt @@ -0,0 +1,44 @@ +package dev.slne.surf.roleplay.mod.server.network.listener + +import dev.slne.surf.roleplay.mod.common.network.protocol.clientbound.ClientboundHandshakePacket +import dev.slne.surf.roleplay.mod.common.network.protocol.listener.TickablePacketListener +import dev.slne.surf.roleplay.mod.common.network.protocol.listener.login.ServerLoginPacketListener +import dev.slne.surf.roleplay.mod.common.network.protocol.serverbound.ServerboundHandshakePacket +import dev.slne.surf.roleplay.mod.common.network.user.userManager +import me.mrnavastar.protoweaver.api.netty.ProtoConnection +import java.util.* + +class ServerLoginPacketListenerImpl(val connection: ProtoConnection) : ServerLoginPacketListener, + TickablePacketListener { + + private var loginTime: Int = 0 + private val handshake = UUID.randomUUID() + + fun startVerifying() { + connection.send(ClientboundHandshakePacket(handshake)) + } + + override fun tick() { + if (loginTime++ >= LOGIN_TIMEOUT) { + disconnect("Login timeout") + } + } + + override fun handleHandshake(packet: ServerboundHandshakePacket) { + if (packet.handshake != handshake) { + disconnect("Handshake mismatch") + return + } + + + userManager.init(packet.uuid, connection) + } + + private fun disconnect(reason: String) { + + } + + companion object { + const val LOGIN_TIMEOUT = 30 // seconds + } +} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-server/src/main/kotlin/dev/slne/surf/roleplay/mod/server/network/user/ServerProtoUser.kt b/surf-roleplay-mod/surf-roleplay-mod-server/src/main/kotlin/dev/slne/surf/roleplay/mod/server/network/user/ServerProtoUser.kt new file mode 100644 index 0000000..45c50ac --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-server/src/main/kotlin/dev/slne/surf/roleplay/mod/server/network/user/ServerProtoUser.kt @@ -0,0 +1,8 @@ +package dev.slne.surf.roleplay.mod.server.network.user + +import dev.slne.surf.roleplay.mod.common.network.user.ProtoUser +import me.mrnavastar.protoweaver.api.netty.ProtoConnection +import java.util.* + +class ServerProtoUser(uuid: UUID, override val connection: ProtoConnection) : ProtoUser(uuid) { +} \ No newline at end of file diff --git a/surf-roleplay-mod/surf-roleplay-mod-server/src/main/kotlin/dev/slne/surf/roleplay/mod/server/network/user/ServerProtoUserManager.kt b/surf-roleplay-mod/surf-roleplay-mod-server/src/main/kotlin/dev/slne/surf/roleplay/mod/server/network/user/ServerProtoUserManager.kt new file mode 100644 index 0000000..59adc7e --- /dev/null +++ b/surf-roleplay-mod/surf-roleplay-mod-server/src/main/kotlin/dev/slne/surf/roleplay/mod/server/network/user/ServerProtoUserManager.kt @@ -0,0 +1,14 @@ +package dev.slne.surf.roleplay.mod.server.network.user + +import com.google.auto.service.AutoService +import dev.slne.surf.roleplay.mod.common.network.user.ProtoUserManager +import me.mrnavastar.protoweaver.api.netty.ProtoConnection +import java.util.* + +@AutoService(ProtoUserManager::class) +class ServerProtoUserManager : ProtoUserManager() { + override fun createUser( + uuid: UUID, + connection: ProtoConnection + ) = ServerProtoUser(uuid, connection) +} \ No newline at end of file From 8813cdb1f32a7f6da586086a746b97ca66b578db Mon Sep 17 00:00:00 2001 From: Ammo Date: Fri, 22 Aug 2025 14:02:58 +0200 Subject: [PATCH 06/11] Implement weapon mechanics and refactor related classes: add PlayerMagazine, PlayerWeapon, and enhance lockpick functionality --- settings.gradle.kts | 6 - .../build.gradle.kts | 11 -- .../build.gradle.kts | 11 -- .../surf-roleplay-common-api/build.gradle.kts | 7 - .../api/common/mechanic/MechanicRegistry.kt | 21 --- .../common/mechanic/idcard/IdCardMechanic.kt | 5 - .../api/common/mechanic/rentable/Rentable.kt | 120 --------------- .../mechanic/rentable/RentableMechanic.kt | 81 ---------- .../mechanic/rentable/rentables/Apartment.kt | 8 - .../mechanic/rentable/rentables/House.kt | 8 - .../mechanic/rentable/utils/door/Door.kt | 38 ----- .../api/common/mechanic/weapon/Weapon.kt | 29 ---- .../common/mechanic/weapon/WeaponMechanic.kt | 11 -- .../mechanic/weapon/magazine/Magazine.kt | 37 ----- .../roleplay/api/common/player/RpPlayer.kt | 120 --------------- .../api/common/player/RpPlayerManager.kt | 15 -- .../api/common/player/identity/RpIdentity.kt | 141 ------------------ .../common/player/license/ExpirableLicense.kt | 13 -- .../api/common/player/license/License.kt | 60 -------- .../player/license/LicenseSerializer.kt | 26 ---- .../events/RpPlayerLicenseRemovedEvent.kt | 15 -- .../civilian/CivilianFishingLicense.kt | 5 - .../civilian/CivilianVehicleLicense.kt | 14 -- .../civilian/CivilianWeaponLicense.kt | 8 - .../licenses/police/PoliceWeaponLicense.kt | 8 - .../common/transaction/utils/BalanceType.kt | 35 ----- .../surf/roleplay/api/common/util/RpJob.kt | 63 -------- .../surf-roleplay-server-api/build.gradle.kts | 11 -- .../build.gradle.kts | 1 - .../core/client/player/ClientRpPlayer.kt | 4 +- .../client/player/ClientRpPlayerManager.kt | 10 +- .../build.gradle.kts | 4 - .../roleplay/core/common/ContextHolderImpl.kt | 4 +- .../{CommonRpInstance.kt => RpInstance.kt} | 12 +- .../core/common/mechanics/CommonMechanic.kt | 11 -- .../core/common/mechanics}/Mechanic.kt | 28 ++-- ...echanicRegistry.kt => MechanicRegistry.kt} | 19 ++- .../mechanics/idcard/IdCardCommonMechanic.kt | 8 - .../common/mechanics/idcard/IdCardMechanic.kt | 7 + .../core/common/mechanics/rentable/Cracker.kt | 6 +- .../mechanics/rentable/RentCollectorJob.kt | 16 +- .../rentable/{RentableImpl.kt => Rentable.kt} | 90 +++++++---- .../mechanics/rentable/RentableMechanic.kt | 124 +++++++++++++++ .../rentable/RentableMechanicImpl.kt | 85 ----------- .../mechanics/rentable}/StorageContainer.kt | 48 +++--- .../rentable/StorageContainerImpl.kt | 34 ----- .../containers/RegularStorageContainer.kt | 13 +- .../containers/VaultStorageContainer.kt | 21 ++- .../rentable/door/{DoorImpl.kt => Door.kt} | 27 ++-- .../rentable/door/doors/FrontDoor.kt | 12 +- .../rentable/door/doors/GarageDoor.kt | 12 +- .../rentable/door/doors/RegularDoor.kt | 12 +- .../events/RentableMemberAddEvent.kt | 6 +- .../events/RentableMemberRemoveEvent.kt | 6 +- .../events/RentableOwnerChangeEvent.kt | 8 +- .../events/RentableRentCollectEvent.kt | 4 +- .../mechanics/rentable/lockpick}/LockPick.kt | 23 +-- .../rentable/lockpick/LockPickImpl.kt | 10 -- .../lockpick/lockpicks/BatteringRam.kt | 4 +- .../lockpick/lockpicks/PremiumLockPick.kt | 4 +- .../lockpick/lockpicks/RegularLockPick.kt | 4 +- .../rentables/{HouseImpl.kt => Apartment.kt} | 13 +- .../rentables/{ApartmentImpl.kt => House.kt} | 13 +- .../mechanics}/rentable/utils/Crackable.kt | 5 +- .../rentable/utils}/DoorContainer.kt | 3 +- .../mechanics}/rentable/utils/Lockable.kt | 4 +- .../core/common/mechanics/weapon/Weapon.kt | 28 ++++ .../common/mechanics/weapon/WeaponImpl.kt | 37 ----- .../common/mechanics/weapon/WeaponMechanic.kt | 12 ++ .../mechanics/weapon/WeaponMechanicImpl.kt | 18 --- .../mechanics/weapon/magazine/Magazine.kt | 17 +++ .../mechanics/weapon/magazine/MagazineImpl.kt | 21 --- .../weapon/magazine/PlayerMagazine.kt | 8 + .../weapon/magazine/PlayerMagazineImpl.kt | 11 -- .../mechanics/weapon/player/PlayerWeapon.kt | 15 ++ .../weapon/player/PlayerWeaponImpl.kt | 16 -- .../mechanics}/weapon/utils/WeaponType.kt | 2 +- .../common/player/CommonRpPlayerManager.kt | 25 ---- .../common/player/PlayerIdentityFetcher.kt | 4 +- .../player/{CommonRpPlayer.kt => RpPlayer.kt} | 74 +++++---- .../core/common/player/RpPlayerManager.kt | 30 ++++ .../common/player/events/RpPlayerJoinEvent.kt | 4 +- .../common/player/events/RpPlayerQuitEvent.kt | 4 +- .../{CommonRpIdentity.kt => RpIdentity.kt} | 60 ++++---- .../common/player/identity/RpIdentityType.kt | 33 ++++ ...ianIdentityImpl.kt => CivilianIdentity.kt} | 18 ++- ...oliceIdentityImpl.kt => PoliceIdentity.kt} | 23 +-- ...entityImpl.kt => RescueServiceIdentity.kt} | 21 ++- .../ClientboundIdentityGetPacket.kt | 32 ---- .../ServerboundCreateIdentityPacket.kt | 4 - .../player/license/CommonLicenseBridge.kt | 28 ---- ...xpirableLicense.kt => ExpirableLicense.kt} | 13 +- .../common/player/license/HasLicenses.kt | 18 +-- .../common/player/license/IdentityLicense.kt | 6 +- .../license/{CommonLicense.kt => License.kt} | 34 +++-- .../common/player/license/LicenseService.kt | 38 +++-- .../events/RpPlayerLicenseAddedEvent.kt | 8 +- .../events/RpPlayerLicenseRemovedEvent.kt | 15 ++ .../civilian/CivilianFishingLicense.kt | 9 +- ...censeImpl.kt => CivilianVehicleLicense.kt} | 61 ++++---- ...icenseImpl.kt => CivilianWeaponLicense.kt} | 17 +-- .../license/utils/LicenseCreateResult.kt | 4 +- .../license/utils/LicenseRemovedReason.kt | 6 +- .../license/utils/UnobtainableReason.kt | 4 +- .../common/transaction/HasRpTransactions.kt | 4 +- .../core}/common/transaction/RpTransaction.kt | 6 +- .../common/transaction/utils/BalanceType.kt | 38 +++++ .../common/util}/InternalContextHolder.kt | 3 +- .../core}/common/util/InternalRoleplayApi.kt | 2 +- surf-roleplay-paper/build.gradle.kts | 1 - .../dev/slne/surf/roleplay/paper/PaperMain.kt | 8 +- .../surf/roleplay/paper/PaperRpInstance.kt | 8 +- .../paper/command/ActiveIdentityCommand.kt | 2 +- .../roleplay/paper/command/BalanceCommand.kt | 4 +- .../paper/command/args/BalanceTypeArgument.kt | 2 +- .../roleplay/paper/listener/OnlineListener.kt | 6 +- .../mechanics/idcard/IdCardMechanicImpl.kt | 4 +- .../idcard/dialogs/CreateIdDialog.kt | 4 +- .../rentable/commands/RentableCommand.kt | 6 +- .../listeners/RentCollectedListener.kt | 2 +- .../rentable/listeners/RentableListener.kt | 6 +- .../paper/player/events/RpPlayerDeathEvent.kt | 2 +- .../listener/IdentityOnlineListener.kt | 2 +- .../license/dialogs/BuyLicenseDialog.kt | 5 +- .../player/license/dialogs/LicenseDialog.kt | 4 +- .../player/license/dialogs/MyLicenseDialog.kt | 2 +- .../listeners/LicenseChangedHandler.kt | 4 +- .../roleplay}/paper/player/player-utils.kt | 2 +- surf-roleplay-server/build.gradle.kts | 1 - .../mechanics/idcard/IdCardMechanicImpl.kt | 4 +- .../civilian/RpPlayerCivilianIdentityModel.kt | 4 +- .../police/RpPlayerPoliceIdentityModel.kt | 4 +- .../RpPlayerRescueServiceIdentityModel.kt | 4 +- .../player/license/LicenseExpirationJob.kt | 8 +- .../player/license/db/IdentityLicenseModel.kt | 2 +- 135 files changed, 838 insertions(+), 1736 deletions(-) delete mode 100644 surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-common-api/build.gradle.kts delete mode 100644 surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/build.gradle.kts delete mode 100644 surf-roleplay-api/surf-roleplay-common-api/build.gradle.kts delete mode 100644 surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/MechanicRegistry.kt delete mode 100644 surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/idcard/IdCardMechanic.kt delete mode 100644 surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/Rentable.kt delete mode 100644 surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/RentableMechanic.kt delete mode 100644 surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/rentables/Apartment.kt delete mode 100644 surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/rentables/House.kt delete mode 100644 surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/door/Door.kt delete mode 100644 surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/weapon/Weapon.kt delete mode 100644 surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/weapon/WeaponMechanic.kt delete mode 100644 surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/weapon/magazine/Magazine.kt delete mode 100644 surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/RpPlayer.kt delete mode 100644 surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/RpPlayerManager.kt delete mode 100644 surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/identity/RpIdentity.kt delete mode 100644 surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/ExpirableLicense.kt delete mode 100644 surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/License.kt delete mode 100644 surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/LicenseSerializer.kt delete mode 100644 surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/events/RpPlayerLicenseRemovedEvent.kt delete mode 100644 surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/licenses/civilian/CivilianFishingLicense.kt delete mode 100644 surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/licenses/civilian/CivilianVehicleLicense.kt delete mode 100644 surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/licenses/civilian/CivilianWeaponLicense.kt delete mode 100644 surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/licenses/police/PoliceWeaponLicense.kt delete mode 100644 surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/transaction/utils/BalanceType.kt delete mode 100644 surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/util/RpJob.kt delete mode 100644 surf-roleplay-api/surf-roleplay-server-api/build.gradle.kts rename surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/{CommonRpInstance.kt => RpInstance.kt} (52%) delete mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/CommonMechanic.kt rename {surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic => surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics}/Mechanic.kt (70%) rename surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/{CommonMechanicRegistry.kt => MechanicRegistry.kt} (59%) delete mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/idcard/IdCardCommonMechanic.kt create mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/idcard/IdCardMechanic.kt rename surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/{RentableImpl.kt => Rentable.kt} (61%) create mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/RentableMechanic.kt delete mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/RentableMechanicImpl.kt rename {surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils => surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable}/StorageContainer.kt (60%) delete mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/StorageContainerImpl.kt rename surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/door/{DoorImpl.kt => Door.kt} (64%) rename {surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils => surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable}/events/RentableMemberAddEvent.kt (88%) rename {surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils => surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable}/events/RentableMemberRemoveEvent.kt (89%) rename {surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils => surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable}/events/RentableOwnerChangeEvent.kt (94%) rename {surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils => surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable}/events/RentableRentCollectEvent.kt (77%) rename {surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils => surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/lockpick}/LockPick.kt (54%) delete mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/lockpick/LockPickImpl.kt rename surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/rentables/{HouseImpl.kt => Apartment.kt} (68%) rename surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/rentables/{ApartmentImpl.kt => House.kt} (67%) rename {surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic => surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics}/rentable/utils/Crackable.kt (81%) rename {surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/door => surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/utils}/DoorContainer.kt (63%) rename {surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic => surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics}/rentable/utils/Lockable.kt (78%) create mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/Weapon.kt delete mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/WeaponImpl.kt create mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/WeaponMechanic.kt delete mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/WeaponMechanicImpl.kt create mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/magazine/Magazine.kt delete mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/magazine/MagazineImpl.kt create mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/magazine/PlayerMagazine.kt delete mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/magazine/PlayerMagazineImpl.kt create mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/player/PlayerWeapon.kt delete mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/player/PlayerWeaponImpl.kt rename {surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic => surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics}/weapon/utils/WeaponType.kt (74%) delete mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/CommonRpPlayerManager.kt rename surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/{CommonRpPlayer.kt => RpPlayer.kt} (66%) create mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/RpPlayerManager.kt rename {surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api => surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core}/common/player/events/RpPlayerJoinEvent.kt (56%) rename {surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api => surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core}/common/player/events/RpPlayerQuitEvent.kt (56%) rename surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/{CommonRpIdentity.kt => RpIdentity.kt} (69%) create mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/RpIdentityType.kt rename surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/identities/{CivilianIdentityImpl.kt => CivilianIdentity.kt} (68%) rename surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/identities/{PoliceIdentityImpl.kt => PoliceIdentity.kt} (66%) rename surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/identities/{RescueServiceIdentityImpl.kt => RescueServiceIdentity.kt} (66%) delete mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/protocol/clientbound/ClientboundIdentityGetPacket.kt delete mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/protocol/serverbound/ServerboundCreateIdentityPacket.kt delete mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/CommonLicenseBridge.kt rename surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/{CommonExpirableLicense.kt => ExpirableLicense.kt} (66%) rename {surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api => surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core}/common/player/license/HasLicenses.kt (78%) rename {surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api => surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core}/common/player/license/IdentityLicense.kt (93%) rename surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/{CommonLicense.kt => License.kt} (66%) rename surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/InternalLicenseBridge.kt => surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/LicenseService.kt (70%) rename {surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api => surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core}/common/player/license/events/RpPlayerLicenseAddedEvent.kt (51%) create mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/events/RpPlayerLicenseRemovedEvent.kt rename surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/licenses/civilian/{CivilianVehicleLicenseImpl.kt => CivilianVehicleLicense.kt} (65%) rename surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/licenses/civilian/{CivilianWeaponLicenseImpl.kt => CivilianWeaponLicense.kt} (69%) rename {surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api => surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core}/common/player/license/utils/LicenseCreateResult.kt (58%) rename {surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api => surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core}/common/player/license/utils/LicenseRemovedReason.kt (89%) rename {surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api => surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core}/common/player/license/utils/UnobtainableReason.kt (93%) rename {surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api => surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core}/common/transaction/HasRpTransactions.kt (98%) rename {surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api => surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core}/common/transaction/RpTransaction.kt (80%) create mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/transaction/utils/BalanceType.kt rename {surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common => surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/util}/InternalContextHolder.kt (73%) rename {surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api => surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core}/common/util/InternalRoleplayApi.kt (92%) rename {surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api => surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay}/paper/player/events/RpPlayerDeathEvent.kt (96%) rename {surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api => surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay}/paper/player/player-utils.kt (83%) diff --git a/settings.gradle.kts b/settings.gradle.kts index 38b54dd..eb72fd8 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -14,12 +14,6 @@ plugins { id("org.gradle.toolchains.foojay-resolver-convention") version "0.8.0" } -include("surf-roleplay-api:surf-roleplay-common-api") -include("surf-roleplay-api:surf-roleplay-client-api:surf-roleplay-client-common-api") -include("surf-roleplay-api:surf-roleplay-client-api:surf-roleplay-client-paper-api") -include("surf-roleplay-api:surf-roleplay-client-api:surf-roleplay-client-velocity-api") -include("surf-roleplay-api:surf-roleplay-server-api") - include("surf-roleplay-core:surf-roleplay-core-common") include("surf-roleplay-core:surf-roleplay-core-client") include("surf-roleplay-paper") diff --git a/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-common-api/build.gradle.kts b/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-common-api/build.gradle.kts deleted file mode 100644 index d6c8fc1..0000000 --- a/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-common-api/build.gradle.kts +++ /dev/null @@ -1,11 +0,0 @@ -plugins { - id("dev.slne.surf.surfapi.gradle.core") -} - -surfCoreApi { - withCloudClientCommon() -} - -dependencies { - api(project(":surf-roleplay-api:surf-roleplay-common-api")) -} \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/build.gradle.kts b/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/build.gradle.kts deleted file mode 100644 index 0f4c276..0000000 --- a/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/build.gradle.kts +++ /dev/null @@ -1,11 +0,0 @@ -plugins { - id("dev.slne.surf.surfapi.gradle.paper-raw") -} - -surfRawPaperApi { - withCloudClientPaper() -} - -dependencies { - api(project(":surf-roleplay-api:surf-roleplay-client-api:surf-roleplay-client-common-api")) -} \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-common-api/build.gradle.kts b/surf-roleplay-api/surf-roleplay-common-api/build.gradle.kts deleted file mode 100644 index 7516627..0000000 --- a/surf-roleplay-api/surf-roleplay-common-api/build.gradle.kts +++ /dev/null @@ -1,7 +0,0 @@ -plugins { - id("dev.slne.surf.surfapi.gradle.core") -} - -surfCoreApi { - withCloudCommon() -} \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/MechanicRegistry.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/MechanicRegistry.kt deleted file mode 100644 index 19f5cb3..0000000 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/MechanicRegistry.kt +++ /dev/null @@ -1,21 +0,0 @@ -package dev.slne.surf.roleplay.api.common.mechanic - -interface MechanicRegistry { - - /** - * Returns the mechanic instance of the specified class. - * - * @param clazz The class of the mechanic to retrieve. - * @return The mechanic instance of the specified class. - * @throws IllegalArgumentException if no mechanic of the specified class is registered. - */ - fun getMechanic(clazz: Class): T -} - -/** - * Returns the mechanic instance of the specified type. - * This is a convenience function that uses reified type parameters - * - * @return The mechanic instance of the specified type - */ -inline fun MechanicRegistry.getMechanic(): T = getMechanic(T::class.java) \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/idcard/IdCardMechanic.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/idcard/IdCardMechanic.kt deleted file mode 100644 index f9454bd..0000000 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/idcard/IdCardMechanic.kt +++ /dev/null @@ -1,5 +0,0 @@ -package dev.slne.surf.roleplay.api.common.mechanic.idcard - -import dev.slne.surf.roleplay.api.common.mechanic.Mechanic - -interface IdCardMechanic : Mechanic \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/Rentable.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/Rentable.kt deleted file mode 100644 index 65784a6..0000000 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/Rentable.kt +++ /dev/null @@ -1,120 +0,0 @@ -package dev.slne.surf.roleplay.api.common.mechanic.rentable - -import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.StorageContainer -import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.door.Door -import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.door.DoorContainer -import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.events.RentableMemberAddEvent -import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.events.RentableMemberRemoveEvent -import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.events.RentableOwnerChangeEvent -import dev.slne.surf.roleplay.api.common.player.RpPlayer -import it.unimi.dsi.fastutil.objects.ObjectSet -import net.kyori.adventure.key.Key -import net.kyori.adventure.text.ComponentLike -import org.jetbrains.annotations.Unmodifiable -import java.time.ZonedDateTime -import kotlin.time.Duration - -/** - * Represents a rentable property in the game. - * A rentable property can be owned, rented, and have members associated with it. - */ -interface Rentable : ComponentLike { - - /** - * The unique identifier for the rentable property. - */ - val key: Key - - /** - * The name of the rentable property. - */ - val rent: Int - - /** - * The duration for which the property can be rented, after this the rent will be due again. - */ - val rentDuration: Duration - - /** - * The date and time when the rent was last collected. - */ - val lastRentCollection: ZonedDateTime? - - /** - * The size of the rentable property in square blocks. - */ - val size: Double - - /** - * The number of stories in the rentable property. - */ - val stories: Int - - /** - * The owner of the rentable property, if any. - */ - val owner: RpPlayer? - - /** - * The members of the rentable property, if any. - */ - val members: @Unmodifiable ObjectSet - - /** - * The [StorageContainer]s of this rentable - */ - val storageContainers: @Unmodifiable ObjectSet - - /** - * The [Door]s of this rentable - */ - val doorContainers: @Unmodifiable ObjectSet - - /** - * Checks if the property is currently rented. - */ - val isRented: Boolean - - /** - * Sets the owner of the rentable property and collects the first rent - * - * @param player The player to set as the owner of the rentable property. - * @param reason The reason for the owner change, which can be used to determine the context of the change. - * @return The result of the owner change event, indicating success or failure. - */ - suspend fun setOwner( - player: RpPlayer?, - reason: RentableOwnerChangeEvent.OwnerChangeReason - ): RentableOwnerChangeEvent.OwnerSetResult - - /** - * Adds a member to the rentable property. - * - * @param player The player to add as a member. - * @return The result of the member addition event, indicating success or failure. - */ - fun addMember(player: RpPlayer): RentableMemberAddEvent.MemberAddResult - - /** - * Removes a member from the rentable property. - * - * @param player The player to remove from the members. - * @return The result of the member removal event, indicating success or failure. - */ - fun removeMember(player: RpPlayer): RentableMemberRemoveEvent.MemberRemoveResult - - /** - * Checks if the player is a member of the rentable property. - * - * @param player The player to check. - * @return True if the player is a member, false otherwise. - */ - fun isMember(player: RpPlayer): Boolean - - /** - * Collects the rent for the rentable property. - * - * @return The result of the rent collection, indicating success or failure. - */ - suspend fun collectRent(): RentableMechanic.RentCollectResult -} \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/RentableMechanic.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/RentableMechanic.kt deleted file mode 100644 index 358fcbf..0000000 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/RentableMechanic.kt +++ /dev/null @@ -1,81 +0,0 @@ -package dev.slne.surf.roleplay.api.common.mechanic.rentable - -import dev.slne.surf.roleplay.api.common.mechanic.Mechanic -import dev.slne.surf.roleplay.api.common.player.RpPlayer -import it.unimi.dsi.fastutil.objects.ObjectSet -import net.kyori.adventure.key.Key -import org.jetbrains.annotations.Unmodifiable - -interface RentableMechanic : Mechanic { - - /** - * The rentables - */ - val rentables: @Unmodifiable ObjectSet - - /** - * Adds a rentable - * - * @param rentable the [Rentable] - * @return If adding the rentable was successful - */ - fun addRentable(rentable: Rentable): Boolean - - /** - * Collects the rent for a [Rentable] - * - * @param rentable the [Rentable] to collect rent for - * @return the result of the rent collection - */ - suspend fun collectRent(rentable: Rentable): RentCollectResult - - /** - * Returns the owned [Rentable]s for one [RpPlayer] - * - * @param player the [RpPlayer] - * @return an object set of [Rentable]s - */ - fun getOwnedRentablesByPlayer(player: RpPlayer): ObjectSet - - /** - * Returns the maximum number of ownable rentables for a player. - * - * @param player the [RpPlayer] to check - * @return the maximum number of ownable rentables - */ - fun getMaxOwnableRentablesByPlayer(player: RpPlayer): Int - - /** - * Returns a [Rentable] by its key. - * - * @param key the [Key] of the [Rentable] - * @return the [Rentable] if found, or null if not found - */ - fun getByKey(key: Key): Rentable? - - /** - * The result of a rent collection attempt. - */ - enum class RentCollectResult { - /** - * The rent was successfully collected. - */ - SUCCESS, - - /** - * The rent collection was cancelled, possibly due to an event. - */ - EVENT_CANCELLED, - - /** - * The player does not have enough money to pay the rent. - */ - NOT_ENOUGH_MONEY, - - /** - * The rentable is not currently rented. - */ - NOT_RENTED, - } - -} \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/rentables/Apartment.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/rentables/Apartment.kt deleted file mode 100644 index f536300..0000000 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/rentables/Apartment.kt +++ /dev/null @@ -1,8 +0,0 @@ -package dev.slne.surf.roleplay.api.common.mechanic.rentable.rentables - -import dev.slne.surf.roleplay.api.common.mechanic.rentable.Rentable - -/** - * Represents an apartment that can be rented. - */ -interface Apartment : Rentable \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/rentables/House.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/rentables/House.kt deleted file mode 100644 index 2f0f8a6..0000000 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/rentables/House.kt +++ /dev/null @@ -1,8 +0,0 @@ -package dev.slne.surf.roleplay.api.common.mechanic.rentable.rentables - -import dev.slne.surf.roleplay.api.common.mechanic.rentable.Rentable - -/** - * Represents a house that can be rented. - */ -interface House : Rentable \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/door/Door.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/door/Door.kt deleted file mode 100644 index a376373..0000000 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/door/Door.kt +++ /dev/null @@ -1,38 +0,0 @@ -package dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.door - -import dev.slne.surf.cloud.api.common.player.teleport.TeleportLocation -import dev.slne.surf.roleplay.api.common.mechanic.rentable.Rentable -import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.Crackable -import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.Lockable - -/** - * Represents a door in the game that can be locked and cracked. - * A door is associated with a rentable property and has a specific location in the world. - */ -interface Door : Lockable, Crackable { - - /** - * The rentable property that this door belongs to. - */ - val rentable: Rentable - - /** - * The door container of this door, which holds multiple doors. - */ - val container: DoorContainer - - /** - * The location of the door in the world. - */ - val location: TeleportLocation - - /** - * Opens the door. - */ - suspend fun open() - - /** - * Closes the door. - */ - suspend fun close() -} \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/weapon/Weapon.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/weapon/Weapon.kt deleted file mode 100644 index 9a7095a..0000000 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/weapon/Weapon.kt +++ /dev/null @@ -1,29 +0,0 @@ -package dev.slne.surf.roleplay.api.common.mechanic.weapon - -import dev.slne.surf.roleplay.api.common.mechanic.weapon.magazine.Magazine -import dev.slne.surf.roleplay.api.common.mechanic.weapon.utils.WeaponType -import dev.slne.surf.surfapi.core.api.messages.builder.SurfComponentBuilder -import it.unimi.dsi.fastutil.objects.ObjectSet -import net.kyori.adventure.key.Key -import net.kyori.adventure.text.Component -import kotlin.time.Duration - -interface Weapon { - - val type: WeaponType - - val name: String - - val weaponMaterial: Key - - val displayName: SurfComponentBuilder.() -> Unit - - val description: Component - - val weaponShootCooldown: Duration - - val supportedMagazines: ObjectSet - - fun isApplicableMagazine(magazine: Magazine): Boolean - -} \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/weapon/WeaponMechanic.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/weapon/WeaponMechanic.kt deleted file mode 100644 index e17f6b9..0000000 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/weapon/WeaponMechanic.kt +++ /dev/null @@ -1,11 +0,0 @@ -package dev.slne.surf.roleplay.api.common.mechanic.weapon - -import dev.slne.surf.roleplay.api.common.mechanic.Mechanic -import it.unimi.dsi.fastutil.objects.ObjectSet -import org.jetbrains.annotations.Unmodifiable - -interface WeaponMechanic : Mechanic { - - val weapons: @Unmodifiable ObjectSet - -} \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/weapon/magazine/Magazine.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/weapon/magazine/Magazine.kt deleted file mode 100644 index ca32439..0000000 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/weapon/magazine/Magazine.kt +++ /dev/null @@ -1,37 +0,0 @@ -package dev.slne.surf.roleplay.api.common.mechanic.weapon.magazine - -import dev.slne.surf.surfapi.core.api.messages.builder.SurfComponentBuilder -import net.kyori.adventure.text.Component - -interface Magazine { - - /** - * The unique identifier of the magazine. - * This is used to identify the magazine in the system. - */ - val name: String - - /** - * The display name of the magazine. - * This is a function that allows you to build the display name using a [SurfComponentBuilder]. - */ - val displayName: SurfComponentBuilder.() -> Unit - - /** - * The description of the magazine. - */ - val description: Component - - /** - * The maximum amount of ammo that can be loaded into this magazine. - * This is used to determine how many bullets the magazine can hold. - */ - val maxAmmo: Int - - /** - * Function to calculate the damage dealt by the weapon using this magazine. - * The function takes the distance to the target hit as a parameter and returns the damage dealt. - */ - val damageFunction: (Double) -> Double - -} \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/RpPlayer.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/RpPlayer.kt deleted file mode 100644 index 319494d..0000000 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/RpPlayer.kt +++ /dev/null @@ -1,120 +0,0 @@ -@file:OptIn(InternalRoleplayApi::class) - -package dev.slne.surf.roleplay.api.common.player - -import dev.slne.surf.cloud.api.common.player.OfflineCloudPlayer -import dev.slne.surf.roleplay.api.common.InternalContextHolder -import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity -import dev.slne.surf.roleplay.api.common.player.license.HasLicenses -import dev.slne.surf.roleplay.api.common.transaction.HasRpTransactions -import dev.slne.surf.roleplay.api.common.util.InternalRoleplayApi -import it.unimi.dsi.fastutil.objects.ObjectSet -import net.kyori.adventure.text.ComponentLike -import org.springframework.beans.factory.getBean -import java.time.ZonedDateTime - -interface RpPlayer : HasRpTransactions, HasLicenses, ComponentLike { - - /** - * The cloud player associated with this [RpPlayer]. - */ - val cloudPlayer: OfflineCloudPlayer - - /** - * The active identity of the player. - */ - val activeIdentity: RpIdentity? - - /** - * The identities of the player. - */ - val identities: ObjectSet - - /** - * The date and time when the player was created. - */ - val createdAt: ZonedDateTime - - /** - * The last time the player's information was updated. - */ - val updatedAt: ZonedDateTime - - /** - * Sets the active identity for the player. - * - * @param identity The [RpIdentity] to set as the active identity. - */ - suspend fun setActiveIdentity(identity: RpIdentity) - - /** - * Gets one of the player's identities by type. - * - * @param type The type of the identity to retrieve. - * @return The identity of the specified type, or `null` if not found. - */ - fun getIdentity(type: RpIdentity.RpIdentityType): RpIdentity? - - /** - * Gets one of the player's identities by class type. - * - * @param clazz The class type of the identity to retrieve. - * @param T The type of the identity. - */ - fun getIdentity(clazz: Class): RpIdentity? - - /** - * Creates a new identity for the player. - * - * @param identity The identity to create. - * @return The created identity. - */ - suspend fun createIdentity(identity: T): T - - /** - * Updates the player's identity information. - * - * @param identity the [T] - * @return The updated identity, or `null` if the identity was not found and `createIfNotExists` is `false`. - */ - suspend fun updateIdentity(identity: T): T? - - /** - * Creates or updates the player's identity. - * - * If the identity already exists, it will be updated using the provided lambda function. - * If it does not exist, a new identity will be created. - * - * @param identity the [T] - * @return The created or updated identity, or `null` if the operation failed. - */ - suspend fun createOrUpdateIdentity(identity: T): T - - /** - * Checks if the player is a citizen. - * - * @return `true` if the player is a citizen, `false` otherwise. - */ - fun hasCompletedCitizenship(): Boolean - - companion object { - operator fun get(cloudPlayer: OfflineCloudPlayer) = - InternalContextHolder.instance.context.getBean() - .getPlayerByUuid(cloudPlayer.uuid) - } -} - -/** - * Gets the [RpIdentity] of the specified type for this [RpPlayer]. - * - * @param T The type of the identity to retrieve. - * @return The identity of the specified type, or `null` if not found. - */ -inline fun RpPlayer.getIdentity() = getIdentity(T::class.java) - -/** - * Gets the [RpPlayer] associated with this [OfflineCloudPlayer]. - * - * @return The [RpPlayer] instance for this player. - */ -fun OfflineCloudPlayer.rpPlayer() = RpPlayer[this] \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/RpPlayerManager.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/RpPlayerManager.kt deleted file mode 100644 index 7781a9d..0000000 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/RpPlayerManager.kt +++ /dev/null @@ -1,15 +0,0 @@ -package dev.slne.surf.roleplay.api.common.player - -import dev.slne.surf.roleplay.api.common.InternalContextHolder -import dev.slne.surf.roleplay.api.common.util.InternalRoleplayApi -import org.springframework.beans.factory.getBean -import java.util.* - -@InternalRoleplayApi -interface RpPlayerManager { - fun getPlayerByUuid(uuid: UUID): RpPlayer - - companion object { - val instance get() = InternalContextHolder.instance.context.getBean() - } -} \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/identity/RpIdentity.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/identity/RpIdentity.kt deleted file mode 100644 index d5216cb..0000000 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/identity/RpIdentity.kt +++ /dev/null @@ -1,141 +0,0 @@ -package dev.slne.surf.roleplay.api.common.player.identity - -import dev.slne.surf.roleplay.api.common.player.RpPlayer -import dev.slne.surf.roleplay.api.common.player.license.HasLicenses -import dev.slne.surf.roleplay.api.common.transaction.HasRpTransactions -import dev.slne.surf.surfapi.core.api.messages.adventure.buildText -import net.kyori.adventure.text.ComponentLike -import java.time.LocalDate -import java.time.ZonedDateTime -import java.util.* - -/** - * Represents a roleplay identity of a player - */ -interface RpIdentity : HasRpTransactions, HasLicenses { - - /** - * The unique identifier for this identity. - */ - val uuid: UUID - - /** - * The player associated with this identity. - */ - val player: RpPlayer - - /** - * The type of the identity. - */ - val type: RpIdentityType - - /** - * The first name of the player. - */ - var firstName: String - - /** - * The last name of the player. - */ - var lastName: String - - /** - * The birth date of the player. - */ - var dateOfBirth: LocalDate - - /** - * Updates the information of the current instance of [RpIdentity]. - * The provided [identity] lambda is used to modify the instance's fields. - * - * @param identity A lambda that modifies the fields of the current instance of [RpIdentity]. - * @return The updated instance of [RpIdentity]. - */ - suspend fun updateInformation(identity: T.() -> Unit): T - - /** - * The date and time when the identity was created. - */ - val createdAt: ZonedDateTime - - /** - * The date and time when the identity was last updated. - */ - var updatedAt: ZonedDateTime - - enum class RpIdentityType : ComponentLike { - /** - * Represents a player who is a member of the civilian population. - */ - CIVILIAN { - override fun asComponent() = buildText { - text("Zivilist") - } - }, - - /** - * Represents a player who is a member of the emergency medical service. - */ - POLICE { - override fun asComponent() = buildText { - text("Polizist") - } - }, - - /** - * Represents a player who is a member of the rescue service. - */ - RESCUE_SERVICE { - override fun asComponent() = buildText { - text("SAR") - } - } - } - - /** - * Represents a civilian identity in the roleplay system. - * - * This interface is used to distinguish a civilian roleplay identity, which is a type of - * general roleplay identity. It encapsulates all the properties and behavior associated - * specifically with civilian players. - * - * The `CivilianIdentity` is tied to the broader `RpIdentity` interface and can be manipulated - * through systems that manage identities, such as creating, updating, or associating them - * with players. This identity type is expected to represent standard non-authoritative - * roles within the game. - */ - interface CivilianIdentity : RpIdentity - - /** - * Represents an identity for a player who is a member of the rescue service. - * Extends the generic `RpIdentity` interface to specify details unique to rescue service personnel. - */ - interface RescueServiceIdentity : RpIdentity { - /** - * Represents the rank assigned to a player within the rescue service roleplay identity. - * - * This value indicates the hierarchical position or title of the player - * in the context of their role as a member of the rescue service. - */ - val rank: String - } - - /** - * Represents the identity of a police officer within the game. - * Extends the base roleplay identity functionality by adding police-specific attributes - * such as rank and badge number that uniquely define a police officer's identity. - */ - interface PoliceIdentity : RpIdentity { - /** - * Represents the rank of a player in their roleplay identity, such as in a police or rescue service role. - * This value indicates the hierarchical status or designation within the associated identity. - */ - val rank: String - - /** - * Represents the badge number associated with a police identity. - * The badge number is unique to each police officer and serves as an identifier. - */ - val badgeNumber: String - } -} \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/ExpirableLicense.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/ExpirableLicense.kt deleted file mode 100644 index 59e95ed..0000000 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/ExpirableLicense.kt +++ /dev/null @@ -1,13 +0,0 @@ -package dev.slne.surf.roleplay.api.common.player.license - -import kotlin.time.Duration - -interface ExpirableLicense : License { - - /** - * The duration for which the license is valid. - * If null, the license does not expire. - */ - val expiresIn: Duration - -} \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/License.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/License.kt deleted file mode 100644 index dd0ac0a..0000000 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/License.kt +++ /dev/null @@ -1,60 +0,0 @@ -package dev.slne.surf.roleplay.api.common.player.license - -import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity -import dev.slne.surf.roleplay.api.common.player.license.utils.UnobtainableReason -import it.unimi.dsi.fastutil.objects.ObjectSet -import kotlinx.serialization.Serializable -import net.kyori.adventure.key.Key -import net.kyori.adventure.text.Component - -@Serializable(with = LicenseSerializer::class) -interface License { - /** - * The internal name of the license, used for identification. - */ - val key: Key - - /** - * The display name of the license, shown to players. - */ - val displayName: Component - - /** - * A description of the license, providing more details about its purpose and benefits. - */ - val description: Component - - /** - * The price of the license in the game currency. - * This is the amount a player must pay to obtain the license. - */ - val price: Int - - /** - * A set of other licenses that must be obtained before this one. - * This allows for dependencies between licenses. - */ - val dependencies: ObjectSet - - /** - * A set of child licenses that can be obtained after this one. - * This allows for a hierarchy of licenses. - */ - val children: ObjectSet - - /** - * The permission required to obtain this license. - * This is used to check if a player has the necessary permissions. - */ - val permission: String - - /** - * Checks if the player can obtain this license. - * Returns a pair where the first element is a boolean indicating success, - * and the second element is an [UnobtainableReason] if applicable. - * - * @param identity The identity of the player that is trying to obtain the license. - * @return A pair containing a boolean indicating if the player can obtain the license, - */ - suspend fun canObtain(identity: RpIdentity): Pair> -} \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/LicenseSerializer.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/LicenseSerializer.kt deleted file mode 100644 index d54c092..0000000 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/LicenseSerializer.kt +++ /dev/null @@ -1,26 +0,0 @@ -@file:OptIn(InternalRoleplayApi::class) - -package dev.slne.surf.roleplay.api.common.player.license - -import dev.slne.surf.roleplay.api.common.util.InternalRoleplayApi -import dev.slne.surf.surfapi.core.api.messages.adventure.key -import kotlinx.serialization.KSerializer -import kotlinx.serialization.descriptors.PrimitiveKind -import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor -import kotlinx.serialization.encoding.Decoder -import kotlinx.serialization.encoding.Encoder - -object LicenseSerializer : KSerializer { - - override val descriptor = PrimitiveSerialDescriptor("License", PrimitiveKind.STRING) - - override fun serialize( - encoder: Encoder, - value: License - ) { - encoder.encodeString(value.key.asString()) - } - - override fun deserialize(decoder: Decoder) = - InternalLicenseBridge.instance.getLicenseByKeyOrThrow(key(decoder.decodeString())) -} \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/events/RpPlayerLicenseRemovedEvent.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/events/RpPlayerLicenseRemovedEvent.kt deleted file mode 100644 index 28d3f18..0000000 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/events/RpPlayerLicenseRemovedEvent.kt +++ /dev/null @@ -1,15 +0,0 @@ -package dev.slne.surf.roleplay.api.common.player.license.events - -import dev.slne.surf.cloud.api.common.event.CancellableCloudEvent -import dev.slne.surf.roleplay.api.common.player.RpPlayer -import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity -import dev.slne.surf.roleplay.api.common.player.license.IdentityLicense -import dev.slne.surf.roleplay.api.common.player.license.utils.LicenseRemovedReason - -class RpPlayerLicenseRemovedEvent( - source: Any, - val player: RpPlayer, - val identity: RpIdentity, - val license: IdentityLicense, - val reason: LicenseRemovedReason, -) : CancellableCloudEvent(source) \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/licenses/civilian/CivilianFishingLicense.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/licenses/civilian/CivilianFishingLicense.kt deleted file mode 100644 index 6105b24..0000000 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/licenses/civilian/CivilianFishingLicense.kt +++ /dev/null @@ -1,5 +0,0 @@ -package dev.slne.surf.roleplay.api.common.player.license.licenses.civilian - -import dev.slne.surf.roleplay.api.common.player.license.License - -interface CivilianFishingLicense : License \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/licenses/civilian/CivilianVehicleLicense.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/licenses/civilian/CivilianVehicleLicense.kt deleted file mode 100644 index 8d4d3f3..0000000 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/licenses/civilian/CivilianVehicleLicense.kt +++ /dev/null @@ -1,14 +0,0 @@ -package dev.slne.surf.roleplay.api.common.player.license.licenses.civilian - -import dev.slne.surf.roleplay.api.common.player.license.License - -interface CivilianVehicleLicense { - interface DriversLicense : License - interface TruckLicense : License - interface BusLicense : License - interface TaxiLicense : License - interface MotorcycleLicense : License - interface BoatLicense : License - interface PilotLicense : License - interface HelicopterLicense : License -} \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/licenses/civilian/CivilianWeaponLicense.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/licenses/civilian/CivilianWeaponLicense.kt deleted file mode 100644 index ca3a367..0000000 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/licenses/civilian/CivilianWeaponLicense.kt +++ /dev/null @@ -1,8 +0,0 @@ -package dev.slne.surf.roleplay.api.common.player.license.licenses.civilian - -import dev.slne.surf.roleplay.api.common.player.license.License - -interface CivilianWeaponLicense { - interface LightWeaponLicense : License - interface HeavyWeaponLicense : License -} \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/licenses/police/PoliceWeaponLicense.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/licenses/police/PoliceWeaponLicense.kt deleted file mode 100644 index 90b106a..0000000 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/licenses/police/PoliceWeaponLicense.kt +++ /dev/null @@ -1,8 +0,0 @@ -package dev.slne.surf.roleplay.api.common.player.license.licenses.police - -import dev.slne.surf.roleplay.api.common.player.license.License - -interface PoliceWeaponLicense { - interface LightWeaponLicense : License - interface HeavyWeaponLicense : License -} \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/transaction/utils/BalanceType.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/transaction/utils/BalanceType.kt deleted file mode 100644 index b9f97ed..0000000 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/transaction/utils/BalanceType.kt +++ /dev/null @@ -1,35 +0,0 @@ -package dev.slne.surf.roleplay.api.common.transaction.utils - -import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity - -enum class BalanceType(val currencyName: (RpIdentity) -> String) { - CASH({ - when (it) { - is RpIdentity.CivilianIdentity -> "civilian_cash" - is RpIdentity.PoliceIdentity -> "police_cash" - is RpIdentity.RescueServiceIdentity -> "rescue_service_cash" - else -> error("Unknown identity type: ${it::class.simpleName}") - } - }), - - BANK({ - when (it) { - is RpIdentity.CivilianIdentity -> "civilian_bank" - is RpIdentity.PoliceIdentity -> "police_bank" - is RpIdentity.RescueServiceIdentity -> "rescue_service_bank" - else -> error("Unknown identity type: ${it::class.simpleName}") - } - }), - - CRYPTO({ - when (it) { - is RpIdentity.CivilianIdentity -> "civilian_crypto" - is RpIdentity.PoliceIdentity -> "police_crypto" - is RpIdentity.RescueServiceIdentity -> "rescue_service_crypto" - else -> error("Unknown identity type: ${it::class.simpleName}") - } - }); - - fun getCurrencyName(identity: RpIdentity) = - currencyName(identity).let { "roleplay_$it" } -} \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/util/RpJob.kt b/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/util/RpJob.kt deleted file mode 100644 index 0f76179..0000000 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/util/RpJob.kt +++ /dev/null @@ -1,63 +0,0 @@ -package dev.slne.surf.roleplay.api.common.util - -import dev.slne.surf.surfapi.core.api.util.logger -import kotlinx.coroutines.* -import kotlin.time.Duration - -abstract class RpJob( - val name: String, - val delay: Duration -) { - private val supervisor: CompletableJob - private val scope: CoroutineScope - - init { - val (supervisor, scope) = buildCoroutineScope(name) - - this.supervisor = supervisor - this.scope = scope - } - - fun start() = scope.launch { - while (isActive) { - tick() - delay(delay) - } - } - - suspend fun stop() { - supervisor.cancelAndJoin() - } - - abstract suspend fun tick() - - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (other !is RpJob) return false - - if (name != other.name) return false - if (delay != other.delay) return false - - return true - } - - override fun hashCode(): Int { - var result = name.hashCode() - result = 31 * result + delay.hashCode() - return result - } -} - -private val log = logger() - -private fun buildCoroutineScope(name: String): Pair { - val supervisor = SupervisorJob() - val scope = - CoroutineScope(supervisor + CoroutineName(name) + CoroutineExceptionHandler { _, throwable -> - if (throwable is CancellationException) return@CoroutineExceptionHandler - - log.atSevere().withCause(throwable).log("$name failed") - }) - - return supervisor to scope -} \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-server-api/build.gradle.kts b/surf-roleplay-api/surf-roleplay-server-api/build.gradle.kts deleted file mode 100644 index ad6c7f2..0000000 --- a/surf-roleplay-api/surf-roleplay-server-api/build.gradle.kts +++ /dev/null @@ -1,11 +0,0 @@ -plugins { - id("dev.slne.surf.surfapi.gradle.core") -} - -surfCoreApi { - withCloudServer() -} - -dependencies { - api(project(":surf-roleplay-api:surf-roleplay-common-api")) -} \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-client/build.gradle.kts b/surf-roleplay-core/surf-roleplay-core-client/build.gradle.kts index e225f30..9b1e70f 100644 --- a/surf-roleplay-core/surf-roleplay-core-client/build.gradle.kts +++ b/surf-roleplay-core/surf-roleplay-core-client/build.gradle.kts @@ -7,6 +7,5 @@ surfCoreApi { } dependencies { - api(project(":surf-roleplay-api:surf-roleplay-client-api:surf-roleplay-client-common-api")) api(project(":surf-roleplay-core:surf-roleplay-core-common")) } \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-client/src/main/kotlin/dev/slne/surf/roleplay/core/client/player/ClientRpPlayer.kt b/surf-roleplay-core/surf-roleplay-core-client/src/main/kotlin/dev/slne/surf/roleplay/core/client/player/ClientRpPlayer.kt index c8cebd8..2e32e10 100644 --- a/surf-roleplay-core/surf-roleplay-core-client/src/main/kotlin/dev/slne/surf/roleplay/core/client/player/ClientRpPlayer.kt +++ b/surf-roleplay-core/surf-roleplay-core-client/src/main/kotlin/dev/slne/surf/roleplay/core/client/player/ClientRpPlayer.kt @@ -1,6 +1,6 @@ package dev.slne.surf.roleplay.core.client.player -import dev.slne.surf.roleplay.core.common.player.CommonRpPlayer +import dev.slne.surf.roleplay.core.common.player.RpPlayer import java.util.* -class ClientRpPlayer(uuid: UUID) : CommonRpPlayer(uuid) +class ClientRpPlayer(uuid: UUID) : RpPlayer(uuid) diff --git a/surf-roleplay-core/surf-roleplay-core-client/src/main/kotlin/dev/slne/surf/roleplay/core/client/player/ClientRpPlayerManager.kt b/surf-roleplay-core/surf-roleplay-core-client/src/main/kotlin/dev/slne/surf/roleplay/core/client/player/ClientRpPlayerManager.kt index 48bb546..d355049 100644 --- a/surf-roleplay-core/surf-roleplay-core-client/src/main/kotlin/dev/slne/surf/roleplay/core/client/player/ClientRpPlayerManager.kt +++ b/surf-roleplay-core/surf-roleplay-core-client/src/main/kotlin/dev/slne/surf/roleplay/core/client/player/ClientRpPlayerManager.kt @@ -1,14 +1,16 @@ package dev.slne.surf.roleplay.core.client.player -import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity -import dev.slne.surf.roleplay.core.common.player.CommonRpPlayerManager +import dev.slne.surf.roleplay.core.common.player.RpPlayerManager +import dev.slne.surf.roleplay.core.common.player.identity.RpIdentity +import dev.slne.surf.roleplay.core.common.util.InternalRoleplayApi import org.springframework.stereotype.Component import java.util.* +@OptIn(InternalRoleplayApi::class) @Component -class ClientRpPlayerManager : CommonRpPlayerManager() { +class ClientRpPlayerManager : RpPlayerManager() { override fun createPlayer(uuid: UUID) = ClientRpPlayer(uuid) - + override suspend fun fetchIdentities(uuid: UUID): Set { TODO("Not yet implemented") } diff --git a/surf-roleplay-core/surf-roleplay-core-common/build.gradle.kts b/surf-roleplay-core/surf-roleplay-core-common/build.gradle.kts index dabaaaa..7516627 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/build.gradle.kts +++ b/surf-roleplay-core/surf-roleplay-core-common/build.gradle.kts @@ -4,8 +4,4 @@ plugins { surfCoreApi { withCloudCommon() -} - -dependencies { - api(project(":surf-roleplay-api:surf-roleplay-common-api")) } \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/ContextHolderImpl.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/ContextHolderImpl.kt index 6067607..efa23db 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/ContextHolderImpl.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/ContextHolderImpl.kt @@ -1,8 +1,8 @@ package dev.slne.surf.roleplay.core.common import com.google.auto.service.AutoService -import dev.slne.surf.roleplay.api.common.InternalContextHolder -import dev.slne.surf.roleplay.api.common.util.InternalRoleplayApi +import dev.slne.surf.roleplay.core.common.util.InternalContextHolder +import dev.slne.surf.roleplay.core.common.util.InternalRoleplayApi import org.springframework.context.ApplicationContext @OptIn(InternalRoleplayApi::class) diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/CommonRpInstance.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/RpInstance.kt similarity index 52% rename from surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/CommonRpInstance.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/RpInstance.kt index 2e5f3c8..78c3f39 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/CommonRpInstance.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/RpInstance.kt @@ -1,25 +1,25 @@ package dev.slne.surf.roleplay.core.common -import dev.slne.surf.roleplay.core.common.mechanics.CommonMechanicRegistry +import dev.slne.surf.roleplay.core.common.mechanics.MechanicRegistry import javax.annotation.OverridingMethodsMustInvokeSuper -abstract class CommonRpInstance( - private val commonMechanicRegistry: CommonMechanicRegistry +abstract class RpInstance( + private val mechanicRegistry: MechanicRegistry ) { @OverridingMethodsMustInvokeSuper open suspend fun onLoad() { - commonMechanicRegistry.loadMechanics() + mechanicRegistry.loadMechanics() } @OverridingMethodsMustInvokeSuper open suspend fun onEnable() { - commonMechanicRegistry.enableMechanics() + mechanicRegistry.enableMechanics() } @OverridingMethodsMustInvokeSuper open suspend fun onDisable() { - commonMechanicRegistry.disableMechanics() + mechanicRegistry.disableMechanics() } } \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/CommonMechanic.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/CommonMechanic.kt deleted file mode 100644 index 8dfaeea..0000000 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/CommonMechanic.kt +++ /dev/null @@ -1,11 +0,0 @@ -package dev.slne.surf.roleplay.core.common.mechanics - -import dev.slne.surf.roleplay.api.common.mechanic.Mechanic - -abstract class CommonMechanic( - override val name: String, -) : Mechanic { - override suspend fun onLoad() {} - override suspend fun onEnable() {} - override suspend fun onDisable() {} -} \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/Mechanic.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/Mechanic.kt similarity index 70% rename from surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/Mechanic.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/Mechanic.kt index 282df7a..38d0e1c 100644 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/Mechanic.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/Mechanic.kt @@ -1,33 +1,35 @@ @file:OptIn(InternalRoleplayApi::class) -package dev.slne.surf.roleplay.api.common.mechanic +package dev.slne.surf.roleplay.core.common.mechanics -import dev.slne.surf.roleplay.api.common.InternalContextHolder -import dev.slne.surf.roleplay.api.common.util.InternalRoleplayApi +import dev.slne.surf.roleplay.core.common.util.InternalContextHolder +import dev.slne.surf.roleplay.core.common.util.InternalRoleplayApi import org.springframework.beans.factory.getBean -interface Mechanic { - - /** - * Returns the name of the mechanic. - * This name should be unique across all mechanics. - */ - val name: String +abstract class Mechanic( + val name: String, +) { /** * Called when the mechanic is loaded. */ - suspend fun onLoad() + open suspend fun onLoad() { + + } /** * Called when the mechanic is enabled. */ - suspend fun onEnable() + open suspend fun onEnable() { + + } /** * Called when the mechanic is disabled. */ - suspend fun onDisable() + open suspend fun onDisable() { + + } companion object { /** diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/CommonMechanicRegistry.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/MechanicRegistry.kt similarity index 59% rename from surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/CommonMechanicRegistry.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/MechanicRegistry.kt index 94b27a1..975b773 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/CommonMechanicRegistry.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/MechanicRegistry.kt @@ -1,19 +1,24 @@ package dev.slne.surf.roleplay.core.common.mechanics import dev.slne.surf.cloud.api.common.util.forEachAnnotationOrdered -import dev.slne.surf.roleplay.api.common.mechanic.Mechanic -import dev.slne.surf.roleplay.api.common.mechanic.MechanicRegistry import org.springframework.beans.factory.ObjectProvider import org.springframework.context.ApplicationContext import org.springframework.stereotype.Component @Component -class CommonMechanicRegistry( +class MechanicRegistry( private val context: ApplicationContext, private val mechanics: ObjectProvider, -) : MechanicRegistry { +) { - override fun getMechanic(clazz: Class) = context.getBean(clazz) + /** + * Returns the mechanic instance of the specified class. + * + * @param clazz The class of the mechanic to retrieve. + * @return The mechanic instance of the specified class. + * @throws IllegalArgumentException if no mechanic of the specified class is registered. + */ + fun getMechanic(clazz: Class) = context.getBean(clazz) suspend fun loadMechanics() { mechanics.forEachAnnotationOrdered { it.onLoad() } @@ -26,4 +31,6 @@ class CommonMechanicRegistry( suspend fun disableMechanics() { mechanics.forEachAnnotationOrdered { it.onDisable() } // // FIXME: 11.08.2025 20:27 turn around stream } -} \ No newline at end of file +} + +inline fun MechanicRegistry.getMechanic(): T = getMechanic(T::class.java) \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/idcard/IdCardCommonMechanic.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/idcard/IdCardCommonMechanic.kt deleted file mode 100644 index 84a30fa..0000000 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/idcard/IdCardCommonMechanic.kt +++ /dev/null @@ -1,8 +0,0 @@ -package dev.slne.surf.roleplay.core.common.mechanics.idcard - -import dev.slne.surf.roleplay.api.common.mechanic.idcard.IdCardMechanic -import dev.slne.surf.roleplay.core.common.mechanics.CommonMechanic - -abstract class IdCardCommonMechanic : CommonMechanic( - name = "IdCardMechanic", -), IdCardMechanic \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/idcard/IdCardMechanic.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/idcard/IdCardMechanic.kt new file mode 100644 index 0000000..5e2d163 --- /dev/null +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/idcard/IdCardMechanic.kt @@ -0,0 +1,7 @@ +package dev.slne.surf.roleplay.core.common.mechanics.idcard + +import dev.slne.surf.roleplay.core.common.mechanics.Mechanic + +object IdCardMechanic : Mechanic( + name = "IdCardMechanic", +) \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/Cracker.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/Cracker.kt index e233242..7e4fb68 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/Cracker.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/Cracker.kt @@ -1,8 +1,8 @@ package dev.slne.surf.roleplay.core.common.mechanics.rentable -import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.Crackable -import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.LockPick -import dev.slne.surf.roleplay.api.common.player.RpPlayer +import dev.slne.surf.roleplay.core.common.mechanics.rentable.lockpick.LockPick +import dev.slne.surf.roleplay.core.common.mechanics.rentable.utils.Crackable +import dev.slne.surf.roleplay.core.common.player.RpPlayer object Cracker { diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/RentCollectorJob.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/RentCollectorJob.kt index 851c776..e16c166 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/RentCollectorJob.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/RentCollectorJob.kt @@ -1,16 +1,18 @@ -package dev.slne.surf.roleplay.mechanic.mechanics.rentable +package dev.slne.surf.roleplay.core.common.mechanics.rentable -import dev.slne.surf.roleplay.api.coroutine.RpJob -import dev.slne.surf.roleplay.core.common.mechanics.rentable.RentableMechanicImpl +import org.springframework.scheduling.annotation.Scheduled +import org.springframework.stereotype.Component import java.time.ZonedDateTime -import kotlin.time.Duration.Companion.seconds +import java.util.concurrent.TimeUnit -object RentCollectorJob : RpJob("RentCollectorJob", 1.seconds) { +@Component +class RentCollectorJob { - override suspend fun tick() { + @Scheduled(fixedDelay = 1, timeUnit = TimeUnit.SECONDS) + suspend fun tick() { val now = ZonedDateTime.now() - RentableMechanicImpl.rentables.forEach { rentable -> + RentableMechanic.rentables.forEach { rentable -> if (rentable.owner == null) return@forEach val lastCollection = rentable.lastRentCollection diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/RentableImpl.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/Rentable.kt similarity index 61% rename from surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/RentableImpl.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/Rentable.kt index fc7c6b8..399b074 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/RentableImpl.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/Rentable.kt @@ -1,51 +1,54 @@ package dev.slne.surf.roleplay.core.common.mechanics.rentable -import dev.slne.surf.roleplay.api.common.mechanic.Mechanic -import dev.slne.surf.roleplay.api.common.mechanic.rentable.Rentable -import dev.slne.surf.roleplay.api.common.mechanic.rentable.RentableMechanic -import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.StorageContainer -import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.door.DoorContainer -import dev.slne.surf.roleplay.api.common.player.RpPlayer -import dev.slne.surf.roleplay.api.mechanic.rentable.events.RentableMemberRemoveEvent -import dev.slne.surf.roleplay.api.mechanic.rentable.events.RentableOwnerChangeEvent -import dev.slne.surf.roleplay.api.paper.rentable.events.RentableMemberAddEvent +import dev.slne.surf.roleplay.core.common.mechanics.Mechanic +import dev.slne.surf.roleplay.core.common.mechanics.rentable.events.RentableMemberAddEvent +import dev.slne.surf.roleplay.core.common.mechanics.rentable.events.RentableMemberRemoveEvent +import dev.slne.surf.roleplay.core.common.mechanics.rentable.events.RentableOwnerChangeEvent +import dev.slne.surf.roleplay.core.common.mechanics.rentable.utils.DoorContainer +import dev.slne.surf.roleplay.core.common.player.RpPlayer import dev.slne.surf.surfapi.core.api.messages.adventure.buildText import dev.slne.surf.surfapi.core.api.util.freeze import dev.slne.surf.surfapi.core.api.util.mutableObjectSetOf import dev.slne.surf.surfapi.core.api.util.objectSetOf import it.unimi.dsi.fastutil.objects.ObjectSet import net.kyori.adventure.key.Key +import net.kyori.adventure.text.ComponentLike import java.time.ZonedDateTime import kotlin.time.Duration -abstract class RentableImpl( - override val key: Key, - override val rent: Int, - override val rentDuration: Duration, - override val size: Double, - override val stories: Int, +abstract class Rentable( + val key: Key, + val rent: Int, + val rentDuration: Duration, + val size: Double, + val stories: Int, storageContainers: ObjectSet = objectSetOf(), doorContainers: ObjectSet = objectSetOf() -) : Rentable { +) : ComponentLike { private val _members = mutableObjectSetOf() private val _storageContainers = mutableObjectSetOf() private val _doorContainers = mutableObjectSetOf() - override val storageContainers = _storageContainers.freeze() - override val doorContainers = _doorContainers.freeze() + val storageContainers = _storageContainers.freeze() + val doorContainers = _doorContainers.freeze() init { _storageContainers.addAll(storageContainers) _doorContainers.addAll(doorContainers) } - override var owner: RpPlayer? = null - override val members get() = _members.freeze() - override val isRented: Boolean get() = owner != null - override var lastRentCollection: ZonedDateTime? = null - - override suspend fun collectRent(): RentableMechanic.RentCollectResult { + var owner: RpPlayer? = null + val members get() = _members.freeze() + val isRented: Boolean get() = owner != null + var lastRentCollection: ZonedDateTime? = null + + /** + * Collects the rent for the rentable property. + * + * @return The result of the rent collection, indicating success or failure. + */ + suspend fun collectRent(): RentableMechanic.RentCollectResult { val result = Mechanic.getMechanic().collectRent(this) if (result == RentableMechanic.RentCollectResult.SUCCESS) { @@ -55,11 +58,18 @@ abstract class RentableImpl( return result } - override suspend fun setOwner( + /** + * Sets the owner of the rentable property and collects the first rent + * + * @param player The player to set as the owner of the rentable property. + * @param reason The reason for the owner change, which can be used to determine the context of the change. + * @return The result of the owner change event, indicating success or failure. + */ + suspend fun setOwner( player: RpPlayer?, reason: RentableOwnerChangeEvent.OwnerChangeReason ): RentableOwnerChangeEvent.OwnerSetResult { - val event = RentableOwnerChangeEvent(this, owner, player, reason) + val event = RentableOwnerChangeEvent(this, this, owner, player, reason) if (!event.callEvent()) { return RentableOwnerChangeEvent.OwnerSetResult.Failure( @@ -122,12 +132,18 @@ abstract class RentableImpl( return RentableOwnerChangeEvent.OwnerSetResult.Success } - override fun addMember(player: RpPlayer): RentableMemberAddEvent.MemberAddResult { + /** + * Adds a member to the rentable property. + * + * @param player The player to add as a member. + * @return The result of the member addition event, indicating success or failure. + */ + fun addMember(player: RpPlayer): RentableMemberAddEvent.MemberAddResult { if (isMember(player)) { return RentableMemberAddEvent.MemberAddResult.Failure(RentableMemberAddEvent.MemberAddFailureReason.AlreadyMember) } - val event = RentableMemberAddEvent(this, player) + val event = RentableMemberAddEvent(this, this, player) if (!event.callEvent()) { return RentableMemberAddEvent.MemberAddResult.Failure(RentableMemberAddEvent.MemberAddFailureReason.EventCancelled) @@ -138,12 +154,18 @@ abstract class RentableImpl( return RentableMemberAddEvent.MemberAddResult.Success } - override fun removeMember(player: RpPlayer): RentableMemberRemoveEvent.MemberRemoveResult { + /** + * Removes a member from the rentable property. + * + * @param player The player to remove from the members. + * @return The result of the member removal event, indicating success or failure. + */ + fun removeMember(player: RpPlayer): RentableMemberRemoveEvent.MemberRemoveResult { if (!isMember(player)) { return RentableMemberRemoveEvent.MemberRemoveResult.Failure(RentableMemberRemoveEvent.MemberRemoveFailureReason.NotMember) } - val event = RentableMemberRemoveEvent(this, player) + val event = RentableMemberRemoveEvent(this, this, player) if (!event.callEvent()) { return RentableMemberRemoveEvent.MemberRemoveResult.Failure(RentableMemberRemoveEvent.MemberRemoveFailureReason.EventCancelled) @@ -154,7 +176,13 @@ abstract class RentableImpl( return RentableMemberRemoveEvent.MemberRemoveResult.Success } - override fun isMember(player: RpPlayer) = _members.contains(player) || owner == player + /** + * Checks if the player is a member of the rentable property. + * + * @param player The player to check. + * @return True if the player is a member, false otherwise. + */ + fun isMember(player: RpPlayer) = _members.contains(player) || owner == player override fun asComponent() = buildText { variableValue(key.asString()) diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/RentableMechanic.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/RentableMechanic.kt new file mode 100644 index 0000000..9d31371 --- /dev/null +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/RentableMechanic.kt @@ -0,0 +1,124 @@ +package dev.slne.surf.roleplay.core.common.mechanics.rentable + +import dev.slne.surf.roleplay.core.common.mechanics.Mechanic +import dev.slne.surf.roleplay.core.common.mechanics.rentable.events.RentableRentCollectEvent +import dev.slne.surf.roleplay.core.common.mechanics.rentable.rentables.House +import dev.slne.surf.roleplay.core.common.player.RpPlayer +import dev.slne.surf.surfapi.core.api.messages.adventure.key +import dev.slne.surf.surfapi.core.api.util.freeze +import dev.slne.surf.surfapi.core.api.util.mutableObjectSetOf +import dev.slne.surf.surfapi.core.api.util.objectSetOf +import dev.slne.surf.surfapi.core.api.util.toObjectSet +import net.kyori.adventure.key.Key +import kotlin.time.Duration.Companion.seconds + +object RentableMechanic : Mechanic("RentableMechanic") { + + private val _rentables = mutableObjectSetOf() + val rentables get() = _rentables.freeze() + + /** + * Adds a rentable + * + * @param rentable the [Rentable] + * @return If adding the rentable was successful + */ + fun addRentable(rentable: Rentable) = _rentables.add(rentable) + + override suspend fun onEnable() { + val rentable = House( + key = key("roleplay_house", "house_1"), + rent = 1000, + rentDuration = 10.seconds, + size = 100.0, + stories = 3, + storageContainers = objectSetOf(), + doors = objectSetOf() + ) + + addRentable(rentable) + } + + /** + * Collects the rent for a [Rentable] + * + * @param rentable the [Rentable] to collect rent for + * @return the result of the rent collection + */ + suspend fun collectRent(rentable: Rentable): RentCollectResult { + val currentOwner = rentable.owner ?: return RentCollectResult.NOT_RENTED + val currentBankBalance = currentOwner.getBankBalance() + + val event = RentableRentCollectEvent( + source = this, + rentable = rentable, + amount = rentable.rent + ) + + if (!event.callEvent()) { + return RentCollectResult.EVENT_CANCELLED + } + + val rent = event.amount + + if (rent > currentBankBalance) { + return RentCollectResult.NOT_ENOUGH_MONEY + } + + currentOwner.removeBankBalance(rent) + + return RentCollectResult.SUCCESS + } + + /** + * Returns the owned [Rentable]s for one [RpPlayer] + * + * @param player the [RpPlayer] + * @return an object set of [Rentable]s + */ + fun getOwnedRentablesByPlayer(player: RpPlayer) = + _rentables.filter { it.owner == player }.toObjectSet() + + /** + * Returns the maximum number of ownable rentables for a player. + * + * @param player the [RpPlayer] to check + * @return the maximum number of ownable rentables + */ + fun getMaxOwnableRentablesByPlayer(player: RpPlayer) = 1 + + /** + * Returns a [Rentable] by its key. + * + * @param key the [Key] of the [Rentable] + * @return the [Rentable] if found, or null if not found + */ + fun getByKey(key: Key) = _rentables.find { it.key == key } + ?: _rentables.find { it.key.asString() == key.asString() } + ?: _rentables.find { it.key.namespace() == key.namespace() && it.key.value() == key.value() } + + /** + * The result of a rent collection attempt. + */ + enum class RentCollectResult { + /** + * The rent was successfully collected. + */ + SUCCESS, + + /** + * The rent collection was cancelled, possibly due to an event. + */ + EVENT_CANCELLED, + + /** + * The player does not have enough money to pay the rent. + */ + NOT_ENOUGH_MONEY, + + /** + * The rentable is not currently rented. + */ + NOT_RENTED, + } +} \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/RentableMechanicImpl.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/RentableMechanicImpl.kt deleted file mode 100644 index 3e8d6d7..0000000 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/RentableMechanicImpl.kt +++ /dev/null @@ -1,85 +0,0 @@ -package dev.slne.surf.roleplay.core.common.mechanics.rentable - -import dev.jorel.commandapi.kotlindsl.* -import dev.slne.surf.roleplay.api.common.mechanic.rentable.Rentable -import dev.slne.surf.roleplay.api.common.mechanic.rentable.RentableMechanic -import dev.slne.surf.roleplay.api.common.player.RpPlayer -import dev.slne.surf.roleplay.api.paper.rentable.events.RentableRentCollectEvent -import dev.slne.surf.roleplay.core.common.mechanics.rentable.rentables.HouseImpl -import dev.slne.surf.roleplay.mechanic.MechanicImpl -import dev.slne.surf.roleplay.mechanic.mechanics.rentable.RentCollectorJob -import dev.slne.surf.roleplay.mechanic.mechanics.rentable.listeners.RentCollectedListener -import dev.slne.surf.roleplay.mechanic.mechanics.rentable.listeners.RentableListener -import dev.slne.surf.roleplay.mechanic.mechanics.rentable.listeners.RentableOnlineListener -import dev.slne.surf.surfapi.core.api.messages.adventure.key -import dev.slne.surf.surfapi.core.api.util.freeze -import dev.slne.surf.surfapi.core.api.util.mutableObjectSetOf -import dev.slne.surf.surfapi.core.api.util.objectSetOf -import dev.slne.surf.surfapi.core.api.util.toObjectSet -import net.kyori.adventure.key.Key -import kotlin.time.Duration.Companion.seconds - -object RentableMechanicImpl : MechanicImpl( - name = "RentableMechanic", - handlers = objectSetOf( - RentableOnlineListener, - RentCollectedListener, - RentableListener - ), - rpJobs = objectSetOf( - RentCollectorJob - ) -), RentableMechanic { - - private val _rentables = mutableObjectSetOf() - override val rentables get() = _rentables.freeze() - - override fun addRentable(rentable: Rentable) = _rentables.add(rentable) - - override suspend fun onEnable() { - val rentable = HouseImpl( - key = key("roleplay_house", "house_1"), - rent = 1000, - rentDuration = 10.seconds, - size = 100.0, - stories = 3, - storageContainers = objectSetOf(), - doors = objectSetOf() - ) - - addRentable(rentable) - } - - override suspend fun collectRent(rentable: Rentable): RentableMechanic.RentCollectResult { - val currentOwner = rentable.owner ?: return RentableMechanic.RentCollectResult.NOT_RENTED - val currentBankBalance = currentOwner.getBankBalance() - - val event = RentableRentCollectEvent( - rentable = rentable, - amount = rentable.rent - ) - - if (!event.callEvent()) { - return RentableMechanic.RentCollectResult.EVENT_CANCELLED - } - - val rent = event.amount - - if (rent > currentBankBalance) { - return RentableMechanic.RentCollectResult.NOT_ENOUGH_MONEY - } - - currentOwner.removeBankBalance(rent) - - return RentableMechanic.RentCollectResult.SUCCESS - } - - override fun getOwnedRentablesByPlayer(player: RpPlayer) = - _rentables.filter { it.owner == player }.toObjectSet() - - override fun getMaxOwnableRentablesByPlayer(player: RpPlayer) = 1 - - override fun getByKey(key: Key) = _rentables.find { it.key == key } - ?: _rentables.find { it.key.asString() == key.asString() } - ?: _rentables.find { it.key.namespace() == key.namespace() && it.key.value() == key.value() } -} \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/StorageContainer.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/StorageContainer.kt similarity index 60% rename from surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/StorageContainer.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/StorageContainer.kt index 2696c8f..5e2a175 100644 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/StorageContainer.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/StorageContainer.kt @@ -1,41 +1,28 @@ -package dev.slne.surf.roleplay.api.common.mechanic.rentable.utils +@file:Suppress("UnstableApiUsage") -import dev.slne.surf.cloud.api.common.player.teleport.TeleportLocation -import dev.slne.surf.roleplay.api.common.mechanic.rentable.Rentable +package dev.slne.surf.roleplay.core.common.mechanics.rentable + +import dev.slne.surf.cloud.api.common.player.teleport.WorldLocation +import dev.slne.surf.roleplay.core.common.mechanics.rentable.utils.Crackable +import dev.slne.surf.roleplay.core.common.mechanics.rentable.utils.Lockable +import dev.slne.surf.roleplay.core.common.player.RpPlayer import dev.slne.surf.surfapi.core.api.messages.adventure.key import net.kyori.adventure.key.Key import kotlin.time.Duration import kotlin.time.Duration.Companion.seconds -/** - * Represents a storage container that can be placed in the world and is associated with a rentable property. - */ -interface StorageContainer { - - /** - * The rentable property that this storage container belongs to. - */ - val rentable: Rentable - - /** - * The location of the storage container in the world. - */ - val location: TeleportLocation - - /** - * The type of the storage container, which can be either a regular storage container or a vault. - */ - val type: StorageContainerType - - /** - * The size of the storage container, which determines how many slots it has. - */ +abstract class StorageContainer( + val rentable: Rentable, + val location: WorldLocation, + val type: StorageContainerType, val size: StorageContainerSize +) : Lockable { - /** - * Places the storage container in the world at its designated location. - */ - suspend fun placeInWorld() + override fun canAccess(player: RpPlayer): Boolean { + val crackableAndCracked = this is Crackable && this.cracked + + return crackableAndCracked || rentable.isMember(player) + } /** * The different types of storage containers. @@ -82,5 +69,4 @@ interface StorageContainer { */ SIZE_9X6(54, 90.seconds), ; } - } \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/StorageContainerImpl.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/StorageContainerImpl.kt deleted file mode 100644 index fe8a221..0000000 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/StorageContainerImpl.kt +++ /dev/null @@ -1,34 +0,0 @@ -@file:Suppress("UnstableApiUsage") - -package dev.slne.surf.roleplay.mechanic.mechanics.rentable.utils - -import com.github.shynixn.mccoroutine.folia.regionDispatcher -import dev.slne.surf.roleplay.api.mechanic.rentable.Rentable -import dev.slne.surf.roleplay.api.mechanic.rentable.utils.Crackable -import dev.slne.surf.roleplay.api.mechanic.rentable.utils.Lockable -import dev.slne.surf.roleplay.api.mechanic.rentable.utils.StorageContainer -import dev.slne.surf.roleplay.api.player.RpPlayer -import dev.slne.surf.roleplay.core.common.mechanics.plugin -import dev.slne.surf.surfapi.bukkit.api.util.getBlockAtAsync -import kotlinx.coroutines.withContext -import org.bukkit.Location - -open class StorageContainerImpl( - override val rentable: Rentable, - override val location: Location, - override val type: StorageContainer.StorageContainerType, - override val size: StorageContainer.StorageContainerSize -) : StorageContainer, Lockable { - - override suspend fun placeInWorld() = withContext(plugin.regionDispatcher(location)) { - val block = location.world.getBlockAtAsync(location.toBlock()) - - block.type = type.material - } - - override fun canAccess(player: RpPlayer): Boolean { - val crackableAndCracked = this is Crackable && this.cracked - - return crackableAndCracked || rentable.isMember(player) - } -} \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/containers/RegularStorageContainer.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/containers/RegularStorageContainer.kt index d3d7fcc..8b5e06c 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/containers/RegularStorageContainer.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/containers/RegularStorageContainer.kt @@ -1,17 +1,14 @@ package dev.slne.surf.roleplay.core.common.mechanics.rentable.containers -import dev.slne.surf.roleplay.api.common.mechanic.rentable.Rentable -import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.StorageContainer -import dev.slne.surf.roleplay.api.mechanic.rentable.Rentable -import dev.slne.surf.roleplay.api.mechanic.rentable.utils.StorageContainer -import dev.slne.surf.roleplay.mechanic.mechanics.rentable.utils.StorageContainerImpl -import org.bukkit.Location +import dev.slne.surf.cloud.api.common.player.teleport.WorldLocation +import dev.slne.surf.roleplay.core.common.mechanics.rentable.Rentable +import dev.slne.surf.roleplay.core.common.mechanics.rentable.StorageContainer class RegularStorageContainer( rentable: Rentable, - location: Location, + location: WorldLocation, size: StorageContainer.StorageContainerSize -) : StorageContainerImpl( +) : StorageContainer( rentable = rentable, location = location, type = StorageContainer.StorageContainerType.REGULAR, diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/containers/VaultStorageContainer.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/containers/VaultStorageContainer.kt index 4dd03b6..b1a6288 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/containers/VaultStorageContainer.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/containers/VaultStorageContainer.kt @@ -1,24 +1,23 @@ package dev.slne.surf.roleplay.core.common.mechanics.rentable.containers -import dev.slne.surf.roleplay.api.common.mechanic.rentable.Rentable -import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.Crackable -import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.LockPick -import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.StorageContainer -import dev.slne.surf.roleplay.api.common.player.RpPlayer +import dev.slne.surf.cloud.api.common.player.teleport.WorldLocation import dev.slne.surf.roleplay.core.common.mechanics.rentable.Cracker -import dev.slne.surf.roleplay.mechanic.mechanics.rentable.utils.StorageContainerImpl -import org.bukkit.Location +import dev.slne.surf.roleplay.core.common.mechanics.rentable.Rentable +import dev.slne.surf.roleplay.core.common.mechanics.rentable.StorageContainer +import dev.slne.surf.roleplay.core.common.mechanics.rentable.lockpick.LockPick +import dev.slne.surf.roleplay.core.common.mechanics.rentable.utils.Crackable +import dev.slne.surf.roleplay.core.common.player.RpPlayer import kotlin.time.Duration class VaultStorageContainer( rentable: Rentable, - location: Location, - size: StorageContainer.StorageContainerSize, + location: WorldLocation, + size: StorageContainerSize, override val crackDuration: Duration = size.vaultCrackDuration -) : StorageContainerImpl( +) : StorageContainer( rentable = rentable, location = location, - type = StorageContainer.StorageContainerType.VAULT, + type = StorageContainerType.VAULT, size = size, ), Crackable { override var cracked: Boolean = false diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/door/DoorImpl.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/door/Door.kt similarity index 64% rename from surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/door/DoorImpl.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/door/Door.kt index 78a3845..56a11fc 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/door/DoorImpl.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/door/Door.kt @@ -1,20 +1,21 @@ package dev.slne.surf.roleplay.core.common.mechanics.rentable.door -import dev.slne.surf.cloud.api.common.player.teleport.TeleportLocation -import dev.slne.surf.roleplay.api.common.mechanic.rentable.Rentable -import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.LockPick -import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.door.Door -import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.door.DoorContainer -import dev.slne.surf.roleplay.api.common.player.RpPlayer +import dev.slne.surf.cloud.api.common.player.teleport.WorldLocation import dev.slne.surf.roleplay.core.common.mechanics.rentable.Cracker +import dev.slne.surf.roleplay.core.common.mechanics.rentable.Rentable +import dev.slne.surf.roleplay.core.common.mechanics.rentable.lockpick.LockPick +import dev.slne.surf.roleplay.core.common.mechanics.rentable.utils.Crackable +import dev.slne.surf.roleplay.core.common.mechanics.rentable.utils.DoorContainer +import dev.slne.surf.roleplay.core.common.mechanics.rentable.utils.Lockable +import dev.slne.surf.roleplay.core.common.player.RpPlayer import kotlin.time.Duration -abstract class DoorImpl( - override val rentable: Rentable, - override val container: DoorContainer, - override val location: TeleportLocation, +abstract class Door( + val rentable: Rentable, + val container: DoorContainer, + val location: WorldLocation, override val crackDuration: Duration -) : Door { +) : Lockable, Crackable { override var cracked: Boolean = false @@ -33,7 +34,7 @@ abstract class DoorImpl( } } - override suspend fun open() { + suspend fun open() { container.doors.forEach { door -> doorStateOperation(door) { state -> state.isOpen = true @@ -41,7 +42,7 @@ abstract class DoorImpl( } } - override suspend fun close() { + suspend fun close() { container.doors.forEach { door -> doorStateOperation(door) { state -> state.isOpen = false diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/door/doors/FrontDoor.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/door/doors/FrontDoor.kt index eb0bd29..2944e51 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/door/doors/FrontDoor.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/door/doors/FrontDoor.kt @@ -1,16 +1,16 @@ package dev.slne.surf.roleplay.core.common.mechanics.rentable.door.doors -import dev.slne.surf.roleplay.api.common.mechanic.rentable.Rentable -import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.door.DoorContainer -import dev.slne.surf.roleplay.core.common.mechanics.rentable.door.DoorImpl -import org.bukkit.Location +import dev.slne.surf.cloud.api.common.player.teleport.WorldLocation +import dev.slne.surf.roleplay.core.common.mechanics.rentable.Rentable +import dev.slne.surf.roleplay.core.common.mechanics.rentable.door.Door +import dev.slne.surf.roleplay.core.common.mechanics.rentable.utils.DoorContainer import kotlin.time.Duration.Companion.seconds class FrontDoor( rentable: Rentable, container: DoorContainer, - location: Location -) : DoorImpl( + location: WorldLocation +) : Door( rentable = rentable, container = container, location = location, diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/door/doors/GarageDoor.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/door/doors/GarageDoor.kt index ec01478..d80e3f3 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/door/doors/GarageDoor.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/door/doors/GarageDoor.kt @@ -1,16 +1,16 @@ package dev.slne.surf.roleplay.core.common.mechanics.rentable.door.doors -import dev.slne.surf.roleplay.api.common.mechanic.rentable.Rentable -import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.door.DoorContainer -import dev.slne.surf.roleplay.core.common.mechanics.rentable.door.DoorImpl -import org.bukkit.Location +import dev.slne.surf.cloud.api.common.player.teleport.WorldLocation +import dev.slne.surf.roleplay.core.common.mechanics.rentable.Rentable +import dev.slne.surf.roleplay.core.common.mechanics.rentable.door.Door +import dev.slne.surf.roleplay.core.common.mechanics.rentable.utils.DoorContainer import kotlin.time.Duration.Companion.seconds class GarageDoor( rentable: Rentable, container: DoorContainer, - location: Location -) : DoorImpl( + location: WorldLocation +) : Door( rentable = rentable, container = container, location = location, diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/door/doors/RegularDoor.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/door/doors/RegularDoor.kt index 21708a6..4887ed6 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/door/doors/RegularDoor.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/door/doors/RegularDoor.kt @@ -1,16 +1,16 @@ package dev.slne.surf.roleplay.core.common.mechanics.rentable.door.doors -import dev.slne.surf.roleplay.api.common.mechanic.rentable.Rentable -import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.door.DoorContainer -import dev.slne.surf.roleplay.core.common.mechanics.rentable.door.DoorImpl -import org.bukkit.Location +import dev.slne.surf.cloud.api.common.player.teleport.WorldLocation +import dev.slne.surf.roleplay.core.common.mechanics.rentable.Rentable +import dev.slne.surf.roleplay.core.common.mechanics.rentable.door.Door +import dev.slne.surf.roleplay.core.common.mechanics.rentable.utils.DoorContainer import kotlin.time.Duration.Companion.seconds class RegularDoor( rentable: Rentable, container: DoorContainer, - location: Location -) : DoorImpl( + location: WorldLocation +) : Door( rentable = rentable, container = container, location = location, diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/events/RentableMemberAddEvent.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/events/RentableMemberAddEvent.kt similarity index 88% rename from surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/events/RentableMemberAddEvent.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/events/RentableMemberAddEvent.kt index 3a66fdb..da1edd2 100644 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/events/RentableMemberAddEvent.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/events/RentableMemberAddEvent.kt @@ -1,8 +1,8 @@ -package dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.events +package dev.slne.surf.roleplay.core.common.mechanics.rentable.events import dev.slne.surf.cloud.api.common.event.CancellableCloudEvent -import dev.slne.surf.roleplay.api.common.mechanic.rentable.Rentable -import dev.slne.surf.roleplay.api.common.player.RpPlayer +import dev.slne.surf.roleplay.core.common.mechanics.rentable.Rentable +import dev.slne.surf.roleplay.core.common.player.RpPlayer /** * Event triggered when a member is added to a rentable property. diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/events/RentableMemberRemoveEvent.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/events/RentableMemberRemoveEvent.kt similarity index 89% rename from surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/events/RentableMemberRemoveEvent.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/events/RentableMemberRemoveEvent.kt index d068f3c..e97a41a 100644 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/events/RentableMemberRemoveEvent.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/events/RentableMemberRemoveEvent.kt @@ -1,8 +1,8 @@ -package dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.events +package dev.slne.surf.roleplay.core.common.mechanics.rentable.events import dev.slne.surf.cloud.api.common.event.CancellableCloudEvent -import dev.slne.surf.roleplay.api.common.mechanic.rentable.Rentable -import dev.slne.surf.roleplay.api.common.player.RpPlayer +import dev.slne.surf.roleplay.core.common.mechanics.rentable.Rentable +import dev.slne.surf.roleplay.core.common.player.RpPlayer /** * Event triggered when a member is removed from a rentable property. diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/events/RentableOwnerChangeEvent.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/events/RentableOwnerChangeEvent.kt similarity index 94% rename from surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/events/RentableOwnerChangeEvent.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/events/RentableOwnerChangeEvent.kt index e5bcdd6..5bc0e1c 100644 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/events/RentableOwnerChangeEvent.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/events/RentableOwnerChangeEvent.kt @@ -1,9 +1,9 @@ -package dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.events +package dev.slne.surf.roleplay.core.common.mechanics.rentable.events import dev.slne.surf.cloud.api.common.event.CancellableCloudEvent -import dev.slne.surf.roleplay.api.common.mechanic.rentable.Rentable -import dev.slne.surf.roleplay.api.common.mechanic.rentable.RentableMechanic -import dev.slne.surf.roleplay.api.common.player.RpPlayer +import dev.slne.surf.roleplay.core.common.mechanics.rentable.Rentable +import dev.slne.surf.roleplay.core.common.mechanics.rentable.RentableMechanic +import dev.slne.surf.roleplay.core.common.player.RpPlayer import dev.slne.surf.surfapi.core.api.messages.builder.SurfComponentBuilder /** diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/events/RentableRentCollectEvent.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/events/RentableRentCollectEvent.kt similarity index 77% rename from surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/events/RentableRentCollectEvent.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/events/RentableRentCollectEvent.kt index 49113b6..64f0528 100644 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/events/RentableRentCollectEvent.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/events/RentableRentCollectEvent.kt @@ -1,7 +1,7 @@ -package dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.events +package dev.slne.surf.roleplay.core.common.mechanics.rentable.events import dev.slne.surf.cloud.api.common.event.CancellableCloudEvent -import dev.slne.surf.roleplay.api.common.mechanic.rentable.Rentable +import dev.slne.surf.roleplay.core.common.mechanics.rentable.Rentable /** * Event triggered when rent is collected from a rentable property. diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/LockPick.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/lockpick/LockPick.kt similarity index 54% rename from surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/LockPick.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/lockpick/LockPick.kt index 785da69..2d0fc17 100644 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/LockPick.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/lockpick/LockPick.kt @@ -1,24 +1,12 @@ -package dev.slne.surf.roleplay.api.common.mechanic.rentable.utils +package dev.slne.surf.roleplay.core.common.mechanics.rentable.lockpick -import dev.slne.surf.roleplay.api.common.player.RpPlayer +import dev.slne.surf.roleplay.core.common.player.RpPlayer import dev.slne.surf.surfapi.core.api.messages.builder.SurfComponentBuilder -/** - * Represents a lock pick that can be used to pick locks. - */ -interface LockPick { - - /** - * The display name of the lock pick. - */ - val displayName: SurfComponentBuilder.() -> Unit - - /** - * The chance of successfully picking the lock. - * A value between 0.0 (0%) and 1.0 (100%). - */ +abstract class LockPick( + val displayName: SurfComponentBuilder.() -> Unit, val breakChance: (RpPlayer) -> Double - +) { enum class LockPickResult { /** * The lockpick was successful. @@ -40,5 +28,4 @@ interface LockPick { */ EVENT_CANCELLED } - } \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/lockpick/LockPickImpl.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/lockpick/LockPickImpl.kt deleted file mode 100644 index 533104d..0000000 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/lockpick/LockPickImpl.kt +++ /dev/null @@ -1,10 +0,0 @@ -package dev.slne.surf.roleplay.core.common.mechanics.rentable.lockpick - -import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.LockPick -import dev.slne.surf.roleplay.api.common.player.RpPlayer -import dev.slne.surf.surfapi.core.api.messages.builder.SurfComponentBuilder - -abstract class LockPickImpl( - override val displayName: SurfComponentBuilder.() -> Unit, - override val breakChance: (RpPlayer) -> Double -) : LockPick \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/lockpick/lockpicks/BatteringRam.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/lockpick/lockpicks/BatteringRam.kt index 603c9f9..a9acde3 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/lockpick/lockpicks/BatteringRam.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/lockpick/lockpicks/BatteringRam.kt @@ -1,8 +1,8 @@ package dev.slne.surf.roleplay.core.common.mechanics.rentable.lockpick.lockpicks -import dev.slne.surf.roleplay.core.common.mechanics.rentable.lockpick.LockPickImpl +import dev.slne.surf.roleplay.core.common.mechanics.rentable.lockpick.LockPick -object BatteringRam : LockPickImpl( +object BatteringRam : LockPick( displayName = { primary("Rammbock") }, diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/lockpick/lockpicks/PremiumLockPick.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/lockpick/lockpicks/PremiumLockPick.kt index 0bbaae5..b1f583f 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/lockpick/lockpicks/PremiumLockPick.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/lockpick/lockpicks/PremiumLockPick.kt @@ -1,8 +1,8 @@ package dev.slne.surf.roleplay.core.common.mechanics.rentable.lockpick.lockpicks -import dev.slne.surf.roleplay.core.common.mechanics.rentable.lockpick.LockPickImpl +import dev.slne.surf.roleplay.core.common.mechanics.rentable.lockpick.LockPick -object PremiumLockPick : LockPickImpl( +object PremiumLockPick : LockPick( displayName = { primary("Verzinkter Vierkantstahl Dietrich") }, diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/lockpick/lockpicks/RegularLockPick.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/lockpick/lockpicks/RegularLockPick.kt index d1637b5..b00e251 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/lockpick/lockpicks/RegularLockPick.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/lockpick/lockpicks/RegularLockPick.kt @@ -1,8 +1,8 @@ package dev.slne.surf.roleplay.core.common.mechanics.rentable.lockpick.lockpicks -import dev.slne.surf.roleplay.core.common.mechanics.rentable.lockpick.LockPickImpl +import dev.slne.surf.roleplay.core.common.mechanics.rentable.lockpick.LockPick -object RegularLockPick : LockPickImpl( +object RegularLockPick : LockPick( displayName = { primary("Dietrich") }, diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/rentables/HouseImpl.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/rentables/Apartment.kt similarity index 68% rename from surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/rentables/HouseImpl.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/rentables/Apartment.kt index 3d50868..a7262fc 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/rentables/HouseImpl.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/rentables/Apartment.kt @@ -1,15 +1,14 @@ package dev.slne.surf.roleplay.core.common.mechanics.rentable.rentables -import dev.slne.surf.roleplay.api.common.mechanic.rentable.rentables.House -import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.StorageContainer -import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.door.DoorContainer -import dev.slne.surf.roleplay.core.common.mechanics.rentable.RentableImpl +import dev.slne.surf.roleplay.core.common.mechanics.rentable.Rentable +import dev.slne.surf.roleplay.core.common.mechanics.rentable.StorageContainer +import dev.slne.surf.roleplay.core.common.mechanics.rentable.utils.DoorContainer import dev.slne.surf.surfapi.core.api.util.mutableObjectSetOf import it.unimi.dsi.fastutil.objects.ObjectSet import net.kyori.adventure.key.Key import kotlin.time.Duration -class HouseImpl( +class Apartment( key: Key, rent: Int, rentDuration: Duration, @@ -17,7 +16,7 @@ class HouseImpl( stories: Int, storageContainers: ObjectSet = mutableObjectSetOf(), doors: ObjectSet = mutableObjectSetOf() -) : RentableImpl( +) : Rentable( key, rent, rentDuration, @@ -25,4 +24,4 @@ class HouseImpl( stories, storageContainers, doors -), House \ No newline at end of file +) \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/rentables/ApartmentImpl.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/rentables/House.kt similarity index 67% rename from surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/rentables/ApartmentImpl.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/rentables/House.kt index 94e387d..17d93a6 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/rentables/ApartmentImpl.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/rentables/House.kt @@ -1,15 +1,14 @@ package dev.slne.surf.roleplay.core.common.mechanics.rentable.rentables -import dev.slne.surf.roleplay.api.common.mechanic.rentable.rentables.Apartment -import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.StorageContainer -import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.door.DoorContainer -import dev.slne.surf.roleplay.core.common.mechanics.rentable.RentableImpl +import dev.slne.surf.roleplay.core.common.mechanics.rentable.Rentable +import dev.slne.surf.roleplay.core.common.mechanics.rentable.StorageContainer +import dev.slne.surf.roleplay.core.common.mechanics.rentable.utils.DoorContainer import dev.slne.surf.surfapi.core.api.util.mutableObjectSetOf import it.unimi.dsi.fastutil.objects.ObjectSet import net.kyori.adventure.key.Key import kotlin.time.Duration -class ApartmentImpl( +class House( key: Key, rent: Int, rentDuration: Duration, @@ -17,7 +16,7 @@ class ApartmentImpl( stories: Int, storageContainers: ObjectSet = mutableObjectSetOf(), doors: ObjectSet = mutableObjectSetOf() -) : RentableImpl( +) : Rentable( key, rent, rentDuration, @@ -25,4 +24,4 @@ class ApartmentImpl( stories, storageContainers, doors -), Apartment \ No newline at end of file +) \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/Crackable.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/utils/Crackable.kt similarity index 81% rename from surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/Crackable.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/utils/Crackable.kt index eb6a3a2..8278d4a 100644 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/Crackable.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/utils/Crackable.kt @@ -1,6 +1,7 @@ -package dev.slne.surf.roleplay.api.common.mechanic.rentable.utils +package dev.slne.surf.roleplay.core.common.mechanics.rentable.utils -import dev.slne.surf.roleplay.api.common.player.RpPlayer +import dev.slne.surf.roleplay.core.common.mechanics.rentable.lockpick.LockPick +import dev.slne.surf.roleplay.core.common.player.RpPlayer import kotlin.time.Duration /** diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/door/DoorContainer.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/utils/DoorContainer.kt similarity index 63% rename from surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/door/DoorContainer.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/utils/DoorContainer.kt index 70d8d56..209ba9f 100644 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/door/DoorContainer.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/utils/DoorContainer.kt @@ -1,5 +1,6 @@ -package dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.door +package dev.slne.surf.roleplay.core.common.mechanics.rentable.utils +import dev.slne.surf.roleplay.core.common.mechanics.rentable.door.Door import it.unimi.dsi.fastutil.objects.ObjectSet /** diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/Lockable.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/utils/Lockable.kt similarity index 78% rename from surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/Lockable.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/utils/Lockable.kt index 482047a..7bdfd00 100644 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/rentable/utils/Lockable.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/utils/Lockable.kt @@ -1,6 +1,6 @@ -package dev.slne.surf.roleplay.api.common.mechanic.rentable.utils +package dev.slne.surf.roleplay.core.common.mechanics.rentable.utils -import dev.slne.surf.roleplay.api.common.player.RpPlayer +import dev.slne.surf.roleplay.core.common.player.RpPlayer /** * Represents an entity that can be locked and accessed by players. diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/Weapon.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/Weapon.kt new file mode 100644 index 0000000..70fc58d --- /dev/null +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/Weapon.kt @@ -0,0 +1,28 @@ +package dev.slne.surf.roleplay.core.common.mechanics.weapon + +import dev.slne.surf.roleplay.core.common.mechanics.weapon.magazine.Magazine +import dev.slne.surf.roleplay.core.common.mechanics.weapon.utils.WeaponType +import dev.slne.surf.surfapi.core.api.messages.builder.SurfComponentBuilder +import dev.slne.surf.surfapi.core.api.util.objectSetOf +import it.unimi.dsi.fastutil.objects.ObjectSet +import net.kyori.adventure.key.Key +import kotlin.time.Duration +import kotlin.time.Duration.Companion.seconds + +abstract class Weapon( + val type: WeaponType, + val weaponMaterial: Key, + val name: String, + val displayName: SurfComponentBuilder.() -> Unit = { + primary(name) + }, + val description: SurfComponentBuilder.() -> Unit = { + spacer("Eine ") + append(displayName) + spacer(" Waffe") + }, + val weaponShootCooldown: Duration = 1.seconds, + val supportedMagazines: ObjectSet = objectSetOf() +) { + fun isApplicableMagazine(magazine: Magazine) = magazine in supportedMagazines +} \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/WeaponImpl.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/WeaponImpl.kt deleted file mode 100644 index a2ceda7..0000000 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/WeaponImpl.kt +++ /dev/null @@ -1,37 +0,0 @@ -package dev.slne.surf.roleplay.mechanic.mechanics.weapon - -import dev.slne.surf.roleplay.api.mechanic.weapon.Weapon -import dev.slne.surf.roleplay.api.mechanic.weapon.magazine.Magazine -import dev.slne.surf.roleplay.api.mechanic.weapon.utils.WeaponType -import dev.slne.surf.surfapi.bukkit.api.builder.LoreBuilder -import dev.slne.surf.surfapi.core.api.messages.builder.SurfComponentBuilder -import dev.slne.surf.surfapi.core.api.util.objectSetOf -import it.unimi.dsi.fastutil.objects.ObjectSet -import org.bukkit.Material -import org.bukkit.inventory.ItemStack -import kotlin.time.Duration -import kotlin.time.Duration.Companion.seconds - -abstract class WeaponImpl( - override val type: WeaponType, - override val weaponMaterial: Material, - override val name: String, - override val displayName: SurfComponentBuilder.() -> Unit = { - primary(name) - }, - override val description: LoreBuilder.() -> Unit = { - line { - spacer("Eine ") - append(displayName) - spacer(" Waffe") - } - }, - override val weaponShootCooldown: Duration = 1.seconds, - override val supportedMagazines: ObjectSet = objectSetOf() -) : Weapon { - override fun isApplicableMagazine(magazine: Magazine) = magazine in supportedMagazines - - override fun buildItemStack(): ItemStack { - - } -} \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/WeaponMechanic.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/WeaponMechanic.kt new file mode 100644 index 0000000..8ede3eb --- /dev/null +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/WeaponMechanic.kt @@ -0,0 +1,12 @@ +package dev.slne.surf.roleplay.core.common.mechanics.weapon + +import dev.slne.surf.roleplay.core.common.mechanics.Mechanic +import dev.slne.surf.surfapi.core.api.util.freeze +import dev.slne.surf.surfapi.core.api.util.mutableObjectSetOf + +object WeaponMechanic : Mechanic( + name = "WeaponMechanic", +) { + private val _weapons = mutableObjectSetOf() + val weapons get() = _weapons.freeze() +} \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/WeaponMechanicImpl.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/WeaponMechanicImpl.kt deleted file mode 100644 index 70aca44..0000000 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/WeaponMechanicImpl.kt +++ /dev/null @@ -1,18 +0,0 @@ -package dev.slne.surf.roleplay.mechanic.mechanics.weapon - -import dev.slne.surf.roleplay.api.common.mechanic.weapon.WeaponMechanic -import dev.slne.surf.roleplay.api.mechanic.weapon.Weapon -import dev.slne.surf.roleplay.mechanic.MechanicImpl -import dev.slne.surf.surfapi.core.api.util.freeze -import dev.slne.surf.surfapi.core.api.util.mutableObjectSetOf -import dev.slne.surf.surfapi.core.api.util.objectSetOf - -object WeaponMechanicImpl : MechanicImpl( - name = "WeaponMechanic", - handlers = objectSetOf(), - rpJobs = objectSetOf(), - packetListeners = objectSetOf() -), WeaponMechanic { - private val _weapons = mutableObjectSetOf() - override val weapons get() = _weapons.freeze() -} \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/magazine/Magazine.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/magazine/Magazine.kt new file mode 100644 index 0000000..02c02f2 --- /dev/null +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/magazine/Magazine.kt @@ -0,0 +1,17 @@ +package dev.slne.surf.roleplay.core.common.mechanics.weapon.magazine + +import dev.slne.surf.surfapi.core.api.messages.builder.SurfComponentBuilder + +abstract class Magazine( + val name: String, + val displayName: SurfComponentBuilder.() -> Unit = { + primary(name) + }, + val description: SurfComponentBuilder.() -> Unit = { + spacer("Ein ") + append(displayName) + spacer(" Magazin") + }, + val maxAmmo: Int, + val damageFunction: (Double) -> Double +) \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/magazine/MagazineImpl.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/magazine/MagazineImpl.kt deleted file mode 100644 index 719ce96..0000000 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/magazine/MagazineImpl.kt +++ /dev/null @@ -1,21 +0,0 @@ -package dev.slne.surf.roleplay.mechanic.mechanics.weapon.magazine - -import dev.slne.surf.roleplay.api.mechanic.weapon.magazine.Magazine -import dev.slne.surf.surfapi.bukkit.api.builder.LoreBuilder -import dev.slne.surf.surfapi.core.api.messages.builder.SurfComponentBuilder - -abstract class MagazineImpl( - override val name: String, - override val displayName: SurfComponentBuilder.() -> Unit = { - primary(name) - }, - override val description: LoreBuilder.() -> Unit = { - line { - spacer("Ein ") - append(displayName) - spacer(" Magazin") - } - }, - override val maxAmmo: Int, - override val damageFunction: (Double) -> Double -) : Magazine \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/magazine/PlayerMagazine.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/magazine/PlayerMagazine.kt new file mode 100644 index 0000000..0c27816 --- /dev/null +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/magazine/PlayerMagazine.kt @@ -0,0 +1,8 @@ +package dev.slne.surf.roleplay.core.common.mechanics.weapon.magazine + +class PlayerMagazine( + val magazine: Magazine, +) { + private var _currentAmmo = magazine.maxAmmo + val currentAmmo get() = _currentAmmo +} \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/magazine/PlayerMagazineImpl.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/magazine/PlayerMagazineImpl.kt deleted file mode 100644 index bfe498a..0000000 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/magazine/PlayerMagazineImpl.kt +++ /dev/null @@ -1,11 +0,0 @@ -package dev.slne.surf.roleplay.mechanic.mechanics.weapon.magazine - -import dev.slne.surf.roleplay.api.mechanic.weapon.magazine.Magazine -import dev.slne.surf.roleplay.api.mechanic.weapon.magazine.PlayerMagazine - -class PlayerMagazineImpl( - override val magazine: Magazine, -) : PlayerMagazine { - private var _currentAmmo = magazine.maxAmmo - override val currentAmmo get() = _currentAmmo -} \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/player/PlayerWeapon.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/player/PlayerWeapon.kt new file mode 100644 index 0000000..9855b22 --- /dev/null +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/player/PlayerWeapon.kt @@ -0,0 +1,15 @@ +package dev.slne.surf.roleplay.core.common.mechanics.weapon.player + +import dev.slne.surf.roleplay.core.common.mechanics.weapon.Weapon +import dev.slne.surf.roleplay.core.common.mechanics.weapon.magazine.PlayerMagazine + +class PlayerWeapon( + val weapon: Weapon +) { + private var _currentMagazine: PlayerMagazine? = null + val currentMagazine get() = _currentMagazine + + fun setCurrentMagazine(magazine: PlayerMagazine?) { + _currentMagazine = magazine + } +} \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/player/PlayerWeaponImpl.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/player/PlayerWeaponImpl.kt deleted file mode 100644 index 0fde671..0000000 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/player/PlayerWeaponImpl.kt +++ /dev/null @@ -1,16 +0,0 @@ -package dev.slne.surf.roleplay.mechanic.mechanics.weapon.player - -import dev.slne.surf.roleplay.api.mechanic.weapon.Weapon -import dev.slne.surf.roleplay.api.mechanic.weapon.magazine.PlayerMagazine -import dev.slne.surf.roleplay.api.mechanic.weapon.player.PlayerWeapon - -class PlayerWeaponImpl( - override val weapon: Weapon -) : PlayerWeapon { - private var _currentMagazine: PlayerMagazine? = null - override val currentMagazine get() = _currentMagazine - - override fun setCurrentMagazine(magazine: PlayerMagazine?) { - _currentMagazine = magazine - } -} \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/weapon/utils/WeaponType.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/utils/WeaponType.kt similarity index 74% rename from surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/weapon/utils/WeaponType.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/utils/WeaponType.kt index 0d65b1c..0c6f12b 100644 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/mechanic/weapon/utils/WeaponType.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/utils/WeaponType.kt @@ -1,4 +1,4 @@ -package dev.slne.surf.roleplay.api.common.mechanic.weapon.utils +package dev.slne.surf.roleplay.core.common.mechanics.weapon.utils enum class WeaponType { PISTOL, diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/CommonRpPlayerManager.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/CommonRpPlayerManager.kt deleted file mode 100644 index 44bd116..0000000 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/CommonRpPlayerManager.kt +++ /dev/null @@ -1,25 +0,0 @@ -package dev.slne.surf.roleplay.core.common.player - -import com.github.benmanes.caffeine.cache.Caffeine -import dev.slne.surf.roleplay.api.common.player.RpPlayerManager -import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity -import dev.slne.surf.roleplay.api.common.util.InternalRoleplayApi -import java.util.* - -@OptIn(InternalRoleplayApi::class) -abstract class CommonRpPlayerManager : RpPlayerManager { - - private val cache = Caffeine.newBuilder() - .maximumSize(10_000) - .build { createPlayer(it) } - - abstract fun createPlayer(uuid: UUID): CommonRpPlayer - - override fun getPlayerByUuid(uuid: UUID) = cache.get(uuid) - - abstract suspend fun fetchIdentities(uuid: UUID): Set - - abstract suspend fun createIdentity(identity: T): T - abstract suspend fun updateIdentity(identity: T): T? - abstract suspend fun createOrUpdateIdentity(identity: T): T -} \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/PlayerIdentityFetcher.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/PlayerIdentityFetcher.kt index d768cff..65d25bb 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/PlayerIdentityFetcher.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/PlayerIdentityFetcher.kt @@ -2,7 +2,6 @@ package dev.slne.surf.roleplay.core.common.player import dev.slne.surf.cloud.api.common.player.OfflineCloudPlayer import dev.slne.surf.cloud.api.common.player.task.PrePlayerJoinTask -import dev.slne.surf.roleplay.api.common.player.rpPlayer import dev.slne.surf.surfapi.core.api.util.logger import org.springframework.stereotype.Component @@ -12,7 +11,8 @@ class PlayerIdentityFetcher : PrePlayerJoinTask { override suspend fun preJoin(player: OfflineCloudPlayer): PrePlayerJoinTask.Result { try { - (player.rpPlayer() as CommonRpPlayer).fetchIdentities() + player.rpPlayer().fetchIdentities() + return PrePlayerJoinTask.Result.ALLOWED } catch (e: Throwable) { log.atSevere() diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/CommonRpPlayer.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/RpPlayer.kt similarity index 66% rename from surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/CommonRpPlayer.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/RpPlayer.kt index 1e3f4a3..5123a18 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/CommonRpPlayer.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/RpPlayer.kt @@ -2,38 +2,41 @@ package dev.slne.surf.roleplay.core.common.player import dev.slne.surf.cloud.api.common.player.OfflineCloudPlayer import dev.slne.surf.cloud.api.common.player.toOfflineCloudPlayer -import dev.slne.surf.roleplay.api.common.InternalContextHolder -import dev.slne.surf.roleplay.api.common.player.RpPlayer -import dev.slne.surf.roleplay.api.common.player.getIdentity -import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity -import dev.slne.surf.roleplay.api.common.player.license.License -import dev.slne.surf.roleplay.api.common.player.license.utils.LicenseRemovedReason -import dev.slne.surf.roleplay.api.common.transaction.utils.BalanceType -import dev.slne.surf.roleplay.api.common.util.InternalRoleplayApi +import dev.slne.surf.roleplay.core.common.player.identity.RpIdentity +import dev.slne.surf.roleplay.core.common.player.identity.RpIdentityType +import dev.slne.surf.roleplay.core.common.player.identity.identities.CivilianIdentity +import dev.slne.surf.roleplay.core.common.player.license.HasLicenses +import dev.slne.surf.roleplay.core.common.player.license.License +import dev.slne.surf.roleplay.core.common.player.license.utils.LicenseRemovedReason +import dev.slne.surf.roleplay.core.common.transaction.HasRpTransactions +import dev.slne.surf.roleplay.core.common.transaction.utils.BalanceType +import dev.slne.surf.roleplay.core.common.util.InternalContextHolder +import dev.slne.surf.roleplay.core.common.util.InternalRoleplayApi import dev.slne.surf.surfapi.core.api.messages.adventure.appendNewline import dev.slne.surf.surfapi.core.api.messages.adventure.buildText import dev.slne.surf.surfapi.core.api.util.freeze import dev.slne.surf.surfapi.core.api.util.mutableObjectSetOf +import net.kyori.adventure.text.ComponentLike import org.springframework.beans.factory.getBean import java.time.ZonedDateTime import java.util.* @OptIn(InternalRoleplayApi::class) -abstract class CommonRpPlayer( +abstract class RpPlayer( private val uuid: UUID, - override var createdAt: ZonedDateTime = ZonedDateTime.now(), - override var updatedAt: ZonedDateTime = ZonedDateTime.now() -) : RpPlayer { + var createdAt: ZonedDateTime = ZonedDateTime.now(), + var updatedAt: ZonedDateTime = ZonedDateTime.now() +) : HasRpTransactions, HasLicenses, ComponentLike { - override val cloudPlayer: OfflineCloudPlayer + val cloudPlayer: OfflineCloudPlayer get() = uuid.toOfflineCloudPlayer() private val _identities = mutableObjectSetOf() - override val identities = _identities.freeze() + val identities = _identities.freeze() - override var activeIdentity: RpIdentity? = null + var activeIdentity: RpIdentity? = null - private val playerService get() = InternalContextHolder.instance.context.getBean() + private val playerService get() = InternalContextHolder.instance.context.getBean() suspend fun fetchIdentities() { val fetched = playerService.fetchIdentities(uuid) @@ -42,7 +45,7 @@ abstract class CommonRpPlayer( _identities.addAll(fetched) } - override suspend fun setActiveIdentity(identity: RpIdentity) { + fun setActiveIdentity(identity: RpIdentity) { if (!_identities.contains(identity)) { error("Tried to set an active identity that is not part of the player's identities: $identity") } @@ -52,17 +55,17 @@ abstract class CommonRpPlayer( fun addIdentity(identity: RpIdentity) = _identities.add(identity) - override suspend fun createIdentity(identity: T) = + suspend fun createIdentity(identity: T) = playerService.createIdentity(identity) - override suspend fun updateIdentity(identity: T) = + suspend fun updateIdentity(identity: T) = playerService.updateIdentity(identity) - override suspend fun createOrUpdateIdentity(identity: T) = + suspend fun createOrUpdateIdentity(identity: T) = playerService.createOrUpdateIdentity(identity) @Suppress("UNCHECKED_CAST") - override fun getIdentity(type: RpIdentity.RpIdentityType) = + fun getIdentity(type: RpIdentityType) = _identities.firstOrNull { it.type == type } ?: error("No identity of type $type found for player $uuid") @@ -88,11 +91,11 @@ abstract class CommonRpPlayer( ) = activeIdentity?.getBalanceHistory(balanceType, limit) ?: error("Tried accessing balance history of a player without an active identity $uuid") - override fun getIdentity(clazz: Class) = identities.firstOrNull { + fun getIdentity(clazz: Class) = identities.firstOrNull { clazz.isAssignableFrom(it.javaClass) } - override fun hasCompletedCitizenship() = getIdentity() != null + fun hasCompletedCitizenship() = getIdentity() != null override val licenses get() = activeIdentity?.licenses @@ -155,7 +158,7 @@ abstract class CommonRpPlayer( if (this === other) return true if (javaClass != other?.javaClass) return false - other as CommonRpPlayer + other as dev.slne.surf.roleplay.core.common.player.RpPlayer return cloudPlayer == other.cloudPlayer } @@ -164,4 +167,25 @@ abstract class CommonRpPlayer( return cloudPlayer.hashCode() } -} \ No newline at end of file + companion object { + operator fun get(cloudPlayer: OfflineCloudPlayer) = + InternalContextHolder.instance.context.getBean() + .getPlayerByUuid(cloudPlayer.uuid) + } + +} + +/** + * Gets the [RpIdentity] of the specified type for this [RpPlayer]. + * + * @param T The type of the identity to retrieve. + * @return The identity of the specified type, or `null` if not found. + */ +inline fun RpPlayer.getIdentity() = getIdentity(T::class.java) + +/** + * Gets the [RpPlayer] associated with this [OfflineCloudPlayer]. + * + * @return The [RpPlayer] instance for this player. + */ +fun OfflineCloudPlayer.rpPlayer() = RpPlayer[this] \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/RpPlayerManager.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/RpPlayerManager.kt new file mode 100644 index 0000000..b7f421f --- /dev/null +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/RpPlayerManager.kt @@ -0,0 +1,30 @@ +package dev.slne.surf.roleplay.core.common.player + +import com.github.benmanes.caffeine.cache.Caffeine +import dev.slne.surf.roleplay.core.common.player.identity.RpIdentity +import dev.slne.surf.roleplay.core.common.util.InternalContextHolder +import dev.slne.surf.roleplay.core.common.util.InternalRoleplayApi +import org.springframework.beans.factory.getBean +import java.util.* + +@InternalRoleplayApi +abstract class RpPlayerManager { + + private val cache = Caffeine.newBuilder() + .maximumSize(10_000) + .build { createPlayer(it) } + + abstract fun createPlayer(uuid: UUID): RpPlayer + + fun getPlayerByUuid(uuid: UUID) = cache.get(uuid) + + abstract suspend fun fetchIdentities(uuid: UUID): Set + + abstract suspend fun createIdentity(identity: T): T + abstract suspend fun updateIdentity(identity: T): T? + abstract suspend fun createOrUpdateIdentity(identity: T): T + + companion object { + val instance get() = InternalContextHolder.instance.context.getBean() + } +} \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/events/RpPlayerJoinEvent.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/events/RpPlayerJoinEvent.kt similarity index 56% rename from surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/events/RpPlayerJoinEvent.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/events/RpPlayerJoinEvent.kt index bdd4d79..533ab5d 100644 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/events/RpPlayerJoinEvent.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/events/RpPlayerJoinEvent.kt @@ -1,7 +1,7 @@ -package dev.slne.surf.roleplay.api.common.player.events +package dev.slne.surf.roleplay.core.common.player.events import dev.slne.surf.cloud.api.common.event.CloudEvent -import dev.slne.surf.roleplay.api.common.player.RpPlayer +import dev.slne.surf.roleplay.core.common.player.RpPlayer class RpPlayerJoinEvent( source: Any, diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/events/RpPlayerQuitEvent.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/events/RpPlayerQuitEvent.kt similarity index 56% rename from surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/events/RpPlayerQuitEvent.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/events/RpPlayerQuitEvent.kt index d0a2e54..c4e7029 100644 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/events/RpPlayerQuitEvent.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/events/RpPlayerQuitEvent.kt @@ -1,7 +1,7 @@ -package dev.slne.surf.roleplay.api.common.player.events +package dev.slne.surf.roleplay.core.common.player.events import dev.slne.surf.cloud.api.common.event.CloudEvent -import dev.slne.surf.roleplay.api.common.player.RpPlayer +import dev.slne.surf.roleplay.core.common.player.RpPlayer class RpPlayerQuitEvent( source: Any, diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/CommonRpIdentity.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/RpIdentity.kt similarity index 69% rename from surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/CommonRpIdentity.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/RpIdentity.kt index 8757e8b..7b11f7e 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/CommonRpIdentity.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/RpIdentity.kt @@ -2,40 +2,42 @@ package dev.slne.surf.roleplay.core.common.player.identity -import dev.slne.surf.cloud.api.common.netty.network.codec.StreamCodec -import dev.slne.surf.cloud.api.common.netty.protocol.buffer.SurfByteBuf -import dev.slne.surf.roleplay.api.common.player.RpPlayer -import dev.slne.surf.roleplay.api.common.player.RpPlayerManager -import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity -import dev.slne.surf.roleplay.api.common.player.license.ExpirableLicense -import dev.slne.surf.roleplay.api.common.player.license.IdentityLicense -import dev.slne.surf.roleplay.api.common.player.license.InternalLicenseBridge -import dev.slne.surf.roleplay.api.common.player.license.License -import dev.slne.surf.roleplay.api.common.player.license.events.RpPlayerLicenseAddedEvent -import dev.slne.surf.roleplay.api.common.player.license.events.RpPlayerLicenseRemovedEvent -import dev.slne.surf.roleplay.api.common.player.license.utils.LicenseCreateResult -import dev.slne.surf.roleplay.api.common.player.license.utils.LicenseRemovedReason -import dev.slne.surf.roleplay.api.common.player.license.utils.UnobtainableReason -import dev.slne.surf.roleplay.api.common.transaction.RpTransaction -import dev.slne.surf.roleplay.api.common.transaction.utils.BalanceType -import dev.slne.surf.roleplay.api.common.util.InternalRoleplayApi -import dev.slne.surf.roleplay.core.common.player.identity.identities.CivilianIdentityImpl -import dev.slne.surf.roleplay.core.common.player.identity.identities.PoliceIdentityImpl +import dev.slne.surf.roleplay.core.common.player.RpPlayer +import dev.slne.surf.roleplay.core.common.player.RpPlayerManager +import dev.slne.surf.roleplay.core.common.player.license.* +import dev.slne.surf.roleplay.core.common.player.license.events.RpPlayerLicenseAddedEvent +import dev.slne.surf.roleplay.core.common.player.license.events.RpPlayerLicenseRemovedEvent +import dev.slne.surf.roleplay.core.common.player.license.utils.LicenseCreateResult +import dev.slne.surf.roleplay.core.common.player.license.utils.LicenseRemovedReason +import dev.slne.surf.roleplay.core.common.player.license.utils.UnobtainableReason +import dev.slne.surf.roleplay.core.common.transaction.HasRpTransactions +import dev.slne.surf.roleplay.core.common.transaction.RpTransaction +import dev.slne.surf.roleplay.core.common.transaction.utils.BalanceType +import dev.slne.surf.roleplay.core.common.util.InternalRoleplayApi import dev.slne.surf.surfapi.core.api.util.mutableObject2ObjectMapOf import dev.slne.surf.surfapi.core.api.util.mutableObjectSetOf import dev.slne.surf.surfapi.core.api.util.objectSetOf import it.unimi.dsi.fastutil.objects.ObjectLinkedOpenHashSet +import kotlinx.serialization.Contextual import kotlinx.serialization.Serializable import kotlinx.serialization.Transient +import java.time.LocalDate import java.time.ZonedDateTime +import java.util.* @Serializable -abstract class CommonRpIdentity( - val codecType: RpIdentityCodecType, -) : RpIdentity { - - override val player: RpPlayer get() = RpPlayerManager.instance.getPlayerByUuid(uuid) - private val licenseService get() = InternalLicenseBridge.instance +abstract class RpIdentity( + open val uuid: @Contextual UUID, + open val type: RpIdentityType, + open var firstName: String, + open var lastName: String, + open var dateOfBirth: @Contextual LocalDate, + open val createdAt: @Contextual ZonedDateTime = ZonedDateTime.now(), + open var updatedAt: @Contextual ZonedDateTime = ZonedDateTime.now() +) : HasRpTransactions, HasLicenses { + + val player: RpPlayer get() = RpPlayerManager.instance.getPlayerByUuid(uuid) + private val licenseService get() = LicenseService.instance @Transient private val _licenses = mutableObjectSetOf() @@ -45,13 +47,7 @@ abstract class CommonRpIdentity( _licenses.add(license) } - enum class RpIdentityCodecType(val codec: StreamCodec) { - CIVILIAN(SurfByteBuf.streamCodecFromKotlin(CivilianIdentityImpl.serializer())), - POLICE(SurfByteBuf.streamCodecFromKotlin(PoliceIdentityImpl.serializer())), - RESCUE_SERVICE(SurfByteBuf.streamCodecFromKotlin(PoliceIdentityImpl.serializer())), - } - - override suspend fun updateInformation(identity: T.() -> Unit): T { + suspend fun updateInformation(identity: T.() -> Unit): T { TODO("Not yet implemented") } diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/RpIdentityType.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/RpIdentityType.kt new file mode 100644 index 0000000..197793e --- /dev/null +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/RpIdentityType.kt @@ -0,0 +1,33 @@ +package dev.slne.surf.roleplay.core.common.player.identity + +import dev.slne.surf.surfapi.core.api.messages.adventure.buildText +import net.kyori.adventure.text.ComponentLike + +enum class RpIdentityType : ComponentLike { + /** + * Represents a player who is a member of the civilian population. + */ + CIVILIAN { + override fun asComponent() = buildText { + text("Zivilist") + } + }, + + /** + * Represents a player who is a member of the emergency medical service. + */ + POLICE { + override fun asComponent() = buildText { + text("Polizist") + } + }, + + /** + * Represents a player who is a member of the rescue service. + */ + RESCUE_SERVICE { + override fun asComponent() = buildText { + text("SAR") + } + } +} \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/identities/CivilianIdentityImpl.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/identities/CivilianIdentity.kt similarity index 68% rename from surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/identities/CivilianIdentityImpl.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/identities/CivilianIdentity.kt index 38b54fc..9f6c99f 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/identities/CivilianIdentityImpl.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/identities/CivilianIdentity.kt @@ -1,7 +1,7 @@ package dev.slne.surf.roleplay.core.common.player.identity.identities -import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity -import dev.slne.surf.roleplay.core.common.player.identity.CommonRpIdentity +import dev.slne.surf.roleplay.core.common.player.identity.RpIdentity +import dev.slne.surf.roleplay.core.common.player.identity.RpIdentityType import kotlinx.serialization.Contextual import kotlinx.serialization.Serializable import java.time.LocalDate @@ -9,16 +9,22 @@ import java.time.ZonedDateTime import java.util.* @Serializable -class CivilianIdentityImpl( +class CivilianIdentity( override val uuid: @Contextual UUID, override var firstName: String, override var lastName: String, override var dateOfBirth: @Contextual LocalDate, override val createdAt: @Contextual ZonedDateTime = ZonedDateTime.now(), override var updatedAt: @Contextual ZonedDateTime = ZonedDateTime.now() -) : CommonRpIdentity(RpIdentityCodecType.CIVILIAN), RpIdentity.CivilianIdentity { - override val type = RpIdentity.RpIdentityType.CIVILIAN - +) : RpIdentity( + uuid, + RpIdentityType.CIVILIAN, + firstName, + lastName, + dateOfBirth, + createdAt, + updatedAt +) { override fun toString(): String { val parent = super.toString() diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/identities/PoliceIdentityImpl.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/identities/PoliceIdentity.kt similarity index 66% rename from surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/identities/PoliceIdentityImpl.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/identities/PoliceIdentity.kt index 6bfe1ca..d0d9fab 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/identities/PoliceIdentityImpl.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/identities/PoliceIdentity.kt @@ -1,7 +1,7 @@ package dev.slne.surf.roleplay.core.common.player.identity.identities -import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity -import dev.slne.surf.roleplay.core.common.player.identity.CommonRpIdentity +import dev.slne.surf.roleplay.core.common.player.identity.RpIdentity +import dev.slne.surf.roleplay.core.common.player.identity.RpIdentityType import kotlinx.serialization.Contextual import kotlinx.serialization.Serializable import java.time.LocalDate @@ -9,19 +9,24 @@ import java.time.ZonedDateTime import java.util.* @Serializable -class PoliceIdentityImpl( +class PoliceIdentity( override val uuid: @Contextual UUID, override var firstName: String, override var lastName: String, override var dateOfBirth: @Contextual LocalDate, - override val badgeNumber: String, - override val rank: String, + val badgeNumber: String, + val rank: String, override val createdAt: @Contextual ZonedDateTime = ZonedDateTime.now(), override var updatedAt: @Contextual ZonedDateTime = ZonedDateTime.now() -) : CommonRpIdentity(RpIdentityCodecType.POLICE), RpIdentity.PoliceIdentity { - - override val type = RpIdentity.RpIdentityType.POLICE - +) : RpIdentity( + uuid, + RpIdentityType.POLICE, + firstName, + lastName, + dateOfBirth, + createdAt, + updatedAt +) { override fun toString(): String { val parent = super.toString() diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/identities/RescueServiceIdentityImpl.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/identities/RescueServiceIdentity.kt similarity index 66% rename from surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/identities/RescueServiceIdentityImpl.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/identities/RescueServiceIdentity.kt index 8ec06a7..bd55d11 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/identities/RescueServiceIdentityImpl.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/identities/RescueServiceIdentity.kt @@ -1,7 +1,7 @@ package dev.slne.surf.roleplay.core.common.player.identity.identities -import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity -import dev.slne.surf.roleplay.core.common.player.identity.CommonRpIdentity +import dev.slne.surf.roleplay.core.common.player.identity.RpIdentity +import dev.slne.surf.roleplay.core.common.player.identity.RpIdentityType import kotlinx.serialization.Contextual import kotlinx.serialization.Serializable import java.time.LocalDate @@ -9,18 +9,23 @@ import java.time.ZonedDateTime import java.util.* @Serializable -class RescueServiceIdentityImpl( +class RescueServiceIdentity( override val uuid: @Contextual UUID, override var firstName: String, override var lastName: String, override var dateOfBirth: @Contextual LocalDate, - override val rank: String, + val rank: String, override val createdAt: @Contextual ZonedDateTime = ZonedDateTime.now(), override var updatedAt: @Contextual ZonedDateTime = ZonedDateTime.now() -) : CommonRpIdentity(RpIdentityCodecType.RESCUE_SERVICE), RpIdentity.RescueServiceIdentity { - - override val type = RpIdentity.RpIdentityType.RESCUE_SERVICE - +) : RpIdentity( + uuid, + RpIdentityType.RESCUE_SERVICE, + firstName, + lastName, + dateOfBirth, + createdAt, + updatedAt +) { override fun toString(): String { val parent = super.toString() diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/protocol/clientbound/ClientboundIdentityGetPacket.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/protocol/clientbound/ClientboundIdentityGetPacket.kt deleted file mode 100644 index 7c0cd81..0000000 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/protocol/clientbound/ClientboundIdentityGetPacket.kt +++ /dev/null @@ -1,32 +0,0 @@ -package dev.slne.surf.roleplay.core.common.player.identity.protocol.clientbound - -import dev.slne.surf.cloud.api.common.meta.SurfNettyPacket -import dev.slne.surf.cloud.api.common.netty.network.codec.StreamCodec -import dev.slne.surf.cloud.api.common.netty.network.protocol.PacketFlow -import dev.slne.surf.cloud.api.common.netty.packet.ResponseNettyPacket -import dev.slne.surf.cloud.api.common.netty.packet.packetCodec -import dev.slne.surf.cloud.api.common.netty.protocol.buffer.SurfByteBuf -import dev.slne.surf.cloud.api.common.netty.protocol.buffer.readEnum -import dev.slne.surf.roleplay.core.common.player.identity.CommonRpIdentity - -@SurfNettyPacket("roleplay:identity_get", PacketFlow.CLIENTBOUND) -class ClientboundIdentityGetPacket( - val identity: CommonRpIdentity -) : ResponseNettyPacket() { - - companion object { - val STREAM_CODEC = - packetCodec(ClientboundIdentityGetPacket::write, ::ClientboundIdentityGetPacket) - } - - private constructor(buf: SurfByteBuf) : this( - buf.readEnum().codec.decode(buf) - ) - - @Suppress("UNCHECKED_CAST") - private fun write(buf: SurfByteBuf) { - buf.writeEnum(identity.type) - val codec = identity.codecType.codec as StreamCodec - codec.encode(buf, identity) - } -} \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/protocol/serverbound/ServerboundCreateIdentityPacket.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/protocol/serverbound/ServerboundCreateIdentityPacket.kt deleted file mode 100644 index c53425d..0000000 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/protocol/serverbound/ServerboundCreateIdentityPacket.kt +++ /dev/null @@ -1,4 +0,0 @@ -package dev.slne.surf.roleplay.core.common.player.identity.protocol.serverbound - -class ServerboundCreateIdentityPacket: { -} \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/CommonLicenseBridge.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/CommonLicenseBridge.kt deleted file mode 100644 index 48c6e38..0000000 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/CommonLicenseBridge.kt +++ /dev/null @@ -1,28 +0,0 @@ -package dev.slne.surf.roleplay.core.common.player.license - -import dev.slne.surf.cloud.api.common.util.toObjectSet -import dev.slne.surf.roleplay.api.common.player.license.InternalLicenseBridge -import dev.slne.surf.roleplay.api.common.player.license.License -import dev.slne.surf.roleplay.api.common.util.InternalRoleplayApi -import net.kyori.adventure.key.Key -import org.springframework.context.ApplicationContext - -@OptIn(InternalRoleplayApi::class) -abstract class CommonLicenseBridge( - private val context: ApplicationContext -) : InternalLicenseBridge { - - override val licenses - get() = context.getBeansOfType(License::class.java) - .values - .toObjectSet() - - override fun getLicense(license: Class) = - context.getBean(license) - - override fun getLicenseByKey(key: Key) = - licenses.find { it.key == key } - - override fun getLicenseByKeyOrThrow(key: Key) = - getLicenseByKey(key) ?: error("License with key $key not found in the context.") -} \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/CommonExpirableLicense.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/ExpirableLicense.kt similarity index 66% rename from surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/CommonExpirableLicense.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/ExpirableLicense.kt index 6407e28..a75c911 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/CommonExpirableLicense.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/ExpirableLicense.kt @@ -1,26 +1,25 @@ package dev.slne.surf.roleplay.core.common.player.license -import dev.slne.surf.roleplay.api.common.player.license.ExpirableLicense -import dev.slne.surf.roleplay.api.common.player.license.License +import dev.slne.surf.surfapi.core.api.messages.builder.SurfComponentBuilder import dev.slne.surf.surfapi.core.api.util.objectSetOf import it.unimi.dsi.fastutil.objects.ObjectSet import net.kyori.adventure.key.Key import net.kyori.adventure.text.Component import kotlin.time.Duration -abstract class CommonExpirableLicense( +abstract class ExpirableLicense( key: Key, displayName: Component, - description: Component, + description: SurfComponentBuilder.() -> Unit, price: Int, - override val expiresIn: Duration, + val expiresIn: Duration, dependencies: ObjectSet = objectSetOf(), permission: String = LicensePermissionRegistry.createLicensePermission(key) -) : CommonLicense( +) : License( key, displayName, description, price, dependencies, permission -), ExpirableLicense \ No newline at end of file +) \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/HasLicenses.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/HasLicenses.kt similarity index 78% rename from surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/HasLicenses.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/HasLicenses.kt index 7d43e3b..e8be110 100644 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/HasLicenses.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/HasLicenses.kt @@ -1,10 +1,10 @@ -package dev.slne.surf.roleplay.api.common.player.license +package dev.slne.surf.roleplay.core.common.player.license -import dev.slne.surf.roleplay.api.common.player.RpPlayer -import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity -import dev.slne.surf.roleplay.api.common.player.license.utils.LicenseCreateResult -import dev.slne.surf.roleplay.api.common.player.license.utils.LicenseRemovedReason -import dev.slne.surf.roleplay.api.common.player.license.utils.UnobtainableReason +import dev.slne.surf.roleplay.core.common.player.RpPlayer +import dev.slne.surf.roleplay.core.common.player.identity.RpIdentity +import dev.slne.surf.roleplay.core.common.player.license.utils.LicenseCreateResult +import dev.slne.surf.roleplay.core.common.player.license.utils.LicenseRemovedReason +import dev.slne.surf.roleplay.core.common.player.license.utils.UnobtainableReason import it.unimi.dsi.fastutil.objects.ObjectSet import org.jetbrains.annotations.Unmodifiable @@ -20,7 +20,7 @@ interface HasLicenses { * * @param license The license to add. * @return A triple containing a boolean indicating success or failure, an [UnobtainableReason] if the license could not be obtained - * and the [IdentityLicense] if successfully added. + * and the [dev.slne.surf.roleplay.core.common.player.license.IdentityLicense] if successfully added. */ suspend fun addLicense(license: License): LicenseCreateResult @@ -54,7 +54,7 @@ interface HasLicenses { * Retrieves a specific license owned by the player. * * @param license The class of the license to retrieve. - * @return The [IdentityLicense] if found, or null if not found. + * @return The [dev.slne.surf.roleplay.core.common.player.license.IdentityLicense] if found, or null if not found. */ fun getLicense(license: Class): IdentityLicense? @@ -79,7 +79,7 @@ interface HasLicenses { * Extension function to retrieve a license by its type. * * @param T The type of the license to retrieve. - * @return The [IdentityLicense] if found, or null if not found. + * @return The [dev.slne.surf.roleplay.core.common.player.license.IdentityLicense] if found, or null if not found. */ @Suppress("UNCHECKED_CAST") inline fun HasLicenses.getLicense() = diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/IdentityLicense.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/IdentityLicense.kt similarity index 93% rename from surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/IdentityLicense.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/IdentityLicense.kt index c5c6142..b48980e 100644 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/IdentityLicense.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/IdentityLicense.kt @@ -1,6 +1,6 @@ -package dev.slne.surf.roleplay.api.common.player.license +package dev.slne.surf.roleplay.core.common.player.license -import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity +import dev.slne.surf.roleplay.core.common.player.identity.RpIdentity import kotlinx.serialization.Contextual import kotlinx.serialization.Serializable import java.time.ZonedDateTime @@ -17,7 +17,7 @@ import java.time.ZonedDateTime */ @Serializable data class IdentityLicense( - val license: License, + val license: @Contextual License, val identity: RpIdentity, val expiresAt: @Contextual ZonedDateTime?, val createdAt: @Contextual ZonedDateTime = ZonedDateTime.now() diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/CommonLicense.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/License.kt similarity index 66% rename from surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/CommonLicense.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/License.kt index 1856c10..f2f2d6e 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/CommonLicense.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/License.kt @@ -1,9 +1,11 @@ +@file:OptIn(InternalRoleplayApi::class) + package dev.slne.surf.roleplay.core.common.player.license -import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity -import dev.slne.surf.roleplay.api.common.player.license.InternalLicenseBridge -import dev.slne.surf.roleplay.api.common.player.license.License -import dev.slne.surf.roleplay.api.common.player.license.utils.UnobtainableReason +import dev.slne.surf.roleplay.core.common.player.identity.RpIdentity +import dev.slne.surf.roleplay.core.common.player.license.utils.UnobtainableReason +import dev.slne.surf.roleplay.core.common.util.InternalRoleplayApi +import dev.slne.surf.surfapi.core.api.messages.builder.SurfComponentBuilder import dev.slne.surf.surfapi.core.api.util.mutableObjectSetOf import dev.slne.surf.surfapi.core.api.util.objectSetOf import dev.slne.surf.surfapi.core.api.util.toObjectSet @@ -11,23 +13,23 @@ import it.unimi.dsi.fastutil.objects.ObjectSet import net.kyori.adventure.key.Key import net.kyori.adventure.text.Component -abstract class CommonLicense( - override val key: Key, - override val displayName: Component, - override val description: Component, - override val price: Int, - override val dependencies: ObjectSet = objectSetOf(), - override val permission: String = LicensePermissionRegistry.createLicensePermission(key) -) : License { +abstract class License( + val key: Key, + val displayName: Component, + val description: SurfComponentBuilder.() -> Unit, + val price: Int, + val dependencies: ObjectSet = objectSetOf(), + val permission: String = LicensePermissionRegistry.createLicensePermission(key) +) { - private val licenseService get() = InternalLicenseBridge.instance + private val licenseService get() = LicenseService.instance - override val children + val children get() = licenseService.licenses.filter { it.dependencies.contains(this) }.toObjectSet() - override suspend fun canObtain(identity: RpIdentity): Pair> { + suspend fun canObtain(identity: RpIdentity): Pair> { val player = identity.player val cloudPlayer = player.cloudPlayer val onlineCloudPlayer = cloudPlayer.player @@ -64,7 +66,7 @@ abstract class CommonLicense( override fun equals(other: Any?): Boolean { if (this === other) return true - if (other !is CommonLicense) return false + if (other !is License) return false if (key != other.key) return false diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/InternalLicenseBridge.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/LicenseService.kt similarity index 70% rename from surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/InternalLicenseBridge.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/LicenseService.kt index cfc1b49..b489108 100644 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/InternalLicenseBridge.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/LicenseService.kt @@ -1,24 +1,31 @@ @file:OptIn(InternalRoleplayApi::class) -package dev.slne.surf.roleplay.api.common.player.license +package dev.slne.surf.roleplay.core.common.player.license -import dev.slne.surf.roleplay.api.common.InternalContextHolder -import dev.slne.surf.roleplay.api.common.player.RpPlayer -import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity -import dev.slne.surf.roleplay.api.common.util.InternalRoleplayApi +import dev.slne.surf.cloud.api.common.util.toObjectSet +import dev.slne.surf.roleplay.core.common.player.RpPlayer +import dev.slne.surf.roleplay.core.common.player.identity.RpIdentity +import dev.slne.surf.roleplay.core.common.util.InternalContextHolder +import dev.slne.surf.roleplay.core.common.util.InternalRoleplayApi import it.unimi.dsi.fastutil.objects.Object2ObjectMap import it.unimi.dsi.fastutil.objects.ObjectSet import net.kyori.adventure.key.Key import org.jetbrains.annotations.Unmodifiable import org.springframework.beans.factory.getBean +import org.springframework.context.ApplicationContext @InternalRoleplayApi -interface InternalLicenseBridge { +abstract class LicenseService( + private val context: ApplicationContext +) { /** * All licenses available in the game. */ val licenses: @Unmodifiable ObjectSet + get() = context.getBeansOfType(License::class.java) + .values + .toObjectSet() /** * Retrieves a license of the specified type. @@ -27,7 +34,7 @@ interface InternalLicenseBridge { * @param license The class object of the license type. * @return An instance of the requested license type. */ - fun getLicense(license: Class): T + fun getLicense(license: Class): T = context.getBean(license) /** * Returns the license by its key. @@ -35,7 +42,7 @@ interface InternalLicenseBridge { * @param key the key of the license to retrieve. * @return the license instance if found, or null if not found. */ - fun getLicenseByKey(key: Key): License? + fun getLicenseByKey(key: Key): License? = licenses.find { it.key == key } /** * Returns the license by its key. @@ -44,7 +51,8 @@ interface InternalLicenseBridge { * @return the license instance if found. * @throws IllegalArgumentException if the license is not found. */ - fun getLicenseByKeyOrThrow(key: Key): License + fun getLicenseByKeyOrThrow(key: Key): License = + getLicenseByKey(key) ?: error("License with key $key not found in the context.") /** * Creates a new license for the given identity. @@ -52,7 +60,7 @@ interface InternalLicenseBridge { * @param identityLicense the license to create. * @return the result of the license creation, including success status and any unobtainable reasons. */ - suspend fun createLicense(identityLicense: IdentityLicense): IdentityLicense + abstract suspend fun createLicense(identityLicense: IdentityLicense): IdentityLicense /** * Confiscates a license from the given identity. @@ -63,7 +71,7 @@ interface InternalLicenseBridge { * @param confiscatedReason the reason for confiscation. * @return a result indicating whether the confiscation was successful. */ - suspend fun confiscateLicense( + abstract suspend fun confiscateLicense( identity: RpIdentity, license: License, confiscatedBy: RpPlayer, @@ -77,7 +85,7 @@ interface InternalLicenseBridge { * @param license the license to be removed. * @return true if the removal was successful, false otherwise. */ - suspend fun removeLicense( + abstract suspend fun removeLicense( identity: RpIdentity, license: License ): Boolean @@ -93,10 +101,10 @@ interface InternalLicenseBridge { * is a set of [IdentityLicense] objects representing the expired licenses * for that identity. */ - suspend fun getAllExpiredLicenses(): Object2ObjectMap> + abstract suspend fun getAllExpiredLicenses(): Object2ObjectMap> companion object { - val instance get() = InternalContextHolder.instance.context.getBean() + val instance get() = InternalContextHolder.instance.context.getBean() } } @@ -107,5 +115,5 @@ interface InternalLicenseBridge { * @return the license instance if found. * @throws IllegalArgumentException if the license is not found. */ -inline fun InternalLicenseBridge.getLicense() = +inline fun LicenseService.getLicense() = getLicense(T::class.java) \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/events/RpPlayerLicenseAddedEvent.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/events/RpPlayerLicenseAddedEvent.kt similarity index 51% rename from surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/events/RpPlayerLicenseAddedEvent.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/events/RpPlayerLicenseAddedEvent.kt index b855c29..de59afc 100644 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/events/RpPlayerLicenseAddedEvent.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/events/RpPlayerLicenseAddedEvent.kt @@ -1,9 +1,9 @@ -package dev.slne.surf.roleplay.api.common.player.license.events +package dev.slne.surf.roleplay.core.common.player.license.events import dev.slne.surf.cloud.api.common.event.CancellableCloudEvent -import dev.slne.surf.roleplay.api.common.player.RpPlayer -import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity -import dev.slne.surf.roleplay.api.common.player.license.IdentityLicense +import dev.slne.surf.roleplay.core.common.player.RpPlayer +import dev.slne.surf.roleplay.core.common.player.identity.RpIdentity +import dev.slne.surf.roleplay.core.common.player.license.IdentityLicense class RpPlayerLicenseAddedEvent( source: Any, diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/events/RpPlayerLicenseRemovedEvent.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/events/RpPlayerLicenseRemovedEvent.kt new file mode 100644 index 0000000..c52846f --- /dev/null +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/events/RpPlayerLicenseRemovedEvent.kt @@ -0,0 +1,15 @@ +package dev.slne.surf.roleplay.core.common.player.license.events + +import dev.slne.surf.cloud.api.common.event.CancellableCloudEvent +import dev.slne.surf.roleplay.core.common.player.RpPlayer +import dev.slne.surf.roleplay.core.common.player.identity.RpIdentity +import dev.slne.surf.roleplay.core.common.player.license.IdentityLicense +import dev.slne.surf.roleplay.core.common.player.license.utils.LicenseRemovedReason + +class RpPlayerLicenseRemovedEvent( + source: Any, + val player: RpPlayer, + val identity: RpIdentity, + val license: IdentityLicense, + val reason: LicenseRemovedReason, +) : CancellableCloudEvent(source) \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/licenses/civilian/CivilianFishingLicense.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/licenses/civilian/CivilianFishingLicense.kt index beb94ee..ec936ca 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/licenses/civilian/CivilianFishingLicense.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/licenses/civilian/CivilianFishingLicense.kt @@ -1,17 +1,16 @@ package dev.slne.surf.roleplay.core.common.player.license.licenses.civilian -import dev.slne.surf.roleplay.api.common.player.license.licenses.civilian.CivilianFishingLicense -import dev.slne.surf.roleplay.core.common.player.license.CommonLicense +import dev.slne.surf.roleplay.core.common.player.license.License import dev.slne.surf.surfapi.core.api.messages.adventure.buildText import dev.slne.surf.surfapi.core.api.messages.adventure.key import org.springframework.stereotype.Component @Component -class CivilianFishingLicense : CommonLicense( +class CivilianFishingLicense : License( key = key("civilian", "fishing_license"), displayName = buildText { primary("Angelschein") }, - description = buildText { + description = { spacer("Die Angel-Lizenz erlaubt es dir, in der Wildnis zu angeln.") }, price = 500, -), CivilianFishingLicense \ No newline at end of file +) \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/licenses/civilian/CivilianVehicleLicenseImpl.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/licenses/civilian/CivilianVehicleLicense.kt similarity index 65% rename from surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/licenses/civilian/CivilianVehicleLicenseImpl.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/licenses/civilian/CivilianVehicleLicense.kt index fabf25d..6cf7c8e 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/licenses/civilian/CivilianVehicleLicenseImpl.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/licenses/civilian/CivilianVehicleLicense.kt @@ -1,34 +1,32 @@ package dev.slne.surf.roleplay.core.common.player.license.licenses.civilian -import dev.slne.surf.roleplay.api.common.player.license.licenses.civilian.CivilianVehicleLicense -import dev.slne.surf.roleplay.core.common.player.license.CommonExpirableLicense -import dev.slne.surf.roleplay.core.common.player.license.CommonLicense -import dev.slne.surf.surfapi.core.api.messages.adventure.buildText +import dev.slne.surf.roleplay.core.common.player.license.ExpirableLicense +import dev.slne.surf.roleplay.core.common.player.license.License import dev.slne.surf.surfapi.core.api.messages.adventure.key import dev.slne.surf.surfapi.core.api.util.objectSetOf import net.kyori.adventure.text.Component import kotlin.time.Duration.Companion.minutes import org.springframework.stereotype.Component as SpringComponent -class CivilianVehicleLicenseImpl { +class CivilianVehicleLicense { @SpringComponent - class DriversLicense : CommonLicense( + class DriversLicense : License( key = key("civilian", "drivers_license"), displayName = Component.text("Führerschein"), - description = buildText { + description = { spacer("Der Führerschein erlaubt es dir, Fahrzeuge zu führen.") }, price = 1000, - ), CivilianVehicleLicense.DriversLicense + ) @SpringComponent class TruckLicense( - driversLicense: CivilianVehicleLicense.DriversLicense - ) : CommonExpirableLicense( + driversLicense: DriversLicense + ) : ExpirableLicense( key = key("civilian", "truck_license"), displayName = Component.text("Lkw-Führerschein"), - description = buildText { + description = { spacer("Der Lkw-Führerschein erlaubt es dir, Lastkraftwagen zu fahren.") }, price = 2000, @@ -36,30 +34,30 @@ class CivilianVehicleLicenseImpl { dependencies = objectSetOf( driversLicense ) - ), CivilianVehicleLicense.TruckLicense + ) @SpringComponent class BusLicense( - driversLicense: CivilianVehicleLicense.DriversLicense - ) : CommonLicense( + driversLicense: DriversLicense + ) : License( key = key("civilian", "bus_license"), displayName = Component.text("Bus-Führerschein"), - description = buildText { + description = { spacer("Der Bus-Führerschein erlaubt es dir, Busse zu fahren.") }, price = 2500, dependencies = objectSetOf( driversLicense ) - ), CivilianVehicleLicense.BusLicense + ) @SpringComponent class TaxiLicense( driversLicense: DriversLicense - ) : CommonLicense( + ) : License( key = key("civilian", "taxi_license"), displayName = Component.text("Taxi-Führerschein"), - description = buildText { + description = { spacer("Der Taxi-Führerschein erlaubt es dir, Taxis zu fahren.") }, @@ -67,46 +65,45 @@ class CivilianVehicleLicenseImpl { dependencies = objectSetOf( driversLicense ) - ), CivilianVehicleLicense.TaxiLicense { - } + ) @SpringComponent - class MotorcycleLicense : CommonLicense( + class MotorcycleLicense : License( key = key("civilian", "motorcycle_license"), displayName = Component.text("Motorrad-Führerschein"), - description = buildText { + description = { spacer("Der Motorrad-Führerschein erlaubt es dir, Motorräder zu fahren.") }, price = 1500, - ), CivilianVehicleLicense.MotorcycleLicense + ) @SpringComponent - class BoatLicense : CommonLicense( + class BoatLicense : License( key = key("civilian", "boat_license"), displayName = Component.text("Bootsführerschein"), - description = buildText { + description = { spacer("Der Bootsführerschein erlaubt es dir, Boote zu fahren.") }, price = 1800, - ), CivilianVehicleLicense.BoatLicense + ) @SpringComponent - class PilotLicense : CommonLicense( + class PilotLicense : License( key = key("civilian", "pilot_license"), displayName = Component.text("Pilotenschein"), - description = buildText { + description = { spacer("Der Pilotenschein erlaubt es dir, Flugzeuge zu fliegen.") }, price = 5000, - ), CivilianVehicleLicense.PilotLicense + ) @SpringComponent - class HelicopterLicense : CommonLicense( + class HelicopterLicense : License( key = key("civilian", "helicopter_license"), displayName = Component.text("Hubschrauber-Führerschein"), - description = buildText { + description = { spacer("Der Hubschrauber-Führerschein erlaubt es dir, Hubschrauber zu fliegen.") }, price = 6000, - ), CivilianVehicleLicense.HelicopterLicense + ) } \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/licenses/civilian/CivilianWeaponLicenseImpl.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/licenses/civilian/CivilianWeaponLicense.kt similarity index 69% rename from surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/licenses/civilian/CivilianWeaponLicenseImpl.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/licenses/civilian/CivilianWeaponLicense.kt index 4022d45..ec87f45 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/licenses/civilian/CivilianWeaponLicenseImpl.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/licenses/civilian/CivilianWeaponLicense.kt @@ -1,36 +1,35 @@ package dev.slne.surf.roleplay.core.common.player.license.licenses.civilian -import dev.slne.surf.roleplay.api.common.player.license.licenses.civilian.CivilianWeaponLicense -import dev.slne.surf.roleplay.core.common.player.license.CommonLicense +import dev.slne.surf.roleplay.core.common.player.license.License import dev.slne.surf.surfapi.core.api.messages.adventure.buildText import dev.slne.surf.surfapi.core.api.messages.adventure.key import dev.slne.surf.surfapi.core.api.util.objectSetOf import org.springframework.stereotype.Component -class CivilianWeaponLicenseImpl { +class CivilianWeaponLicense { @Component - class LightWeaponLicense : CommonLicense( + class LightWeaponLicense : License( key = key("civilian", "light_weapon_license"), displayName = buildText { success("Kleiner Waffenschein") }, - description = buildText { + description = { spacer("Erlaubt das Führen von leichten Waffen wie Pistolen und Revolvern.") }, price = 5000 - ), CivilianWeaponLicense.LightWeaponLicense + ) @Component class HeavyWeaponLicense( lightWeaponLicense: LightWeaponLicense - ) : CommonLicense( + ) : License( key = key("civilian", "heavy_weapon_license"), displayName = buildText { error("Großer Waffenschein") }, - description = buildText { + description = { spacer("Erlaubt das Führen von schweren Waffen wie Maschinengewehren und Scharfschützengewehren.") }, price = 10000, dependencies = objectSetOf( lightWeaponLicense ) - ), CivilianWeaponLicense.HeavyWeaponLicense + ) } \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/utils/LicenseCreateResult.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/utils/LicenseCreateResult.kt similarity index 58% rename from surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/utils/LicenseCreateResult.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/utils/LicenseCreateResult.kt index 5361dd0..8c0e4aa 100644 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/utils/LicenseCreateResult.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/utils/LicenseCreateResult.kt @@ -1,6 +1,6 @@ -package dev.slne.surf.roleplay.api.common.player.license.utils +package dev.slne.surf.roleplay.core.common.player.license.utils -import dev.slne.surf.roleplay.api.common.player.license.IdentityLicense +import dev.slne.surf.roleplay.core.common.player.license.IdentityLicense import it.unimi.dsi.fastutil.objects.ObjectSet data class LicenseCreateResult( diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/utils/LicenseRemovedReason.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/utils/LicenseRemovedReason.kt similarity index 89% rename from surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/utils/LicenseRemovedReason.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/utils/LicenseRemovedReason.kt index e6298c5..0f235c3 100644 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/utils/LicenseRemovedReason.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/utils/LicenseRemovedReason.kt @@ -1,7 +1,7 @@ -package dev.slne.surf.roleplay.api.common.player.license.utils +package dev.slne.surf.roleplay.core.common.player.license.utils -import dev.slne.surf.roleplay.api.common.player.RpPlayer -import dev.slne.surf.roleplay.api.common.player.license.IdentityLicense +import dev.slne.surf.roleplay.core.common.player.RpPlayer +import dev.slne.surf.roleplay.core.common.player.license.IdentityLicense import dev.slne.surf.surfapi.core.api.messages.builder.SurfComponentBuilder sealed class LicenseRemovedReason(val message: SurfComponentBuilder.(IdentityLicense) -> Unit) { diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/utils/UnobtainableReason.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/utils/UnobtainableReason.kt similarity index 93% rename from surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/utils/UnobtainableReason.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/utils/UnobtainableReason.kt index 53ed21b..b114a42 100644 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/player/license/utils/UnobtainableReason.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/utils/UnobtainableReason.kt @@ -1,6 +1,6 @@ -package dev.slne.surf.roleplay.api.common.player.license.utils +package dev.slne.surf.roleplay.core.common.player.license.utils -import dev.slne.surf.roleplay.api.common.player.license.License +import dev.slne.surf.roleplay.core.common.player.license.License import dev.slne.surf.surfapi.core.api.messages.adventure.appendNewline import dev.slne.surf.surfapi.core.api.messages.builder.SurfComponentBuilder import it.unimi.dsi.fastutil.objects.ObjectSet diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/transaction/HasRpTransactions.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/transaction/HasRpTransactions.kt similarity index 98% rename from surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/transaction/HasRpTransactions.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/transaction/HasRpTransactions.kt index 25d03aa..12a3017 100644 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/transaction/HasRpTransactions.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/transaction/HasRpTransactions.kt @@ -1,6 +1,6 @@ -package dev.slne.surf.roleplay.api.common.transaction +package dev.slne.surf.roleplay.core.common.transaction -import dev.slne.surf.roleplay.api.common.transaction.utils.BalanceType +import dev.slne.surf.roleplay.core.common.transaction.utils.BalanceType import it.unimi.dsi.fastutil.objects.ObjectLinkedOpenHashSet interface HasRpTransactions { diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/transaction/RpTransaction.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/transaction/RpTransaction.kt similarity index 80% rename from surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/transaction/RpTransaction.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/transaction/RpTransaction.kt index 59d69ea..745ef7c 100644 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/transaction/RpTransaction.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/transaction/RpTransaction.kt @@ -1,7 +1,7 @@ -package dev.slne.surf.roleplay.api.common.transaction +package dev.slne.surf.roleplay.core.common.transaction -import dev.slne.surf.roleplay.api.common.player.RpPlayer -import dev.slne.surf.roleplay.api.common.transaction.utils.BalanceType +import dev.slne.surf.roleplay.core.common.player.RpPlayer +import dev.slne.surf.roleplay.core.common.transaction.utils.BalanceType import java.time.ZonedDateTime import java.util.* diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/transaction/utils/BalanceType.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/transaction/utils/BalanceType.kt new file mode 100644 index 0000000..9fa51ca --- /dev/null +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/transaction/utils/BalanceType.kt @@ -0,0 +1,38 @@ +package dev.slne.surf.roleplay.core.common.transaction.utils + +import dev.slne.surf.roleplay.core.common.player.identity.RpIdentity +import dev.slne.surf.roleplay.core.common.player.identity.identities.CivilianIdentity +import dev.slne.surf.roleplay.core.common.player.identity.identities.PoliceIdentity +import dev.slne.surf.roleplay.core.common.player.identity.identities.RescueServiceIdentity + +enum class BalanceType(val currencyName: (RpIdentity) -> String) { + CASH({ + when (it) { + is CivilianIdentity -> "civilian_cash" + is PoliceIdentity -> "police_cash" + is RescueServiceIdentity -> "rescue_service_cash" + else -> error("Unknown identity type: ${it::class.simpleName}") + } + }), + + BANK({ + when (it) { + is CivilianIdentity -> "civilian_bank" + is PoliceIdentity -> "police_bank" + is RescueServiceIdentity -> "rescue_service_bank" + else -> error("Unknown identity type: ${it::class.simpleName}") + } + }), + + CRYPTO({ + when (it) { + is CivilianIdentity -> "civilian_crypto" + is PoliceIdentity -> "police_crypto" + is RescueServiceIdentity -> "rescue_service_crypto" + else -> error("Unknown identity type: ${it::class.simpleName}") + } + }); + + fun getCurrencyName(identity: RpIdentity) = + currencyName(identity).let { "roleplay_$it" } +} \ No newline at end of file diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/InternalContextHolder.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/util/InternalContextHolder.kt similarity index 73% rename from surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/InternalContextHolder.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/util/InternalContextHolder.kt index 20bcf6e..bbccc00 100644 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/InternalContextHolder.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/util/InternalContextHolder.kt @@ -1,6 +1,5 @@ -package dev.slne.surf.roleplay.api.common +package dev.slne.surf.roleplay.core.common.util -import dev.slne.surf.roleplay.api.common.util.InternalRoleplayApi import dev.slne.surf.surfapi.core.api.util.requiredService import org.springframework.context.ApplicationContext diff --git a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/util/InternalRoleplayApi.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/util/InternalRoleplayApi.kt similarity index 92% rename from surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/util/InternalRoleplayApi.kt rename to surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/util/InternalRoleplayApi.kt index cf5b32c..2690eb1 100644 --- a/surf-roleplay-api/surf-roleplay-common-api/src/main/kotlin/dev/slne/surf/roleplay/api/common/util/InternalRoleplayApi.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/util/InternalRoleplayApi.kt @@ -1,4 +1,4 @@ -package dev.slne.surf.roleplay.api.common.util +package dev.slne.surf.roleplay.core.common.util @RequiresOptIn( level = RequiresOptIn.Level.ERROR, diff --git a/surf-roleplay-paper/build.gradle.kts b/surf-roleplay-paper/build.gradle.kts index ca35863..78e8066 100644 --- a/surf-roleplay-paper/build.gradle.kts +++ b/surf-roleplay-paper/build.gradle.kts @@ -17,7 +17,6 @@ surfPaperPluginApi { dependencies { api(project(":surf-roleplay-core:surf-roleplay-core-client")) - api(project(":surf-roleplay-api:surf-roleplay-client-api:surf-roleplay-client-paper-api")) compileOnly(libs.surf.npc.api) } diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/PaperMain.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/PaperMain.kt index 2487ead..9ac22a7 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/PaperMain.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/PaperMain.kt @@ -1,9 +1,9 @@ package dev.slne.surf.roleplay.paper import com.github.shynixn.mccoroutine.folia.SuspendingJavaPlugin -import dev.slne.surf.roleplay.api.common.InternalContextHolder -import dev.slne.surf.roleplay.api.common.util.InternalRoleplayApi -import dev.slne.surf.roleplay.core.common.CommonRpInstance +import dev.slne.surf.roleplay.core.common.RpInstance +import dev.slne.surf.roleplay.core.common.util.InternalContextHolder +import dev.slne.surf.roleplay.core.common.util.InternalRoleplayApi import dev.slne.surf.roleplay.paper.command.activeIdentityCommand import dev.slne.surf.roleplay.paper.command.balanceCommand import org.bukkit.plugin.java.JavaPlugin @@ -12,7 +12,7 @@ import org.springframework.beans.factory.getBean @OptIn(InternalRoleplayApi::class) class PaperMain : SuspendingJavaPlugin() { - private val rpInstance get() = InternalContextHolder.instance.context.getBean() + private val rpInstance get() = InternalContextHolder.instance.context.getBean() override suspend fun onLoadAsync() { rpInstance.onLoad() diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/PaperRpInstance.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/PaperRpInstance.kt index f1dcfba..b4e93f0 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/PaperRpInstance.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/PaperRpInstance.kt @@ -1,7 +1,7 @@ package dev.slne.surf.roleplay.paper -import dev.slne.surf.roleplay.core.common.CommonRpInstance -import dev.slne.surf.roleplay.core.common.mechanics.CommonMechanicRegistry +import dev.slne.surf.roleplay.core.common.RpInstance +import dev.slne.surf.roleplay.core.common.mechanics.MechanicRegistry import dev.slne.surf.roleplay.paper.player.license.LicenseNpc import dev.slne.surf.roleplay.paper.spring.postprocessor.BukkitListenerPostProcessor import dev.slne.surf.roleplay.paper.spring.postprocessor.PacketListenerPostProcessor @@ -9,10 +9,10 @@ import org.springframework.stereotype.Component @Component class PaperRpInstance( - commonMechanicRegistry: CommonMechanicRegistry, + commonMechanicRegistry: MechanicRegistry, private val bukkitListenerPostProcessor: BukkitListenerPostProcessor, private val packetListenerPostProcessor: PacketListenerPostProcessor -) : CommonRpInstance(commonMechanicRegistry) { +) : RpInstance(commonMechanicRegistry) { override suspend fun onEnable() { super.onEnable() diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/command/ActiveIdentityCommand.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/command/ActiveIdentityCommand.kt index 9a3d624..d122c0f 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/command/ActiveIdentityCommand.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/command/ActiveIdentityCommand.kt @@ -3,7 +3,7 @@ package dev.slne.surf.roleplay.paper.command import com.github.shynixn.mccoroutine.folia.launch import dev.jorel.commandapi.kotlindsl.commandAPICommand import dev.jorel.commandapi.kotlindsl.playerExecutor -import dev.slne.surf.roleplay.api.paper.player.rpPlayer +import dev.slne.surf.roleplay.paper.player.rpPlayer import dev.slne.surf.roleplay.paper.plugin import dev.slne.surf.surfapi.core.api.messages.adventure.sendText diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/command/BalanceCommand.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/command/BalanceCommand.kt index 67beb84..31e3069 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/command/BalanceCommand.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/command/BalanceCommand.kt @@ -2,9 +2,9 @@ package dev.slne.surf.roleplay.paper.command import com.github.shynixn.mccoroutine.folia.launch import dev.jorel.commandapi.kotlindsl.* -import dev.slne.surf.roleplay.api.common.transaction.utils.BalanceType -import dev.slne.surf.roleplay.api.paper.player.rpPlayer +import dev.slne.surf.roleplay.core.common.transaction.utils.BalanceType import dev.slne.surf.roleplay.paper.command.args.balanceTypeArgument +import dev.slne.surf.roleplay.paper.player.rpPlayer import dev.slne.surf.roleplay.paper.plugin import dev.slne.surf.surfapi.core.api.messages.adventure.sendText import org.bukkit.entity.Player diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/command/args/BalanceTypeArgument.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/command/args/BalanceTypeArgument.kt index ede66ec..3ebb6d1 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/command/args/BalanceTypeArgument.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/command/args/BalanceTypeArgument.kt @@ -5,7 +5,7 @@ import dev.jorel.commandapi.arguments.Argument import dev.jorel.commandapi.arguments.ArgumentSuggestions import dev.jorel.commandapi.arguments.CustomArgument import dev.jorel.commandapi.arguments.StringArgument -import dev.slne.surf.roleplay.api.common.transaction.utils.BalanceType +import dev.slne.surf.roleplay.core.common.transaction.utils.BalanceType class BalanceTypeArgument(nodeName: String) : CustomArgument( StringArgument(nodeName), diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/listener/OnlineListener.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/listener/OnlineListener.kt index c73ae26..4bad28d 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/listener/OnlineListener.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/listener/OnlineListener.kt @@ -4,9 +4,9 @@ import com.github.shynixn.mccoroutine.folia.globalRegionDispatcher import com.github.shynixn.mccoroutine.folia.launch import dev.slne.surf.cloud.api.client.paper.player.toCloudOfflinePlayer import dev.slne.surf.roleplay.api.common.player.RpPlayer -import dev.slne.surf.roleplay.api.common.player.events.RpPlayerJoinEvent -import dev.slne.surf.roleplay.api.common.player.events.RpPlayerQuitEvent -import dev.slne.surf.roleplay.api.paper.player.events.RpPlayerDeathEvent +import dev.slne.surf.roleplay.core.common.player.events.RpPlayerJoinEvent +import dev.slne.surf.roleplay.core.common.player.events.RpPlayerQuitEvent +import dev.slne.surf.roleplay.paper.player.events.RpPlayerDeathEvent import dev.slne.surf.roleplay.paper.plugin import kotlinx.coroutines.withContext import org.bukkit.event.EventHandler diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/IdCardMechanicImpl.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/IdCardMechanicImpl.kt index 48ee672..9e44685 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/IdCardMechanicImpl.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/IdCardMechanicImpl.kt @@ -1,10 +1,10 @@ package dev.slne.surf.roleplay.paper.mechanics.idcard -import dev.slne.surf.roleplay.core.common.mechanics.idcard.IdCardCommonMechanic +import dev.slne.surf.roleplay.core.common.mechanics.idcard.IdCardMechanic import dev.slne.surf.roleplay.core.common.mechanics.utils.RpMechanic @RpMechanic -class IdCardMechanicImpl : IdCardCommonMechanic() { +class IdCardMechanicImpl : IdCardMechanic() { override suspend fun onEnable() { IdCardNpc.spawnNpc() } diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/dialogs/CreateIdDialog.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/dialogs/CreateIdDialog.kt index a63a0ff..6de5e03 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/dialogs/CreateIdDialog.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/dialogs/CreateIdDialog.kt @@ -6,7 +6,7 @@ package dev.slne.surf.roleplay.paper.mechanics.idcard.dialogs import com.github.shynixn.mccoroutine.folia.launch import dev.slne.surf.cloud.api.client.paper.player.toCloudOfflinePlayer import dev.slne.surf.roleplay.api.common.player.RpPlayer -import dev.slne.surf.roleplay.core.common.player.identity.identities.CivilianIdentityImpl +import dev.slne.surf.roleplay.core.common.player.identity.identities.CivilianIdentity import dev.slne.surf.roleplay.paper.mechanics.idcard.IdCard import dev.slne.surf.roleplay.paper.plugin import dev.slne.surf.surfapi.bukkit.api.dialog.base @@ -155,7 +155,7 @@ private fun confirmCreationButton(): ActionButton = actionButton { val rpPlayer = RpPlayer[player.toCloudOfflinePlayer()] val identity = rpPlayer.createOrUpdateIdentity( - CivilianIdentityImpl( + CivilianIdentity( player = rpPlayer, firstName = firstName, lastName = lastName, diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/commands/RentableCommand.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/commands/RentableCommand.kt index 32b1692..b927b17 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/commands/RentableCommand.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/commands/RentableCommand.kt @@ -5,9 +5,9 @@ import dev.jorel.commandapi.arguments.ArgumentSuggestions import dev.jorel.commandapi.kotlindsl.* import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.events.OwnerChangeReason import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.events.OwnerSetResult -import dev.slne.surf.roleplay.api.paper.player.rpPlayer -import dev.slne.surf.roleplay.core.common.mechanics.rentable.RentableMechanicImpl.getByKey -import dev.slne.surf.roleplay.core.common.mechanics.rentable.RentableMechanicImpl.rentables +import dev.slne.surf.roleplay.core.common.mechanics.rentable.RentableMechanic.getByKey +import dev.slne.surf.roleplay.core.common.mechanics.rentable.RentableMechanic.rentables +import dev.slne.surf.roleplay.paper.player.rpPlayer import dev.slne.surf.roleplay.paper.plugin import dev.slne.surf.surfapi.core.api.messages.adventure.appendNewline import dev.slne.surf.surfapi.core.api.messages.adventure.sendText diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/listeners/RentCollectedListener.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/listeners/RentCollectedListener.kt index 4e907b4..60c0076 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/listeners/RentCollectedListener.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/listeners/RentCollectedListener.kt @@ -2,7 +2,7 @@ package dev.slne.surf.roleplay.paper.mechanics.rentable.listeners import com.github.shynixn.mccoroutine.folia.entityDispatcher import com.github.shynixn.mccoroutine.folia.launch -import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.events.RentableRentCollectEvent +import dev.slne.surf.roleplay.core.common.mechanics.rentable.events.RentableRentCollectEvent import dev.slne.surf.roleplay.paper.plugin import dev.slne.surf.surfapi.core.api.messages.adventure.playSound import dev.slne.surf.surfapi.core.api.messages.adventure.sendText diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/listeners/RentableListener.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/listeners/RentableListener.kt index da79e69..abe5c6f 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/listeners/RentableListener.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/listeners/RentableListener.kt @@ -3,9 +3,9 @@ package dev.slne.surf.roleplay.paper.mechanics.rentable.listeners import com.github.shynixn.mccoroutine.folia.entityDispatcher import com.github.shynixn.mccoroutine.folia.launch import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.events.OwnerChangeReason -import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.events.RentableMemberAddEvent -import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.events.RentableMemberRemoveEvent -import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.events.RentableOwnerChangeEvent +import dev.slne.surf.roleplay.core.common.mechanics.rentable.events.RentableMemberAddEvent +import dev.slne.surf.roleplay.core.common.mechanics.rentable.events.RentableMemberRemoveEvent +import dev.slne.surf.roleplay.core.common.mechanics.rentable.events.RentableOwnerChangeEvent import dev.slne.surf.roleplay.paper.plugin import dev.slne.surf.surfapi.core.api.messages.adventure.playSound import dev.slne.surf.surfapi.core.api.messages.adventure.sendText diff --git a/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/player/events/RpPlayerDeathEvent.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/events/RpPlayerDeathEvent.kt similarity index 96% rename from surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/player/events/RpPlayerDeathEvent.kt rename to surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/events/RpPlayerDeathEvent.kt index 6d5cfe5..5931dba 100644 --- a/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/player/events/RpPlayerDeathEvent.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/events/RpPlayerDeathEvent.kt @@ -1,4 +1,4 @@ -package dev.slne.surf.roleplay.api.paper.player.events +package dev.slne.surf.roleplay.paper.player.events import dev.slne.surf.cloud.api.client.paper.player.toCloudOfflinePlayer import dev.slne.surf.cloud.api.common.event.CloudEvent diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/identity/listener/IdentityOnlineListener.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/identity/listener/IdentityOnlineListener.kt index 2d71a78..02261eb 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/identity/listener/IdentityOnlineListener.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/identity/listener/IdentityOnlineListener.kt @@ -1,7 +1,7 @@ package dev.slne.surf.roleplay.paper.player.identity.listener import com.github.shynixn.mccoroutine.folia.launch -import dev.slne.surf.roleplay.api.common.player.events.RpPlayerJoinEvent +import dev.slne.surf.roleplay.core.common.player.events.RpPlayerJoinEvent import dev.slne.surf.roleplay.paper.player.identity.dialogs.createIdentitySelectorDialog import dev.slne.surf.roleplay.paper.plugin import org.bukkit.event.EventHandler diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/dialogs/BuyLicenseDialog.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/dialogs/BuyLicenseDialog.kt index b494f66..51be21a 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/dialogs/BuyLicenseDialog.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/dialogs/BuyLicenseDialog.kt @@ -5,9 +5,8 @@ package dev.slne.surf.roleplay.paper.player.license.dialogs import com.github.shynixn.mccoroutine.folia.launch import dev.slne.surf.roleplay.api.common.player.RpPlayer import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity -import dev.slne.surf.roleplay.api.common.player.license.IdentityLicense -import dev.slne.surf.roleplay.api.common.player.license.License -import dev.slne.surf.roleplay.api.common.player.license.utils.UnobtainableReason +import dev.slne.surf.roleplay.core.common.player.license.IdentityLicense +import dev.slne.surf.roleplay.core.common.player.license.utils.UnobtainableReason import dev.slne.surf.roleplay.paper.plugin import dev.slne.surf.surfapi.bukkit.api.dialog.base import dev.slne.surf.surfapi.bukkit.api.dialog.builder.actionButton diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/dialogs/LicenseDialog.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/dialogs/LicenseDialog.kt index fa02d53..a2d86de 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/dialogs/LicenseDialog.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/dialogs/LicenseDialog.kt @@ -4,8 +4,7 @@ package dev.slne.surf.roleplay.paper.player.license.dialogs import dev.slne.surf.roleplay.api.common.player.RpPlayer import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity -import dev.slne.surf.roleplay.api.common.player.license.IdentityLicense -import dev.slne.surf.roleplay.api.common.player.license.License +import dev.slne.surf.roleplay.core.common.player.license.IdentityLicense import dev.slne.surf.surfapi.bukkit.api.dialog.base import dev.slne.surf.surfapi.bukkit.api.dialog.builder.actionButton import dev.slne.surf.surfapi.bukkit.api.dialog.dialog @@ -22,6 +21,7 @@ import net.kyori.adventure.text.format.TextDecoration import java.time.Duration import java.time.LocalDateTime import java.time.format.DateTimeFormatter +import kotlin.collections.map fun SurfComponentBuilder.appendLicenseDependencies( player: RpPlayer, diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/dialogs/MyLicenseDialog.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/dialogs/MyLicenseDialog.kt index b80e92a..538f6b4 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/dialogs/MyLicenseDialog.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/dialogs/MyLicenseDialog.kt @@ -4,7 +4,7 @@ package dev.slne.surf.roleplay.paper.player.license.dialogs import dev.slne.surf.roleplay.api.common.player.RpPlayer import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity -import dev.slne.surf.roleplay.api.common.player.license.IdentityLicense +import dev.slne.surf.roleplay.core.common.player.license.IdentityLicense import dev.slne.surf.surfapi.bukkit.api.dialog.base import dev.slne.surf.surfapi.bukkit.api.dialog.dialog import dev.slne.surf.surfapi.bukkit.api.dialog.type diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/listeners/LicenseChangedHandler.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/listeners/LicenseChangedHandler.kt index f0e61b9..2e32dd6 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/listeners/LicenseChangedHandler.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/listeners/LicenseChangedHandler.kt @@ -2,8 +2,8 @@ package dev.slne.surf.roleplay.paper.player.license.listeners import com.github.shynixn.mccoroutine.folia.entityDispatcher import com.github.shynixn.mccoroutine.folia.launch -import dev.slne.surf.roleplay.api.common.player.license.events.RpPlayerLicenseAddedEvent -import dev.slne.surf.roleplay.api.common.player.license.events.RpPlayerLicenseRemovedEvent +import dev.slne.surf.roleplay.core.common.player.license.events.RpPlayerLicenseAddedEvent +import dev.slne.surf.roleplay.core.common.player.license.events.RpPlayerLicenseRemovedEvent import dev.slne.surf.roleplay.paper.plugin import dev.slne.surf.surfapi.core.api.messages.adventure.buildText import dev.slne.surf.surfapi.core.api.messages.adventure.playSound diff --git a/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/player/player-utils.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/player-utils.kt similarity index 83% rename from surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/player/player-utils.kt rename to surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/player-utils.kt index 2fe7601..817f31c 100644 --- a/surf-roleplay-api/surf-roleplay-client-api/surf-roleplay-client-paper-api/src/main/kotlin/dev/slne/surf/roleplay/api/paper/player/player-utils.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/player-utils.kt @@ -1,4 +1,4 @@ -package dev.slne.surf.roleplay.api.paper.player +package dev.slne.surf.roleplay.paper.player import dev.slne.surf.cloud.api.client.paper.player.toCloudOfflinePlayer import dev.slne.surf.roleplay.api.common.player.RpPlayer diff --git a/surf-roleplay-server/build.gradle.kts b/surf-roleplay-server/build.gradle.kts index 084ea0e..9ecb990 100644 --- a/surf-roleplay-server/build.gradle.kts +++ b/surf-roleplay-server/build.gradle.kts @@ -10,7 +10,6 @@ surfCoreApi { dependencies { api(project(":surf-roleplay-core:surf-roleplay-core-common")) - api(project(":surf-roleplay-api:surf-roleplay-server-api")) } tasks.withType { diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/mechanics/idcard/IdCardMechanicImpl.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/mechanics/idcard/IdCardMechanicImpl.kt index 03b24b4..83de91a 100644 --- a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/mechanics/idcard/IdCardMechanicImpl.kt +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/mechanics/idcard/IdCardMechanicImpl.kt @@ -1,7 +1,7 @@ package dev.slne.surf.roleplay.server.mechanics.idcard -import dev.slne.surf.roleplay.core.common.mechanics.idcard.IdCardCommonMechanic +import dev.slne.surf.roleplay.core.common.mechanics.idcard.IdCardMechanic import dev.slne.surf.roleplay.core.common.mechanics.utils.RpMechanic @RpMechanic -class IdCardMechanicImpl() : IdCardCommonMechanic() \ No newline at end of file +class IdCardMechanicImpl() : IdCardMechanic() \ No newline at end of file diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/civilian/RpPlayerCivilianIdentityModel.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/civilian/RpPlayerCivilianIdentityModel.kt index 23a89db..edb8e2a 100644 --- a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/civilian/RpPlayerCivilianIdentityModel.kt +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/civilian/RpPlayerCivilianIdentityModel.kt @@ -2,7 +2,7 @@ package dev.slne.surf.roleplay.server.player.identity.db.impl.civilian import dev.slne.surf.roleplay.api.common.player.RpPlayer import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity -import dev.slne.surf.roleplay.core.common.player.identity.identities.CivilianIdentityImpl +import dev.slne.surf.roleplay.core.common.player.identity.identities.CivilianIdentity import dev.slne.surf.roleplay.server.player.identity.db.RpPlayerIdentityBaseModel import org.jetbrains.exposed.dao.LongEntityClass import org.jetbrains.exposed.dao.id.EntityID @@ -15,7 +15,7 @@ class RpPlayerCivilianIdentityModel( ) { companion object : LongEntityClass(RpPlayerCivilianIdentityTable) - override suspend fun toApi(player: RpPlayer) = CivilianIdentityImpl( + override suspend fun toApi(player: RpPlayer) = CivilianIdentity( player = player, firstName = firstName, lastName = lastName, diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/police/RpPlayerPoliceIdentityModel.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/police/RpPlayerPoliceIdentityModel.kt index cd13636..c86c523 100644 --- a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/police/RpPlayerPoliceIdentityModel.kt +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/police/RpPlayerPoliceIdentityModel.kt @@ -2,7 +2,7 @@ package dev.slne.surf.roleplay.core.player.identity.db.impl.police import dev.slne.surf.roleplay.api.common.player.RpPlayer import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity -import dev.slne.surf.roleplay.core.common.player.identity.identities.PoliceIdentityImpl +import dev.slne.surf.roleplay.core.common.player.identity.identities.PoliceIdentity import dev.slne.surf.roleplay.server.player.identity.db.RpPlayerIdentityBaseModel import dev.slne.surf.roleplay.server.player.identity.db.impl.police.RpPlayerPoliceIdentityTable import org.jetbrains.exposed.dao.LongEntityClass @@ -19,7 +19,7 @@ class RpPlayerPoliceIdentityModel( var badgeNumber by RpPlayerPoliceIdentityTable.badgeNumber var rank by RpPlayerPoliceIdentityTable.rank - override suspend fun toApi(player: RpPlayer) = PoliceIdentityImpl( + override suspend fun toApi(player: RpPlayer) = PoliceIdentity( player = player, firstName = firstName, lastName = lastName, diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/rescueservice/RpPlayerRescueServiceIdentityModel.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/rescueservice/RpPlayerRescueServiceIdentityModel.kt index 77387bf..154868c 100644 --- a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/rescueservice/RpPlayerRescueServiceIdentityModel.kt +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/rescueservice/RpPlayerRescueServiceIdentityModel.kt @@ -2,7 +2,7 @@ package dev.slne.surf.roleplay.server.player.identity.db.impl.rescueservice import dev.slne.surf.roleplay.api.common.player.RpPlayer import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity -import dev.slne.surf.roleplay.core.common.player.identity.identities.RescueServiceIdentityImpl +import dev.slne.surf.roleplay.core.common.player.identity.identities.RescueServiceIdentity import dev.slne.surf.roleplay.server.player.identity.db.RpPlayerIdentityBaseModel import org.jetbrains.exposed.dao.LongEntityClass import org.jetbrains.exposed.dao.id.EntityID @@ -18,7 +18,7 @@ class RpPlayerRescueServiceIdentityModel( var rank by RpPlayerRescueServiceIdentityTable.rank - override suspend fun toApi(player: RpPlayer) = RescueServiceIdentityImpl( + override suspend fun toApi(player: RpPlayer) = RescueServiceIdentity( player = player, firstName = firstName, lastName = lastName, diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/LicenseExpirationJob.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/LicenseExpirationJob.kt index 760ec58..30380ae 100644 --- a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/LicenseExpirationJob.kt +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/LicenseExpirationJob.kt @@ -2,9 +2,9 @@ package dev.slne.surf.roleplay.server.player.license -import dev.slne.surf.roleplay.api.common.player.license.InternalLicenseBridge -import dev.slne.surf.roleplay.api.common.player.license.utils.LicenseRemovedReason -import dev.slne.surf.roleplay.api.common.util.InternalRoleplayApi +import dev.slne.surf.roleplay.core.common.player.license.LicenseService +import dev.slne.surf.roleplay.core.common.player.license.utils.LicenseRemovedReason +import dev.slne.surf.roleplay.core.common.util.InternalRoleplayApi import org.springframework.scheduling.annotation.Scheduled import org.springframework.stereotype.Component import java.util.concurrent.TimeUnit @@ -14,7 +14,7 @@ class LicenseExpirationJob { @Scheduled(fixedDelay = 1, timeUnit = TimeUnit.SECONDS) suspend fun tick() { - val licenses = InternalLicenseBridge.instance.getAllExpiredLicenses() + val licenses = LicenseService.instance.getAllExpiredLicenses() licenses.forEach { (identity, expiredLicenses) -> expiredLicenses.forEach { expiredLicense -> diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/db/IdentityLicenseModel.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/db/IdentityLicenseModel.kt index ec6ecef..3adbdb0 100644 --- a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/db/IdentityLicenseModel.kt +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/db/IdentityLicenseModel.kt @@ -1,8 +1,8 @@ package dev.slne.surf.roleplay.server.player.license.db import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity -import dev.slne.surf.roleplay.api.common.player.license.IdentityLicense import dev.slne.surf.roleplay.api.player.license.LicenseService +import dev.slne.surf.roleplay.core.common.player.license.IdentityLicense import dev.slne.surf.roleplay.core.player.db.RpPlayerModel import dev.slne.surf.surfapi.core.api.messages.adventure.key import org.jetbrains.exposed.dao.LongEntity From 50cd8f1175d0755ae88ae9ad4b7c70f5d5ef42aa Mon Sep 17 00:00:00 2001 From: twisti Date: Sat, 23 Aug 2025 10:34:00 +0200 Subject: [PATCH 07/11] Remove core client module, consolidate `mechanics` into the `paper` module, and migrate context management to `RoleplayApplication`. --- build.gradle.kts | 2 +- settings.gradle.kts | 2 +- .../build.gradle.kts | 11 - .../core/client/player/ClientRpPlayer.kt | 6 - .../slne/surf/roleplay/RoleplayApplication.kt | 7 +- .../roleplay/core/common/ContextHolderImpl.kt | 16 -- .../surf/roleplay/core/common/RpInstance.kt | 27 ++- .../surf/roleplay/core/common/RpLifecycle.kt | 10 + .../core/common/mechanics/Mechanic.kt | 54 ----- .../core/common/mechanics/MechanicRegistry.kt | 36 --- .../common/mechanics/idcard/IdCardMechanic.kt | 7 - .../mechanics/rentable/RentCollectorJob.kt | 27 --- .../containers/RegularStorageContainer.kt | 16 -- .../common/mechanics/rentable/door/Door.kt | 61 ----- .../rentable/door/doors/FrontDoor.kt | 18 -- .../rentable/door/doors/GarageDoor.kt | 18 -- .../rentable/door/doors/RegularDoor.kt | 18 -- .../lockpick/lockpicks/BatteringRam.kt | 10 - .../lockpick/lockpicks/PremiumLockPick.kt | 10 - .../lockpick/lockpicks/RegularLockPick.kt | 10 - .../common/mechanics/weapon/WeaponMechanic.kt | 12 - .../mechanics/weapon/magazine/Magazine.kt | 17 -- .../weapon/magazine/PlayerMagazine.kt | 8 - .../mechanics/weapon/player/PlayerWeapon.kt | 15 -- .../roleplay/core/common/player/RpPlayer.kt | 24 +- .../core/common/player/RpPlayerManager.kt | 19 +- .../core/common/player/identity/RpIdentity.kt | 7 +- .../identity/identities/CivilianIdentity.kt | 5 +- .../core/common/player/license/License.kt | 6 +- .../common/player/license/LicenseService.kt | 5 +- .../civilian/CivilianVehicleLicense.kt | 17 +- .../license/utils/LicenseRemovedReason.kt | 5 +- .../license/utils/UnobtainableReason.kt | 5 +- .../core/common/util/InternalContextHolder.kt | 13 - .../core/common/util/InternalRoleplayApi.kt | 17 -- surf-roleplay-paper/build.gradle.kts | 2 +- .../surf/roleplay/paper/PaperBootstrap.kt | 3 +- .../dev/slne/surf/roleplay/paper/PaperMain.kt | 2 - .../surf/roleplay/paper/PaperRpInstance.kt | 4 - .../paper/command/args/BalanceTypeArgument.kt | 6 +- .../paper/listener/ListenerManager.kt | 2 +- .../roleplay/paper/listener/OnlineListener.kt | 44 +--- .../paper/mechanics/AbstractMechanic.kt | 8 + .../surf/roleplay/paper/mechanics/Mechanic.kt | 6 +- .../mechanics/idcard/IdCardMechanicImpl.kt | 8 +- .../idcard/dialogs/CreateIdDialog.kt | 31 +-- .../idcard/listeners/IdCardHandler.kt | 5 +- .../paper}/mechanics/rentable/Cracker.kt | 6 +- .../paper}/mechanics/rentable/Rentable.kt | 71 ++++-- .../mechanics/rentable/RentableMechanic.kt | 60 ++--- .../mechanics/rentable/StorageContainer.kt | 14 +- .../rentable/commands/RentableCommand.kt | 4 +- .../containers/RegularStorageContainer.kt | 16 ++ .../containers/VaultStorageContainer.kt | 12 +- .../paper/mechanics/rentable/door/Door.kt | 73 ++++++ .../rentable/door/doors/FrontDoor.kt | 19 ++ .../rentable/door/doors/GarageDoor.kt | 19 ++ .../rentable/door/doors/RegularDoor.kt | 19 ++ .../rentable/events/RentableMemberAddEvent.kt | 4 +- .../events/RentableMemberRemoveEvent.kt | 4 +- .../events/RentableOwnerChangeEvent.kt | 10 +- .../events/RentableRentCollectEvent.kt | 4 +- .../listeners/RentCollectedListener.kt | 41 ++-- .../rentable/listeners/RentableListener.kt | 224 ++++++++---------- .../mechanics/rentable/lockpick/LockPick.kt | 7 +- .../lockpick/lockpicks/BatteringRam.kt | 10 + .../lockpick/lockpicks/PremiumLockPick.kt | 10 + .../lockpick/lockpicks/RegularLockPick.kt | 10 + .../mechanics/rentable/rentables/Apartment.kt | 11 +- .../mechanics/rentable/rentables/House.kt | 11 +- .../mechanics/rentable/utils/Crackable.kt | 4 +- .../mechanics/rentable/utils/DoorContainer.kt | 4 +- .../mechanics/rentable/utils/Lockable.kt | 2 +- .../paper}/mechanics/weapon/Weapon.kt | 16 +- .../paper/mechanics/weapon/WeaponMechanic.kt | 12 + .../mechanics/weapon/magazine/Magazine.kt | 21 ++ .../weapon/magazine/PlayerMagazine.kt | 6 + .../mechanics/weapon/player/PlayerWeapon.kt | 13 + .../mechanics/weapon/utils/WeaponType.kt | 2 +- .../roleplay/paper/player/PaperRpPlayer.kt | 6 + .../paper/player/PaperRpPlayerManager.kt | 10 +- .../paper}/player/events/RpPlayerJoinEvent.kt | 2 +- .../paper}/player/events/RpPlayerQuitEvent.kt | 2 +- .../listener/IdentityOnlineListener.kt | 2 +- .../paper/player/license/LicenseNpc.kt | 13 +- .../license/dialogs/BuyLicenseDialog.kt | 2 +- .../roleplay/paper/player/player-utils.kt | 5 +- .../paper/spring}/RpPacketListener.kt | 2 +- .../BukkitListenerPostProcessor.kt | 7 +- .../PacketListenerPostProcessor.kt | 11 +- .../surf/roleplay/server/PluginBootstrap.kt | 3 +- .../mechanics/idcard/IdCardMechanicImpl.kt | 7 - .../player/license/LicenseExpirationJob.kt | 1 - .../player/license/LicenseServiceImpl.kt | 2 +- 94 files changed, 674 insertions(+), 802 deletions(-) delete mode 100644 surf-roleplay-core/surf-roleplay-core-client/build.gradle.kts delete mode 100644 surf-roleplay-core/surf-roleplay-core-client/src/main/kotlin/dev/slne/surf/roleplay/core/client/player/ClientRpPlayer.kt delete mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/ContextHolderImpl.kt create mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/RpLifecycle.kt delete mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/Mechanic.kt delete mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/MechanicRegistry.kt delete mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/idcard/IdCardMechanic.kt delete mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/RentCollectorJob.kt delete mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/containers/RegularStorageContainer.kt delete mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/door/Door.kt delete mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/door/doors/FrontDoor.kt delete mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/door/doors/GarageDoor.kt delete mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/door/doors/RegularDoor.kt delete mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/lockpick/lockpicks/BatteringRam.kt delete mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/lockpick/lockpicks/PremiumLockPick.kt delete mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/lockpick/lockpicks/RegularLockPick.kt delete mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/WeaponMechanic.kt delete mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/magazine/Magazine.kt delete mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/magazine/PlayerMagazine.kt delete mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/player/PlayerWeapon.kt delete mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/util/InternalContextHolder.kt delete mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/util/InternalRoleplayApi.kt create mode 100644 surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/AbstractMechanic.kt rename surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/utils/RpMechanic.kt => surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/Mechanic.kt (59%) rename {surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common => surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper}/mechanics/rentable/Cracker.kt (59%) rename {surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common => surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper}/mechanics/rentable/Rentable.kt (72%) rename {surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common => surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper}/mechanics/rentable/RentableMechanic.kt (65%) rename {surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common => surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper}/mechanics/rentable/StorageContainer.kt (81%) create mode 100644 surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/containers/RegularStorageContainer.kt rename {surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common => surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper}/mechanics/rentable/containers/VaultStorageContainer.kt (60%) create mode 100644 surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/door/Door.kt create mode 100644 surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/door/doors/FrontDoor.kt create mode 100644 surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/door/doors/GarageDoor.kt create mode 100644 surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/door/doors/RegularDoor.kt rename {surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common => surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper}/mechanics/rentable/events/RentableMemberAddEvent.kt (92%) rename {surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common => surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper}/mechanics/rentable/events/RentableMemberRemoveEvent.kt (92%) rename {surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common => surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper}/mechanics/rentable/events/RentableOwnerChangeEvent.kt (92%) rename {surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common => surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper}/mechanics/rentable/events/RentableRentCollectEvent.kt (78%) rename {surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common => surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper}/mechanics/rentable/lockpick/LockPick.kt (73%) create mode 100644 surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/lockpick/lockpicks/BatteringRam.kt create mode 100644 surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/lockpick/lockpicks/PremiumLockPick.kt create mode 100644 surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/lockpick/lockpicks/RegularLockPick.kt rename {surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common => surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper}/mechanics/rentable/rentables/Apartment.kt (57%) rename {surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common => surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper}/mechanics/rentable/rentables/House.kt (56%) rename {surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common => surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper}/mechanics/rentable/utils/Crackable.kt (86%) rename {surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common => surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper}/mechanics/rentable/utils/DoorContainer.kt (63%) rename {surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common => surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper}/mechanics/rentable/utils/Lockable.kt (88%) rename {surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common => surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper}/mechanics/weapon/Weapon.kt (58%) create mode 100644 surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/weapon/WeaponMechanic.kt create mode 100644 surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/weapon/magazine/Magazine.kt create mode 100644 surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/weapon/magazine/PlayerMagazine.kt create mode 100644 surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/weapon/player/PlayerWeapon.kt rename {surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common => surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper}/mechanics/weapon/utils/WeaponType.kt (74%) create mode 100644 surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/PaperRpPlayer.kt rename surf-roleplay-core/surf-roleplay-core-client/src/main/kotlin/dev/slne/surf/roleplay/core/client/player/ClientRpPlayerManager.kt => surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/PaperRpPlayerManager.kt (71%) rename {surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common => surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper}/player/events/RpPlayerJoinEvent.kt (78%) rename {surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common => surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper}/player/events/RpPlayerQuitEvent.kt (78%) rename {surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/utils => surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/spring}/RpPacketListener.kt (84%) delete mode 100644 surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/mechanics/idcard/IdCardMechanicImpl.kt diff --git a/build.gradle.kts b/build.gradle.kts index 52c3671..d0bf2f2 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -24,7 +24,7 @@ subprojects { afterEvaluate { plugins.withType { configure { - toolchain.languageVersion.set(JavaLanguageVersion.of(24)) + toolchain.languageVersion.set(JavaLanguageVersion.of(21)) } } } diff --git a/settings.gradle.kts b/settings.gradle.kts index eb72fd8..ac99d0c 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -11,7 +11,7 @@ pluginManagement { } plugins { - id("org.gradle.toolchains.foojay-resolver-convention") version "0.8.0" + id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0" } include("surf-roleplay-core:surf-roleplay-core-common") diff --git a/surf-roleplay-core/surf-roleplay-core-client/build.gradle.kts b/surf-roleplay-core/surf-roleplay-core-client/build.gradle.kts deleted file mode 100644 index 9b1e70f..0000000 --- a/surf-roleplay-core/surf-roleplay-core-client/build.gradle.kts +++ /dev/null @@ -1,11 +0,0 @@ -plugins { - id("dev.slne.surf.surfapi.gradle.core") -} - -surfCoreApi { - withCloudClientCommon() -} - -dependencies { - api(project(":surf-roleplay-core:surf-roleplay-core-common")) -} \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-client/src/main/kotlin/dev/slne/surf/roleplay/core/client/player/ClientRpPlayer.kt b/surf-roleplay-core/surf-roleplay-core-client/src/main/kotlin/dev/slne/surf/roleplay/core/client/player/ClientRpPlayer.kt deleted file mode 100644 index 2e32e10..0000000 --- a/surf-roleplay-core/surf-roleplay-core-client/src/main/kotlin/dev/slne/surf/roleplay/core/client/player/ClientRpPlayer.kt +++ /dev/null @@ -1,6 +0,0 @@ -package dev.slne.surf.roleplay.core.client.player - -import dev.slne.surf.roleplay.core.common.player.RpPlayer -import java.util.* - -class ClientRpPlayer(uuid: UUID) : RpPlayer(uuid) diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/RoleplayApplication.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/RoleplayApplication.kt index 8ab6df4..ae00658 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/RoleplayApplication.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/RoleplayApplication.kt @@ -1,6 +1,11 @@ package dev.slne.surf.roleplay import dev.slne.surf.cloud.api.common.SurfCloudApplication +import org.springframework.context.ApplicationContext @SurfCloudApplication -class RoleplayApplication \ No newline at end of file +class RoleplayApplication { + companion object { + lateinit var context: ApplicationContext + } +} \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/ContextHolderImpl.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/ContextHolderImpl.kt deleted file mode 100644 index efa23db..0000000 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/ContextHolderImpl.kt +++ /dev/null @@ -1,16 +0,0 @@ -package dev.slne.surf.roleplay.core.common - -import com.google.auto.service.AutoService -import dev.slne.surf.roleplay.core.common.util.InternalContextHolder -import dev.slne.surf.roleplay.core.common.util.InternalRoleplayApi -import org.springframework.context.ApplicationContext - -@OptIn(InternalRoleplayApi::class) -@AutoService(InternalContextHolder::class) -class ContextHolderImpl : InternalContextHolder { - override lateinit var context: ApplicationContext - - companion object { - val instance = InternalContextHolder.instance as ContextHolderImpl - } -} \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/RpInstance.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/RpInstance.kt index 78c3f39..e3bc9aa 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/RpInstance.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/RpInstance.kt @@ -1,24 +1,35 @@ package dev.slne.surf.roleplay.core.common +import dev.slne.surf.cloud.api.common.util.forEachAnnotationOrdered +import dev.slne.surf.cloud.api.common.util.forEachAnnotationOrderedReversed import dev.slne.surf.roleplay.core.common.mechanics.MechanicRegistry +import org.springframework.beans.factory.ObjectProvider +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.stereotype.Component import javax.annotation.OverridingMethodsMustInvokeSuper -abstract class RpInstance( - private val mechanicRegistry: MechanicRegistry -) { +@Component +class RpInstance(private val lifecycles: ObjectProvider) { + @Autowired + private lateinit var mechanicRegistry: MechanicRegistry + + + suspend fun onLoad() { + lifecycles.forEachAnnotationOrdered { it.onLoad() } - @OverridingMethodsMustInvokeSuper - open suspend fun onLoad() { mechanicRegistry.loadMechanics() } - @OverridingMethodsMustInvokeSuper - open suspend fun onEnable() { + suspend fun onEnable() { + lifecycles.forEachAnnotationOrdered { it.onEnable() } + mechanicRegistry.enableMechanics() } @OverridingMethodsMustInvokeSuper - open suspend fun onDisable() { + suspend fun onDisable() { + lifecycles.forEachAnnotationOrderedReversed { it.onDisable() } + mechanicRegistry.disableMechanics() } diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/RpLifecycle.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/RpLifecycle.kt new file mode 100644 index 0000000..a186bdd --- /dev/null +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/RpLifecycle.kt @@ -0,0 +1,10 @@ +package dev.slne.surf.roleplay.core.common + +import org.springframework.stereotype.Component + +@Component +interface RpLifecycle { + suspend fun onLoad() = Unit + suspend fun onEnable() = Unit + suspend fun onDisable() = Unit +} \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/Mechanic.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/Mechanic.kt deleted file mode 100644 index 38d0e1c..0000000 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/Mechanic.kt +++ /dev/null @@ -1,54 +0,0 @@ -@file:OptIn(InternalRoleplayApi::class) - -package dev.slne.surf.roleplay.core.common.mechanics - -import dev.slne.surf.roleplay.core.common.util.InternalContextHolder -import dev.slne.surf.roleplay.core.common.util.InternalRoleplayApi -import org.springframework.beans.factory.getBean - -abstract class Mechanic( - val name: String, -) { - - /** - * Called when the mechanic is loaded. - */ - open suspend fun onLoad() { - - } - - /** - * Called when the mechanic is enabled. - */ - open suspend fun onEnable() { - - } - - /** - * Called when the mechanic is disabled. - */ - open suspend fun onDisable() { - - } - - companion object { - /** - * Gets the mechanic by its class type. - * - * @param T The type of the mechanic. - * @param mechanic The class type of the mechanic. - * @return The [Mechanic] instance of type [T]. - */ - fun getMechanic(mechanic: Class): T = - InternalContextHolder.instance.context.getBean().getMechanic(mechanic) - - /** - * Gets the mechanic by its class type. - * - * @param T The type of the mechanic. - * @return The [Mechanic] instance of type [T]. - */ - inline fun getMechanic(): T = - getMechanic(T::class.java) - } -} \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/MechanicRegistry.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/MechanicRegistry.kt deleted file mode 100644 index 975b773..0000000 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/MechanicRegistry.kt +++ /dev/null @@ -1,36 +0,0 @@ -package dev.slne.surf.roleplay.core.common.mechanics - -import dev.slne.surf.cloud.api.common.util.forEachAnnotationOrdered -import org.springframework.beans.factory.ObjectProvider -import org.springframework.context.ApplicationContext -import org.springframework.stereotype.Component - -@Component -class MechanicRegistry( - private val context: ApplicationContext, - private val mechanics: ObjectProvider, -) { - - /** - * Returns the mechanic instance of the specified class. - * - * @param clazz The class of the mechanic to retrieve. - * @return The mechanic instance of the specified class. - * @throws IllegalArgumentException if no mechanic of the specified class is registered. - */ - fun getMechanic(clazz: Class) = context.getBean(clazz) - - suspend fun loadMechanics() { - mechanics.forEachAnnotationOrdered { it.onLoad() } - } - - suspend fun enableMechanics() { - mechanics.forEachAnnotationOrdered { it.onEnable() } - } - - suspend fun disableMechanics() { - mechanics.forEachAnnotationOrdered { it.onDisable() } // // FIXME: 11.08.2025 20:27 turn around stream - } -} - -inline fun MechanicRegistry.getMechanic(): T = getMechanic(T::class.java) \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/idcard/IdCardMechanic.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/idcard/IdCardMechanic.kt deleted file mode 100644 index 5e2d163..0000000 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/idcard/IdCardMechanic.kt +++ /dev/null @@ -1,7 +0,0 @@ -package dev.slne.surf.roleplay.core.common.mechanics.idcard - -import dev.slne.surf.roleplay.core.common.mechanics.Mechanic - -object IdCardMechanic : Mechanic( - name = "IdCardMechanic", -) \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/RentCollectorJob.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/RentCollectorJob.kt deleted file mode 100644 index e16c166..0000000 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/RentCollectorJob.kt +++ /dev/null @@ -1,27 +0,0 @@ -package dev.slne.surf.roleplay.core.common.mechanics.rentable - -import org.springframework.scheduling.annotation.Scheduled -import org.springframework.stereotype.Component -import java.time.ZonedDateTime -import java.util.concurrent.TimeUnit - -@Component -class RentCollectorJob { - - @Scheduled(fixedDelay = 1, timeUnit = TimeUnit.SECONDS) - suspend fun tick() { - val now = ZonedDateTime.now() - - RentableMechanic.rentables.forEach { rentable -> - if (rentable.owner == null) return@forEach - - val lastCollection = rentable.lastRentCollection - val delay = rentable.rentDuration - - if (lastCollection == null || now.isAfter(lastCollection.plusSeconds(delay.inWholeSeconds))) { - rentable.collectRent() - } - } - } - -} \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/containers/RegularStorageContainer.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/containers/RegularStorageContainer.kt deleted file mode 100644 index 8b5e06c..0000000 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/containers/RegularStorageContainer.kt +++ /dev/null @@ -1,16 +0,0 @@ -package dev.slne.surf.roleplay.core.common.mechanics.rentable.containers - -import dev.slne.surf.cloud.api.common.player.teleport.WorldLocation -import dev.slne.surf.roleplay.core.common.mechanics.rentable.Rentable -import dev.slne.surf.roleplay.core.common.mechanics.rentable.StorageContainer - -class RegularStorageContainer( - rentable: Rentable, - location: WorldLocation, - size: StorageContainer.StorageContainerSize -) : StorageContainer( - rentable = rentable, - location = location, - type = StorageContainer.StorageContainerType.REGULAR, - size = size, -) \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/door/Door.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/door/Door.kt deleted file mode 100644 index 56a11fc..0000000 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/door/Door.kt +++ /dev/null @@ -1,61 +0,0 @@ -package dev.slne.surf.roleplay.core.common.mechanics.rentable.door - -import dev.slne.surf.cloud.api.common.player.teleport.WorldLocation -import dev.slne.surf.roleplay.core.common.mechanics.rentable.Cracker -import dev.slne.surf.roleplay.core.common.mechanics.rentable.Rentable -import dev.slne.surf.roleplay.core.common.mechanics.rentable.lockpick.LockPick -import dev.slne.surf.roleplay.core.common.mechanics.rentable.utils.Crackable -import dev.slne.surf.roleplay.core.common.mechanics.rentable.utils.DoorContainer -import dev.slne.surf.roleplay.core.common.mechanics.rentable.utils.Lockable -import dev.slne.surf.roleplay.core.common.player.RpPlayer -import kotlin.time.Duration - -abstract class Door( - val rentable: Rentable, - val container: DoorContainer, - val location: WorldLocation, - override val crackDuration: Duration -) : Lockable, Crackable { - - override var cracked: Boolean = false - - private suspend fun doorStateOperation( - door: Door, - operation: (org.bukkit.block.data.type.Door) -> Unit - ) { - val doorLocation = door.location - - val doorBlock = doorLocation.world.getBlockAtAsync(doorLocation.toBlock()) - val doorBlockState = doorBlock.state - - if (doorBlockState is org.bukkit.block.data.type.Door) { - operation(doorBlockState) - doorBlockState.update(true, false) - } - } - - suspend fun open() { - container.doors.forEach { door -> - doorStateOperation(door) { state -> - state.isOpen = true - } - } - } - - suspend fun close() { - container.doors.forEach { door -> - doorStateOperation(door) { state -> - state.isOpen = false - } - } - } - - override fun canAccess(player: RpPlayer) = cracked || rentable.isMember(player) - - override suspend fun crack( - player: RpPlayer, - lockPick: LockPick - ) = Cracker.crack(player, this, lockPick) { - cracked = true - } -} \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/door/doors/FrontDoor.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/door/doors/FrontDoor.kt deleted file mode 100644 index 2944e51..0000000 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/door/doors/FrontDoor.kt +++ /dev/null @@ -1,18 +0,0 @@ -package dev.slne.surf.roleplay.core.common.mechanics.rentable.door.doors - -import dev.slne.surf.cloud.api.common.player.teleport.WorldLocation -import dev.slne.surf.roleplay.core.common.mechanics.rentable.Rentable -import dev.slne.surf.roleplay.core.common.mechanics.rentable.door.Door -import dev.slne.surf.roleplay.core.common.mechanics.rentable.utils.DoorContainer -import kotlin.time.Duration.Companion.seconds - -class FrontDoor( - rentable: Rentable, - container: DoorContainer, - location: WorldLocation -) : Door( - rentable = rentable, - container = container, - location = location, - crackDuration = 30.seconds -) \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/door/doors/GarageDoor.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/door/doors/GarageDoor.kt deleted file mode 100644 index d80e3f3..0000000 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/door/doors/GarageDoor.kt +++ /dev/null @@ -1,18 +0,0 @@ -package dev.slne.surf.roleplay.core.common.mechanics.rentable.door.doors - -import dev.slne.surf.cloud.api.common.player.teleport.WorldLocation -import dev.slne.surf.roleplay.core.common.mechanics.rentable.Rentable -import dev.slne.surf.roleplay.core.common.mechanics.rentable.door.Door -import dev.slne.surf.roleplay.core.common.mechanics.rentable.utils.DoorContainer -import kotlin.time.Duration.Companion.seconds - -class GarageDoor( - rentable: Rentable, - container: DoorContainer, - location: WorldLocation -) : Door( - rentable = rentable, - container = container, - location = location, - crackDuration = 15.seconds -) \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/door/doors/RegularDoor.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/door/doors/RegularDoor.kt deleted file mode 100644 index 4887ed6..0000000 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/door/doors/RegularDoor.kt +++ /dev/null @@ -1,18 +0,0 @@ -package dev.slne.surf.roleplay.core.common.mechanics.rentable.door.doors - -import dev.slne.surf.cloud.api.common.player.teleport.WorldLocation -import dev.slne.surf.roleplay.core.common.mechanics.rentable.Rentable -import dev.slne.surf.roleplay.core.common.mechanics.rentable.door.Door -import dev.slne.surf.roleplay.core.common.mechanics.rentable.utils.DoorContainer -import kotlin.time.Duration.Companion.seconds - -class RegularDoor( - rentable: Rentable, - container: DoorContainer, - location: WorldLocation -) : Door( - rentable = rentable, - container = container, - location = location, - crackDuration = 15.seconds -) \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/lockpick/lockpicks/BatteringRam.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/lockpick/lockpicks/BatteringRam.kt deleted file mode 100644 index a9acde3..0000000 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/lockpick/lockpicks/BatteringRam.kt +++ /dev/null @@ -1,10 +0,0 @@ -package dev.slne.surf.roleplay.core.common.mechanics.rentable.lockpick.lockpicks - -import dev.slne.surf.roleplay.core.common.mechanics.rentable.lockpick.LockPick - -object BatteringRam : LockPick( - displayName = { - primary("Rammbock") - }, - breakChance = { 0.0 } -) \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/lockpick/lockpicks/PremiumLockPick.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/lockpick/lockpicks/PremiumLockPick.kt deleted file mode 100644 index b1f583f..0000000 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/lockpick/lockpicks/PremiumLockPick.kt +++ /dev/null @@ -1,10 +0,0 @@ -package dev.slne.surf.roleplay.core.common.mechanics.rentable.lockpick.lockpicks - -import dev.slne.surf.roleplay.core.common.mechanics.rentable.lockpick.LockPick - -object PremiumLockPick : LockPick( - displayName = { - primary("Verzinkter Vierkantstahl Dietrich") - }, - breakChance = { 0.1 } -) \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/lockpick/lockpicks/RegularLockPick.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/lockpick/lockpicks/RegularLockPick.kt deleted file mode 100644 index b00e251..0000000 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/lockpick/lockpicks/RegularLockPick.kt +++ /dev/null @@ -1,10 +0,0 @@ -package dev.slne.surf.roleplay.core.common.mechanics.rentable.lockpick.lockpicks - -import dev.slne.surf.roleplay.core.common.mechanics.rentable.lockpick.LockPick - -object RegularLockPick : LockPick( - displayName = { - primary("Dietrich") - }, - breakChance = { 0.5 } -) \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/WeaponMechanic.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/WeaponMechanic.kt deleted file mode 100644 index 8ede3eb..0000000 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/WeaponMechanic.kt +++ /dev/null @@ -1,12 +0,0 @@ -package dev.slne.surf.roleplay.core.common.mechanics.weapon - -import dev.slne.surf.roleplay.core.common.mechanics.Mechanic -import dev.slne.surf.surfapi.core.api.util.freeze -import dev.slne.surf.surfapi.core.api.util.mutableObjectSetOf - -object WeaponMechanic : Mechanic( - name = "WeaponMechanic", -) { - private val _weapons = mutableObjectSetOf() - val weapons get() = _weapons.freeze() -} \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/magazine/Magazine.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/magazine/Magazine.kt deleted file mode 100644 index 02c02f2..0000000 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/magazine/Magazine.kt +++ /dev/null @@ -1,17 +0,0 @@ -package dev.slne.surf.roleplay.core.common.mechanics.weapon.magazine - -import dev.slne.surf.surfapi.core.api.messages.builder.SurfComponentBuilder - -abstract class Magazine( - val name: String, - val displayName: SurfComponentBuilder.() -> Unit = { - primary(name) - }, - val description: SurfComponentBuilder.() -> Unit = { - spacer("Ein ") - append(displayName) - spacer(" Magazin") - }, - val maxAmmo: Int, - val damageFunction: (Double) -> Double -) \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/magazine/PlayerMagazine.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/magazine/PlayerMagazine.kt deleted file mode 100644 index 0c27816..0000000 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/magazine/PlayerMagazine.kt +++ /dev/null @@ -1,8 +0,0 @@ -package dev.slne.surf.roleplay.core.common.mechanics.weapon.magazine - -class PlayerMagazine( - val magazine: Magazine, -) { - private var _currentAmmo = magazine.maxAmmo - val currentAmmo get() = _currentAmmo -} \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/player/PlayerWeapon.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/player/PlayerWeapon.kt deleted file mode 100644 index 9855b22..0000000 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/player/PlayerWeapon.kt +++ /dev/null @@ -1,15 +0,0 @@ -package dev.slne.surf.roleplay.core.common.mechanics.weapon.player - -import dev.slne.surf.roleplay.core.common.mechanics.weapon.Weapon -import dev.slne.surf.roleplay.core.common.mechanics.weapon.magazine.PlayerMagazine - -class PlayerWeapon( - val weapon: Weapon -) { - private var _currentMagazine: PlayerMagazine? = null - val currentMagazine get() = _currentMagazine - - fun setCurrentMagazine(magazine: PlayerMagazine?) { - _currentMagazine = magazine - } -} \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/RpPlayer.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/RpPlayer.kt index 5123a18..fc8c729 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/RpPlayer.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/RpPlayer.kt @@ -2,6 +2,7 @@ package dev.slne.surf.roleplay.core.common.player import dev.slne.surf.cloud.api.common.player.OfflineCloudPlayer import dev.slne.surf.cloud.api.common.player.toOfflineCloudPlayer +import dev.slne.surf.roleplay.RoleplayApplication import dev.slne.surf.roleplay.core.common.player.identity.RpIdentity import dev.slne.surf.roleplay.core.common.player.identity.RpIdentityType import dev.slne.surf.roleplay.core.common.player.identity.identities.CivilianIdentity @@ -10,8 +11,6 @@ import dev.slne.surf.roleplay.core.common.player.license.License import dev.slne.surf.roleplay.core.common.player.license.utils.LicenseRemovedReason import dev.slne.surf.roleplay.core.common.transaction.HasRpTransactions import dev.slne.surf.roleplay.core.common.transaction.utils.BalanceType -import dev.slne.surf.roleplay.core.common.util.InternalContextHolder -import dev.slne.surf.roleplay.core.common.util.InternalRoleplayApi import dev.slne.surf.surfapi.core.api.messages.adventure.appendNewline import dev.slne.surf.surfapi.core.api.messages.adventure.buildText import dev.slne.surf.surfapi.core.api.util.freeze @@ -21,7 +20,6 @@ import org.springframework.beans.factory.getBean import java.time.ZonedDateTime import java.util.* -@OptIn(InternalRoleplayApi::class) abstract class RpPlayer( private val uuid: UUID, var createdAt: ZonedDateTime = ZonedDateTime.now(), @@ -31,12 +29,12 @@ abstract class RpPlayer( val cloudPlayer: OfflineCloudPlayer get() = uuid.toOfflineCloudPlayer() - private val _identities = mutableObjectSetOf() + private val _identities = mutableObjectSetOf() // TODO: 22.08.2025 20:31 - replace with cloud cache soon val identities = _identities.freeze() var activeIdentity: RpIdentity? = null - private val playerService get() = InternalContextHolder.instance.context.getBean() + private val playerService get() = RoleplayApplication.context.getBean() suspend fun fetchIdentities() { val fetched = playerService.fetchIdentities(uuid) @@ -156,21 +154,23 @@ abstract class RpPlayer( override fun equals(other: Any?): Boolean { if (this === other) return true - if (javaClass != other?.javaClass) return false + if (other !is RpPlayer) return false - other as dev.slne.surf.roleplay.core.common.player.RpPlayer + if (uuid != other.uuid) return false - return cloudPlayer == other.cloudPlayer + return true } override fun hashCode(): Int { - return cloudPlayer.hashCode() + return uuid.hashCode() } + companion object { - operator fun get(cloudPlayer: OfflineCloudPlayer) = - InternalContextHolder.instance.context.getBean() - .getPlayerByUuid(cloudPlayer.uuid) + operator fun get(cloudPlayer: OfflineCloudPlayer) = get(cloudPlayer.uuid) + operator fun get(uuid: UUID) = + RoleplayApplication.context.getBean() + .getPlayerByUuid(uuid) } } diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/RpPlayerManager.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/RpPlayerManager.kt index b7f421f..ab71e83 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/RpPlayerManager.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/RpPlayerManager.kt @@ -1,20 +1,24 @@ package dev.slne.surf.roleplay.core.common.player import com.github.benmanes.caffeine.cache.Caffeine +import com.sksamuel.aedile.core.expireAfterAccess import dev.slne.surf.roleplay.core.common.player.identity.RpIdentity -import dev.slne.surf.roleplay.core.common.util.InternalContextHolder -import dev.slne.surf.roleplay.core.common.util.InternalRoleplayApi -import org.springframework.beans.factory.getBean +import org.springframework.scheduling.annotation.Scheduled +import org.springframework.stereotype.Component import java.util.* +import java.util.concurrent.TimeUnit +import kotlin.time.Duration.Companion.minutes -@InternalRoleplayApi +@Component abstract class RpPlayerManager { private val cache = Caffeine.newBuilder() .maximumSize(10_000) + .expireAfterAccess(30.minutes) .build { createPlayer(it) } abstract fun createPlayer(uuid: UUID): RpPlayer + abstract fun onlineUuids(): Set fun getPlayerByUuid(uuid: UUID) = cache.get(uuid) @@ -24,7 +28,10 @@ abstract class RpPlayerManager { abstract suspend fun updateIdentity(identity: T): T? abstract suspend fun createOrUpdateIdentity(identity: T): T - companion object { - val instance get() = InternalContextHolder.instance.context.getBean() + @Scheduled(fixedDelay = 15, timeUnit = TimeUnit.MINUTES) + fun cacheRefresh() { + onlineUuids().forEach { uuid -> + cache.getIfPresent(uuid) + } } } \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/RpIdentity.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/RpIdentity.kt index 7b11f7e..d630b1d 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/RpIdentity.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/RpIdentity.kt @@ -13,7 +13,6 @@ import dev.slne.surf.roleplay.core.common.player.license.utils.UnobtainableReaso import dev.slne.surf.roleplay.core.common.transaction.HasRpTransactions import dev.slne.surf.roleplay.core.common.transaction.RpTransaction import dev.slne.surf.roleplay.core.common.transaction.utils.BalanceType -import dev.slne.surf.roleplay.core.common.util.InternalRoleplayApi import dev.slne.surf.surfapi.core.api.util.mutableObject2ObjectMapOf import dev.slne.surf.surfapi.core.api.util.mutableObjectSetOf import dev.slne.surf.surfapi.core.api.util.objectSetOf @@ -36,7 +35,7 @@ abstract class RpIdentity( open var updatedAt: @Contextual ZonedDateTime = ZonedDateTime.now() ) : HasRpTransactions, HasLicenses { - val player: RpPlayer get() = RpPlayerManager.instance.getPlayerByUuid(uuid) + val player: RpPlayer get() = RpPlayer[uuid] private val licenseService get() = LicenseService.instance @Transient @@ -188,4 +187,8 @@ abstract class RpIdentity( return ObjectLinkedOpenHashSet() } + override fun toString(): String { + return "RpIdentity(uuid=$uuid, type=$type, firstName='$firstName', lastName='$lastName', dateOfBirth=$dateOfBirth, createdAt=$createdAt, updatedAt=$updatedAt)" + } + } \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/identities/CivilianIdentity.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/identities/CivilianIdentity.kt index 9f6c99f..97f254e 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/identities/CivilianIdentity.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/identities/CivilianIdentity.kt @@ -25,9 +25,8 @@ class CivilianIdentity( createdAt, updatedAt ) { - override fun toString(): String { - val parent = super.toString() - return "CivilianIdentityImpl($parent)" + override fun toString(): String { + return "CivilianIdentity() ${super.toString()}" } } \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/License.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/License.kt index f2f2d6e..c0059a4 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/License.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/License.kt @@ -4,7 +4,7 @@ package dev.slne.surf.roleplay.core.common.player.license import dev.slne.surf.roleplay.core.common.player.identity.RpIdentity import dev.slne.surf.roleplay.core.common.player.license.utils.UnobtainableReason -import dev.slne.surf.roleplay.core.common.util.InternalRoleplayApi +import dev.slne.surf.surfapi.core.api.messages.adventure.buildText import dev.slne.surf.surfapi.core.api.messages.builder.SurfComponentBuilder import dev.slne.surf.surfapi.core.api.util.mutableObjectSetOf import dev.slne.surf.surfapi.core.api.util.objectSetOf @@ -16,7 +16,7 @@ import net.kyori.adventure.text.Component abstract class License( val key: Key, val displayName: Component, - val description: SurfComponentBuilder.() -> Unit, + description: SurfComponentBuilder.() -> Unit, val price: Int, val dependencies: ObjectSet = objectSetOf(), val permission: String = LicensePermissionRegistry.createLicensePermission(key) @@ -24,6 +24,8 @@ abstract class License( private val licenseService get() = LicenseService.instance + val description = buildText(description) + val children get() = licenseService.licenses.filter { it.dependencies.contains(this) diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/LicenseService.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/LicenseService.kt index b489108..5999e45 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/LicenseService.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/LicenseService.kt @@ -5,16 +5,15 @@ package dev.slne.surf.roleplay.core.common.player.license import dev.slne.surf.cloud.api.common.util.toObjectSet import dev.slne.surf.roleplay.core.common.player.RpPlayer import dev.slne.surf.roleplay.core.common.player.identity.RpIdentity -import dev.slne.surf.roleplay.core.common.util.InternalContextHolder -import dev.slne.surf.roleplay.core.common.util.InternalRoleplayApi import it.unimi.dsi.fastutil.objects.Object2ObjectMap import it.unimi.dsi.fastutil.objects.ObjectSet import net.kyori.adventure.key.Key import org.jetbrains.annotations.Unmodifiable import org.springframework.beans.factory.getBean import org.springframework.context.ApplicationContext +import org.springframework.stereotype.Component -@InternalRoleplayApi +@Component abstract class LicenseService( private val context: ApplicationContext ) { diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/licenses/civilian/CivilianVehicleLicense.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/licenses/civilian/CivilianVehicleLicense.kt index 6cf7c8e..f1621e8 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/licenses/civilian/CivilianVehicleLicense.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/licenses/civilian/CivilianVehicleLicense.kt @@ -3,6 +3,7 @@ package dev.slne.surf.roleplay.core.common.player.license.licenses.civilian import dev.slne.surf.roleplay.core.common.player.license.ExpirableLicense import dev.slne.surf.roleplay.core.common.player.license.License import dev.slne.surf.surfapi.core.api.messages.adventure.key +import dev.slne.surf.surfapi.core.api.messages.adventure.text import dev.slne.surf.surfapi.core.api.util.objectSetOf import net.kyori.adventure.text.Component import kotlin.time.Duration.Companion.minutes @@ -13,7 +14,7 @@ class CivilianVehicleLicense { @SpringComponent class DriversLicense : License( key = key("civilian", "drivers_license"), - displayName = Component.text("Führerschein"), + displayName = text("Führerschein"), description = { spacer("Der Führerschein erlaubt es dir, Fahrzeuge zu führen.") }, @@ -25,7 +26,7 @@ class CivilianVehicleLicense { driversLicense: DriversLicense ) : ExpirableLicense( key = key("civilian", "truck_license"), - displayName = Component.text("Lkw-Führerschein"), + displayName = text("Lkw-Führerschein"), description = { spacer("Der Lkw-Führerschein erlaubt es dir, Lastkraftwagen zu fahren.") }, @@ -41,7 +42,7 @@ class CivilianVehicleLicense { driversLicense: DriversLicense ) : License( key = key("civilian", "bus_license"), - displayName = Component.text("Bus-Führerschein"), + displayName = text("Bus-Führerschein"), description = { spacer("Der Bus-Führerschein erlaubt es dir, Busse zu fahren.") }, @@ -56,7 +57,7 @@ class CivilianVehicleLicense { driversLicense: DriversLicense ) : License( key = key("civilian", "taxi_license"), - displayName = Component.text("Taxi-Führerschein"), + displayName = text("Taxi-Führerschein"), description = { spacer("Der Taxi-Führerschein erlaubt es dir, Taxis zu fahren.") @@ -70,7 +71,7 @@ class CivilianVehicleLicense { @SpringComponent class MotorcycleLicense : License( key = key("civilian", "motorcycle_license"), - displayName = Component.text("Motorrad-Führerschein"), + displayName = text("Motorrad-Führerschein"), description = { spacer("Der Motorrad-Führerschein erlaubt es dir, Motorräder zu fahren.") }, @@ -80,7 +81,7 @@ class CivilianVehicleLicense { @SpringComponent class BoatLicense : License( key = key("civilian", "boat_license"), - displayName = Component.text("Bootsführerschein"), + displayName = text("Bootsführerschein"), description = { spacer("Der Bootsführerschein erlaubt es dir, Boote zu fahren.") }, @@ -90,7 +91,7 @@ class CivilianVehicleLicense { @SpringComponent class PilotLicense : License( key = key("civilian", "pilot_license"), - displayName = Component.text("Pilotenschein"), + displayName = text("Pilotenschein"), description = { spacer("Der Pilotenschein erlaubt es dir, Flugzeuge zu fliegen.") }, @@ -100,7 +101,7 @@ class CivilianVehicleLicense { @SpringComponent class HelicopterLicense : License( key = key("civilian", "helicopter_license"), - displayName = Component.text("Hubschrauber-Führerschein"), + displayName = text("Hubschrauber-Führerschein"), description = { spacer("Der Hubschrauber-Führerschein erlaubt es dir, Hubschrauber zu fliegen.") }, diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/utils/LicenseRemovedReason.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/utils/LicenseRemovedReason.kt index 0f235c3..30c551c 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/utils/LicenseRemovedReason.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/utils/LicenseRemovedReason.kt @@ -2,9 +2,10 @@ package dev.slne.surf.roleplay.core.common.player.license.utils import dev.slne.surf.roleplay.core.common.player.RpPlayer import dev.slne.surf.roleplay.core.common.player.license.IdentityLicense +import dev.slne.surf.surfapi.core.api.messages.adventure.buildText import dev.slne.surf.surfapi.core.api.messages.builder.SurfComponentBuilder -sealed class LicenseRemovedReason(val message: SurfComponentBuilder.(IdentityLicense) -> Unit) { +sealed class LicenseRemovedReason(private val messageBuilder: SurfComponentBuilder.(IdentityLicense) -> Unit) { object Expired : LicenseRemovedReason({ info("Deine ") append(it.license.displayName) @@ -57,4 +58,6 @@ sealed class LicenseRemovedReason(val message: SurfComponentBuilder.(IdentityLic append(it.license.displayName) info(" Lizenz wurde entfernt, Grund unbekannt.") }) + + fun message(license: IdentityLicense) = buildText { this.messageBuilder(license) } } \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/utils/UnobtainableReason.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/utils/UnobtainableReason.kt index b114a42..eb8aa46 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/utils/UnobtainableReason.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/utils/UnobtainableReason.kt @@ -2,11 +2,14 @@ package dev.slne.surf.roleplay.core.common.player.license.utils import dev.slne.surf.roleplay.core.common.player.license.License import dev.slne.surf.surfapi.core.api.messages.adventure.appendNewline +import dev.slne.surf.surfapi.core.api.messages.adventure.buildText import dev.slne.surf.surfapi.core.api.messages.builder.SurfComponentBuilder import it.unimi.dsi.fastutil.objects.ObjectSet import net.kyori.adventure.text.Component -sealed class UnobtainableReason(val message: SurfComponentBuilder.() -> Unit) { +sealed class UnobtainableReason(message: SurfComponentBuilder.() -> Unit) { + val message = buildText(message) + class NotEnoughCash( val currentAmount: Int, val neededAmount: Int ) : UnobtainableReason({ diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/util/InternalContextHolder.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/util/InternalContextHolder.kt deleted file mode 100644 index bbccc00..0000000 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/util/InternalContextHolder.kt +++ /dev/null @@ -1,13 +0,0 @@ -package dev.slne.surf.roleplay.core.common.util - -import dev.slne.surf.surfapi.core.api.util.requiredService -import org.springframework.context.ApplicationContext - -@InternalRoleplayApi -interface InternalContextHolder { - val context: ApplicationContext - - companion object { - val instance = requiredService() - } -} \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/util/InternalRoleplayApi.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/util/InternalRoleplayApi.kt deleted file mode 100644 index 2690eb1..0000000 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/util/InternalRoleplayApi.kt +++ /dev/null @@ -1,17 +0,0 @@ -package dev.slne.surf.roleplay.core.common.util - -@RequiresOptIn( - level = RequiresOptIn.Level.ERROR, - message = "This API is intended for internal use only. Do not use it in your code unless you are sure you know what you are doing. " + - "Using this API may lead to unexpected behavior or compatibility issues in future versions." -) -@Retention(AnnotationRetention.BINARY) -@Target( - AnnotationTarget.CLASS, - AnnotationTarget.FUNCTION, - AnnotationTarget.PROPERTY, - AnnotationTarget.TYPEALIAS, - AnnotationTarget.VALUE_PARAMETER, - AnnotationTarget.FIELD -) -annotation class InternalRoleplayApi \ No newline at end of file diff --git a/surf-roleplay-paper/build.gradle.kts b/surf-roleplay-paper/build.gradle.kts index 78e8066..907e4d8 100644 --- a/surf-roleplay-paper/build.gradle.kts +++ b/surf-roleplay-paper/build.gradle.kts @@ -16,7 +16,7 @@ surfPaperPluginApi { } dependencies { - api(project(":surf-roleplay-core:surf-roleplay-core-client")) + api(project(":surf-roleplay-core:surf-roleplay-core-common")) compileOnly(libs.surf.npc.api) } diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/PaperBootstrap.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/PaperBootstrap.kt index 5a1c6a2..a597a93 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/PaperBootstrap.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/PaperBootstrap.kt @@ -3,14 +3,13 @@ package dev.slne.surf.roleplay.paper import dev.slne.surf.cloud.api.common.CloudInstance import dev.slne.surf.cloud.api.common.startSpringApplication import dev.slne.surf.roleplay.RoleplayApplication -import dev.slne.surf.roleplay.core.common.ContextHolderImpl import io.papermc.paper.plugin.bootstrap.BootstrapContext import io.papermc.paper.plugin.bootstrap.PluginBootstrap @Suppress("UnstableApiUsage") class PaperBootstrap : PluginBootstrap { override fun bootstrap(context: BootstrapContext) { - ContextHolderImpl.instance.context = + ContextHolder.instance.context = CloudInstance.startSpringApplication(RoleplayApplication::class) } } \ No newline at end of file diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/PaperMain.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/PaperMain.kt index 9ac22a7..0923c52 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/PaperMain.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/PaperMain.kt @@ -2,8 +2,6 @@ package dev.slne.surf.roleplay.paper import com.github.shynixn.mccoroutine.folia.SuspendingJavaPlugin import dev.slne.surf.roleplay.core.common.RpInstance -import dev.slne.surf.roleplay.core.common.util.InternalContextHolder -import dev.slne.surf.roleplay.core.common.util.InternalRoleplayApi import dev.slne.surf.roleplay.paper.command.activeIdentityCommand import dev.slne.surf.roleplay.paper.command.balanceCommand import org.bukkit.plugin.java.JavaPlugin diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/PaperRpInstance.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/PaperRpInstance.kt index b4e93f0..81a7877 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/PaperRpInstance.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/PaperRpInstance.kt @@ -1,8 +1,6 @@ package dev.slne.surf.roleplay.paper import dev.slne.surf.roleplay.core.common.RpInstance -import dev.slne.surf.roleplay.core.common.mechanics.MechanicRegistry -import dev.slne.surf.roleplay.paper.player.license.LicenseNpc import dev.slne.surf.roleplay.paper.spring.postprocessor.BukkitListenerPostProcessor import dev.slne.surf.roleplay.paper.spring.postprocessor.PacketListenerPostProcessor import org.springframework.stereotype.Component @@ -17,8 +15,6 @@ class PaperRpInstance( override suspend fun onEnable() { super.onEnable() - LicenseNpc.spawnNpc() - bukkitListenerPostProcessor.registerListeners() packetListenerPostProcessor.registerListeners() } diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/command/args/BalanceTypeArgument.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/command/args/BalanceTypeArgument.kt index 3ebb6d1..394924c 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/command/args/BalanceTypeArgument.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/command/args/BalanceTypeArgument.kt @@ -24,7 +24,5 @@ inline fun CommandAPICommand.balanceTypeArgument( nodeName: String, optional: Boolean = false, block: Argument<*>.() -> Unit = {} -) = withArguments(BalanceTypeArgument(nodeName).apply { - isOptional = optional - block() -}) \ No newline at end of file +): CommandAPICommand = + withArguments(BalanceTypeArgument(nodeName).setOptional(optional).apply(block)) \ No newline at end of file diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/listener/ListenerManager.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/listener/ListenerManager.kt index 63e8d8c..1439768 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/listener/ListenerManager.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/listener/ListenerManager.kt @@ -14,7 +14,7 @@ import com.github.shynixn.mccoroutine.folia.launch import com.github.shynixn.mccoroutine.folia.regionDispatcher import dev.jorel.commandapi.kotlindsl.commandAPICommand import dev.jorel.commandapi.kotlindsl.playerExecutor -import dev.slne.surf.roleplay.core.common.mechanics.utils.RpPacketListener +import dev.slne.surf.roleplay.paper.spring.RpPacketListener import dev.slne.surf.roleplay.paper.plugin import dev.slne.surf.surfapi.bukkit.api.builder.ItemStack import dev.slne.surf.surfapi.core.api.messages.adventure.playSound diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/listener/OnlineListener.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/listener/OnlineListener.kt index 4bad28d..b66f744 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/listener/OnlineListener.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/listener/OnlineListener.kt @@ -1,14 +1,9 @@ package dev.slne.surf.roleplay.paper.listener -import com.github.shynixn.mccoroutine.folia.globalRegionDispatcher -import com.github.shynixn.mccoroutine.folia.launch -import dev.slne.surf.cloud.api.client.paper.player.toCloudOfflinePlayer -import dev.slne.surf.roleplay.api.common.player.RpPlayer -import dev.slne.surf.roleplay.core.common.player.events.RpPlayerJoinEvent -import dev.slne.surf.roleplay.core.common.player.events.RpPlayerQuitEvent import dev.slne.surf.roleplay.paper.player.events.RpPlayerDeathEvent -import dev.slne.surf.roleplay.paper.plugin -import kotlinx.coroutines.withContext +import dev.slne.surf.roleplay.paper.player.events.RpPlayerJoinEvent +import dev.slne.surf.roleplay.paper.player.events.RpPlayerQuitEvent +import dev.slne.surf.roleplay.paper.player.rpPlayer import org.bukkit.event.EventHandler import org.bukkit.event.EventPriority import org.bukkit.event.Listener @@ -20,36 +15,21 @@ import org.springframework.stereotype.Component @Component class OnlineListener : Listener { - @EventHandler(priority = EventPriority.LOWEST) + @EventHandler fun onJoin(event: PlayerJoinEvent) { - plugin.launch { - val player = RpPlayer[event.player.toCloudOfflinePlayer()] - - withContext(plugin.globalRegionDispatcher) { - RpPlayerJoinEvent(player).callEvent() - } - } + val player = event.player.rpPlayer + RpPlayerJoinEvent(this, player).postAndForget() } - @EventHandler(priority = EventPriority.MONITOR) + @EventHandler fun onQuit(event: PlayerQuitEvent) { - plugin.launch { - val player = RpPlayer[event.player.toCloudOfflinePlayer()] - - withContext(plugin.globalRegionDispatcher) { - RpPlayerQuitEvent(player).callEvent() - - rpPlayerManagerImpl.onDisconnect(player) - } - } + val player = event.player.rpPlayer + RpPlayerQuitEvent(this, player).postAndForget() } - @EventHandler(priority = EventPriority.MONITOR) + @EventHandler(priority = EventPriority.HIGHEST) fun onPlayerDeath(event: PlayerDeathEvent) { - plugin.launch { - withContext(plugin.globalRegionDispatcher) { - RpPlayerDeathEvent(RpPlayer[event.player.toCloudOfflinePlayer()], event).callEvent() - } - } + val player = event.player.rpPlayer + RpPlayerDeathEvent(this, player, event).postAndForget() } } \ No newline at end of file diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/AbstractMechanic.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/AbstractMechanic.kt new file mode 100644 index 0000000..f11a468 --- /dev/null +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/AbstractMechanic.kt @@ -0,0 +1,8 @@ +@file:OptIn(InternalRoleplayApi::class) + +package dev.slne.surf.roleplay.paper.mechanics + +import dev.slne.surf.roleplay.core.common.RpLifecycle + +abstract class AbstractMechanic(val name: String) : RpLifecycle { +} \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/utils/RpMechanic.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/Mechanic.kt similarity index 59% rename from surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/utils/RpMechanic.kt rename to surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/Mechanic.kt index fde0fa6..8510cb1 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/utils/RpMechanic.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/Mechanic.kt @@ -1,8 +1,8 @@ -package dev.slne.surf.roleplay.core.common.mechanics.utils +package dev.slne.surf.roleplay.paper.mechanics import org.springframework.stereotype.Component -@Component @Retention(AnnotationRetention.RUNTIME) @Target(AnnotationTarget.CLASS) -annotation class RpMechanic() +@Component +annotation class Mechanic() diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/IdCardMechanicImpl.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/IdCardMechanicImpl.kt index 9e44685..3dcd817 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/IdCardMechanicImpl.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/IdCardMechanicImpl.kt @@ -1,10 +1,10 @@ package dev.slne.surf.roleplay.paper.mechanics.idcard -import dev.slne.surf.roleplay.core.common.mechanics.idcard.IdCardMechanic -import dev.slne.surf.roleplay.core.common.mechanics.utils.RpMechanic +import dev.slne.surf.roleplay.paper.mechanics.AbstractMechanic +import dev.slne.surf.roleplay.paper.mechanics.Mechanic -@RpMechanic -class IdCardMechanicImpl : IdCardMechanic() { +@Mechanic +class IdCardMechanicImpl : AbstractMechanic("IdCardMechanic") { override suspend fun onEnable() { IdCardNpc.spawnNpc() } diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/dialogs/CreateIdDialog.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/dialogs/CreateIdDialog.kt index 6de5e03..118b14c 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/dialogs/CreateIdDialog.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/dialogs/CreateIdDialog.kt @@ -4,10 +4,9 @@ package dev.slne.surf.roleplay.paper.mechanics.idcard.dialogs import com.github.shynixn.mccoroutine.folia.launch -import dev.slne.surf.cloud.api.client.paper.player.toCloudOfflinePlayer -import dev.slne.surf.roleplay.api.common.player.RpPlayer import dev.slne.surf.roleplay.core.common.player.identity.identities.CivilianIdentity import dev.slne.surf.roleplay.paper.mechanics.idcard.IdCard +import dev.slne.surf.roleplay.paper.player.rpPlayer import dev.slne.surf.roleplay.paper.plugin import dev.slne.surf.surfapi.bukkit.api.dialog.base import dev.slne.surf.surfapi.bukkit.api.dialog.builder.DialogBodyBuilder @@ -18,14 +17,13 @@ import dev.slne.surf.surfapi.bukkit.api.dialog.type import dev.slne.surf.surfapi.bukkit.api.nms.NmsUseWithCaution import io.papermc.paper.dialog.Dialog import io.papermc.paper.registry.data.dialog.ActionButton -import io.papermc.paper.registry.data.dialog.DialogBase +import io.papermc.paper.registry.data.dialog.DialogBase.DialogAfterAction import net.kyori.adventure.text.format.TextDecoration -import org.bukkit.entity.Player import java.time.LocalDate import java.time.Year -private val nameRegex = Regex("^[a-zA-ZÄÖÜäöüß]{3,16}") -private val nameRegexDashes = Regex("^[a-zA-ZÄÖÜäöüß-]{3,16}") +private val nameRegex = "^[a-zA-ZÄÖÜäöüß]{3,16}".toRegex() +private val nameRegexDashes = "^[a-zA-ZÄÖÜäöüß-]{3,16}".toRegex() fun createIdDialog( firstName: String? = null, @@ -34,7 +32,7 @@ fun createIdDialog( ) = dialog { base { title { primary("Personalausweis beantragen") } - afterAction(DialogBase.DialogAfterAction.WAIT_FOR_RESPONSE) + afterAction(DialogAfterAction.WAIT_FOR_RESPONSE) body { plainMessage(400) { @@ -88,9 +86,7 @@ private fun confirmCreationButton(): ActionButton = actionButton { } action { - customClick { info, audience -> - val player = audience as? Player ?: error("Audience is not a Player") - + customPlayerClick { info, player -> val firstName = info.getText("first_name") ?: "" val lastName = info.getText("last_name") ?: "" val birthDateString = info.getText("birth_date") ?: "" @@ -102,7 +98,7 @@ private fun confirmCreationButton(): ActionButton = actionButton { val isValidBirthDateString = validateDate(birthDateString) if (!isValidBirthDateString || !isValidFirstName || !isValidLastName || !isValidFirstNameLength || !isValidLastNameLength) { - audience.showDialog( + player.showDialog( invalidInputDialog( firstName, lastName, @@ -146,17 +142,16 @@ private fun confirmCreationButton(): ActionButton = actionButton { } } ) - return@customClick + return@customPlayerClick } val birthDate = LocalDate.parse(birthDateString, IdCard.formatter) plugin.launch { - val rpPlayer = RpPlayer[player.toCloudOfflinePlayer()] - + val rpPlayer = player.rpPlayer val identity = rpPlayer.createOrUpdateIdentity( CivilianIdentity( - player = rpPlayer, + uuid = player.uniqueId, firstName = firstName, lastName = lastName, dateOfBirth = birthDate @@ -165,7 +160,7 @@ private fun confirmCreationButton(): ActionButton = actionButton { rpPlayer.setActiveIdentity(identity) - audience.showDialog(idCreationSuccess(firstName, lastName, birthDate)) + player.showDialog(idCreationSuccess(firstName, lastName, birthDate)) } } } @@ -179,7 +174,7 @@ private fun invalidInputDialog( ): Dialog = dialog { base { title { error("Der Personalausweis konnte nicht erstellt werden!") } - afterAction(DialogBase.DialogAfterAction.NONE) + afterAction(DialogAfterAction.NONE) body { plainMessage(400) {} @@ -206,7 +201,7 @@ private fun idCreationSuccess( ): Dialog = dialog { base { title { success("Dein Personalausweises wurde erfolgreich mit folgenden Angaben erstellt:") } - afterAction(DialogBase.DialogAfterAction.NONE) + afterAction(DialogAfterAction.NONE) body { plainMessage(400) { diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/listeners/IdCardHandler.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/listeners/IdCardHandler.kt index 6b4c9db..194d7f0 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/listeners/IdCardHandler.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/listeners/IdCardHandler.kt @@ -2,12 +2,11 @@ package dev.slne.surf.roleplay.paper.mechanics.idcard.listeners import com.github.shynixn.mccoroutine.folia.entityDispatcher import com.github.shynixn.mccoroutine.folia.launch -import dev.slne.surf.cloud.api.client.paper.player.toCloudOfflinePlayer import dev.slne.surf.npc.api.event.NpcInteractEvent import dev.slne.surf.npc.api.surfNpcApi -import dev.slne.surf.roleplay.api.common.player.RpPlayer import dev.slne.surf.roleplay.paper.mechanics.idcard.IdCardNpc import dev.slne.surf.roleplay.paper.mechanics.idcard.dialogs.createIdDialog +import dev.slne.surf.roleplay.paper.player.rpPlayer import dev.slne.surf.roleplay.paper.plugin import dev.slne.surf.surfapi.core.api.messages.adventure.playSound import dev.slne.surf.surfapi.core.api.messages.adventure.sendText @@ -31,7 +30,7 @@ class IdCardHandler : Listener { if (npc.npcUuid != idCardNpc.npcUuid) return plugin.launch(plugin.entityDispatcher(player)) { - val rpPlayer = RpPlayer[player.toCloudOfflinePlayer()] + val rpPlayer = player.rpPlayer if (rpPlayer.hasCompletedCitizenship()) { player.sendText { diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/Cracker.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/Cracker.kt similarity index 59% rename from surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/Cracker.kt rename to surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/Cracker.kt index 7e4fb68..2510c6b 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/Cracker.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/Cracker.kt @@ -1,7 +1,7 @@ -package dev.slne.surf.roleplay.core.common.mechanics.rentable +package dev.slne.surf.roleplay.paper.mechanics.rentable -import dev.slne.surf.roleplay.core.common.mechanics.rentable.lockpick.LockPick -import dev.slne.surf.roleplay.core.common.mechanics.rentable.utils.Crackable +import dev.slne.surf.roleplay.paper.mechanics.rentable.lockpick.LockPick +import dev.slne.surf.roleplay.paper.mechanics.rentable.utils.Crackable import dev.slne.surf.roleplay.core.common.player.RpPlayer object Cracker { diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/Rentable.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/Rentable.kt similarity index 72% rename from surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/Rentable.kt rename to surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/Rentable.kt index 399b074..7c71e21 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/Rentable.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/Rentable.kt @@ -1,10 +1,10 @@ -package dev.slne.surf.roleplay.core.common.mechanics.rentable +package dev.slne.surf.roleplay.paper.mechanics.rentable -import dev.slne.surf.roleplay.core.common.mechanics.Mechanic -import dev.slne.surf.roleplay.core.common.mechanics.rentable.events.RentableMemberAddEvent -import dev.slne.surf.roleplay.core.common.mechanics.rentable.events.RentableMemberRemoveEvent -import dev.slne.surf.roleplay.core.common.mechanics.rentable.events.RentableOwnerChangeEvent -import dev.slne.surf.roleplay.core.common.mechanics.rentable.utils.DoorContainer +import dev.slne.surf.roleplay.paper.mechanics.rentable.events.RentableMemberAddEvent +import dev.slne.surf.roleplay.paper.mechanics.rentable.events.RentableMemberRemoveEvent +import dev.slne.surf.roleplay.paper.mechanics.rentable.events.RentableOwnerChangeEvent +import dev.slne.surf.roleplay.paper.mechanics.rentable.events.RentableRentCollectEvent +import dev.slne.surf.roleplay.paper.mechanics.rentable.utils.DoorContainer import dev.slne.surf.roleplay.core.common.player.RpPlayer import dev.slne.surf.surfapi.core.api.messages.adventure.buildText import dev.slne.surf.surfapi.core.api.util.freeze @@ -14,6 +14,7 @@ import it.unimi.dsi.fastutil.objects.ObjectSet import net.kyori.adventure.key.Key import net.kyori.adventure.text.ComponentLike import java.time.ZonedDateTime +import java.util.concurrent.atomic.AtomicBoolean import kotlin.time.Duration abstract class Rentable( @@ -22,6 +23,7 @@ abstract class Rentable( val rentDuration: Duration, val size: Double, val stories: Int, + val mechanic: RentableMechanic, storageContainers: ObjectSet = objectSetOf(), doorContainers: ObjectSet = objectSetOf() ) : ComponentLike { @@ -33,6 +35,9 @@ abstract class Rentable( val storageContainers = _storageContainers.freeze() val doorContainers = _doorContainers.freeze() + private val collectingRent = AtomicBoolean(false) + + init { _storageContainers.addAll(storageContainers) _doorContainers.addAll(doorContainers) @@ -49,13 +54,38 @@ abstract class Rentable( * @return The result of the rent collection, indicating success or failure. */ suspend fun collectRent(): RentableMechanic.RentCollectResult { - val result = Mechanic.getMechanic().collectRent(this) + if (!collectingRent.compareAndSet(false, true)) { // exit quickly if already collecting + return RentableMechanic.RentCollectResult.ALREADY_COLLECTING + } + + try { + val currentOwner = owner ?: return RentableMechanic.RentCollectResult.NOT_RENTED + val currentBankBalance = currentOwner.getBankBalance() + + val event = RentableRentCollectEvent( + source = this, + rentable = this, + amount = rent + ) + event.post() - if (result == RentableMechanic.RentCollectResult.SUCCESS) { + if (event.isCancelled) { + return RentableMechanic.RentCollectResult.EVENT_CANCELLED + } + + val rent = event.amount + + if (rent > currentBankBalance) { + return RentableMechanic.RentCollectResult.NOT_ENOUGH_MONEY + } + + currentOwner.removeBankBalance(rent) lastRentCollection = ZonedDateTime.now() - } - return result + return RentableMechanic.RentCollectResult.SUCCESS + } finally { + collectingRent.set(false) + } } /** @@ -70,8 +100,9 @@ abstract class Rentable( reason: RentableOwnerChangeEvent.OwnerChangeReason ): RentableOwnerChangeEvent.OwnerSetResult { val event = RentableOwnerChangeEvent(this, this, owner, player, reason) + event.post() - if (!event.callEvent()) { + if (event.isCancelled) { return RentableOwnerChangeEvent.OwnerSetResult.Failure( RentableOwnerChangeEvent.OwnerSetFailureReason.EventCancelled( event.cancelReason ?: "Unbekannt" @@ -93,10 +124,8 @@ abstract class Rentable( ) } - val rentableMechanic = Mechanic.getMechanic() - - val maxRentables = rentableMechanic.getMaxOwnableRentablesByPlayer(player) - val ownedRentables = rentableMechanic.getOwnedRentablesByPlayer(player) + val maxRentables = mechanic.getMaxOwnableRentablesByPlayer(player) + val ownedRentables = mechanic.getOwnedRentablesByPlayer(player) if (ownedRentables.size >= maxRentables) { return RentableOwnerChangeEvent.OwnerSetResult.Failure( @@ -107,7 +136,7 @@ abstract class Rentable( ) } - val currentMoney = player.getBankBalance().toInt() + val currentMoney = player.getBankBalance() if (currentMoney < rent) { return RentableOwnerChangeEvent.OwnerSetResult.Failure( @@ -138,14 +167,15 @@ abstract class Rentable( * @param player The player to add as a member. * @return The result of the member addition event, indicating success or failure. */ - fun addMember(player: RpPlayer): RentableMemberAddEvent.MemberAddResult { + suspend fun addMember(player: RpPlayer): RentableMemberAddEvent.MemberAddResult { if (isMember(player)) { return RentableMemberAddEvent.MemberAddResult.Failure(RentableMemberAddEvent.MemberAddFailureReason.AlreadyMember) } val event = RentableMemberAddEvent(this, this, player) + event.post() - if (!event.callEvent()) { + if (event.isCancelled) { return RentableMemberAddEvent.MemberAddResult.Failure(RentableMemberAddEvent.MemberAddFailureReason.EventCancelled) } @@ -160,14 +190,15 @@ abstract class Rentable( * @param player The player to remove from the members. * @return The result of the member removal event, indicating success or failure. */ - fun removeMember(player: RpPlayer): RentableMemberRemoveEvent.MemberRemoveResult { + suspend fun removeMember(player: RpPlayer): RentableMemberRemoveEvent.MemberRemoveResult { if (!isMember(player)) { return RentableMemberRemoveEvent.MemberRemoveResult.Failure(RentableMemberRemoveEvent.MemberRemoveFailureReason.NotMember) } val event = RentableMemberRemoveEvent(this, this, player) + event.post() - if (!event.callEvent()) { + if (event.isCancelled) { return RentableMemberRemoveEvent.MemberRemoveResult.Failure(RentableMemberRemoveEvent.MemberRemoveFailureReason.EventCancelled) } diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/RentableMechanic.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/RentableMechanic.kt similarity index 65% rename from surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/RentableMechanic.kt rename to surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/RentableMechanic.kt index 9d31371..f642aa0 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/RentableMechanic.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/RentableMechanic.kt @@ -1,21 +1,24 @@ -package dev.slne.surf.roleplay.core.common.mechanics.rentable +package dev.slne.surf.roleplay.paper.mechanics.rentable -import dev.slne.surf.roleplay.core.common.mechanics.Mechanic -import dev.slne.surf.roleplay.core.common.mechanics.rentable.events.RentableRentCollectEvent -import dev.slne.surf.roleplay.core.common.mechanics.rentable.rentables.House +import dev.slne.surf.roleplay.paper.mechanics.AbstractMechanic +import dev.slne.surf.roleplay.paper.mechanics.Mechanic +import dev.slne.surf.roleplay.paper.mechanics.rentable.rentables.House import dev.slne.surf.roleplay.core.common.player.RpPlayer import dev.slne.surf.surfapi.core.api.messages.adventure.key import dev.slne.surf.surfapi.core.api.util.freeze import dev.slne.surf.surfapi.core.api.util.mutableObjectSetOf import dev.slne.surf.surfapi.core.api.util.objectSetOf -import dev.slne.surf.surfapi.core.api.util.toObjectSet import net.kyori.adventure.key.Key +import org.springframework.scheduling.annotation.Scheduled +import java.time.ZonedDateTime +import java.util.concurrent.TimeUnit import kotlin.time.Duration.Companion.seconds -object RentableMechanic : Mechanic("RentableMechanic") { +@Mechanic +class RentableMechanic : AbstractMechanic("RentableMechanic") { private val _rentables = mutableObjectSetOf() - val rentables get() = _rentables.freeze() + val rentables = _rentables.freeze() /** * Adds a rentable @@ -32,6 +35,7 @@ object RentableMechanic : Mechanic("RentableMechanic") { rentDuration = 10.seconds, size = 100.0, stories = 3, + mechanic = this, storageContainers = objectSetOf(), doors = objectSetOf() ) @@ -45,31 +49,27 @@ object RentableMechanic : Mechanic("RentableMechanic") { * @param rentable the [Rentable] to collect rent for * @return the result of the rent collection */ + @Deprecated("Use rentable.collectRent() instead", ReplaceWith("rentable.collectRent()")) suspend fun collectRent(rentable: Rentable): RentCollectResult { - val currentOwner = rentable.owner ?: return RentCollectResult.NOT_RENTED - val currentBankBalance = currentOwner.getBankBalance() - - val event = RentableRentCollectEvent( - source = this, - rentable = rentable, - amount = rentable.rent - ) + return rentable.collectRent() + } - if (!event.callEvent()) { - return RentCollectResult.EVENT_CANCELLED - } + @Scheduled(fixedDelay = 1, timeUnit = TimeUnit.SECONDS) + suspend fun collectRents() { + val now = ZonedDateTime.now() - val rent = event.amount + for (rentable in _rentables) { + if (rentable.owner == null) continue + val lastCollection = rentable.lastRentCollection + val delay = rentable.rentDuration - if (rent > currentBankBalance) { - return RentCollectResult.NOT_ENOUGH_MONEY + if (lastCollection == null || now.isAfter(lastCollection.plusSeconds(delay.inWholeSeconds))) { + rentable.collectRent() + } } - - currentOwner.removeBankBalance(rent) - - return RentCollectResult.SUCCESS } + /** * Returns the owned [Rentable]s for one [RpPlayer] * @@ -77,7 +77,7 @@ object RentableMechanic : Mechanic("RentableMechanic") { * @return an object set of [Rentable]s */ fun getOwnedRentablesByPlayer(player: RpPlayer) = - _rentables.filter { it.owner == player }.toObjectSet() + _rentables.filterTo(mutableObjectSetOf()) { it.owner == player } /** * Returns the maximum number of ownable rentables for a player. @@ -94,8 +94,7 @@ object RentableMechanic : Mechanic("RentableMechanic") { * @return the [Rentable] if found, or null if not found */ fun getByKey(key: Key) = _rentables.find { it.key == key } - ?: _rentables.find { it.key.asString() == key.asString() } - ?: _rentables.find { it.key.namespace() == key.namespace() && it.key.value() == key.value() } + /** * The result of a rent collection attempt. @@ -120,5 +119,10 @@ object RentableMechanic : Mechanic("RentableMechanic") { * The rentable is not currently rented. */ NOT_RENTED, + + /** + * The rent collection is already in progress. + */ + ALREADY_COLLECTING } } \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/StorageContainer.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/StorageContainer.kt similarity index 81% rename from surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/StorageContainer.kt rename to surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/StorageContainer.kt index 5e2a175..04f3062 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/StorageContainer.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/StorageContainer.kt @@ -1,12 +1,12 @@ @file:Suppress("UnstableApiUsage") -package dev.slne.surf.roleplay.core.common.mechanics.rentable +package dev.slne.surf.roleplay.paper.mechanics.rentable import dev.slne.surf.cloud.api.common.player.teleport.WorldLocation -import dev.slne.surf.roleplay.core.common.mechanics.rentable.utils.Crackable -import dev.slne.surf.roleplay.core.common.mechanics.rentable.utils.Lockable +import dev.slne.surf.roleplay.paper.mechanics.rentable.utils.Crackable +import dev.slne.surf.roleplay.paper.mechanics.rentable.utils.Lockable import dev.slne.surf.roleplay.core.common.player.RpPlayer -import dev.slne.surf.surfapi.core.api.messages.adventure.key +import dev.slne.surf.surfapi.core.api.generated.BlockTypeKeys import net.kyori.adventure.key.Key import kotlin.time.Duration import kotlin.time.Duration.Companion.seconds @@ -27,9 +27,9 @@ abstract class StorageContainer( /** * The different types of storage containers. */ - enum class StorageContainerType(val material: Key) { - REGULAR(key("minecraft:chest")), - VAULT(key("minecraft:vault")), ; + enum class StorageContainerType(val blockType: Key) { + REGULAR(BlockTypeKeys.CHEST), + VAULT(BlockTypeKeys.VAULT); } /** diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/commands/RentableCommand.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/commands/RentableCommand.kt index b927b17..8adc989 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/commands/RentableCommand.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/commands/RentableCommand.kt @@ -5,8 +5,8 @@ import dev.jorel.commandapi.arguments.ArgumentSuggestions import dev.jorel.commandapi.kotlindsl.* import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.events.OwnerChangeReason import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.events.OwnerSetResult -import dev.slne.surf.roleplay.core.common.mechanics.rentable.RentableMechanic.getByKey -import dev.slne.surf.roleplay.core.common.mechanics.rentable.RentableMechanic.rentables +import dev.slne.surf.roleplay.paper.mechanics.rentable.RentableMechanic.getByKey +import dev.slne.surf.roleplay.paper.mechanics.rentable.RentableMechanic.rentables import dev.slne.surf.roleplay.paper.player.rpPlayer import dev.slne.surf.roleplay.paper.plugin import dev.slne.surf.surfapi.core.api.messages.adventure.appendNewline diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/containers/RegularStorageContainer.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/containers/RegularStorageContainer.kt new file mode 100644 index 0000000..9d26c9e --- /dev/null +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/containers/RegularStorageContainer.kt @@ -0,0 +1,16 @@ +package dev.slne.surf.roleplay.paper.mechanics.rentable.containers + +import dev.slne.surf.cloud.api.common.player.teleport.WorldLocation +import dev.slne.surf.roleplay.paper.mechanics.rentable.Rentable +import dev.slne.surf.roleplay.paper.mechanics.rentable.StorageContainer + +class RegularStorageContainer( + rentable: Rentable, + location: WorldLocation, + size: StorageContainerSize +) : StorageContainer( + rentable = rentable, + location = location, + type = StorageContainerType.REGULAR, + size = size, +) \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/containers/VaultStorageContainer.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/containers/VaultStorageContainer.kt similarity index 60% rename from surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/containers/VaultStorageContainer.kt rename to surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/containers/VaultStorageContainer.kt index b1a6288..bd574bb 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/containers/VaultStorageContainer.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/containers/VaultStorageContainer.kt @@ -1,11 +1,11 @@ -package dev.slne.surf.roleplay.core.common.mechanics.rentable.containers +package dev.slne.surf.roleplay.paper.mechanics.rentable.containers import dev.slne.surf.cloud.api.common.player.teleport.WorldLocation -import dev.slne.surf.roleplay.core.common.mechanics.rentable.Cracker -import dev.slne.surf.roleplay.core.common.mechanics.rentable.Rentable -import dev.slne.surf.roleplay.core.common.mechanics.rentable.StorageContainer -import dev.slne.surf.roleplay.core.common.mechanics.rentable.lockpick.LockPick -import dev.slne.surf.roleplay.core.common.mechanics.rentable.utils.Crackable +import dev.slne.surf.roleplay.paper.mechanics.rentable.Cracker +import dev.slne.surf.roleplay.paper.mechanics.rentable.Rentable +import dev.slne.surf.roleplay.paper.mechanics.rentable.StorageContainer +import dev.slne.surf.roleplay.paper.mechanics.rentable.lockpick.LockPick +import dev.slne.surf.roleplay.paper.mechanics.rentable.utils.Crackable import dev.slne.surf.roleplay.core.common.player.RpPlayer import kotlin.time.Duration diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/door/Door.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/door/Door.kt new file mode 100644 index 0000000..f7a1ff3 --- /dev/null +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/door/Door.kt @@ -0,0 +1,73 @@ +package dev.slne.surf.roleplay.paper.mechanics.rentable.door + +import com.github.shynixn.mccoroutine.folia.regionDispatcher +import dev.slne.surf.cloud.api.client.paper.toLocation +import dev.slne.surf.cloud.api.common.player.teleport.WorldLocation +import dev.slne.surf.roleplay.paper.mechanics.rentable.Cracker +import dev.slne.surf.roleplay.paper.mechanics.rentable.Rentable +import dev.slne.surf.roleplay.paper.mechanics.rentable.lockpick.LockPick +import dev.slne.surf.roleplay.paper.mechanics.rentable.utils.Crackable +import dev.slne.surf.roleplay.paper.mechanics.rentable.utils.DoorContainer +import dev.slne.surf.roleplay.paper.mechanics.rentable.utils.Lockable +import dev.slne.surf.roleplay.core.common.player.RpPlayer +import dev.slne.surf.roleplay.paper.plugin +import dev.slne.surf.surfapi.bukkit.api.util.getBlockAtAsync +import dev.slne.surf.surfapi.core.api.util.mapAsync +import kotlinx.coroutines.withContext +import org.bukkit.Location +import kotlin.collections.forEach +import kotlin.time.Duration +import org.bukkit.block.data.type.Door as DoorBlockData + +@Suppress("UnstableApiUsage") +abstract class Door( + val rentable: Rentable, + val container: DoorContainer, + val location: Location, + override val crackDuration: Duration +) : Lockable, Crackable { + + override var cracked: Boolean = false + + private suspend fun doorStateOperation( + door: Door, + operation: (DoorBlockData) -> Unit + ) { + val doorLocation = door.location + + withContext(plugin.regionDispatcher(doorLocation)) { + val doorBlock = doorLocation.world.getBlockAtAsync(doorLocation.toBlock()) + val doorBlockState = doorBlock.state + + if (doorBlockState is DoorBlockData) { + operation(doorBlockState) + doorBlockState.update(true, false) + } + } + } + + suspend fun open() { + container.doors.mapAsync { door -> + doorStateOperation(door) { state -> + state.isOpen = true + } + } + } + + suspend fun close() { + container.doors.mapAsync { door -> + doorStateOperation(door) { state -> + state.isOpen = false + } + } + } + + override fun canAccess(player: RpPlayer) = cracked || rentable.isMember(player) + + override suspend fun crack( + player: RpPlayer, + lockPick: LockPick + ) = Cracker.crack(player, this, lockPick) { + cracked = true + } +} \ No newline at end of file diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/door/doors/FrontDoor.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/door/doors/FrontDoor.kt new file mode 100644 index 0000000..942c593 --- /dev/null +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/door/doors/FrontDoor.kt @@ -0,0 +1,19 @@ +package dev.slne.surf.roleplay.paper.mechanics.rentable.door.doors + +import dev.slne.surf.cloud.api.common.player.teleport.WorldLocation +import dev.slne.surf.roleplay.paper.mechanics.rentable.Rentable +import dev.slne.surf.roleplay.paper.mechanics.rentable.door.Door +import dev.slne.surf.roleplay.paper.mechanics.rentable.utils.DoorContainer +import org.bukkit.Location +import kotlin.time.Duration.Companion.seconds + +class FrontDoor( + rentable: Rentable, + container: DoorContainer, + location: Location +) : Door( + rentable = rentable, + container = container, + location = location, + crackDuration = 30.seconds +) \ No newline at end of file diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/door/doors/GarageDoor.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/door/doors/GarageDoor.kt new file mode 100644 index 0000000..287263e --- /dev/null +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/door/doors/GarageDoor.kt @@ -0,0 +1,19 @@ +package dev.slne.surf.roleplay.paper.mechanics.rentable.door.doors + +import dev.slne.surf.cloud.api.common.player.teleport.WorldLocation +import dev.slne.surf.roleplay.paper.mechanics.rentable.Rentable +import dev.slne.surf.roleplay.paper.mechanics.rentable.door.Door +import dev.slne.surf.roleplay.paper.mechanics.rentable.utils.DoorContainer +import org.bukkit.Location +import kotlin.time.Duration.Companion.seconds + +class GarageDoor( + rentable: Rentable, + container: DoorContainer, + location: Location +) : Door( + rentable = rentable, + container = container, + location = location, + crackDuration = 15.seconds +) \ No newline at end of file diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/door/doors/RegularDoor.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/door/doors/RegularDoor.kt new file mode 100644 index 0000000..794710d --- /dev/null +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/door/doors/RegularDoor.kt @@ -0,0 +1,19 @@ +package dev.slne.surf.roleplay.paper.mechanics.rentable.door.doors + +import dev.slne.surf.cloud.api.common.player.teleport.WorldLocation +import dev.slne.surf.roleplay.paper.mechanics.rentable.Rentable +import dev.slne.surf.roleplay.paper.mechanics.rentable.door.Door +import dev.slne.surf.roleplay.paper.mechanics.rentable.utils.DoorContainer +import org.bukkit.Location +import kotlin.time.Duration.Companion.seconds + +class RegularDoor( + rentable: Rentable, + container: DoorContainer, + location: Location +) : Door( + rentable = rentable, + container = container, + location = location, + crackDuration = 15.seconds +) \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/events/RentableMemberAddEvent.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/events/RentableMemberAddEvent.kt similarity index 92% rename from surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/events/RentableMemberAddEvent.kt rename to surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/events/RentableMemberAddEvent.kt index da1edd2..3814b00 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/events/RentableMemberAddEvent.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/events/RentableMemberAddEvent.kt @@ -1,7 +1,7 @@ -package dev.slne.surf.roleplay.core.common.mechanics.rentable.events +package dev.slne.surf.roleplay.paper.mechanics.rentable.events import dev.slne.surf.cloud.api.common.event.CancellableCloudEvent -import dev.slne.surf.roleplay.core.common.mechanics.rentable.Rentable +import dev.slne.surf.roleplay.paper.mechanics.rentable.Rentable import dev.slne.surf.roleplay.core.common.player.RpPlayer /** diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/events/RentableMemberRemoveEvent.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/events/RentableMemberRemoveEvent.kt similarity index 92% rename from surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/events/RentableMemberRemoveEvent.kt rename to surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/events/RentableMemberRemoveEvent.kt index e97a41a..cc4f2cc 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/events/RentableMemberRemoveEvent.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/events/RentableMemberRemoveEvent.kt @@ -1,7 +1,7 @@ -package dev.slne.surf.roleplay.core.common.mechanics.rentable.events +package dev.slne.surf.roleplay.paper.mechanics.rentable.events import dev.slne.surf.cloud.api.common.event.CancellableCloudEvent -import dev.slne.surf.roleplay.core.common.mechanics.rentable.Rentable +import dev.slne.surf.roleplay.paper.mechanics.rentable.Rentable import dev.slne.surf.roleplay.core.common.player.RpPlayer /** diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/events/RentableOwnerChangeEvent.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/events/RentableOwnerChangeEvent.kt similarity index 92% rename from surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/events/RentableOwnerChangeEvent.kt rename to surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/events/RentableOwnerChangeEvent.kt index 5bc0e1c..fa03c9a 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/events/RentableOwnerChangeEvent.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/events/RentableOwnerChangeEvent.kt @@ -1,9 +1,10 @@ -package dev.slne.surf.roleplay.core.common.mechanics.rentable.events +package dev.slne.surf.roleplay.paper.mechanics.rentable.events import dev.slne.surf.cloud.api.common.event.CancellableCloudEvent -import dev.slne.surf.roleplay.core.common.mechanics.rentable.Rentable -import dev.slne.surf.roleplay.core.common.mechanics.rentable.RentableMechanic import dev.slne.surf.roleplay.core.common.player.RpPlayer +import dev.slne.surf.roleplay.paper.mechanics.rentable.Rentable +import dev.slne.surf.roleplay.paper.mechanics.rentable.RentableMechanic +import dev.slne.surf.surfapi.core.api.messages.adventure.buildText import dev.slne.surf.surfapi.core.api.messages.builder.SurfComponentBuilder /** @@ -54,7 +55,8 @@ class RentableOwnerChangeEvent( * * @property message A function that builds a message describing the failure reason. */ - sealed class OwnerSetFailureReason(val message: SurfComponentBuilder.() -> Unit) { + sealed class OwnerSetFailureReason(message: SurfComponentBuilder.() -> Unit) { + val message = buildText(message) /** * Indicates that the new owner is already a member of the rentable property. diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/events/RentableRentCollectEvent.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/events/RentableRentCollectEvent.kt similarity index 78% rename from surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/events/RentableRentCollectEvent.kt rename to surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/events/RentableRentCollectEvent.kt index 64f0528..2820276 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/events/RentableRentCollectEvent.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/events/RentableRentCollectEvent.kt @@ -1,7 +1,7 @@ -package dev.slne.surf.roleplay.core.common.mechanics.rentable.events +package dev.slne.surf.roleplay.paper.mechanics.rentable.events import dev.slne.surf.cloud.api.common.event.CancellableCloudEvent -import dev.slne.surf.roleplay.core.common.mechanics.rentable.Rentable +import dev.slne.surf.roleplay.paper.mechanics.rentable.Rentable /** * Event triggered when rent is collected from a rentable property. diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/listeners/RentCollectedListener.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/listeners/RentCollectedListener.kt index 60c0076..b2c0311 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/listeners/RentCollectedListener.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/listeners/RentCollectedListener.kt @@ -1,41 +1,36 @@ package dev.slne.surf.roleplay.paper.mechanics.rentable.listeners -import com.github.shynixn.mccoroutine.folia.entityDispatcher -import com.github.shynixn.mccoroutine.folia.launch -import dev.slne.surf.roleplay.core.common.mechanics.rentable.events.RentableRentCollectEvent -import dev.slne.surf.roleplay.paper.plugin +import dev.slne.surf.cloud.api.common.event.CloudEventHandler +import dev.slne.surf.roleplay.paper.mechanics.rentable.events.RentableRentCollectEvent import dev.slne.surf.surfapi.core.api.messages.adventure.playSound import dev.slne.surf.surfapi.core.api.messages.adventure.sendText +import net.kyori.adventure.sound.Sound.Source import org.bukkit.Sound -import org.bukkit.event.EventHandler -import org.bukkit.event.Listener import org.springframework.stereotype.Component +@Suppress("unused") @Component -class RentCollectedListener : Listener { +class RentCollectedListener { - @EventHandler + @CloudEventHandler fun onRentableRentCollect(event: RentableRentCollectEvent) { val rentable = event.rentable val player = rentable.owner?.cloudPlayer?.player ?: return - plugin.launch(plugin.entityDispatcher(player)) { - player.sendText { - appendPrefix() + player.sendText { + appendPrefix() - info("Du hast die Miete in Höhe von ") - variableValue("${event.amount} €") - info(" für deine Immobilie ") - append(rentable) - info(" bezahlt.") - } + info("Du hast die Miete in Höhe von ") + variableValue("${event.amount} €") + info(" für deine Immobilie ") + append(rentable) + info(" bezahlt.") + } - player.playSound(true) { - type(Sound.BLOCK_ANVIL_LAND) - volume(.5f) - source(net.kyori.adventure.sound.Sound.Source.BLOCK) - } + player.playSound(true) { + type(Sound.BLOCK_ANVIL_LAND) + volume(.5f) + source(Source.BLOCK) } } - } \ No newline at end of file diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/listeners/RentableListener.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/listeners/RentableListener.kt index abe5c6f..8464e39 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/listeners/RentableListener.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/listeners/RentableListener.kt @@ -1,122 +1,105 @@ package dev.slne.surf.roleplay.paper.mechanics.rentable.listeners -import com.github.shynixn.mccoroutine.folia.entityDispatcher -import com.github.shynixn.mccoroutine.folia.launch -import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.events.OwnerChangeReason -import dev.slne.surf.roleplay.core.common.mechanics.rentable.events.RentableMemberAddEvent -import dev.slne.surf.roleplay.core.common.mechanics.rentable.events.RentableMemberRemoveEvent -import dev.slne.surf.roleplay.core.common.mechanics.rentable.events.RentableOwnerChangeEvent -import dev.slne.surf.roleplay.paper.plugin +import dev.slne.surf.cloud.api.common.event.CloudEventHandler +import dev.slne.surf.roleplay.paper.mechanics.rentable.events.RentableMemberAddEvent +import dev.slne.surf.roleplay.paper.mechanics.rentable.events.RentableMemberRemoveEvent +import dev.slne.surf.roleplay.paper.mechanics.rentable.events.RentableOwnerChangeEvent +import dev.slne.surf.roleplay.paper.mechanics.rentable.events.RentableOwnerChangeEvent.OwnerChangeReason import dev.slne.surf.surfapi.core.api.messages.adventure.playSound import dev.slne.surf.surfapi.core.api.messages.adventure.sendText -import kotlinx.coroutines.withContext +import net.kyori.adventure.sound.Sound.Source import org.bukkit.Sound -import org.bukkit.event.EventHandler -import org.bukkit.event.Listener import org.springframework.stereotype.Component +@Suppress("unused") @Component -class RentableListener : Listener { +class RentableListener { - @EventHandler + @CloudEventHandler fun onRentableMemberAdd(event: RentableMemberAddEvent) { val rentable = event.rentable val members = event.rentable.members + val memberPlayer = event.member.cloudPlayer.player - plugin.launch { - val memberPlayer = event.member.cloudPlayer.player + if (memberPlayer != null) { + memberPlayer.sendText { + appendPrefix() - if (memberPlayer != null) { - withContext(plugin.entityDispatcher(memberPlayer)) { - memberPlayer.sendText { - appendPrefix() - - info("Du wurdest zu der Immobilie ") - append(rentable) - info(" hinzugefügt.") - } - - memberPlayer.playSound(true) { - type(Sound.ENTITY_VILLAGER_CELEBRATE) - volume(.5f) - source(net.kyori.adventure.sound.Sound.Source.NEUTRAL) - } - } + info("Du wurdest zu der Immobilie ") + append(rentable) + info(" hinzugefügt.") } - members.filterNot { it == event.member }.forEach { member -> - val memberPlayer = member.cloudPlayer.player ?: return@forEach + memberPlayer.playSound(true) { + type(Sound.ENTITY_VILLAGER_CELEBRATE) + volume(0.5f) + source(Source.NEUTRAL) + } + } - withContext(plugin.entityDispatcher(memberPlayer)) { - memberPlayer.sendText { - appendPrefix() + for (member in members) { + if (member == event.member) continue + val memberPlayer = member.cloudPlayer.player ?: continue + memberPlayer.sendText { + appendPrefix() - append(event.member.asComponent()) - info(" wurde zu der Immobilie ") - append(rentable) - info(" hinzugefügt.") - } + append(event.member) + info(" wurde zu der Immobilie ") + append(rentable) + info(" hinzugefügt.") + } - memberPlayer.playSound(true) { - type(Sound.ENTITY_VILLAGER_CELEBRATE) - volume(.5f) - source(net.kyori.adventure.sound.Sound.Source.NEUTRAL) - } - } + memberPlayer.playSound(true) { + type(Sound.ENTITY_VILLAGER_CELEBRATE) + volume(.5f) + source(Source.NEUTRAL) } } } - @EventHandler + @CloudEventHandler fun onRentableMemberRemove(event: RentableMemberRemoveEvent) { val rentable = event.rentable val members = event.rentable.members + val memberPlayer = event.member.cloudPlayer.player - plugin.launch { - val memberPlayer = event.member.cloudPlayer.player - - if (memberPlayer != null) { - withContext(plugin.entityDispatcher(memberPlayer)) { - memberPlayer.sendText { - appendPrefix() - - info("Du wurdest von der Immobilie ") - append(rentable) - info(" entfernt.") - } + if (memberPlayer != null) { + memberPlayer.sendText { + appendPrefix() - memberPlayer.playSound(true) { - type(Sound.ENTITY_VILLAGER_NO) - volume(.5f) - source(net.kyori.adventure.sound.Sound.Source.NEUTRAL) - } - } + info("Du wurdest von der Immobilie ") + append(rentable) + info(" entfernt.") } - members.filterNot { it == event.member }.forEach { member -> - val memberPlayer = member.cloudPlayer.player ?: return@forEach + memberPlayer.playSound(true) { + type(Sound.ENTITY_VILLAGER_NO) + volume(.5f) + source(Source.NEUTRAL) + } + } - withContext(plugin.entityDispatcher(memberPlayer)) { - memberPlayer.sendText { - appendPrefix() + for (member in members) { + if (member == event.member) continue + val memberPlayer = member.cloudPlayer.player ?: continue + memberPlayer.sendText { + appendPrefix() - append(event.member.asComponent()) - info(" wurde von der Immobilie ") - append(rentable) - info(" entfernt.") - } + append(event.member.asComponent()) + info(" wurde von der Immobilie ") + append(rentable) + info(" entfernt.") + } - memberPlayer.playSound(true) { - type(Sound.ENTITY_VILLAGER_NO) - volume(.5f) - source(net.kyori.adventure.sound.Sound.Source.NEUTRAL) - } - } + memberPlayer.playSound(true) { + type(Sound.ENTITY_VILLAGER_NO) + volume(.5f) + source(Source.NEUTRAL) } } } - @EventHandler + @CloudEventHandler fun onRentableOwnerChange(event: RentableOwnerChangeEvent) { val reason = event.reason val rentable = event.rentable @@ -127,53 +110,46 @@ class RentableListener : Listener { val newOwnerPlayer = newOwner?.cloudPlayer?.player val oldOwnerPlayer = oldOwner?.cloudPlayer?.player - plugin.launch { - if (newOwner != null && newOwnerPlayer != null) { - withContext(plugin.entityDispatcher(newOwnerPlayer)) { - newOwnerPlayer.sendText { - appendPrefix() - - success("Du bist jetzt der Eigentümer der Immobilie ") - append(rentable) - success(".") - - if (reason == OwnerChangeReason.RentableBought) { - info(" Du hast die Immobilie gemietet.") - } else if (reason is OwnerChangeReason.OwnerSetNewOwner) { - info(" Du wurdest als neuer Eigentümer gesetzt.") - } - } - - newOwnerPlayer.playSound(true) { - type(Sound.ENTITY_PLAYER_LEVELUP) - volume(.5f) - source(net.kyori.adventure.sound.Sound.Source.NEUTRAL) - } + if (newOwner != null && newOwnerPlayer != null) { + newOwnerPlayer.sendText { + appendPrefix() + + success("Du bist jetzt der Eigentümer der Immobilie ") + append(rentable) + success(".") + + if (reason == OwnerChangeReason.RentableBought) { + info(" Du hast die Immobilie gemietet.") + } else if (reason is OwnerChangeReason.OwnerSetNewOwner) { + info(" Du wurdest als neuer Eigentümer gesetzt.") } } - if (oldOwner != null && oldOwnerPlayer != null) { - withContext(plugin.entityDispatcher(oldOwnerPlayer)) { - oldOwnerPlayer.sendText { - appendPrefix() - - info("Du bist nicht mehr der Eigentümer der Immobilie ") - append(rentable) - info(".") - - if (reason is OwnerChangeReason.OwnerSetNewOwner) { - error(" Du wurdest als Eigentümer entfernt.") - } - } - - oldOwnerPlayer.playSound(true) { - type(Sound.ENTITY_VILLAGER_NO) - volume(.5f) - source(net.kyori.adventure.sound.Sound.Source.NEUTRAL) - } + newOwnerPlayer.playSound(true) { + type(Sound.ENTITY_PLAYER_LEVELUP) + volume(.5f) + source(Source.NEUTRAL) + } + } + + if (oldOwner != null && oldOwnerPlayer != null) { + oldOwnerPlayer.sendText { + appendPrefix() + + info("Du bist nicht mehr der Eigentümer der Immobilie ") + append(rentable) + info(".") + + if (reason is OwnerChangeReason.OwnerSetNewOwner) { + error(" Du wurdest als Eigentümer entfernt.") } } + + oldOwnerPlayer.playSound(true) { + type(Sound.ENTITY_VILLAGER_NO) + volume(.5f) + source(Source.NEUTRAL) + } } } - } \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/lockpick/LockPick.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/lockpick/LockPick.kt similarity index 73% rename from surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/lockpick/LockPick.kt rename to surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/lockpick/LockPick.kt index 2d0fc17..6d9a19e 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/lockpick/LockPick.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/lockpick/LockPick.kt @@ -1,12 +1,15 @@ -package dev.slne.surf.roleplay.core.common.mechanics.rentable.lockpick +package dev.slne.surf.roleplay.paper.mechanics.rentable.lockpick import dev.slne.surf.roleplay.core.common.player.RpPlayer +import dev.slne.surf.surfapi.core.api.messages.adventure.buildText import dev.slne.surf.surfapi.core.api.messages.builder.SurfComponentBuilder abstract class LockPick( - val displayName: SurfComponentBuilder.() -> Unit, + displayName: SurfComponentBuilder.() -> Unit, val breakChance: (RpPlayer) -> Double ) { + val displayName = buildText(displayName) + enum class LockPickResult { /** * The lockpick was successful. diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/lockpick/lockpicks/BatteringRam.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/lockpick/lockpicks/BatteringRam.kt new file mode 100644 index 0000000..d3efd41 --- /dev/null +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/lockpick/lockpicks/BatteringRam.kt @@ -0,0 +1,10 @@ +package dev.slne.surf.roleplay.paper.mechanics.rentable.lockpick.lockpicks + +import dev.slne.surf.roleplay.paper.mechanics.rentable.lockpick.LockPick + +object BatteringRam : LockPick( + displayName = { + primary("Rammbock") + }, + breakChance = { 0.0 } +) \ No newline at end of file diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/lockpick/lockpicks/PremiumLockPick.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/lockpick/lockpicks/PremiumLockPick.kt new file mode 100644 index 0000000..a6a3bf4 --- /dev/null +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/lockpick/lockpicks/PremiumLockPick.kt @@ -0,0 +1,10 @@ +package dev.slne.surf.roleplay.paper.mechanics.rentable.lockpick.lockpicks + +import dev.slne.surf.roleplay.paper.mechanics.rentable.lockpick.LockPick + +object PremiumLockPick : LockPick( + displayName = { + primary("Verzinkter Vierkantstahl Dietrich") + }, + breakChance = { 0.1 } +) \ No newline at end of file diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/lockpick/lockpicks/RegularLockPick.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/lockpick/lockpicks/RegularLockPick.kt new file mode 100644 index 0000000..58b8a21 --- /dev/null +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/lockpick/lockpicks/RegularLockPick.kt @@ -0,0 +1,10 @@ +package dev.slne.surf.roleplay.paper.mechanics.rentable.lockpick.lockpicks + +import dev.slne.surf.roleplay.paper.mechanics.rentable.lockpick.LockPick + +object RegularLockPick : LockPick( + displayName = { + primary("Dietrich") + }, + breakChance = { 0.5 } +) \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/rentables/Apartment.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/rentables/Apartment.kt similarity index 57% rename from surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/rentables/Apartment.kt rename to surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/rentables/Apartment.kt index a7262fc..66756db 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/rentables/Apartment.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/rentables/Apartment.kt @@ -1,8 +1,9 @@ -package dev.slne.surf.roleplay.core.common.mechanics.rentable.rentables +package dev.slne.surf.roleplay.paper.mechanics.rentable.rentables -import dev.slne.surf.roleplay.core.common.mechanics.rentable.Rentable -import dev.slne.surf.roleplay.core.common.mechanics.rentable.StorageContainer -import dev.slne.surf.roleplay.core.common.mechanics.rentable.utils.DoorContainer +import dev.slne.surf.roleplay.paper.mechanics.rentable.Rentable +import dev.slne.surf.roleplay.paper.mechanics.rentable.RentableMechanic +import dev.slne.surf.roleplay.paper.mechanics.rentable.StorageContainer +import dev.slne.surf.roleplay.paper.mechanics.rentable.utils.DoorContainer import dev.slne.surf.surfapi.core.api.util.mutableObjectSetOf import it.unimi.dsi.fastutil.objects.ObjectSet import net.kyori.adventure.key.Key @@ -14,6 +15,7 @@ class Apartment( rentDuration: Duration, size: Double, stories: Int, + mechanic: RentableMechanic, storageContainers: ObjectSet = mutableObjectSetOf(), doors: ObjectSet = mutableObjectSetOf() ) : Rentable( @@ -22,6 +24,7 @@ class Apartment( rentDuration, size, stories, + mechanic, storageContainers, doors ) \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/rentables/House.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/rentables/House.kt similarity index 56% rename from surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/rentables/House.kt rename to surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/rentables/House.kt index 17d93a6..66f629c 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/rentables/House.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/rentables/House.kt @@ -1,8 +1,9 @@ -package dev.slne.surf.roleplay.core.common.mechanics.rentable.rentables +package dev.slne.surf.roleplay.paper.mechanics.rentable.rentables -import dev.slne.surf.roleplay.core.common.mechanics.rentable.Rentable -import dev.slne.surf.roleplay.core.common.mechanics.rentable.StorageContainer -import dev.slne.surf.roleplay.core.common.mechanics.rentable.utils.DoorContainer +import dev.slne.surf.roleplay.paper.mechanics.rentable.Rentable +import dev.slne.surf.roleplay.paper.mechanics.rentable.RentableMechanic +import dev.slne.surf.roleplay.paper.mechanics.rentable.StorageContainer +import dev.slne.surf.roleplay.paper.mechanics.rentable.utils.DoorContainer import dev.slne.surf.surfapi.core.api.util.mutableObjectSetOf import it.unimi.dsi.fastutil.objects.ObjectSet import net.kyori.adventure.key.Key @@ -14,6 +15,7 @@ class House( rentDuration: Duration, size: Double, stories: Int, + mechanic: RentableMechanic, storageContainers: ObjectSet = mutableObjectSetOf(), doors: ObjectSet = mutableObjectSetOf() ) : Rentable( @@ -22,6 +24,7 @@ class House( rentDuration, size, stories, + mechanic, storageContainers, doors ) \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/utils/Crackable.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/utils/Crackable.kt similarity index 86% rename from surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/utils/Crackable.kt rename to surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/utils/Crackable.kt index 8278d4a..6c4c63b 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/utils/Crackable.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/utils/Crackable.kt @@ -1,6 +1,6 @@ -package dev.slne.surf.roleplay.core.common.mechanics.rentable.utils +package dev.slne.surf.roleplay.paper.mechanics.rentable.utils -import dev.slne.surf.roleplay.core.common.mechanics.rentable.lockpick.LockPick +import dev.slne.surf.roleplay.paper.mechanics.rentable.lockpick.LockPick import dev.slne.surf.roleplay.core.common.player.RpPlayer import kotlin.time.Duration diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/utils/DoorContainer.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/utils/DoorContainer.kt similarity index 63% rename from surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/utils/DoorContainer.kt rename to surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/utils/DoorContainer.kt index 209ba9f..045ddd9 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/utils/DoorContainer.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/utils/DoorContainer.kt @@ -1,6 +1,6 @@ -package dev.slne.surf.roleplay.core.common.mechanics.rentable.utils +package dev.slne.surf.roleplay.paper.mechanics.rentable.utils -import dev.slne.surf.roleplay.core.common.mechanics.rentable.door.Door +import dev.slne.surf.roleplay.paper.mechanics.rentable.door.Door import it.unimi.dsi.fastutil.objects.ObjectSet /** diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/utils/Lockable.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/utils/Lockable.kt similarity index 88% rename from surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/utils/Lockable.kt rename to surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/utils/Lockable.kt index 7bdfd00..4dfa378 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/rentable/utils/Lockable.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/utils/Lockable.kt @@ -1,4 +1,4 @@ -package dev.slne.surf.roleplay.core.common.mechanics.rentable.utils +package dev.slne.surf.roleplay.paper.mechanics.rentable.utils import dev.slne.surf.roleplay.core.common.player.RpPlayer diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/Weapon.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/weapon/Weapon.kt similarity index 58% rename from surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/Weapon.kt rename to surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/weapon/Weapon.kt index 70fc58d..8c49299 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/Weapon.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/weapon/Weapon.kt @@ -1,7 +1,8 @@ -package dev.slne.surf.roleplay.core.common.mechanics.weapon +package dev.slne.surf.roleplay.paper.mechanics.weapon -import dev.slne.surf.roleplay.core.common.mechanics.weapon.magazine.Magazine -import dev.slne.surf.roleplay.core.common.mechanics.weapon.utils.WeaponType +import dev.slne.surf.roleplay.paper.mechanics.weapon.magazine.Magazine +import dev.slne.surf.roleplay.paper.mechanics.weapon.utils.WeaponType +import dev.slne.surf.surfapi.core.api.messages.adventure.buildText import dev.slne.surf.surfapi.core.api.messages.builder.SurfComponentBuilder import dev.slne.surf.surfapi.core.api.util.objectSetOf import it.unimi.dsi.fastutil.objects.ObjectSet @@ -11,12 +12,12 @@ import kotlin.time.Duration.Companion.seconds abstract class Weapon( val type: WeaponType, - val weaponMaterial: Key, + val weaponItemType: Key, val name: String, - val displayName: SurfComponentBuilder.() -> Unit = { + displayName: SurfComponentBuilder.() -> Unit = { primary(name) }, - val description: SurfComponentBuilder.() -> Unit = { + description: SurfComponentBuilder.() -> Unit = { spacer("Eine ") append(displayName) spacer(" Waffe") @@ -24,5 +25,8 @@ abstract class Weapon( val weaponShootCooldown: Duration = 1.seconds, val supportedMagazines: ObjectSet = objectSetOf() ) { + val displayName = buildText(displayName) + val description = buildText(description) + fun isApplicableMagazine(magazine: Magazine) = magazine in supportedMagazines } \ No newline at end of file diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/weapon/WeaponMechanic.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/weapon/WeaponMechanic.kt new file mode 100644 index 0000000..2603a0b --- /dev/null +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/weapon/WeaponMechanic.kt @@ -0,0 +1,12 @@ +package dev.slne.surf.roleplay.paper.mechanics.weapon + +import dev.slne.surf.roleplay.paper.mechanics.AbstractMechanic +import dev.slne.surf.roleplay.paper.mechanics.Mechanic +import dev.slne.surf.surfapi.core.api.util.freeze +import dev.slne.surf.surfapi.core.api.util.mutableObjectSetOf + +@Mechanic +class WeaponMechanic : AbstractMechanic("WeaponMechanic") { + private val _weapons = mutableObjectSetOf() + val weapons = _weapons.freeze() +} \ No newline at end of file diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/weapon/magazine/Magazine.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/weapon/magazine/Magazine.kt new file mode 100644 index 0000000..616f33f --- /dev/null +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/weapon/magazine/Magazine.kt @@ -0,0 +1,21 @@ +package dev.slne.surf.roleplay.paper.mechanics.weapon.magazine + +import dev.slne.surf.surfapi.core.api.messages.adventure.buildText +import dev.slne.surf.surfapi.core.api.messages.builder.SurfComponentBuilder + +abstract class Magazine( + val name: String, + displayName: SurfComponentBuilder.() -> Unit = { + primary(name) + }, + description: SurfComponentBuilder.() -> Unit = { + spacer("Ein ") + append(displayName) + spacer(" Magazin") + }, + val maxAmmo: Int, + val damageFunction: (Double) -> Double +) { + val displayName = buildText(displayName) + val description = buildText(description) +} \ No newline at end of file diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/weapon/magazine/PlayerMagazine.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/weapon/magazine/PlayerMagazine.kt new file mode 100644 index 0000000..4f274e7 --- /dev/null +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/weapon/magazine/PlayerMagazine.kt @@ -0,0 +1,6 @@ +package dev.slne.surf.roleplay.paper.mechanics.weapon.magazine + +class PlayerMagazine(val magazine: Magazine) { + var currentAmmo = magazine.maxAmmo + private set +} \ No newline at end of file diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/weapon/player/PlayerWeapon.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/weapon/player/PlayerWeapon.kt new file mode 100644 index 0000000..ae98484 --- /dev/null +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/weapon/player/PlayerWeapon.kt @@ -0,0 +1,13 @@ +package dev.slne.surf.roleplay.paper.mechanics.weapon.player + +import dev.slne.surf.roleplay.paper.mechanics.weapon.Weapon +import dev.slne.surf.roleplay.paper.mechanics.weapon.magazine.PlayerMagazine + +class PlayerWeapon(val weapon: Weapon) { + var currentMagazine: PlayerMagazine? = null + private set + + fun setCurrentMagazine(magazine: PlayerMagazine?) { + currentMagazine = magazine + } +} \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/utils/WeaponType.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/weapon/utils/WeaponType.kt similarity index 74% rename from surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/utils/WeaponType.kt rename to surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/weapon/utils/WeaponType.kt index 0c6f12b..e7e7083 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/weapon/utils/WeaponType.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/weapon/utils/WeaponType.kt @@ -1,4 +1,4 @@ -package dev.slne.surf.roleplay.core.common.mechanics.weapon.utils +package dev.slne.surf.roleplay.paper.mechanics.weapon.utils enum class WeaponType { PISTOL, diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/PaperRpPlayer.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/PaperRpPlayer.kt new file mode 100644 index 0000000..8b2ad58 --- /dev/null +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/PaperRpPlayer.kt @@ -0,0 +1,6 @@ +package dev.slne.surf.roleplay.paper.player + +import dev.slne.surf.roleplay.core.common.player.RpPlayer +import java.util.UUID + +class PaperRpPlayer(uuid: UUID) : RpPlayer(uuid) \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-client/src/main/kotlin/dev/slne/surf/roleplay/core/client/player/ClientRpPlayerManager.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/PaperRpPlayerManager.kt similarity index 71% rename from surf-roleplay-core/surf-roleplay-core-client/src/main/kotlin/dev/slne/surf/roleplay/core/client/player/ClientRpPlayerManager.kt rename to surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/PaperRpPlayerManager.kt index d355049..580ccd7 100644 --- a/surf-roleplay-core/surf-roleplay-core-client/src/main/kotlin/dev/slne/surf/roleplay/core/client/player/ClientRpPlayerManager.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/PaperRpPlayerManager.kt @@ -1,15 +1,15 @@ -package dev.slne.surf.roleplay.core.client.player +package dev.slne.surf.roleplay.paper.player import dev.slne.surf.roleplay.core.common.player.RpPlayerManager import dev.slne.surf.roleplay.core.common.player.identity.RpIdentity -import dev.slne.surf.roleplay.core.common.util.InternalRoleplayApi +import dev.slne.surf.surfapi.bukkit.api.extensions.server import org.springframework.stereotype.Component import java.util.* -@OptIn(InternalRoleplayApi::class) @Component -class ClientRpPlayerManager : RpPlayerManager() { - override fun createPlayer(uuid: UUID) = ClientRpPlayer(uuid) +class PaperRpPlayerManager : RpPlayerManager() { + override fun createPlayer(uuid: UUID) = PaperRpPlayer(uuid) + override fun onlineUuids() = server.onlinePlayers.map { it.uniqueId }.toSet() override suspend fun fetchIdentities(uuid: UUID): Set { TODO("Not yet implemented") diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/events/RpPlayerJoinEvent.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/events/RpPlayerJoinEvent.kt similarity index 78% rename from surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/events/RpPlayerJoinEvent.kt rename to surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/events/RpPlayerJoinEvent.kt index 533ab5d..6b51915 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/events/RpPlayerJoinEvent.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/events/RpPlayerJoinEvent.kt @@ -1,4 +1,4 @@ -package dev.slne.surf.roleplay.core.common.player.events +package dev.slne.surf.roleplay.paper.player.events import dev.slne.surf.cloud.api.common.event.CloudEvent import dev.slne.surf.roleplay.core.common.player.RpPlayer diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/events/RpPlayerQuitEvent.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/events/RpPlayerQuitEvent.kt similarity index 78% rename from surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/events/RpPlayerQuitEvent.kt rename to surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/events/RpPlayerQuitEvent.kt index c4e7029..6fe8280 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/events/RpPlayerQuitEvent.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/events/RpPlayerQuitEvent.kt @@ -1,4 +1,4 @@ -package dev.slne.surf.roleplay.core.common.player.events +package dev.slne.surf.roleplay.paper.player.events import dev.slne.surf.cloud.api.common.event.CloudEvent import dev.slne.surf.roleplay.core.common.player.RpPlayer diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/identity/listener/IdentityOnlineListener.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/identity/listener/IdentityOnlineListener.kt index 02261eb..1ee8f34 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/identity/listener/IdentityOnlineListener.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/identity/listener/IdentityOnlineListener.kt @@ -1,7 +1,7 @@ package dev.slne.surf.roleplay.paper.player.identity.listener import com.github.shynixn.mccoroutine.folia.launch -import dev.slne.surf.roleplay.core.common.player.events.RpPlayerJoinEvent +import dev.slne.surf.roleplay.paper.player.events.RpPlayerJoinEvent import dev.slne.surf.roleplay.paper.player.identity.dialogs.createIdentitySelectorDialog import dev.slne.surf.roleplay.paper.plugin import org.bukkit.event.EventHandler diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/LicenseNpc.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/LicenseNpc.kt index 454887c..2c045ef 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/LicenseNpc.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/LicenseNpc.kt @@ -2,11 +2,20 @@ package dev.slne.surf.roleplay.paper.player.license import dev.slne.surf.npc.api.dsl.npc import dev.slne.surf.npc.api.surfNpcApi +import dev.slne.surf.roleplay.core.common.RpLifecycle import dev.slne.surf.roleplay.paper.plugin +import org.springframework.stereotype.Component -object LicenseNpc { +@Component +class LicenseNpc: RpLifecycle { - const val NPC_NAME = "license_npc" + companion object { + const val NPC_NAME = "license_npc" + } + + override suspend fun onEnable() { + spawnNpc() + } suspend fun spawnNpc() { val npcSkin = surfNpcApi.getSkin("CastCrafter") diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/dialogs/BuyLicenseDialog.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/dialogs/BuyLicenseDialog.kt index 51be21a..c46ff64 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/dialogs/BuyLicenseDialog.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/dialogs/BuyLicenseDialog.kt @@ -180,7 +180,7 @@ private fun cannotBuyLicenseNotice( appendNewline(2) } - unobtainableReason.message(this) + append(unobtainableReason.message) } } } diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/player-utils.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/player-utils.kt index 817f31c..c59218f 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/player-utils.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/player-utils.kt @@ -1,7 +1,6 @@ package dev.slne.surf.roleplay.paper.player -import dev.slne.surf.cloud.api.client.paper.player.toCloudOfflinePlayer -import dev.slne.surf.roleplay.api.common.player.RpPlayer +import dev.slne.surf.roleplay.core.common.player.RpPlayer import org.bukkit.OfflinePlayer -val OfflinePlayer.rpPlayer get() = RpPlayer[this.toCloudOfflinePlayer()] \ No newline at end of file +val OfflinePlayer.rpPlayer get() = RpPlayer[uniqueId] as PaperRpPlayer diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/utils/RpPacketListener.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/spring/RpPacketListener.kt similarity index 84% rename from surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/utils/RpPacketListener.kt rename to surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/spring/RpPacketListener.kt index 6b1a600..e7da892 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/mechanics/utils/RpPacketListener.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/spring/RpPacketListener.kt @@ -1,4 +1,4 @@ -package dev.slne.surf.roleplay.core.common.mechanics.utils +package dev.slne.surf.roleplay.paper.spring import com.github.retrooper.packetevents.event.PacketListenerPriority import org.springframework.stereotype.Component diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/spring/postprocessor/BukkitListenerPostProcessor.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/spring/postprocessor/BukkitListenerPostProcessor.kt index f81f11d..df101a1 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/spring/postprocessor/BukkitListenerPostProcessor.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/spring/postprocessor/BukkitListenerPostProcessor.kt @@ -1,13 +1,14 @@ package dev.slne.surf.roleplay.paper.spring.postprocessor import dev.slne.surf.cloud.api.common.util.mutableObjectSetOf +import dev.slne.surf.roleplay.core.common.RpLifecycle import dev.slne.surf.surfapi.bukkit.api.event.register import org.bukkit.event.Listener import org.springframework.beans.factory.config.BeanPostProcessor import org.springframework.stereotype.Component @Component -class BukkitListenerPostProcessor : BeanPostProcessor { +class BukkitListenerPostProcessor : BeanPostProcessor, RpLifecycle { private val watched = mutableObjectSetOf() @@ -18,8 +19,8 @@ class BukkitListenerPostProcessor : BeanPostProcessor { return bean } - - fun registerListeners() { + + override suspend fun onEnable() { for (listener in watched) { listener.register() } diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/spring/postprocessor/PacketListenerPostProcessor.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/spring/postprocessor/PacketListenerPostProcessor.kt index b1116a9..99ac801 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/spring/postprocessor/PacketListenerPostProcessor.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/spring/postprocessor/PacketListenerPostProcessor.kt @@ -1,15 +1,16 @@ package dev.slne.surf.roleplay.paper.spring.postprocessor -import com.github.retrooper.packetevents.PacketEvents import com.github.retrooper.packetevents.event.PacketListener import dev.slne.surf.cloud.api.common.util.findAnnotation import dev.slne.surf.cloud.api.common.util.object2ObjectMapOf -import dev.slne.surf.roleplay.core.common.mechanics.utils.RpPacketListener +import dev.slne.surf.roleplay.core.common.RpLifecycle +import dev.slne.surf.roleplay.paper.spring.RpPacketListener +import dev.slne.surf.surfapi.core.api.extensions.packetEvents import org.springframework.beans.factory.config.BeanPostProcessor import org.springframework.stereotype.Component @Component -class PacketListenerPostProcessor : BeanPostProcessor { +class PacketListenerPostProcessor : BeanPostProcessor, RpLifecycle { private val packetListeners = object2ObjectMapOf() override fun postProcessAfterInitialization(bean: Any, beanName: String): Any { @@ -24,8 +25,8 @@ class PacketListenerPostProcessor : BeanPostProcessor { return bean } - fun registerListeners() { - val eventManager = PacketEvents.getAPI().eventManager + override suspend fun onEnable() { + val eventManager = packetEvents.eventManager packetListeners.forEach { (listener, annotation) -> eventManager.registerListener(listener, annotation.priority) diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/PluginBootstrap.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/PluginBootstrap.kt index 25e1dc2..ad5a762 100644 --- a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/PluginBootstrap.kt +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/PluginBootstrap.kt @@ -5,11 +5,10 @@ import dev.slne.surf.cloud.api.common.startSpringApplication import dev.slne.surf.cloud.api.server.plugin.bootstrap.BootstrapContext import dev.slne.surf.cloud.api.server.plugin.bootstrap.StandalonePluginBootstrap import dev.slne.surf.roleplay.RoleplayApplication -import dev.slne.surf.roleplay.core.common.ContextHolderImpl class PluginBootstrap : StandalonePluginBootstrap { override suspend fun bootstrap(context: BootstrapContext) { - ContextHolderImpl.instance.context = + ContextHolder.instance.context = CloudInstance.startSpringApplication(RoleplayApplication::class) } } \ No newline at end of file diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/mechanics/idcard/IdCardMechanicImpl.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/mechanics/idcard/IdCardMechanicImpl.kt deleted file mode 100644 index 83de91a..0000000 --- a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/mechanics/idcard/IdCardMechanicImpl.kt +++ /dev/null @@ -1,7 +0,0 @@ -package dev.slne.surf.roleplay.server.mechanics.idcard - -import dev.slne.surf.roleplay.core.common.mechanics.idcard.IdCardMechanic -import dev.slne.surf.roleplay.core.common.mechanics.utils.RpMechanic - -@RpMechanic -class IdCardMechanicImpl() : IdCardMechanic() \ No newline at end of file diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/LicenseExpirationJob.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/LicenseExpirationJob.kt index 30380ae..755883a 100644 --- a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/LicenseExpirationJob.kt +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/LicenseExpirationJob.kt @@ -4,7 +4,6 @@ package dev.slne.surf.roleplay.server.player.license import dev.slne.surf.roleplay.core.common.player.license.LicenseService import dev.slne.surf.roleplay.core.common.player.license.utils.LicenseRemovedReason -import dev.slne.surf.roleplay.core.common.util.InternalRoleplayApi import org.springframework.scheduling.annotation.Scheduled import org.springframework.stereotype.Component import java.util.concurrent.TimeUnit diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/LicenseServiceImpl.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/LicenseServiceImpl.kt index 3a7f2a3..ea6949a 100644 --- a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/LicenseServiceImpl.kt +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/LicenseServiceImpl.kt @@ -1,4 +1,4 @@ -package dev.slne.surf.roleplay.core.player.license +package dev.slne.surf.roleplay.server.player.license import com.google.auto.service.AutoService import dev.slne.surf.roleplay.api.player.RpPlayer From cb9ab4e409b95708295aca8d17cd86103554b78f Mon Sep 17 00:00:00 2001 From: twisti Date: Sat, 23 Aug 2025 10:35:49 +0200 Subject: [PATCH 08/11] Remove `PaperRpInstance` and refactor `RpInstance` to simplify lifecycle handling. --- .../surf/roleplay/core/common/RpInstance.kt | 11 ---------- .../surf/roleplay/paper/PaperRpInstance.kt | 21 ------------------- 2 files changed, 32 deletions(-) delete mode 100644 surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/PaperRpInstance.kt diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/RpInstance.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/RpInstance.kt index e3bc9aa..adeee83 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/RpInstance.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/RpInstance.kt @@ -2,35 +2,24 @@ package dev.slne.surf.roleplay.core.common import dev.slne.surf.cloud.api.common.util.forEachAnnotationOrdered import dev.slne.surf.cloud.api.common.util.forEachAnnotationOrderedReversed -import dev.slne.surf.roleplay.core.common.mechanics.MechanicRegistry import org.springframework.beans.factory.ObjectProvider -import org.springframework.beans.factory.annotation.Autowired import org.springframework.stereotype.Component import javax.annotation.OverridingMethodsMustInvokeSuper @Component class RpInstance(private val lifecycles: ObjectProvider) { - @Autowired - private lateinit var mechanicRegistry: MechanicRegistry - suspend fun onLoad() { lifecycles.forEachAnnotationOrdered { it.onLoad() } - - mechanicRegistry.loadMechanics() } suspend fun onEnable() { lifecycles.forEachAnnotationOrdered { it.onEnable() } - - mechanicRegistry.enableMechanics() } @OverridingMethodsMustInvokeSuper suspend fun onDisable() { lifecycles.forEachAnnotationOrderedReversed { it.onDisable() } - - mechanicRegistry.disableMechanics() } } \ No newline at end of file diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/PaperRpInstance.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/PaperRpInstance.kt deleted file mode 100644 index 81a7877..0000000 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/PaperRpInstance.kt +++ /dev/null @@ -1,21 +0,0 @@ -package dev.slne.surf.roleplay.paper - -import dev.slne.surf.roleplay.core.common.RpInstance -import dev.slne.surf.roleplay.paper.spring.postprocessor.BukkitListenerPostProcessor -import dev.slne.surf.roleplay.paper.spring.postprocessor.PacketListenerPostProcessor -import org.springframework.stereotype.Component - -@Component -class PaperRpInstance( - commonMechanicRegistry: MechanicRegistry, - private val bukkitListenerPostProcessor: BukkitListenerPostProcessor, - private val packetListenerPostProcessor: PacketListenerPostProcessor -) : RpInstance(commonMechanicRegistry) { - - override suspend fun onEnable() { - super.onEnable() - - bukkitListenerPostProcessor.registerListeners() - packetListenerPostProcessor.registerListeners() - } -} \ No newline at end of file From 2ee9eca323036fd6f28b33e687869d6890b3b6c2 Mon Sep 17 00:00:00 2001 From: twisti Date: Sat, 23 Aug 2025 19:31:59 +0200 Subject: [PATCH 09/11] Add `ServerRpPlayer` and `RpPlayerRepository` for server-side player management. Refactor license and identity management. --- .../surf/roleplay/core/common/RpInstance.kt | 1 - .../roleplay/core/common/player/RpPlayer.kt | 179 +++----------- .../core/common/player/RpPlayerManager.kt | 12 +- .../identity/create/RpIdentityCreationData.kt | 37 +++ .../identity/update/RpIdentityUpdateData.kt | 38 +++ .../core/common/player/license/License.kt | 80 ------ .../common/player/license/LicenseService.kt | 2 +- .../player/license/NetworkIdentityLicense.kt | 14 ++ .../civilian/CivilianVehicleLicense.kt | 110 --------- .../civilian/CivilianWeaponLicense.kt | 35 --- .../license/utils/LicenseCreateResult.kt | 10 - .../core/common/transaction/RpTransaction.kt | 50 +--- .../idcard/dialogs/CreateIdDialog.kt | 2 +- .../roleplay/paper/player/PaperRpPlayer.kt | 140 ++++++++++- .../paper/player/PaperRpPlayerManager.kt | 24 +- .../player/identity/PaperIdentityService.kt | 30 +++ .../paper}/player/identity/RpIdentity.kt | 53 ++-- .../identity/identities/CivilianIdentity.kt | 4 +- .../identity/identities/PoliceIdentity.kt | 4 +- .../identities/RescueServiceIdentity.kt | 4 +- .../paper}/player/license/ExpirableLicense.kt | 2 +- .../paper}/player/license/HasLicenses.kt | 16 +- .../paper}/player/license/IdentityLicense.kt | 39 +-- .../roleplay/paper/player/license/License.kt | 70 ++++++ .../paper/player/license/LicenseNpc.kt | 4 +- .../license/LicensePermissionRegistry.kt | 2 +- .../player/license/PaperLicenseService.kt | 54 ++++ .../license/dialogs/BuyLicenseDialog.kt | 4 +- .../player/license/dialogs/LicenseDialog.kt | 2 +- .../player/license/dialogs/MyLicenseDialog.kt | 2 +- .../events/RpPlayerLicenseAddedEvent.kt | 6 +- .../events/RpPlayerLicenseRemovedEvent.kt | 8 +- .../civilian/CivilianFishingLicense.kt | 4 +- .../civilian/CivilianVehicleLicenses.kt | 106 ++++++++ .../civilian/CivilianWeaponLicenses.kt | 33 +++ .../license/listeners/LicenseBuyHandler.kt | 21 +- .../listeners/LicenseChangedHandler.kt | 57 ++--- .../license/utils/LicenseCreateResult.kt | 10 + .../license/utils/LicenseRemovedReason.kt | 4 +- .../license/utils/UnobtainableReason.kt | 7 +- .../surf/roleplay/server/PluginBootstrap.kt | 2 +- .../server/player/RpPlayerManagerImpl.kt | 107 ++------ .../roleplay/server/player/RpPlayerService.kt | 11 + .../roleplay/server/player/ServerRpPlayer.kt | 7 + .../server/player/db/RpPlayerModel.kt | 2 +- .../server/player/db/RpPlayerRepository.kt | 115 +++++++++ .../server/player/db/RpPlayerTable.kt | 16 +- .../identity/db/RpPlayerIdentityBaseModel.kt | 17 +- .../identity/db/RpPlayerIdentityBaseTable.kt | 13 +- .../civilian/RpPlayerCivilianIdentityModel.kt | 30 +-- .../police/RpPlayerPoliceIdentityModel.kt | 35 +-- .../RpPlayerRescueServiceIdentityModel.kt | 32 +-- .../RpPlayerRescueServiceIdentityTable.kt | 5 +- .../player/license/LicenseServiceImpl.kt | 230 ++++++++---------- .../player/license/db/IdentityLicenseModel.kt | 7 + .../player/license/db/IdentityLicenseTable.kt | 8 +- .../player/license/db/LicenseRepository.kt | 53 ++++ 57 files changed, 1054 insertions(+), 916 deletions(-) create mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/create/RpIdentityCreationData.kt create mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/update/RpIdentityUpdateData.kt delete mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/License.kt create mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/NetworkIdentityLicense.kt delete mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/licenses/civilian/CivilianVehicleLicense.kt delete mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/licenses/civilian/CivilianWeaponLicense.kt delete mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/utils/LicenseCreateResult.kt create mode 100644 surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/identity/PaperIdentityService.kt rename {surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common => surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper}/player/identity/RpIdentity.kt (78%) rename {surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common => surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper}/player/identity/identities/CivilianIdentity.kt (85%) rename {surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common => surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper}/player/identity/identities/PoliceIdentity.kt (87%) rename {surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common => surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper}/player/identity/identities/RescueServiceIdentity.kt (86%) rename {surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common => surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper}/player/license/ExpirableLicense.kt (92%) rename {surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common => surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper}/player/license/HasLicenses.kt (80%) rename {surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common => surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper}/player/license/IdentityLicense.kt (57%) create mode 100644 surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/License.kt rename {surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common => surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper}/player/license/LicensePermissionRegistry.kt (77%) create mode 100644 surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/PaperLicenseService.kt rename {surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common => surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper}/player/license/events/RpPlayerLicenseAddedEvent.kt (62%) rename {surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common => surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper}/player/license/events/RpPlayerLicenseRemovedEvent.kt (53%) rename {surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common => surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper}/player/license/licenses/civilian/CivilianFishingLicense.kt (76%) create mode 100644 surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/licenses/civilian/CivilianVehicleLicenses.kt create mode 100644 surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/licenses/civilian/CivilianWeaponLicenses.kt create mode 100644 surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/utils/LicenseCreateResult.kt rename {surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common => surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper}/player/license/utils/LicenseRemovedReason.kt (93%) rename {surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common => surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper}/player/license/utils/UnobtainableReason.kt (88%) create mode 100644 surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/RpPlayerService.kt create mode 100644 surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/ServerRpPlayer.kt create mode 100644 surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/db/RpPlayerRepository.kt create mode 100644 surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/db/LicenseRepository.kt diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/RpInstance.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/RpInstance.kt index adeee83..ac8691d 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/RpInstance.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/RpInstance.kt @@ -17,7 +17,6 @@ class RpInstance(private val lifecycles: ObjectProvider) { lifecycles.forEachAnnotationOrdered { it.onEnable() } } - @OverridingMethodsMustInvokeSuper suspend fun onDisable() { lifecycles.forEachAnnotationOrderedReversed { it.onDisable() } } diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/RpPlayer.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/RpPlayer.kt index fc8c729..bf8c037 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/RpPlayer.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/RpPlayer.kt @@ -3,155 +3,27 @@ package dev.slne.surf.roleplay.core.common.player import dev.slne.surf.cloud.api.common.player.OfflineCloudPlayer import dev.slne.surf.cloud.api.common.player.toOfflineCloudPlayer import dev.slne.surf.roleplay.RoleplayApplication -import dev.slne.surf.roleplay.core.common.player.identity.RpIdentity -import dev.slne.surf.roleplay.core.common.player.identity.RpIdentityType -import dev.slne.surf.roleplay.core.common.player.identity.identities.CivilianIdentity -import dev.slne.surf.roleplay.core.common.player.license.HasLicenses -import dev.slne.surf.roleplay.core.common.player.license.License -import dev.slne.surf.roleplay.core.common.player.license.utils.LicenseRemovedReason import dev.slne.surf.roleplay.core.common.transaction.HasRpTransactions -import dev.slne.surf.roleplay.core.common.transaction.utils.BalanceType -import dev.slne.surf.surfapi.core.api.messages.adventure.appendNewline -import dev.slne.surf.surfapi.core.api.messages.adventure.buildText -import dev.slne.surf.surfapi.core.api.util.freeze -import dev.slne.surf.surfapi.core.api.util.mutableObjectSetOf +import kotlinx.serialization.KSerializer +import kotlinx.serialization.Serializable +import kotlinx.serialization.descriptors.buildClassSerialDescriptor +import kotlinx.serialization.descriptors.element +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder import net.kyori.adventure.text.ComponentLike import org.springframework.beans.factory.getBean import java.time.ZonedDateTime import java.util.* +@Serializable(with = RpPlayerSerializer::class) abstract class RpPlayer( - private val uuid: UUID, + val uuid: UUID, var createdAt: ZonedDateTime = ZonedDateTime.now(), var updatedAt: ZonedDateTime = ZonedDateTime.now() -) : HasRpTransactions, HasLicenses, ComponentLike { - +) : HasRpTransactions, ComponentLike { val cloudPlayer: OfflineCloudPlayer get() = uuid.toOfflineCloudPlayer() - private val _identities = mutableObjectSetOf() // TODO: 22.08.2025 20:31 - replace with cloud cache soon - val identities = _identities.freeze() - - var activeIdentity: RpIdentity? = null - - private val playerService get() = RoleplayApplication.context.getBean() - - suspend fun fetchIdentities() { - val fetched = playerService.fetchIdentities(uuid) - - _identities.clear() - _identities.addAll(fetched) - } - - fun setActiveIdentity(identity: RpIdentity) { - if (!_identities.contains(identity)) { - error("Tried to set an active identity that is not part of the player's identities: $identity") - } - - activeIdentity = identity - } - - fun addIdentity(identity: RpIdentity) = _identities.add(identity) - - suspend fun createIdentity(identity: T) = - playerService.createIdentity(identity) - - suspend fun updateIdentity(identity: T) = - playerService.updateIdentity(identity) - - suspend fun createOrUpdateIdentity(identity: T) = - playerService.createOrUpdateIdentity(identity) - - @Suppress("UNCHECKED_CAST") - fun getIdentity(type: RpIdentityType) = - _identities.firstOrNull { it.type == type } - ?: error("No identity of type $type found for player $uuid") - - override suspend fun getBalance(balanceType: BalanceType) = - activeIdentity?.getBalance(balanceType) - ?: error("Tried accessing balance of a player without an active identity $uuid") - - override suspend fun addBalance( - balanceType: BalanceType, - amount: Int - ) = activeIdentity?.addBalance(balanceType, amount) - ?: error("Tried adding balance to a player without an active identity $uuid") - - override suspend fun removeBalance( - balanceType: BalanceType, - amount: Int - ) = activeIdentity?.removeBalance(balanceType, amount) - ?: error("Tried removing balance from a player without an active identity $uuid") - - override suspend fun getBalanceHistory( - balanceType: BalanceType, - limit: Int - ) = activeIdentity?.getBalanceHistory(balanceType, limit) - ?: error("Tried accessing balance history of a player without an active identity $uuid") - - fun getIdentity(clazz: Class) = identities.firstOrNull { - clazz.isAssignableFrom(it.javaClass) - } - - fun hasCompletedCitizenship() = getIdentity() != null - - override val licenses - get() = activeIdentity?.licenses - ?: error("Tried accessing licenses of a player without an active identity $uuid") - - override suspend fun addLicense(license: License) = - activeIdentity?.addLicense(license) - ?: error("Tried adding a license to a player without an active identity $uuid") - - override suspend fun removeLicense( - license: License, - reason: LicenseRemovedReason - ) = activeIdentity?.removeLicense(license, reason) - ?: error("Tried removing a license from a player without an active identity $uuid") - - override fun getLicense(license: Class) = - activeIdentity?.getLicense(license) - - override suspend fun confiscateLicense( - identity: RpIdentity, - license: License, - confiscatedBy: RpPlayer, - confiscatedReason: String - ) = activeIdentity?.confiscateLicense( - identity, - license, - confiscatedBy, - confiscatedReason - ) - ?: error("Tried confiscating a license from a player without an active identity $uuid") - - override fun asComponent() = buildText { - val activeIdentity = activeIdentity - val name = cloudPlayer.player?.name - - if (activeIdentity == null) { - variableKey(name ?: uuid.toString()) - - return@buildText - } - - val firstName = activeIdentity.firstName - val lastName = activeIdentity.lastName - - variableValue("$firstName $lastName") - - hoverEvent(buildText { - variableKey("UUID: ") - variableValue(uuid.toString()) - appendNewline(2) - - name?.let { - variableKey("Username: ") - variableValue(it) - } - }) - } - override fun equals(other: Any?): Boolean { if (this === other) return true if (other !is RpPlayer) return false @@ -175,17 +47,32 @@ abstract class RpPlayer( } -/** - * Gets the [RpIdentity] of the specified type for this [RpPlayer]. - * - * @param T The type of the identity to retrieve. - * @return The identity of the specified type, or `null` if not found. - */ -inline fun RpPlayer.getIdentity() = getIdentity(T::class.java) - /** * Gets the [RpPlayer] associated with this [OfflineCloudPlayer]. * * @return The [RpPlayer] instance for this player. */ -fun OfflineCloudPlayer.rpPlayer() = RpPlayer[this] \ No newline at end of file +fun OfflineCloudPlayer.rpPlayer() = RpPlayer[this] + +object RpPlayerSerializer : KSerializer { + override val descriptor = buildClassSerialDescriptor("RpPlayer") { + element("mostSigBits") + element("leastSigBits") + } + + override fun serialize( + encoder: Encoder, + value: RpPlayer + ) { + val uuid = value.uuid + encoder.encodeLong(uuid.mostSignificantBits) + encoder.encodeLong(uuid.leastSignificantBits) + } + + override fun deserialize(decoder: Decoder): RpPlayer { + val mostSigBits = decoder.decodeLong() + val leastSigBits = decoder.decodeLong() + val uuid = UUID(mostSigBits, leastSigBits) + return RpPlayer[uuid] + } +} \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/RpPlayerManager.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/RpPlayerManager.kt index ab71e83..499480b 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/RpPlayerManager.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/RpPlayerManager.kt @@ -2,7 +2,7 @@ package dev.slne.surf.roleplay.core.common.player import com.github.benmanes.caffeine.cache.Caffeine import com.sksamuel.aedile.core.expireAfterAccess -import dev.slne.surf.roleplay.core.common.player.identity.RpIdentity +import dev.slne.surf.surfapi.core.api.util.toObjectList import org.springframework.scheduling.annotation.Scheduled import org.springframework.stereotype.Component import java.util.* @@ -17,17 +17,13 @@ abstract class RpPlayerManager { .expireAfterAccess(30.minutes) .build { createPlayer(it) } + val players get() = cache.asMap().values.toObjectList() + abstract fun createPlayer(uuid: UUID): RpPlayer - abstract fun onlineUuids(): Set + abstract fun onlineUuids(): List fun getPlayerByUuid(uuid: UUID) = cache.get(uuid) - abstract suspend fun fetchIdentities(uuid: UUID): Set - - abstract suspend fun createIdentity(identity: T): T - abstract suspend fun updateIdentity(identity: T): T? - abstract suspend fun createOrUpdateIdentity(identity: T): T - @Scheduled(fixedDelay = 15, timeUnit = TimeUnit.MINUTES) fun cacheRefresh() { onlineUuids().forEach { uuid -> diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/create/RpIdentityCreationData.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/create/RpIdentityCreationData.kt new file mode 100644 index 0000000..a7cf754 --- /dev/null +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/create/RpIdentityCreationData.kt @@ -0,0 +1,37 @@ +package dev.slne.surf.roleplay.core.common.player.identity.create + +import kotlinx.serialization.Contextual +import kotlinx.serialization.Serializable +import java.time.LocalDate + +@Serializable +sealed class RpIdentityCreationData { + abstract val firstName: String + abstract val lastName: String + abstract val dateOfBirth: LocalDate + + @Serializable + data class Civilian( + override val firstName: String, + override val lastName: String, + override val dateOfBirth: @Contextual LocalDate + ) : RpIdentityCreationData() + + @Serializable + data class Police( + override val firstName: String, + override val lastName: String, + override val dateOfBirth: @Contextual LocalDate, + val badgeNumber: String, + val rank: String + ) : RpIdentityCreationData() + + @Serializable + data class RescueService( + override val firstName: String, + override val lastName: String, + override val dateOfBirth: @Contextual LocalDate, + val rank: String + ) : RpIdentityCreationData() + +} \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/update/RpIdentityUpdateData.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/update/RpIdentityUpdateData.kt new file mode 100644 index 0000000..4ce5445 --- /dev/null +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/update/RpIdentityUpdateData.kt @@ -0,0 +1,38 @@ +package dev.slne.surf.roleplay.core.common.player.identity.update + +import dev.slne.surf.roleplay.core.common.player.identity.RpIdentityType +import kotlinx.serialization.Contextual +import kotlinx.serialization.Serializable +import java.time.LocalDate + +@Serializable +sealed class RpIdentityUpdateData(val identityType: RpIdentityType) { + abstract val firstName: String? + abstract val lastName: String? + abstract val dateOfBirth: LocalDate? + + @Serializable + data class Civilian( + override val firstName: String? = null, + override val lastName: String? = null, + override val dateOfBirth: @Contextual LocalDate? = null + ) : RpIdentityUpdateData(RpIdentityType.CIVILIAN) + + @Serializable + data class Police( + override val firstName: String? = null, + override val lastName: String? = null, + override val dateOfBirth: @Contextual LocalDate? = null, + val badgeNumber: String? = null, + val rank: String? = null + ) : RpIdentityUpdateData(RpIdentityType.POLICE) + + @Serializable + data class RescueService( + override val firstName: String? = null, + override val lastName: String? = null, + override val dateOfBirth: @Contextual LocalDate? = null, + val rank: String? = null + ) : RpIdentityUpdateData(RpIdentityType.RESCUE_SERVICE) + +} \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/License.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/License.kt deleted file mode 100644 index c0059a4..0000000 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/License.kt +++ /dev/null @@ -1,80 +0,0 @@ -@file:OptIn(InternalRoleplayApi::class) - -package dev.slne.surf.roleplay.core.common.player.license - -import dev.slne.surf.roleplay.core.common.player.identity.RpIdentity -import dev.slne.surf.roleplay.core.common.player.license.utils.UnobtainableReason -import dev.slne.surf.surfapi.core.api.messages.adventure.buildText -import dev.slne.surf.surfapi.core.api.messages.builder.SurfComponentBuilder -import dev.slne.surf.surfapi.core.api.util.mutableObjectSetOf -import dev.slne.surf.surfapi.core.api.util.objectSetOf -import dev.slne.surf.surfapi.core.api.util.toObjectSet -import it.unimi.dsi.fastutil.objects.ObjectSet -import net.kyori.adventure.key.Key -import net.kyori.adventure.text.Component - -abstract class License( - val key: Key, - val displayName: Component, - description: SurfComponentBuilder.() -> Unit, - val price: Int, - val dependencies: ObjectSet = objectSetOf(), - val permission: String = LicensePermissionRegistry.createLicensePermission(key) -) { - - private val licenseService get() = LicenseService.instance - - val description = buildText(description) - - val children - get() = licenseService.licenses.filter { - it.dependencies.contains(this) - }.toObjectSet() - - suspend fun canObtain(identity: RpIdentity): Pair> { - val player = identity.player - val cloudPlayer = player.cloudPlayer - val onlineCloudPlayer = cloudPlayer.player - - val reasons = mutableObjectSetOf() - - if (onlineCloudPlayer != null && !onlineCloudPlayer.hasPermission(permission)) { - reasons.add(UnobtainableReason.NoPermissions) - } - - if (identity.hasLicense(this)) { - reasons.add(UnobtainableReason.AlreadyHasLicense) - } - - val missingDependencies = dependencies - .filterNot { identity.hasLicense(it) } - .toObjectSet() - - if (missingDependencies.isNotEmpty()) { - reasons.add(UnobtainableReason.DependenciesNotMet(missingDependencies)) - } - - if (!player.hasCashBalance(price)) { - reasons.add( - UnobtainableReason.NotEnoughCash( - currentAmount = player.getCashBalance(), - neededAmount = price - ) - ) - } - - return reasons.isEmpty() to reasons - } - - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (other !is License) return false - - if (key != other.key) return false - - return true - } - - override fun hashCode() = key.hashCode() - -} \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/LicenseService.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/LicenseService.kt index 5999e45..1a2e7fc 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/LicenseService.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/LicenseService.kt @@ -96,7 +96,7 @@ abstract class LicenseService( * that have expired. The expired licenses are returned as a mapping * of identities to their associated expired licenses. * - * @return A map where each key is an [RpIdentity] and the corresponding value + * @return A map where each key is an [dev.slne.surf.roleplay.paper.player.identity.RpIdentity] and the corresponding value * is a set of [IdentityLicense] objects representing the expired licenses * for that identity. */ diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/NetworkIdentityLicense.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/NetworkIdentityLicense.kt new file mode 100644 index 0000000..bac935b --- /dev/null +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/NetworkIdentityLicense.kt @@ -0,0 +1,14 @@ +package dev.slne.surf.roleplay.core.common.player.license + +import kotlinx.serialization.Contextual +import kotlinx.serialization.Serializable +import net.kyori.adventure.key.Key +import java.time.ZonedDateTime + +@Serializable +data class NetworkIdentityLicense( + val licenseKey: @Contextual Key, + val expiresAt: @Contextual ZonedDateTime?, + val createdAt: @Contextual ZonedDateTime = ZonedDateTime.now() +) { +} \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/licenses/civilian/CivilianVehicleLicense.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/licenses/civilian/CivilianVehicleLicense.kt deleted file mode 100644 index f1621e8..0000000 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/licenses/civilian/CivilianVehicleLicense.kt +++ /dev/null @@ -1,110 +0,0 @@ -package dev.slne.surf.roleplay.core.common.player.license.licenses.civilian - -import dev.slne.surf.roleplay.core.common.player.license.ExpirableLicense -import dev.slne.surf.roleplay.core.common.player.license.License -import dev.slne.surf.surfapi.core.api.messages.adventure.key -import dev.slne.surf.surfapi.core.api.messages.adventure.text -import dev.slne.surf.surfapi.core.api.util.objectSetOf -import net.kyori.adventure.text.Component -import kotlin.time.Duration.Companion.minutes -import org.springframework.stereotype.Component as SpringComponent - -class CivilianVehicleLicense { - - @SpringComponent - class DriversLicense : License( - key = key("civilian", "drivers_license"), - displayName = text("Führerschein"), - description = { - spacer("Der Führerschein erlaubt es dir, Fahrzeuge zu führen.") - }, - price = 1000, - ) - - @SpringComponent - class TruckLicense( - driversLicense: DriversLicense - ) : ExpirableLicense( - key = key("civilian", "truck_license"), - displayName = text("Lkw-Führerschein"), - description = { - spacer("Der Lkw-Führerschein erlaubt es dir, Lastkraftwagen zu fahren.") - }, - price = 2000, - expiresIn = 5.minutes, - dependencies = objectSetOf( - driversLicense - ) - ) - - @SpringComponent - class BusLicense( - driversLicense: DriversLicense - ) : License( - key = key("civilian", "bus_license"), - displayName = text("Bus-Führerschein"), - description = { - spacer("Der Bus-Führerschein erlaubt es dir, Busse zu fahren.") - }, - price = 2500, - dependencies = objectSetOf( - driversLicense - ) - ) - - @SpringComponent - class TaxiLicense( - driversLicense: DriversLicense - ) : License( - key = key("civilian", "taxi_license"), - displayName = text("Taxi-Führerschein"), - description = { - spacer("Der Taxi-Führerschein erlaubt es dir, Taxis zu fahren.") - - }, - price = 3000, - dependencies = objectSetOf( - driversLicense - ) - ) - - @SpringComponent - class MotorcycleLicense : License( - key = key("civilian", "motorcycle_license"), - displayName = text("Motorrad-Führerschein"), - description = { - spacer("Der Motorrad-Führerschein erlaubt es dir, Motorräder zu fahren.") - }, - price = 1500, - ) - - @SpringComponent - class BoatLicense : License( - key = key("civilian", "boat_license"), - displayName = text("Bootsführerschein"), - description = { - spacer("Der Bootsführerschein erlaubt es dir, Boote zu fahren.") - }, - price = 1800, - ) - - @SpringComponent - class PilotLicense : License( - key = key("civilian", "pilot_license"), - displayName = text("Pilotenschein"), - description = { - spacer("Der Pilotenschein erlaubt es dir, Flugzeuge zu fliegen.") - }, - price = 5000, - ) - - @SpringComponent - class HelicopterLicense : License( - key = key("civilian", "helicopter_license"), - displayName = text("Hubschrauber-Führerschein"), - description = { - spacer("Der Hubschrauber-Führerschein erlaubt es dir, Hubschrauber zu fliegen.") - }, - price = 6000, - ) -} \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/licenses/civilian/CivilianWeaponLicense.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/licenses/civilian/CivilianWeaponLicense.kt deleted file mode 100644 index ec87f45..0000000 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/licenses/civilian/CivilianWeaponLicense.kt +++ /dev/null @@ -1,35 +0,0 @@ -package dev.slne.surf.roleplay.core.common.player.license.licenses.civilian - -import dev.slne.surf.roleplay.core.common.player.license.License -import dev.slne.surf.surfapi.core.api.messages.adventure.buildText -import dev.slne.surf.surfapi.core.api.messages.adventure.key -import dev.slne.surf.surfapi.core.api.util.objectSetOf -import org.springframework.stereotype.Component - -class CivilianWeaponLicense { - - @Component - class LightWeaponLicense : License( - key = key("civilian", "light_weapon_license"), - displayName = buildText { success("Kleiner Waffenschein") }, - description = { - spacer("Erlaubt das Führen von leichten Waffen wie Pistolen und Revolvern.") - }, - price = 5000 - ) - - @Component - class HeavyWeaponLicense( - lightWeaponLicense: LightWeaponLicense - ) : License( - key = key("civilian", "heavy_weapon_license"), - displayName = buildText { error("Großer Waffenschein") }, - description = { - spacer("Erlaubt das Führen von schweren Waffen wie Maschinengewehren und Scharfschützengewehren.") - }, - price = 10000, - dependencies = objectSetOf( - lightWeaponLicense - ) - ) -} \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/utils/LicenseCreateResult.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/utils/LicenseCreateResult.kt deleted file mode 100644 index 8c0e4aa..0000000 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/utils/LicenseCreateResult.kt +++ /dev/null @@ -1,10 +0,0 @@ -package dev.slne.surf.roleplay.core.common.player.license.utils - -import dev.slne.surf.roleplay.core.common.player.license.IdentityLicense -import it.unimi.dsi.fastutil.objects.ObjectSet - -data class LicenseCreateResult( - val success: Boolean, - val reason: ObjectSet, - val license: IdentityLicense? -) diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/transaction/RpTransaction.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/transaction/RpTransaction.kt index 745ef7c..19243d1 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/transaction/RpTransaction.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/transaction/RpTransaction.kt @@ -2,44 +2,18 @@ package dev.slne.surf.roleplay.core.common.transaction import dev.slne.surf.roleplay.core.common.player.RpPlayer import dev.slne.surf.roleplay.core.common.transaction.utils.BalanceType +import kotlinx.serialization.Contextual +import kotlinx.serialization.Serializable import java.time.ZonedDateTime import java.util.* -interface RpTransaction { - - /** - * Unique identifier for the transaction. - */ - val uniqueId: UUID - - /** - * The sender of the transaction. - */ - val sender: RpPlayer? - - /** - * The receiver of the transaction. - */ - val receiver: RpPlayer? - - /** - * The amount of money involved in the transaction. - */ - val amount: Int - - /** - * The type of balance this transaction affects. - */ - val balanceType: BalanceType - - /** - * A description of the transaction, providing additional context or details. - */ - val description: String? - - /** - * The timestamp when the transaction was created. - */ - val createdAt: ZonedDateTime - -} \ No newline at end of file +@Serializable +data class RpTransaction( + val uniqueId: @Contextual UUID, + val sender: RpPlayer?, + val receiver: RpPlayer?, + val amount: Int, + val balanceType: BalanceType, + val description: String? = null, + val createdAt: @Contextual ZonedDateTime = ZonedDateTime.now() +) \ No newline at end of file diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/dialogs/CreateIdDialog.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/dialogs/CreateIdDialog.kt index 118b14c..3036b4b 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/dialogs/CreateIdDialog.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/dialogs/CreateIdDialog.kt @@ -4,7 +4,7 @@ package dev.slne.surf.roleplay.paper.mechanics.idcard.dialogs import com.github.shynixn.mccoroutine.folia.launch -import dev.slne.surf.roleplay.core.common.player.identity.identities.CivilianIdentity +import dev.slne.surf.roleplay.paper.player.identity.identities.CivilianIdentity import dev.slne.surf.roleplay.paper.mechanics.idcard.IdCard import dev.slne.surf.roleplay.paper.player.rpPlayer import dev.slne.surf.roleplay.paper.plugin diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/PaperRpPlayer.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/PaperRpPlayer.kt index 8b2ad58..e07cd73 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/PaperRpPlayer.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/PaperRpPlayer.kt @@ -1,6 +1,142 @@ package dev.slne.surf.roleplay.paper.player +import dev.slne.surf.roleplay.RoleplayApplication import dev.slne.surf.roleplay.core.common.player.RpPlayer -import java.util.UUID +import dev.slne.surf.roleplay.core.common.player.getIdentity +import dev.slne.surf.roleplay.core.common.player.identity.RpIdentityType +import dev.slne.surf.roleplay.core.common.transaction.utils.BalanceType +import dev.slne.surf.roleplay.paper.player.identity.PaperIdentityService +import dev.slne.surf.roleplay.paper.player.identity.RpIdentity +import dev.slne.surf.roleplay.paper.player.identity.identities.CivilianIdentity +import dev.slne.surf.roleplay.paper.player.license.HasLicenses +import dev.slne.surf.roleplay.paper.player.license.License +import dev.slne.surf.roleplay.paper.player.license.utils.LicenseRemovedReason +import dev.slne.surf.surfapi.core.api.messages.adventure.appendNewline +import dev.slne.surf.surfapi.core.api.messages.adventure.buildText +import dev.slne.surf.surfapi.core.api.util.freeze +import dev.slne.surf.surfapi.core.api.util.mutableObjectSetOf +import org.springframework.beans.factory.getBean +import java.util.* -class PaperRpPlayer(uuid: UUID) : RpPlayer(uuid) \ No newline at end of file +class PaperRpPlayer(uuid: UUID) : RpPlayer(uuid), HasLicenses { + + private val _identities = + mutableObjectSetOf() // TODO: 22.08.2025 20:31 - replace with cloud cache soon + val identities = _identities.freeze() + + var activeIdentity: RpIdentity? = null + private set + + override val licenses + get() = activeIdentity?.licenses + ?: error("Tried accessing licenses of a player without an active identity $uuid") + + suspend fun fetchIdentities() { + val fetched = identityService.fetchIdentities(uuid) + + _identities.clear() + _identities.addAll(fetched) + } + + fun setActiveIdentity(identity: RpIdentity) { + require(identity in _identities) { "Tried to set an active identity that is not part of the player's identities: $identity" } + activeIdentity = identity + } + + fun addIdentity(identity: RpIdentity) = _identities.add(identity) + + suspend fun createIdentity(identity: T) = + identityService.createIdentity(identity) + + suspend fun updateIdentity(identity: T) = + identityService.updateIdentity(identity) + + suspend fun createOrUpdateIdentity(identity: T) = + identityService.createOrUpdateIdentity(identity) + + fun getIdentity(type: RpIdentityType) = _identities.find { it.type == type } + + override suspend fun getBalance(balanceType: BalanceType) = + activeIdentity?.getBalance(balanceType) + ?: error("Tried accessing balance of a player without an active identity $uuid") + + override suspend fun addBalance( + balanceType: BalanceType, + amount: Int + ) = activeIdentity?.addBalance(balanceType, amount) + ?: error("Tried adding balance to a player without an active identity $uuid") + + override suspend fun removeBalance( + balanceType: BalanceType, + amount: Int + ) = activeIdentity?.removeBalance(balanceType, amount) + ?: error("Tried removing balance from a player without an active identity $uuid") + + override suspend fun getBalanceHistory( + balanceType: BalanceType, + limit: Int + ) = activeIdentity?.getBalanceHistory(balanceType, limit) + ?: error("Tried accessing balance history of a player without an active identity $uuid") + + fun getIdentity(clazz: Class) = + identities.find { clazz.isAssignableFrom(it.javaClass) } + + fun hasCompletedCitizenship() = getIdentity(RpIdentityType.CIVILIAN) != null + + override suspend fun addLicense(license: License) = + activeIdentity?.addLicense(license) + ?: error("Tried adding a license to a player without an active identity $uuid") + + override suspend fun removeLicense( + license: License, + reason: LicenseRemovedReason + ) = activeIdentity?.removeLicense(license, reason) + ?: error("Tried removing a license from a player without an active identity $uuid") + + override fun getLicense(license: Class) = + activeIdentity?.getLicense(license) + + override suspend fun confiscateLicense( + identity: RpIdentity, + license: License, + confiscatedBy: RpPlayer, + confiscatedReason: String + ) = activeIdentity?.confiscateLicense( + identity, + license, + confiscatedBy, + confiscatedReason + ) ?: error("Tried confiscating a license from a player without an active identity $uuid") + + override fun asComponent() = buildText { + val activeIdentity = activeIdentity + val name = cloudPlayer.player?.name + + if (activeIdentity == null) { + variableKey(name ?: uuid.toString()) + + return@buildText + } + + val firstName = activeIdentity.firstName + val lastName = activeIdentity.lastName + + variableValue("$firstName $lastName") + + hoverEvent(buildText { + variableKey("UUID: ") + variableValue(uuid.toString()) + appendNewline(2) + + name?.let { + variableKey("Username: ") + variableValue(it) + } + }) + } + + companion object { + private val identityService get() = RoleplayApplication.context.getBean() + operator fun get(uuid: UUID) = RpPlayer[uuid] as PaperRpPlayer + } +} \ No newline at end of file diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/PaperRpPlayerManager.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/PaperRpPlayerManager.kt index 580ccd7..3a40e7a 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/PaperRpPlayerManager.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/PaperRpPlayerManager.kt @@ -1,7 +1,7 @@ package dev.slne.surf.roleplay.paper.player import dev.slne.surf.roleplay.core.common.player.RpPlayerManager -import dev.slne.surf.roleplay.core.common.player.identity.RpIdentity +import dev.slne.surf.roleplay.paper.player.identity.RpIdentity import dev.slne.surf.surfapi.bukkit.api.extensions.server import org.springframework.stereotype.Component import java.util.* @@ -9,27 +9,7 @@ import java.util.* @Component class PaperRpPlayerManager : RpPlayerManager() { override fun createPlayer(uuid: UUID) = PaperRpPlayer(uuid) - override fun onlineUuids() = server.onlinePlayers.map { it.uniqueId }.toSet() + override fun onlineUuids() = server.onlinePlayers.map { it.uniqueId } - override suspend fun fetchIdentities(uuid: UUID): Set { - TODO("Not yet implemented") - } - override suspend fun createIdentity( - identity: T - ): T { - TODO("Not yet implemented") - } - - override suspend fun updateIdentity( - identity: T - ): T? { - TODO("Not yet implemented") - } - - override suspend fun createOrUpdateIdentity( - identity: T - ): T { - TODO("Not yet implemented") - } } \ No newline at end of file diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/identity/PaperIdentityService.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/identity/PaperIdentityService.kt new file mode 100644 index 0000000..c273042 --- /dev/null +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/identity/PaperIdentityService.kt @@ -0,0 +1,30 @@ +package dev.slne.surf.roleplay.paper.player.identity + +import org.springframework.stereotype.Service +import java.util.UUID + +@Service +class PaperIdentityService { + + suspend fun fetchIdentities(uuid: UUID): Set { + TODO("Not yet implemented") + } + + suspend fun createIdentity( + identity: T + ): T { + TODO("Not yet implemented") + } + + suspend fun updateIdentity( + identity: T + ): T? { + TODO("Not yet implemented") + } + + suspend fun createOrUpdateIdentity( + identity: T + ): T { + TODO("Not yet implemented") + } +} \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/RpIdentity.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/identity/RpIdentity.kt similarity index 78% rename from surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/RpIdentity.kt rename to surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/identity/RpIdentity.kt index d630b1d..b6c5ae2 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/RpIdentity.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/identity/RpIdentity.kt @@ -1,18 +1,19 @@ -@file:OptIn(InternalRoleplayApi::class) - -package dev.slne.surf.roleplay.core.common.player.identity +package dev.slne.surf.roleplay.paper.player.identity +import dev.slne.surf.roleplay.RoleplayApplication import dev.slne.surf.roleplay.core.common.player.RpPlayer -import dev.slne.surf.roleplay.core.common.player.RpPlayerManager -import dev.slne.surf.roleplay.core.common.player.license.* -import dev.slne.surf.roleplay.core.common.player.license.events.RpPlayerLicenseAddedEvent -import dev.slne.surf.roleplay.core.common.player.license.events.RpPlayerLicenseRemovedEvent -import dev.slne.surf.roleplay.core.common.player.license.utils.LicenseCreateResult -import dev.slne.surf.roleplay.core.common.player.license.utils.LicenseRemovedReason -import dev.slne.surf.roleplay.core.common.player.license.utils.UnobtainableReason +import dev.slne.surf.roleplay.core.common.player.identity.RpIdentityType import dev.slne.surf.roleplay.core.common.transaction.HasRpTransactions import dev.slne.surf.roleplay.core.common.transaction.RpTransaction import dev.slne.surf.roleplay.core.common.transaction.utils.BalanceType +import dev.slne.surf.roleplay.paper.player.PaperRpPlayer +import dev.slne.surf.roleplay.paper.player.license.* +import dev.slne.surf.roleplay.paper.player.license.events.RpPlayerLicenseAddedEvent +import dev.slne.surf.roleplay.paper.player.license.events.RpPlayerLicenseRemovedEvent +import dev.slne.surf.roleplay.paper.player.license.utils.LicenseCreateResult +import dev.slne.surf.roleplay.paper.player.license.utils.LicenseRemovedReason +import dev.slne.surf.roleplay.paper.player.license.utils.UnobtainableReason +import dev.slne.surf.surfapi.core.api.util.freeze import dev.slne.surf.surfapi.core.api.util.mutableObject2ObjectMapOf import dev.slne.surf.surfapi.core.api.util.mutableObjectSetOf import dev.slne.surf.surfapi.core.api.util.objectSetOf @@ -20,27 +21,28 @@ import it.unimi.dsi.fastutil.objects.ObjectLinkedOpenHashSet import kotlinx.serialization.Contextual import kotlinx.serialization.Serializable import kotlinx.serialization.Transient +import org.springframework.beans.factory.getBean import java.time.LocalDate import java.time.ZonedDateTime import java.util.* @Serializable -abstract class RpIdentity( - open val uuid: @Contextual UUID, - open val type: RpIdentityType, - open var firstName: String, - open var lastName: String, - open var dateOfBirth: @Contextual LocalDate, - open val createdAt: @Contextual ZonedDateTime = ZonedDateTime.now(), +abstract class RpIdentity : HasRpTransactions, HasLicenses { + abstract val uuid: @Contextual UUID + abstract val type: RpIdentityType + abstract var firstName: String + abstract var lastName: String + abstract var dateOfBirth: @Contextual LocalDate + open val createdAt: @Contextual ZonedDateTime = ZonedDateTime.now() open var updatedAt: @Contextual ZonedDateTime = ZonedDateTime.now() -) : HasRpTransactions, HasLicenses { - val player: RpPlayer get() = RpPlayer[uuid] - private val licenseService get() = LicenseService.instance + val player get() = PaperRpPlayer[uuid] @Transient private val _licenses = mutableObjectSetOf() - override val licenses get() = _licenses + + @Transient + override val licenses = _licenses.freeze() fun addLicense(license: IdentityLicense) { _licenses.add(license) @@ -51,10 +53,10 @@ abstract class RpIdentity( } override suspend fun addLicense(license: License): LicenseCreateResult { - val (canObtain, reason) = license.canObtain(this) + val unobtainableReasons = license.canObtain(this) - if (!canObtain) { - return LicenseCreateResult(false, reason, null) + if (unobtainableReasons.isNotEmpty()) { + return LicenseCreateResult(false, unobtainableReasons, null) } val expiresAt = if (license is ExpirableLicense) { @@ -191,4 +193,7 @@ abstract class RpIdentity( return "RpIdentity(uuid=$uuid, type=$type, firstName='$firstName', lastName='$lastName', dateOfBirth=$dateOfBirth, createdAt=$createdAt, updatedAt=$updatedAt)" } + companion object { + private val licenseService get() = RoleplayApplication.context.getBean() + } } \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/identities/CivilianIdentity.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/identity/identities/CivilianIdentity.kt similarity index 85% rename from surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/identities/CivilianIdentity.kt rename to surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/identity/identities/CivilianIdentity.kt index 97f254e..1647aee 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/identities/CivilianIdentity.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/identity/identities/CivilianIdentity.kt @@ -1,6 +1,6 @@ -package dev.slne.surf.roleplay.core.common.player.identity.identities +package dev.slne.surf.roleplay.paper.player.identity.identities -import dev.slne.surf.roleplay.core.common.player.identity.RpIdentity +import dev.slne.surf.roleplay.paper.player.identity.RpIdentity import dev.slne.surf.roleplay.core.common.player.identity.RpIdentityType import kotlinx.serialization.Contextual import kotlinx.serialization.Serializable diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/identities/PoliceIdentity.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/identity/identities/PoliceIdentity.kt similarity index 87% rename from surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/identities/PoliceIdentity.kt rename to surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/identity/identities/PoliceIdentity.kt index d0d9fab..1e6c274 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/identities/PoliceIdentity.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/identity/identities/PoliceIdentity.kt @@ -1,6 +1,6 @@ -package dev.slne.surf.roleplay.core.common.player.identity.identities +package dev.slne.surf.roleplay.paper.player.identity.identities -import dev.slne.surf.roleplay.core.common.player.identity.RpIdentity +import dev.slne.surf.roleplay.paper.player.identity.RpIdentity import dev.slne.surf.roleplay.core.common.player.identity.RpIdentityType import kotlinx.serialization.Contextual import kotlinx.serialization.Serializable diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/identities/RescueServiceIdentity.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/identity/identities/RescueServiceIdentity.kt similarity index 86% rename from surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/identities/RescueServiceIdentity.kt rename to surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/identity/identities/RescueServiceIdentity.kt index bd55d11..4504a6f 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/identities/RescueServiceIdentity.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/identity/identities/RescueServiceIdentity.kt @@ -1,6 +1,6 @@ -package dev.slne.surf.roleplay.core.common.player.identity.identities +package dev.slne.surf.roleplay.paper.player.identity.identities -import dev.slne.surf.roleplay.core.common.player.identity.RpIdentity +import dev.slne.surf.roleplay.paper.player.identity.RpIdentity import dev.slne.surf.roleplay.core.common.player.identity.RpIdentityType import kotlinx.serialization.Contextual import kotlinx.serialization.Serializable diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/ExpirableLicense.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/ExpirableLicense.kt similarity index 92% rename from surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/ExpirableLicense.kt rename to surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/ExpirableLicense.kt index a75c911..befa73b 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/ExpirableLicense.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/ExpirableLicense.kt @@ -1,4 +1,4 @@ -package dev.slne.surf.roleplay.core.common.player.license +package dev.slne.surf.roleplay.paper.player.license import dev.slne.surf.surfapi.core.api.messages.builder.SurfComponentBuilder import dev.slne.surf.surfapi.core.api.util.objectSetOf diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/HasLicenses.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/HasLicenses.kt similarity index 80% rename from surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/HasLicenses.kt rename to surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/HasLicenses.kt index e8be110..633a1ed 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/HasLicenses.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/HasLicenses.kt @@ -1,10 +1,10 @@ -package dev.slne.surf.roleplay.core.common.player.license +package dev.slne.surf.roleplay.paper.player.license import dev.slne.surf.roleplay.core.common.player.RpPlayer -import dev.slne.surf.roleplay.core.common.player.identity.RpIdentity -import dev.slne.surf.roleplay.core.common.player.license.utils.LicenseCreateResult -import dev.slne.surf.roleplay.core.common.player.license.utils.LicenseRemovedReason -import dev.slne.surf.roleplay.core.common.player.license.utils.UnobtainableReason +import dev.slne.surf.roleplay.paper.player.identity.RpIdentity +import dev.slne.surf.roleplay.paper.player.license.utils.LicenseCreateResult +import dev.slne.surf.roleplay.paper.player.license.utils.LicenseRemovedReason +import dev.slne.surf.roleplay.paper.player.license.utils.UnobtainableReason import it.unimi.dsi.fastutil.objects.ObjectSet import org.jetbrains.annotations.Unmodifiable @@ -20,7 +20,7 @@ interface HasLicenses { * * @param license The license to add. * @return A triple containing a boolean indicating success or failure, an [UnobtainableReason] if the license could not be obtained - * and the [dev.slne.surf.roleplay.core.common.player.license.IdentityLicense] if successfully added. + * and the [IdentityLicense] if successfully added. */ suspend fun addLicense(license: License): LicenseCreateResult @@ -54,7 +54,7 @@ interface HasLicenses { * Retrieves a specific license owned by the player. * * @param license The class of the license to retrieve. - * @return The [dev.slne.surf.roleplay.core.common.player.license.IdentityLicense] if found, or null if not found. + * @return The [IdentityLicense] if found, or null if not found. */ fun getLicense(license: Class): IdentityLicense? @@ -79,7 +79,7 @@ interface HasLicenses { * Extension function to retrieve a license by its type. * * @param T The type of the license to retrieve. - * @return The [dev.slne.surf.roleplay.core.common.player.license.IdentityLicense] if found, or null if not found. + * @return The [IdentityLicense] if found, or null if not found. */ @Suppress("UNCHECKED_CAST") inline fun HasLicenses.getLicense() = diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/IdentityLicense.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/IdentityLicense.kt similarity index 57% rename from surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/IdentityLicense.kt rename to surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/IdentityLicense.kt index b48980e..d56101b 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/IdentityLicense.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/IdentityLicense.kt @@ -1,8 +1,6 @@ -package dev.slne.surf.roleplay.core.common.player.license +package dev.slne.surf.roleplay.paper.player.license -import dev.slne.surf.roleplay.core.common.player.identity.RpIdentity -import kotlinx.serialization.Contextual -import kotlinx.serialization.Serializable +import dev.slne.surf.roleplay.paper.player.identity.RpIdentity import java.time.ZonedDateTime /** @@ -12,47 +10,26 @@ import java.time.ZonedDateTime * the expiration time, and the creation time. * * @property license The [License] associated with this identity. - * @property identity The [RpIdentity] associated with this license. + * @property identity The [dev.slne.surf.roleplay.paper.player.identity.RpIdentity] associated with this license. * @property expiresAt The expiration time of the license, if applicable. Defaults to null if the license does not expire. */ -@Serializable data class IdentityLicense( - val license: @Contextual License, + val license: License, val identity: RpIdentity, - val expiresAt: @Contextual ZonedDateTime?, - val createdAt: @Contextual ZonedDateTime = ZonedDateTime.now() + val expiresAt: ZonedDateTime?, + val createdAt: ZonedDateTime = ZonedDateTime.now() ) { /** * Checks if the license is expired. */ val isExpired get() = expiresAt?.isBefore(ZonedDateTime.now()) ?: false - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (other !is IdentityLicense) return false - - if (license != other.license) return false - if (identity != other.identity) return false - - return true - } - - override fun hashCode(): Int { - var result = license.hashCode() - result = 31 * result + identity.hashCode() - return result - } - - override fun toString(): String { - return "IdentityLicense(license=$license, expiresAt=$expiresAt, createdAt=$createdAt, isExpired=$isExpired)" - } - companion object { /** - * Creates an [IdentityLicense] from a [License] and an [RpIdentity]. + * Creates an [IdentityLicense] from a [License] and an [dev.slne.surf.roleplay.paper.player.identity.RpIdentity]. * * @param license The [License] to create the identity license from. - * @param identity The [RpIdentity] associated with the license. + * @param identity The [dev.slne.surf.roleplay.paper.player.identity.RpIdentity] associated with the license. * @param createdAt The creation time of the identity license, defaults to the current time. * @return A new [IdentityLicense] instance. */ diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/License.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/License.kt new file mode 100644 index 0000000..8b51f07 --- /dev/null +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/License.kt @@ -0,0 +1,70 @@ +package dev.slne.surf.roleplay.paper.player.license + +import dev.slne.surf.roleplay.paper.player.identity.RpIdentity +import dev.slne.surf.roleplay.paper.player.license.utils.UnobtainableReason +import dev.slne.surf.surfapi.core.api.messages.adventure.buildText +import dev.slne.surf.surfapi.core.api.messages.builder.SurfComponentBuilder +import dev.slne.surf.surfapi.core.api.util.objectSetOf +import dev.slne.surf.surfapi.core.api.util.toObjectSet +import it.unimi.dsi.fastutil.objects.ObjectSet +import net.kyori.adventure.key.Key +import net.kyori.adventure.text.Component +import org.springframework.beans.factory.annotation.Autowired + +abstract class License( + val key: Key, + val displayName: Component, + description: SurfComponentBuilder.() -> Unit, + val price: Int, + val dependencies: ObjectSet = objectSetOf(), + val permission: String = LicensePermissionRegistry.createLicensePermission(key) +) { + + @Autowired + private lateinit var licenseService: PaperLicenseService + + val description = buildText(description) + val children + get() = licenseService.all() + .filter { this in it.dependencies } + .toObjectSet() + + suspend fun canObtain(identity: RpIdentity) = buildSet { + val player = identity.player + val onlineCloudPlayer = player.cloudPlayer.player + + if (onlineCloudPlayer?.hasPermission(permission) != true) { + add(UnobtainableReason.NoPermissions) + } + + if (identity.hasLicense(this@License)) { + add(UnobtainableReason.AlreadyHasLicense) + } + + val missingDependencies = dependencies.filterNot { identity.hasLicense(it) } + if (missingDependencies.isNotEmpty()) { + add(UnobtainableReason.DependenciesNotMet(missingDependencies)) + } + + if (!player.hasCashBalance(price)) { + add(UnobtainableReason.NotEnoughCash(player.getCashBalance(), price)) + } + } + + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (other !is License) return false + + if (key != other.key) return false + + return true + } + + override fun hashCode(): Int { + return key.hashCode() + } + + override fun toString(): String { + return "License(key=$key, price=$price, dependencies=$dependencies, permission='$permission', children=$children)" + } +} \ No newline at end of file diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/LicenseNpc.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/LicenseNpc.kt index 2c045ef..0210262 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/LicenseNpc.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/LicenseNpc.kt @@ -7,9 +7,9 @@ import dev.slne.surf.roleplay.paper.plugin import org.springframework.stereotype.Component @Component -class LicenseNpc: RpLifecycle { +class LicenseNpc : RpLifecycle { - companion object { + companion object { const val NPC_NAME = "license_npc" } diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/LicensePermissionRegistry.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/LicensePermissionRegistry.kt similarity index 77% rename from surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/LicensePermissionRegistry.kt rename to surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/LicensePermissionRegistry.kt index fe54401..20bdda9 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/LicensePermissionRegistry.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/LicensePermissionRegistry.kt @@ -1,4 +1,4 @@ -package dev.slne.surf.roleplay.core.common.player.license +package dev.slne.surf.roleplay.paper.player.license import net.kyori.adventure.key.Key diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/PaperLicenseService.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/PaperLicenseService.kt new file mode 100644 index 0000000..fd9f2c2 --- /dev/null +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/PaperLicenseService.kt @@ -0,0 +1,54 @@ +package dev.slne.surf.roleplay.paper.player.license + +import dev.slne.surf.roleplay.core.common.player.RpPlayer +import dev.slne.surf.roleplay.core.common.player.RpPlayerManager +import dev.slne.surf.roleplay.paper.player.identity.RpIdentity +import dev.slne.surf.roleplay.paper.player.license.utils.LicenseRemovedReason +import it.unimi.dsi.fastutil.objects.Object2ObjectMap +import it.unimi.dsi.fastutil.objects.ObjectSet +import org.springframework.beans.factory.ObjectProvider +import org.springframework.scheduling.annotation.Scheduled +import org.springframework.stereotype.Service +import java.util.concurrent.TimeUnit + +@Service +class PaperLicenseService( + private val licenses: ObjectProvider, + private val rpPlayerManager: RpPlayerManager +) { + fun all() = licenses.asSequence() + + suspend fun createLicense(identityLicense: IdentityLicense): IdentityLicense { + + } + + suspend fun removeLicense( + identity: RpIdentity, + license: License + ): Boolean { + + } + + suspend fun confiscateLicense( + identity: RpIdentity, + license: License, + confiscatedBy: RpPlayer, + confiscatedReason: String + ): Boolean { + + } + + fun getAllExpiredLicenses(): Object2ObjectMap> { + } + + @Scheduled(fixedDelay = 1, timeUnit = TimeUnit.SECONDS) + fun removeExpiredLicenses() { + val expired = getAllExpiredLicenses() + + for ((identity, expiredLicenses) in expired) { + for (license in expiredLicenses) { + identity.removeLicense(license.license, LicenseRemovedReason.Expired) + } + } + } +} \ No newline at end of file diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/dialogs/BuyLicenseDialog.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/dialogs/BuyLicenseDialog.kt index c46ff64..dd03a31 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/dialogs/BuyLicenseDialog.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/dialogs/BuyLicenseDialog.kt @@ -5,8 +5,8 @@ package dev.slne.surf.roleplay.paper.player.license.dialogs import com.github.shynixn.mccoroutine.folia.launch import dev.slne.surf.roleplay.api.common.player.RpPlayer import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity -import dev.slne.surf.roleplay.core.common.player.license.IdentityLicense -import dev.slne.surf.roleplay.core.common.player.license.utils.UnobtainableReason +import dev.slne.surf.roleplay.paper.player.license.IdentityLicense +import dev.slne.surf.roleplay.paper.player.license.utils.UnobtainableReason import dev.slne.surf.roleplay.paper.plugin import dev.slne.surf.surfapi.bukkit.api.dialog.base import dev.slne.surf.surfapi.bukkit.api.dialog.builder.actionButton diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/dialogs/LicenseDialog.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/dialogs/LicenseDialog.kt index a2d86de..2f95936 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/dialogs/LicenseDialog.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/dialogs/LicenseDialog.kt @@ -4,7 +4,7 @@ package dev.slne.surf.roleplay.paper.player.license.dialogs import dev.slne.surf.roleplay.api.common.player.RpPlayer import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity -import dev.slne.surf.roleplay.core.common.player.license.IdentityLicense +import dev.slne.surf.roleplay.paper.player.license.IdentityLicense import dev.slne.surf.surfapi.bukkit.api.dialog.base import dev.slne.surf.surfapi.bukkit.api.dialog.builder.actionButton import dev.slne.surf.surfapi.bukkit.api.dialog.dialog diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/dialogs/MyLicenseDialog.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/dialogs/MyLicenseDialog.kt index 538f6b4..4898873 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/dialogs/MyLicenseDialog.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/dialogs/MyLicenseDialog.kt @@ -4,7 +4,7 @@ package dev.slne.surf.roleplay.paper.player.license.dialogs import dev.slne.surf.roleplay.api.common.player.RpPlayer import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity -import dev.slne.surf.roleplay.core.common.player.license.IdentityLicense +import dev.slne.surf.roleplay.paper.player.license.IdentityLicense import dev.slne.surf.surfapi.bukkit.api.dialog.base import dev.slne.surf.surfapi.bukkit.api.dialog.dialog import dev.slne.surf.surfapi.bukkit.api.dialog.type diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/events/RpPlayerLicenseAddedEvent.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/events/RpPlayerLicenseAddedEvent.kt similarity index 62% rename from surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/events/RpPlayerLicenseAddedEvent.kt rename to surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/events/RpPlayerLicenseAddedEvent.kt index de59afc..3134f3f 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/events/RpPlayerLicenseAddedEvent.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/events/RpPlayerLicenseAddedEvent.kt @@ -1,9 +1,9 @@ -package dev.slne.surf.roleplay.core.common.player.license.events +package dev.slne.surf.roleplay.paper.player.license.events import dev.slne.surf.cloud.api.common.event.CancellableCloudEvent import dev.slne.surf.roleplay.core.common.player.RpPlayer -import dev.slne.surf.roleplay.core.common.player.identity.RpIdentity -import dev.slne.surf.roleplay.core.common.player.license.IdentityLicense +import dev.slne.surf.roleplay.paper.player.identity.RpIdentity +import dev.slne.surf.roleplay.paper.player.license.IdentityLicense class RpPlayerLicenseAddedEvent( source: Any, diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/events/RpPlayerLicenseRemovedEvent.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/events/RpPlayerLicenseRemovedEvent.kt similarity index 53% rename from surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/events/RpPlayerLicenseRemovedEvent.kt rename to surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/events/RpPlayerLicenseRemovedEvent.kt index c52846f..3fedb57 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/events/RpPlayerLicenseRemovedEvent.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/events/RpPlayerLicenseRemovedEvent.kt @@ -1,10 +1,10 @@ -package dev.slne.surf.roleplay.core.common.player.license.events +package dev.slne.surf.roleplay.paper.player.license.events import dev.slne.surf.cloud.api.common.event.CancellableCloudEvent import dev.slne.surf.roleplay.core.common.player.RpPlayer -import dev.slne.surf.roleplay.core.common.player.identity.RpIdentity -import dev.slne.surf.roleplay.core.common.player.license.IdentityLicense -import dev.slne.surf.roleplay.core.common.player.license.utils.LicenseRemovedReason +import dev.slne.surf.roleplay.paper.player.identity.RpIdentity +import dev.slne.surf.roleplay.paper.player.license.IdentityLicense +import dev.slne.surf.roleplay.paper.player.license.utils.LicenseRemovedReason class RpPlayerLicenseRemovedEvent( source: Any, diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/licenses/civilian/CivilianFishingLicense.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/licenses/civilian/CivilianFishingLicense.kt similarity index 76% rename from surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/licenses/civilian/CivilianFishingLicense.kt rename to surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/licenses/civilian/CivilianFishingLicense.kt index ec936ca..c646b93 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/licenses/civilian/CivilianFishingLicense.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/licenses/civilian/CivilianFishingLicense.kt @@ -1,6 +1,6 @@ -package dev.slne.surf.roleplay.core.common.player.license.licenses.civilian +package dev.slne.surf.roleplay.paper.player.license.licenses.civilian -import dev.slne.surf.roleplay.core.common.player.license.License +import dev.slne.surf.roleplay.paper.player.license.License import dev.slne.surf.surfapi.core.api.messages.adventure.buildText import dev.slne.surf.surfapi.core.api.messages.adventure.key import org.springframework.stereotype.Component diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/licenses/civilian/CivilianVehicleLicenses.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/licenses/civilian/CivilianVehicleLicenses.kt new file mode 100644 index 0000000..545024e --- /dev/null +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/licenses/civilian/CivilianVehicleLicenses.kt @@ -0,0 +1,106 @@ +package dev.slne.surf.roleplay.paper.player.license.licenses.civilian + +import dev.slne.surf.roleplay.paper.player.license.ExpirableLicense +import dev.slne.surf.roleplay.paper.player.license.License +import dev.slne.surf.surfapi.core.api.messages.adventure.key +import dev.slne.surf.surfapi.core.api.messages.adventure.text +import dev.slne.surf.surfapi.core.api.util.objectSetOf +import org.springframework.stereotype.Component +import kotlin.time.Duration.Companion.minutes + +@Component +class DriversLicense : License( + key = key("civilian", "drivers_license"), + displayName = text("Führerschein"), + description = { + spacer("Der Führerschein erlaubt es dir, Fahrzeuge zu führen.") + }, + price = 1000, +) + +@Component +class TruckLicense( + driversLicense: DriversLicense +) : ExpirableLicense( + key = key("civilian", "truck_license"), + displayName = text("Lkw-Führerschein"), + description = { + spacer("Der Lkw-Führerschein erlaubt es dir, Lastkraftwagen zu fahren.") + }, + price = 2000, + expiresIn = 5.minutes, + dependencies = objectSetOf( + driversLicense + ) +) + +@Component +class BusLicense( + driversLicense: DriversLicense +) : License( + key = key("civilian", "bus_license"), + displayName = text("Bus-Führerschein"), + description = { + spacer("Der Bus-Führerschein erlaubt es dir, Busse zu fahren.") + }, + price = 2500, + dependencies = objectSetOf( + driversLicense + ) +) + +@Component +class TaxiLicense( + driversLicense: DriversLicense +) : License( + key = key("civilian", "taxi_license"), + displayName = text("Taxi-Führerschein"), + description = { + spacer("Der Taxi-Führerschein erlaubt es dir, Taxis zu fahren.") + + }, + price = 3000, + dependencies = objectSetOf( + driversLicense + ) +) + +@Component +class MotorcycleLicense : License( + key = key("civilian", "motorcycle_license"), + displayName = text("Motorrad-Führerschein"), + description = { + spacer("Der Motorrad-Führerschein erlaubt es dir, Motorräder zu fahren.") + }, + price = 1500, +) + +@Component +class BoatLicense : License( + key = key("civilian", "boat_license"), + displayName = text("Bootsführerschein"), + description = { + spacer("Der Bootsführerschein erlaubt es dir, Boote zu fahren.") + }, + price = 1800, +) + +@Component +class PilotLicense : License( + key = key("civilian", "pilot_license"), + displayName = text("Pilotenschein"), + description = { + spacer("Der Pilotenschein erlaubt es dir, Flugzeuge zu fliegen.") + }, + price = 5000, +) + +@Component +class HelicopterLicense : License( + key = key("civilian", "helicopter_license"), + displayName = text("Hubschrauber-Führerschein"), + description = { + spacer("Der Hubschrauber-Führerschein erlaubt es dir, Hubschrauber zu fliegen.") + }, + price = 6000, +) diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/licenses/civilian/CivilianWeaponLicenses.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/licenses/civilian/CivilianWeaponLicenses.kt new file mode 100644 index 0000000..5a74c2d --- /dev/null +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/licenses/civilian/CivilianWeaponLicenses.kt @@ -0,0 +1,33 @@ +package dev.slne.surf.roleplay.paper.player.license.licenses.civilian + +import dev.slne.surf.roleplay.paper.player.license.License +import dev.slne.surf.surfapi.core.api.messages.adventure.buildText +import dev.slne.surf.surfapi.core.api.messages.adventure.key +import dev.slne.surf.surfapi.core.api.util.objectSetOf +import org.springframework.stereotype.Component + + +@Component +class LightWeaponLicense : License( + key = key("civilian", "light_weapon_license"), + displayName = buildText { success("Kleiner Waffenschein") }, + description = { + spacer("Erlaubt das Führen von leichten Waffen wie Pistolen und Revolvern.") + }, + price = 5000 +) + +@Component +class HeavyWeaponLicense( + lightWeaponLicense: LightWeaponLicense +) : License( + key = key("civilian", "heavy_weapon_license"), + displayName = buildText { error("Großer Waffenschein") }, + description = { + spacer("Erlaubt das Führen von schweren Waffen wie Maschinengewehren und Scharfschützengewehren.") + }, + price = 10000, + dependencies = objectSetOf( + lightWeaponLicense + ) +) diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/listeners/LicenseBuyHandler.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/listeners/LicenseBuyHandler.kt index 1136ed7..d243760 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/listeners/LicenseBuyHandler.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/listeners/LicenseBuyHandler.kt @@ -2,12 +2,11 @@ package dev.slne.surf.roleplay.paper.player.license.listeners import com.github.shynixn.mccoroutine.folia.entityDispatcher import com.github.shynixn.mccoroutine.folia.launch -import dev.slne.surf.cloud.api.client.paper.player.toCloudOfflinePlayer import dev.slne.surf.npc.api.event.NpcInteractEvent import dev.slne.surf.npc.api.surfNpcApi -import dev.slne.surf.roleplay.api.common.player.RpPlayer import dev.slne.surf.roleplay.paper.player.license.LicenseNpc import dev.slne.surf.roleplay.paper.player.license.dialogs.licenseDialog +import dev.slne.surf.roleplay.paper.player.rpPlayer import dev.slne.surf.roleplay.paper.plugin import dev.slne.surf.surfapi.core.api.messages.adventure.sendText import org.bukkit.event.EventHandler @@ -27,18 +26,18 @@ class LicenseBuyHandler : Listener { val npc = event.npc if (npc.npcUuid != licenseNpc.npcUuid) return + val rpPlayer = player.rpPlayer + val activeIdentity = rpPlayer.activeIdentity ?: run { + player.sendText { + appendPrefix() - plugin.launch(plugin.entityDispatcher(player)) { - val rpPlayer = RpPlayer[player.toCloudOfflinePlayer()] - val activeIdentity = rpPlayer.activeIdentity ?: run { - player.sendText { - appendPrefix() - - error("Du musst eine Identität ausgewählt haben, um Lizenzen zu kaufen.") - } - return@launch + error("Du musst eine Identität ausgewählt haben, um Lizenzen zu kaufen.") } + return + } + + plugin.launch(plugin.entityDispatcher(player)) { player.showDialog(licenseDialog(rpPlayer, activeIdentity)) } } diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/listeners/LicenseChangedHandler.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/listeners/LicenseChangedHandler.kt index 2e32dd6..28dc9c1 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/listeners/LicenseChangedHandler.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/listeners/LicenseChangedHandler.kt @@ -1,63 +1,54 @@ package dev.slne.surf.roleplay.paper.player.license.listeners -import com.github.shynixn.mccoroutine.folia.entityDispatcher -import com.github.shynixn.mccoroutine.folia.launch -import dev.slne.surf.roleplay.core.common.player.license.events.RpPlayerLicenseAddedEvent -import dev.slne.surf.roleplay.core.common.player.license.events.RpPlayerLicenseRemovedEvent -import dev.slne.surf.roleplay.paper.plugin +import dev.slne.surf.cloud.api.common.event.CloudEventHandler +import dev.slne.surf.roleplay.paper.player.license.events.RpPlayerLicenseAddedEvent +import dev.slne.surf.roleplay.paper.player.license.events.RpPlayerLicenseRemovedEvent import dev.slne.surf.surfapi.core.api.messages.adventure.buildText import dev.slne.surf.surfapi.core.api.messages.adventure.playSound import dev.slne.surf.surfapi.core.api.messages.adventure.sendText +import net.kyori.adventure.sound.Sound.Source import org.bukkit.Sound -import org.bukkit.event.EventHandler -import org.bukkit.event.Listener import org.springframework.stereotype.Component +@Suppress("unused") @Component -class LicenseChangedHandler : Listener { +class LicenseChangedHandler { - @EventHandler + @CloudEventHandler fun onPlayerLicenseAdded(event: RpPlayerLicenseAddedEvent) { val license = event.license val cloudPlayer = event.player.cloudPlayer.player ?: return - plugin.launch(plugin.entityDispatcher(cloudPlayer)) { - cloudPlayer.sendText { - appendPrefix() + cloudPlayer.sendText { + appendPrefix() - info("Du hast eine ") - append(license.license.displayName) - info(" Lizenz erhalten.") - } + info("Du hast eine ") + append(license.license.displayName) + info(" Lizenz erhalten.") + } - cloudPlayer.playSound(true) { - type(Sound.ENTITY_PLAYER_LEVELUP) - volume(.75f) - source(net.kyori.adventure.sound.Sound.Source.NEUTRAL) - } + cloudPlayer.playSound(true) { + type(Sound.ENTITY_PLAYER_LEVELUP) + volume(.75f) + source(Source.NEUTRAL) } } - @EventHandler + @CloudEventHandler fun onPlayerLicenseRemoved(event: RpPlayerLicenseRemovedEvent) { val license = event.license val cloudPlayer = event.player.cloudPlayer.player ?: return val reason = buildText { appendPrefix() - - event.reason.apply { message(license) } + append(event.reason.message(license)) } - plugin.launch(plugin.entityDispatcher(cloudPlayer)) { - cloudPlayer.sendMessage(reason) - - cloudPlayer.playSound(true) { - type(Sound.ENTITY_VILLAGER_HURT) - volume(.75f) - source(net.kyori.adventure.sound.Sound.Source.NEUTRAL) - } + cloudPlayer.sendMessage(reason) + cloudPlayer.playSound(true) { + type(Sound.ENTITY_VILLAGER_HURT) + volume(.75f) + source(Source.NEUTRAL) } } - } \ No newline at end of file diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/utils/LicenseCreateResult.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/utils/LicenseCreateResult.kt new file mode 100644 index 0000000..ef6db73 --- /dev/null +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/utils/LicenseCreateResult.kt @@ -0,0 +1,10 @@ +package dev.slne.surf.roleplay.paper.player.license.utils + +import dev.slne.surf.roleplay.paper.player.license.IdentityLicense +import it.unimi.dsi.fastutil.objects.ObjectSet + +data class LicenseCreateResult( + val success: Boolean, + val reason: Set, + val license: IdentityLicense? +) diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/utils/LicenseRemovedReason.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/utils/LicenseRemovedReason.kt similarity index 93% rename from surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/utils/LicenseRemovedReason.kt rename to surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/utils/LicenseRemovedReason.kt index 30c551c..f73f722 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/utils/LicenseRemovedReason.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/utils/LicenseRemovedReason.kt @@ -1,7 +1,7 @@ -package dev.slne.surf.roleplay.core.common.player.license.utils +package dev.slne.surf.roleplay.paper.player.license.utils import dev.slne.surf.roleplay.core.common.player.RpPlayer -import dev.slne.surf.roleplay.core.common.player.license.IdentityLicense +import dev.slne.surf.roleplay.paper.player.license.IdentityLicense import dev.slne.surf.surfapi.core.api.messages.adventure.buildText import dev.slne.surf.surfapi.core.api.messages.builder.SurfComponentBuilder diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/utils/UnobtainableReason.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/utils/UnobtainableReason.kt similarity index 88% rename from surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/utils/UnobtainableReason.kt rename to surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/utils/UnobtainableReason.kt index eb8aa46..6b27fb1 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/utils/UnobtainableReason.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/utils/UnobtainableReason.kt @@ -1,10 +1,9 @@ -package dev.slne.surf.roleplay.core.common.player.license.utils +package dev.slne.surf.roleplay.paper.player.license.utils -import dev.slne.surf.roleplay.core.common.player.license.License +import dev.slne.surf.roleplay.paper.player.license.License import dev.slne.surf.surfapi.core.api.messages.adventure.appendNewline import dev.slne.surf.surfapi.core.api.messages.adventure.buildText import dev.slne.surf.surfapi.core.api.messages.builder.SurfComponentBuilder -import it.unimi.dsi.fastutil.objects.ObjectSet import net.kyori.adventure.text.Component sealed class UnobtainableReason(message: SurfComponentBuilder.() -> Unit) { @@ -47,7 +46,7 @@ sealed class UnobtainableReason(message: SurfComponentBuilder.() -> Unit) { }) class DependenciesNotMet( - val missingDependencies: ObjectSet + val missingDependencies: List ) : UnobtainableReason({ error("Du erfüllst nicht die Voraussetzungen, um diese Lizenz zu erwerben.") appendNewline(2) diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/PluginBootstrap.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/PluginBootstrap.kt index ad5a762..1fd8b91 100644 --- a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/PluginBootstrap.kt +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/PluginBootstrap.kt @@ -8,7 +8,7 @@ import dev.slne.surf.roleplay.RoleplayApplication class PluginBootstrap : StandalonePluginBootstrap { override suspend fun bootstrap(context: BootstrapContext) { - ContextHolder.instance.context = + RoleplayApplication.context = CloudInstance.startSpringApplication(RoleplayApplication::class) } } \ No newline at end of file diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/RpPlayerManagerImpl.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/RpPlayerManagerImpl.kt index 648f653..c63f75d 100644 --- a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/RpPlayerManagerImpl.kt +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/RpPlayerManagerImpl.kt @@ -1,95 +1,42 @@ -package dev.slne.surf.roleplay.core.player - -import com.github.benmanes.caffeine.cache.Caffeine -import com.google.auto.service.AutoService -import com.sksamuel.aedile.core.asLoadingCache -import com.sksamuel.aedile.core.withRemovalListener -import dev.slne.surf.roleplay.api.player.RpPlayer -import dev.slne.surf.roleplay.api.player.RpPlayerManager -import dev.slne.surf.roleplay.api.player.identity.RpIdentity -import dev.slne.surf.roleplay.core.player.db.RpPlayerModel -import dev.slne.surf.roleplay.core.player.identity.db.impl.police.RpPlayerPoliceIdentityModel -import dev.slne.surf.roleplay.server.player.db.RpPlayerTable +package dev.slne.surf.roleplay.server.player + +import dev.slne.surf.cloud.api.common.player.CloudPlayerManager +import dev.slne.surf.roleplay.core.common.player.RpPlayer +import dev.slne.surf.roleplay.core.common.player.RpPlayerManager +import dev.slne.surf.roleplay.core.common.player.identity.RpIdentity +import dev.slne.surf.roleplay.server.player.identity.db.impl.police.RpPlayerPoliceIdentityModel +import dev.slne.surf.roleplay.server.player.RpPlayerService import dev.slne.surf.roleplay.server.player.identity.db.impl.civilian.RpPlayerCivilianIdentityModel -import dev.slne.surf.roleplay.server.player.identity.db.impl.civilian.RpPlayerCivilianIdentityTable -import dev.slne.surf.roleplay.server.player.identity.db.impl.police.RpPlayerPoliceIdentityTable import dev.slne.surf.roleplay.server.player.identity.db.impl.rescueservice.RpPlayerRescueServiceIdentityModel -import dev.slne.surf.roleplay.server.player.identity.db.impl.rescueservice.RpPlayerRescueServiceIdentityTable import dev.slne.surf.surfapi.core.api.util.getCallerClass -import dev.slne.surf.surfapi.core.api.util.toObjectSet import kotlinx.coroutines.Dispatchers -import net.kyori.adventure.util.Services -import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq import org.jetbrains.exposed.sql.transactions.experimental.newSuspendedTransaction +import org.springframework.stereotype.Component import java.time.ZonedDateTime import java.util.* -@AutoService(RpPlayerManager::class) -class RpPlayerManagerImpl : RpPlayerManager, Services.Fallback { +@Component +class RpPlayerManagerImpl(private val rpPlayerService: RpPlayerService) : RpPlayerManager() { - private val cache = Caffeine.newBuilder() - .withRemovalListener { key, _, cause -> - println("Removing RpPlayer from cache: $key due to $cause") - } - .asLoadingCache { - println("Loading RpPlayer from database: $it") - findOrCreate(it).toApi() - } - - override val players - get() = cache.underlying().asMap().values.mapNotNull { it.getNow(null) }.toObjectSet() - - fun onDisconnect(player: RpPlayer) = cache.invalidate(player.uuid) - - suspend fun findOrCreate(uuid: UUID) = newSuspendedTransaction(Dispatchers.IO) { - RpPlayerModel.find { RpPlayerTable.uuid eq uuid }.singleOrNull() ?: RpPlayerModel.new { - this.uuid = uuid - this.createdAt = ZonedDateTime.now() - this.updatedAt = ZonedDateTime.now() - } - } - - suspend fun updateUsername( - rpPlayer: RpPlayerImpl, - username: String - ): Unit = newSuspendedTransaction(Dispatchers.IO) { - rpPlayer.username = username - rpPlayer.updatedAt = ZonedDateTime.now() + override fun createPlayer(uuid: UUID) = ServerRpPlayer(uuid) + override fun onlineUuids() = CloudPlayerManager.getOnlinePlayers().uuidSnapshot() - RpPlayerModel.findSingleByAndUpdate((RpPlayerTable.uuid eq rpPlayer.uuid)) { - it.username = username - it.updatedAt = rpPlayer.updatedAt - } + override suspend fun fetchIdentities(uuid: UUID): Set { + rpPlayerService } - private suspend fun findIdentityByType( - rpPlayer: RpPlayerImpl, - identity: T - ) = newSuspendedTransaction(Dispatchers.IO) { - val rpPlayerModel = rpPlayerManagerImpl.findOrCreate(rpPlayer.uuid) - - when (identity) { - is RpIdentity.CivilianIdentity -> { - RpPlayerCivilianIdentityModel.find { - (RpPlayerCivilianIdentityTable.player eq rpPlayerModel.id) - }.singleOrNull() - } - - is RpIdentity.PoliceIdentity -> { - RpPlayerPoliceIdentityModel.find { - (RpPlayerPoliceIdentityTable.player eq rpPlayerModel.id) - }.singleOrNull() - } - - is RpIdentity.RescueServiceIdentity -> { - RpPlayerRescueServiceIdentityModel.find { - (RpPlayerRescueServiceIdentityTable.player eq rpPlayerModel.id) - }.singleOrNull() - } - - else -> error("Unsupported identity type: ${identity::class.qualifiedName}") - } - } +// suspend fun updateUsername( +// rpPlayer: RpPlayerImpl, +// username: String +// ): Unit = newSuspendedTransaction(Dispatchers.IO) { +// rpPlayer.username = username +// rpPlayer.updatedAt = ZonedDateTime.now() +// +// RpPlayerModel.findSingleByAndUpdate((RpPlayerTable.uuid eq rpPlayer.uuid)) { +// it.username = username +// it.updatedAt = rpPlayer.updatedAt +// } +// } @Suppress("UNCHECKED_CAST") suspend fun createIdentity( diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/RpPlayerService.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/RpPlayerService.kt new file mode 100644 index 0000000..402e439 --- /dev/null +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/RpPlayerService.kt @@ -0,0 +1,11 @@ +package dev.slne.surf.roleplay.server.player + +import org.springframework.stereotype.Service + +@Service +class RpPlayerService { + + suspend fun updateUsername(player: ServerRpPlayer, username: String) { + // TODO: 23.08.2025 12:11 - needed? + } +} \ No newline at end of file diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/ServerRpPlayer.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/ServerRpPlayer.kt new file mode 100644 index 0000000..d694d93 --- /dev/null +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/ServerRpPlayer.kt @@ -0,0 +1,7 @@ +package dev.slne.surf.roleplay.server.player + +import dev.slne.surf.roleplay.core.common.player.RpPlayer +import java.util.UUID + +class ServerRpPlayer(uuid: UUID) : RpPlayer(uuid) { +} \ No newline at end of file diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/db/RpPlayerModel.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/db/RpPlayerModel.kt index 17af6e2..8a6c072 100644 --- a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/db/RpPlayerModel.kt +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/db/RpPlayerModel.kt @@ -1,7 +1,7 @@ package dev.slne.surf.roleplay.core.player.db import dev.slne.surf.roleplay.core.player.RpPlayerImpl -import dev.slne.surf.roleplay.core.player.identity.db.impl.police.RpPlayerPoliceIdentityModel +import dev.slne.surf.roleplay.server.player.identity.db.impl.police.RpPlayerPoliceIdentityModel import dev.slne.surf.roleplay.server.player.db.RpPlayerTable import dev.slne.surf.roleplay.server.player.identity.db.impl.civilian.RpPlayerCivilianIdentityModel import dev.slne.surf.roleplay.server.player.identity.db.impl.civilian.RpPlayerCivilianIdentityTable diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/db/RpPlayerRepository.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/db/RpPlayerRepository.kt new file mode 100644 index 0000000..825bd48 --- /dev/null +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/db/RpPlayerRepository.kt @@ -0,0 +1,115 @@ +package dev.slne.surf.roleplay.server.player.db + +import dev.slne.surf.cloud.api.common.util.singleOrNullOrThrow +import dev.slne.surf.cloud.api.server.plugin.CoroutineTransactional +import dev.slne.surf.roleplay.core.common.player.identity.RpIdentityType +import dev.slne.surf.roleplay.core.common.player.identity.create.RpIdentityCreationData +import dev.slne.surf.roleplay.core.common.player.identity.update.RpIdentityUpdateData +import dev.slne.surf.roleplay.core.player.db.RpPlayerModel +import dev.slne.surf.roleplay.server.player.identity.db.impl.police.RpPlayerPoliceIdentityModel +import dev.slne.surf.roleplay.server.player.identity.db.RpPlayerIdentityBaseModel +import dev.slne.surf.roleplay.server.player.identity.db.impl.civilian.RpPlayerCivilianIdentityModel +import dev.slne.surf.roleplay.server.player.identity.db.impl.rescueservice.RpPlayerRescueServiceIdentityModel +import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq +import org.springframework.stereotype.Repository +import java.time.ZonedDateTime +import java.util.* + +@CoroutineTransactional +@Repository +class RpPlayerRepository { + + suspend fun findPlayerId(uuid: UUID) = RpPlayerTable.select(RpPlayerTable.id) + .where { RpPlayerTable.uuid eq uuid } + .singleOrNullOrThrow() + ?.get(RpPlayerTable.id) + + suspend fun findOrCreateModel(uuid: UUID) = + RpPlayerModel.find { RpPlayerTable.uuid eq uuid }.singleOrNullOrThrow() + ?: RpPlayerModel.new { + this.uuid = uuid + this.createdAt = ZonedDateTime.now() + this.updatedAt = ZonedDateTime.now() + } + + suspend fun updateUsername(uuid: UUID, username: String) = + RpPlayerModel.findSingleByAndUpdate(RpPlayerTable.uuid eq uuid) { + it.username = username + } + + private suspend fun findIdentityModelByType( + uuid: UUID, + type: RpIdentityType + ): RpPlayerIdentityBaseModel<*>? { + val playerId = findPlayerId(uuid) ?: return null + val modelClass = when (type) { + RpIdentityType.CIVILIAN -> RpPlayerCivilianIdentityModel + RpIdentityType.POLICE -> RpPlayerPoliceIdentityModel + RpIdentityType.RESCUE_SERVICE -> RpPlayerRescueServiceIdentityModel + } + + return modelClass.find { modelClass.identityTable.player eq playerId }.singleOrNullOrThrow() + } + + suspend fun createIdentity(uuid: UUID, creationData: RpIdentityCreationData) { + val playerModel = findOrCreateModel(uuid) + + fun RpPlayerIdentityBaseModel<*>.applyCommonData() { + this.player = playerModel + this.firstName = creationData.firstName + this.lastName = creationData.lastName + this.dateOfBirth = creationData.dateOfBirth + } + + when (creationData) { + is RpIdentityCreationData.Civilian -> RpPlayerCivilianIdentityModel.new { + applyCommonData() + } + + is RpIdentityCreationData.Police -> RpPlayerPoliceIdentityModel.new { + applyCommonData() + this.badgeNumber = creationData.badgeNumber + this.rank = creationData.rank + } + + is RpIdentityCreationData.RescueService -> RpPlayerRescueServiceIdentityModel.new { + applyCommonData() + this.rank = creationData.rank + } + } + } + + suspend fun updateIdentity(uuid: UUID, updateData: RpIdentityUpdateData): Boolean { + val existingModel = findIdentityModelByType(uuid, updateData.identityType) ?: return false + + fun RpPlayerIdentityBaseModel<*>.applyCommonUpdate() { + updateData.firstName?.let { this.firstName = it } + updateData.lastName?.let { this.lastName = it } + updateData.dateOfBirth?.let { this.dateOfBirth = it } + } + + when (existingModel) { + is RpPlayerCivilianIdentityModel -> { + if (updateData !is RpIdentityUpdateData.Civilian) return false + existingModel.applyCommonUpdate() + } + + is RpPlayerPoliceIdentityModel -> { + if (updateData !is RpIdentityUpdateData.Police) return false + existingModel.applyCommonUpdate() + updateData.badgeNumber?.let { existingModel.badgeNumber = it } + updateData.rank?.let { existingModel.rank = it } + } + + is RpPlayerRescueServiceIdentityModel -> { + if (updateData !is RpIdentityUpdateData.RescueService) return false + existingModel.applyCommonUpdate() + updateData.rank?.let { existingModel.rank = it } + } + + else -> error("Unsupported identity model type: ${existingModel::class.qualifiedName}") + } + + return true + } +} \ No newline at end of file diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/db/RpPlayerTable.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/db/RpPlayerTable.kt index 6962cca..4836032 100644 --- a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/db/RpPlayerTable.kt +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/db/RpPlayerTable.kt @@ -1,15 +1,9 @@ package dev.slne.surf.roleplay.server.player.db -import dev.slne.surf.cloud.api.server.exposed.columns.CurrentZonedDateTime -import dev.slne.surf.cloud.api.server.exposed.columns.zonedDateTime -import org.jetbrains.exposed.dao.id.LongIdTable - -object RpPlayerTable : LongIdTable("rp_players") { - - val uuid = uuid("uuid").uniqueIndex() - val username = varchar("username", 16).nullable() - - val createdAt = zonedDateTime("created_at").defaultExpression(CurrentZonedDateTime) - val updatedAt = zonedDateTime("updated_at").defaultExpression(CurrentZonedDateTime) +import dev.slne.surf.cloud.api.server.exposed.columns.nativeUuid +import dev.slne.surf.cloud.api.server.exposed.table.AuditableLongIdTable +object RpPlayerTable : AuditableLongIdTable("rp_players") { + val uuid = nativeUuid("uuid").uniqueIndex() + val username = char("username", 16).nullable() } \ No newline at end of file diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/RpPlayerIdentityBaseModel.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/RpPlayerIdentityBaseModel.kt index 470681e..38782cb 100644 --- a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/RpPlayerIdentityBaseModel.kt +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/RpPlayerIdentityBaseModel.kt @@ -1,23 +1,20 @@ package dev.slne.surf.roleplay.server.player.identity.db -import dev.slne.surf.roleplay.api.common.player.RpPlayer -import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity +import dev.slne.surf.cloud.api.server.exposed.table.AuditableLongEntity +import dev.slne.surf.cloud.api.server.exposed.table.AuditableLongEntityClass import dev.slne.surf.roleplay.core.player.db.RpPlayerModel -import org.jetbrains.exposed.dao.LongEntity import org.jetbrains.exposed.dao.id.EntityID -abstract class RpPlayerIdentityBaseModel( +abstract class RpPlayerIdentityBaseModel( id: EntityID, table: RpPlayerIdentityBaseTable -) : LongEntity(id) { +) : AuditableLongEntity(id, table) { var player by RpPlayerModel referencedOn table.player var firstName by table.firstName var lastName by table.lastName var dateOfBirth by table.dateOfBirth +} - var createdAt by table.createdAt - var updatedAt by table.updatedAt - - abstract suspend fun toApi(player: RpPlayer): I -} \ No newline at end of file +abstract class RpPlayerIdentityBaseClass(val identityTable: RpPlayerIdentityBaseTable) : + AuditableLongEntityClass(identityTable) \ No newline at end of file diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/RpPlayerIdentityBaseTable.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/RpPlayerIdentityBaseTable.kt index 47e258f..0d17190 100644 --- a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/RpPlayerIdentityBaseTable.kt +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/RpPlayerIdentityBaseTable.kt @@ -1,13 +1,11 @@ package dev.slne.surf.roleplay.server.player.identity.db -import dev.slne.surf.cloud.api.server.exposed.columns.CurrentZonedDateTime -import dev.slne.surf.cloud.api.server.exposed.columns.zonedDateTime +import dev.slne.surf.cloud.api.server.exposed.table.AuditableLongIdTable import dev.slne.surf.roleplay.server.player.db.RpPlayerTable -import org.jetbrains.exposed.dao.id.LongIdTable import org.jetbrains.exposed.sql.ReferenceOption import org.jetbrains.exposed.sql.javatime.date -abstract class RpPlayerIdentityBaseTable(table: String) : LongIdTable(table) { +abstract class RpPlayerIdentityBaseTable(table: String) : AuditableLongIdTable(table) { val player = reference( "player_id", RpPlayerTable, @@ -15,10 +13,7 @@ abstract class RpPlayerIdentityBaseTable(table: String) : LongIdTable(table) { onUpdate = ReferenceOption.CASCADE ).uniqueIndex() - val firstName = varchar("first_name", 16) - val lastName = varchar("last_name", 16) + val firstName = char("first_name", 16) + val lastName = char("last_name", 16) val dateOfBirth = date("date_of_birth") - - val createdAt = zonedDateTime("created_at").defaultExpression(CurrentZonedDateTime) - val updatedAt = zonedDateTime("updated_at").defaultExpression(CurrentZonedDateTime) } \ No newline at end of file diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/civilian/RpPlayerCivilianIdentityModel.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/civilian/RpPlayerCivilianIdentityModel.kt index edb8e2a..c4f959a 100644 --- a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/civilian/RpPlayerCivilianIdentityModel.kt +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/civilian/RpPlayerCivilianIdentityModel.kt @@ -1,31 +1,11 @@ package dev.slne.surf.roleplay.server.player.identity.db.impl.civilian -import dev.slne.surf.roleplay.api.common.player.RpPlayer -import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity -import dev.slne.surf.roleplay.core.common.player.identity.identities.CivilianIdentity +import dev.slne.surf.roleplay.server.player.identity.db.RpPlayerIdentityBaseClass import dev.slne.surf.roleplay.server.player.identity.db.RpPlayerIdentityBaseModel -import org.jetbrains.exposed.dao.LongEntityClass import org.jetbrains.exposed.dao.id.EntityID -class RpPlayerCivilianIdentityModel( - id: EntityID -) : RpPlayerIdentityBaseModel( - id, - RpPlayerCivilianIdentityTable -) { - companion object : LongEntityClass(RpPlayerCivilianIdentityTable) - - override suspend fun toApi(player: RpPlayer) = CivilianIdentity( - player = player, - firstName = firstName, - lastName = lastName, - dateOfBirth = dateOfBirth, - createdAt = createdAt, - updatedAt = updatedAt, - ).apply { -// licenseServiceImpl.fetchLicenses(this).forEach { -// addLicense(it) -// } - // TODO: 09.08.2025 23:53 Fetch licenses and attach to player - } +class RpPlayerCivilianIdentityModel(id: EntityID) : + RpPlayerIdentityBaseModel(id, RpPlayerCivilianIdentityTable) { + companion object : + RpPlayerIdentityBaseClass(RpPlayerCivilianIdentityTable) } \ No newline at end of file diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/police/RpPlayerPoliceIdentityModel.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/police/RpPlayerPoliceIdentityModel.kt index c86c523..d9a50ca 100644 --- a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/police/RpPlayerPoliceIdentityModel.kt +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/police/RpPlayerPoliceIdentityModel.kt @@ -1,37 +1,14 @@ -package dev.slne.surf.roleplay.core.player.identity.db.impl.police +package dev.slne.surf.roleplay.server.player.identity.db.impl.police -import dev.slne.surf.roleplay.api.common.player.RpPlayer -import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity -import dev.slne.surf.roleplay.core.common.player.identity.identities.PoliceIdentity +import dev.slne.surf.roleplay.server.player.identity.db.RpPlayerIdentityBaseClass import dev.slne.surf.roleplay.server.player.identity.db.RpPlayerIdentityBaseModel -import dev.slne.surf.roleplay.server.player.identity.db.impl.police.RpPlayerPoliceIdentityTable -import org.jetbrains.exposed.dao.LongEntityClass import org.jetbrains.exposed.dao.id.EntityID -class RpPlayerPoliceIdentityModel( - id: EntityID -) : RpPlayerIdentityBaseModel( - id, - RpPlayerPoliceIdentityTable -) { - companion object : LongEntityClass(RpPlayerPoliceIdentityTable) +class RpPlayerPoliceIdentityModel(id: EntityID) : + RpPlayerIdentityBaseModel(id, RpPlayerPoliceIdentityTable) { + companion object : + RpPlayerIdentityBaseClass(RpPlayerPoliceIdentityTable) var badgeNumber by RpPlayerPoliceIdentityTable.badgeNumber var rank by RpPlayerPoliceIdentityTable.rank - - override suspend fun toApi(player: RpPlayer) = PoliceIdentity( - player = player, - firstName = firstName, - lastName = lastName, - dateOfBirth = dateOfBirth, - badgeNumber = badgeNumber, - rank = rank, - createdAt = createdAt, - updatedAt = updatedAt, - ).apply { -// licenseServiceImpl.fetchLicenses(this).forEach { -// addLicense(it) -// } - // TODO: 09.08.2025 23:53 Fetch licenses and attach to player - } } \ No newline at end of file diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/rescueservice/RpPlayerRescueServiceIdentityModel.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/rescueservice/RpPlayerRescueServiceIdentityModel.kt index 154868c..0e99d7d 100644 --- a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/rescueservice/RpPlayerRescueServiceIdentityModel.kt +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/rescueservice/RpPlayerRescueServiceIdentityModel.kt @@ -1,35 +1,15 @@ package dev.slne.surf.roleplay.server.player.identity.db.impl.rescueservice -import dev.slne.surf.roleplay.api.common.player.RpPlayer -import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity -import dev.slne.surf.roleplay.core.common.player.identity.identities.RescueServiceIdentity +import dev.slne.surf.roleplay.server.player.identity.db.RpPlayerIdentityBaseClass import dev.slne.surf.roleplay.server.player.identity.db.RpPlayerIdentityBaseModel -import org.jetbrains.exposed.dao.LongEntityClass import org.jetbrains.exposed.dao.id.EntityID -class RpPlayerRescueServiceIdentityModel( - id: EntityID -) : RpPlayerIdentityBaseModel( - id, - RpPlayerRescueServiceIdentityTable -) { +class RpPlayerRescueServiceIdentityModel(id: EntityID) : + RpPlayerIdentityBaseModel(id, RpPlayerRescueServiceIdentityTable) { companion object : - LongEntityClass(RpPlayerRescueServiceIdentityTable) + RpPlayerIdentityBaseClass( + RpPlayerRescueServiceIdentityTable + ) var rank by RpPlayerRescueServiceIdentityTable.rank - - override suspend fun toApi(player: RpPlayer) = RescueServiceIdentity( - player = player, - firstName = firstName, - lastName = lastName, - dateOfBirth = dateOfBirth, - rank = rank, - createdAt = createdAt, - updatedAt = updatedAt, - ).apply { -// licenseServiceImpl.fetchLicenses(this).forEach { -// addLicense(it) -// } - // TODO: 09.08.2025 23:53 Fetch licenses and attach to player - } } \ No newline at end of file diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/rescueservice/RpPlayerRescueServiceIdentityTable.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/rescueservice/RpPlayerRescueServiceIdentityTable.kt index 66674ab..d450487 100644 --- a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/rescueservice/RpPlayerRescueServiceIdentityTable.kt +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/rescueservice/RpPlayerRescueServiceIdentityTable.kt @@ -2,8 +2,7 @@ package dev.slne.surf.roleplay.server.player.identity.db.impl.rescueservice import dev.slne.surf.roleplay.server.player.identity.db.RpPlayerIdentityBaseTable -object RpPlayerRescueServiceIdentityTable : RpPlayerIdentityBaseTable( - "rp_player_rescue_service_identities" -) { +object RpPlayerRescueServiceIdentityTable : + RpPlayerIdentityBaseTable("rp_player_rescue_service_identities") { val rank = varchar("rank", 255) } \ No newline at end of file diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/LicenseServiceImpl.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/LicenseServiceImpl.kt index ea6949a..0a019b9 100644 --- a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/LicenseServiceImpl.kt +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/LicenseServiceImpl.kt @@ -1,129 +1,105 @@ package dev.slne.surf.roleplay.server.player.license -import com.google.auto.service.AutoService -import dev.slne.surf.roleplay.api.player.RpPlayer -import dev.slne.surf.roleplay.api.player.RpPlayerManager -import dev.slne.surf.roleplay.api.player.identity.RpIdentity -import dev.slne.surf.roleplay.api.player.license.IdentityLicense -import dev.slne.surf.roleplay.api.player.license.License -import dev.slne.surf.roleplay.api.player.license.LicenseService -import dev.slne.surf.roleplay.api.player.license.utils.LicenseRemovedReason -import dev.slne.surf.roleplay.core.player.rpPlayerManagerImpl -import dev.slne.surf.roleplay.server.player.license.db.IdentityLicenseModel -import dev.slne.surf.roleplay.server.player.license.db.IdentityLicenseTable -import dev.slne.surf.surfapi.core.api.messages.adventure.key -import dev.slne.surf.surfapi.core.api.util.freeze -import dev.slne.surf.surfapi.core.api.util.mutableObjectSetOf -import dev.slne.surf.surfapi.core.api.util.toObjectList -import kotlinx.coroutines.Dispatchers -import net.kyori.adventure.key.Key -import net.kyori.adventure.util.Services -import org.jetbrains.exposed.sql.and -import org.jetbrains.exposed.sql.transactions.experimental.newSuspendedTransaction - -@AutoService(LicenseService::class) -class LicenseServiceImpl : LicenseService, Services.Fallback { - - - private val _licenses = mutableObjectSetOf() - override val licenses get() = _licenses.freeze() - - suspend fun fetchLicenses(identity: RpIdentity) = newSuspendedTransaction(Dispatchers.IO) { - val rpPlayerModel = rpPlayerManagerImpl.findOrCreate(identity.player.uuid) - - IdentityLicenseModel.find { - (IdentityLicenseTable.player eq rpPlayerModel.id) and - (IdentityLicenseTable.identity eq identity.type) - }.map { it.toApi(identity) }.toObjectList() - } - - override fun getLicense(license: Class) = - _licenses.firstOrNull { license.isAssignableFrom(it::class.java) } - - override fun getLicenseOrThrow(license: Class) = - getLicense(license) ?: error("License not found: ${license.name}") - - override fun getLicenseByKey(key: Key) = _licenses.firstOrNull { it.key == key } - - override fun getLicenseByKeyOrThrow(key: Key) = - getLicenseByKey(key) ?: error("License not found: $key") - - override suspend fun createLicense( - identityLicense: IdentityLicense - ) = newSuspendedTransaction(Dispatchers.IO) { - val (license, identity, expiresAt, createdAt) = identityLicense - val rpPlayerModel = rpPlayerManagerImpl.findOrCreate(identity.player.uuid) - - IdentityLicenseModel.new { - this.player = rpPlayerModel - this.identity = identity.type - this.license = license.key.asString() - this.expiresAt = expiresAt - this.createdAt = createdAt - }.toApi(identityLicense.identity) - } - - override suspend fun confiscateLicense( - identity: RpIdentity, - license: License, - confiscatedBy: RpPlayer, - confiscatedReason: String - ) = newSuspendedTransaction(Dispatchers.IO) { - val player = identity.player - val parentLicense = player.getIdentity(identity.type)?.getLicense(license::class.java) - ?: return@newSuspendedTransaction false - - val parentResult = player.removeLicense( - license, - LicenseRemovedReason.Confiscated(confiscatedBy, confiscatedReason) - ) - - val childrenResults = license.children.map { childLicense -> - if (player.hasLicense(childLicense)) { - player.removeLicense( - childLicense, - LicenseRemovedReason.ConfiscatedChild( - parentLicense, - confiscatedBy, - confiscatedReason - ) - ) - return@map true - } - - false - } - - parentResult && childrenResults.all { it } - } - - override suspend fun removeLicense( - identity: RpIdentity, - license: License - ) = newSuspendedTransaction(Dispatchers.IO) { - val player = identity.player - val rpPlayerModel = rpPlayerManagerImpl.findOrCreate(player.uuid) - val playerLicense = IdentityLicenseModel.find { - (IdentityLicenseTable.player eq rpPlayerModel.id) and - (IdentityLicenseTable.identity eq identity.type) and - (IdentityLicenseTable.license eq license.key.asString()) - } - - if (playerLicense.empty()) { - return@newSuspendedTransaction false - } - - playerLicense.forEach { it.delete() } - - true - } - - fun getAllExpiredLicenses() = RpPlayerManager.players - .mapNotNull { - val activeIdentity = it.activeIdentity ?: return@mapNotNull null - - activeIdentity to activeIdentity.licenses.filter { license -> license.isExpired } - }.toObjectList() -} - -val licenseServiceImpl get() = LicenseService.INSTANCE as LicenseServiceImpl \ No newline at end of file +class LicenseServiceImpl { + + +// private val _licenses = mutableObjectSetOf() +// override val licenses get() = _licenses.freeze() +// +// suspend fun fetchLicenses(identity: RpIdentity) = newSuspendedTransaction(Dispatchers.IO) { +// val rpPlayerModel = rpPlayerManagerImpl.findOrCreate(identity.player.uuid) +// +// IdentityLicenseModel.find { +// (IdentityLicenseTable.player eq rpPlayerModel.id) and +// (IdentityLicenseTable.identity eq identity.type) +// }.map { it.toApi(identity) }.toObjectList() +// } +// +// override fun getLicense(license: Class) = +// _licenses.firstOrNull { license.isAssignableFrom(it::class.java) } +// +// override fun getLicenseOrThrow(license: Class) = +// getLicense(license) ?: error("License not found: ${license.name}") +// +// override fun getLicenseByKey(key: Key) = _licenses.firstOrNull { it.key == key } +// +// override fun getLicenseByKeyOrThrow(key: Key) = +// getLicenseByKey(key) ?: error("License not found: $key") +// +// override suspend fun createLicense( +// identityLicense: IdentityLicense +// ) = newSuspendedTransaction(Dispatchers.IO) { +// val (license, identity, expiresAt, createdAt) = identityLicense +// val rpPlayerModel = rpPlayerManagerImpl.findOrCreate(identity.player.uuid) +// +// IdentityLicenseModel.new { +// this.player = rpPlayerModel +// this.identity = identity.type +// this.license = license.key.asString() +// this.expiresAt = expiresAt +// this.createdAt = createdAt +// }.toApi(identityLicense.identity) +// } +// +// override suspend fun confiscateLicense( +// identity: RpIdentity, +// license: License, +// confiscatedBy: RpPlayer, +// confiscatedReason: String +// ) = newSuspendedTransaction(Dispatchers.IO) { +// val player = identity.player +// val parentLicense = player.getIdentity(identity.type)?.getLicense(license::class.java) +// ?: return@newSuspendedTransaction false +// +// val parentResult = player.removeLicense( +// license, +// LicenseRemovedReason.Confiscated(confiscatedBy, confiscatedReason) +// ) +// +// val childrenResults = license.children.map { childLicense -> +// if (player.hasLicense(childLicense)) { +// player.removeLicense( +// childLicense, +// LicenseRemovedReason.ConfiscatedChild( +// parentLicense, +// confiscatedBy, +// confiscatedReason +// ) +// ) +// return@map true +// } +// +// false +// } +// +// parentResult && childrenResults.all { it } +// } +// +// override suspend fun removeLicense( +// identity: RpIdentity, +// license: License +// ) = newSuspendedTransaction(Dispatchers.IO) { +// val player = identity.player +// val rpPlayerModel = rpPlayerManagerImpl.findOrCreate(player.uuid) +// val playerLicense = IdentityLicenseModel.find { +// (IdentityLicenseTable.player eq rpPlayerModel.id) and +// (IdentityLicenseTable.identity eq identity.type) and +// (IdentityLicenseTable.license eq license.key.asString()) +// } +// +// if (playerLicense.empty()) { +// return@newSuspendedTransaction false +// } +// +// playerLicense.forEach { it.delete() } +// +// true +// } +// +// fun getAllExpiredLicenses() = RpPlayerManager.players +// .mapNotNull { +// val activeIdentity = it.activeIdentity ?: return@mapNotNull null +// +// activeIdentity to activeIdentity.licenses.filter { license -> license.isExpired } +// }.toObjectList() +} \ No newline at end of file diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/db/IdentityLicenseModel.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/db/IdentityLicenseModel.kt index 3adbdb0..64e97e7 100644 --- a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/db/IdentityLicenseModel.kt +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/db/IdentityLicenseModel.kt @@ -3,6 +3,7 @@ package dev.slne.surf.roleplay.server.player.license.db import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity import dev.slne.surf.roleplay.api.player.license.LicenseService import dev.slne.surf.roleplay.core.common.player.license.IdentityLicense +import dev.slne.surf.roleplay.core.common.player.license.NetworkIdentityLicense import dev.slne.surf.roleplay.core.player.db.RpPlayerModel import dev.slne.surf.surfapi.core.api.messages.adventure.key import org.jetbrains.exposed.dao.LongEntity @@ -31,6 +32,12 @@ class IdentityLicenseModel(id: EntityID) : LongEntity(id) { return license } + fun toNetwork() = NetworkIdentityLicense( + licenseKey = license, + expiresAt = expiresAt, + createdAt = createdAt + ) + override fun equals(other: Any?): Boolean { if (this === other) return true if (other !is IdentityLicenseModel) return false diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/db/IdentityLicenseTable.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/db/IdentityLicenseTable.kt index 1df59bd..7cfbbc6 100644 --- a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/db/IdentityLicenseTable.kt +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/db/IdentityLicenseTable.kt @@ -2,8 +2,9 @@ package dev.slne.surf.roleplay.server.player.license.db import dev.slne.surf.cloud.api.server.exposed.columns.CurrentZonedDateTime import dev.slne.surf.cloud.api.server.exposed.columns.zonedDateTime -import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity +import dev.slne.surf.roleplay.core.common.player.identity.RpIdentityType import dev.slne.surf.roleplay.server.player.db.RpPlayerTable +import dev.slne.surf.surfapi.core.api.messages.adventure.key import org.jetbrains.exposed.dao.id.LongIdTable import org.jetbrains.exposed.sql.ReferenceOption @@ -14,9 +15,8 @@ object IdentityLicenseTable : LongIdTable("identity_licenses") { onUpdate = ReferenceOption.CASCADE, onDelete = ReferenceOption.CASCADE ) - val identity = enumerationByName("identity", 255) - - val license = varchar("license", 255) + val identity = enumerationByName("identity", 255) + val license = char("license", 255).transform({ key(it) }, { it.asString() }) val expiresAt = zonedDateTime("expires_at").nullable() val createdAt = zonedDateTime("created_at").defaultExpression(CurrentZonedDateTime) diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/db/LicenseRepository.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/db/LicenseRepository.kt new file mode 100644 index 0000000..90be6dd --- /dev/null +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/db/LicenseRepository.kt @@ -0,0 +1,53 @@ +package dev.slne.surf.roleplay.server.player.license.db + +import dev.slne.surf.cloud.api.server.plugin.CoroutineTransactional +import dev.slne.surf.roleplay.core.common.player.identity.RpIdentityType +import dev.slne.surf.roleplay.core.common.player.license.NetworkIdentityLicense +import dev.slne.surf.roleplay.server.player.db.RpPlayerRepository +import net.kyori.adventure.key.Key +import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq +import org.jetbrains.exposed.sql.and +import org.jetbrains.exposed.sql.deleteWhere +import org.springframework.stereotype.Repository +import java.time.ZonedDateTime +import java.util.* + +@CoroutineTransactional +@Repository +class LicenseRepository(private val rpPlayerRepository: RpPlayerRepository) { + + suspend fun findLicensesForIdentity( + uuid: UUID, + type: RpIdentityType + ): List { + val playerId = rpPlayerRepository.findPlayerId(uuid) ?: return emptyList() + return IdentityLicenseModel.find { (IdentityLicenseTable.player eq playerId) and (IdentityLicenseTable.identity eq type) } + .map { it.toNetwork() } + } + + suspend fun createLicense( + uuid: UUID, + identityType: RpIdentityType, + licenseKey: Key, + expiresAt: ZonedDateTime?, + createdAt: ZonedDateTime + ) { + val playerModel = rpPlayerRepository.findOrCreateModel(uuid) + + IdentityLicenseModel.new { + this.player = playerModel + this.identity = identityType + this.license = licenseKey + this.expiresAt = expiresAt + this.createdAt = createdAt + } + } + + suspend fun deleteLicense(uuid: UUID, identityType: RpIdentityType, licenseKey: Key): Int { + val playerId = rpPlayerRepository.findPlayerId(uuid) ?: return 0 + val deleted = IdentityLicenseTable.deleteWhere { + (player eq playerId) and (identity eq identityType) and (license eq licenseKey) + } + return deleted + } +} \ No newline at end of file From b6aa711555512e336b1dadbe3d81a56cf23f7341 Mon Sep 17 00:00:00 2001 From: twisti Date: Sun, 24 Aug 2025 11:37:15 +0200 Subject: [PATCH 10/11] Remove outdated license, identity, and player-related classes and refactor license management to server-side services. --- settings.gradle.kts | 2 - .../packets/ServerboundCreateLicensePacket.kt | 11 ++ .../packets/ServerboundDeleteLicensePacket.kt | 18 +++ .../core/common/player/RpPlayerManager.kt | 3 +- .../common/player/license/LicenseService.kt | 118 ------------------ .../player/license/NetworkIdentityLicense.kt | 4 + .../common/transaction/utils/BalanceType.kt | 31 ++--- .../dev/slne/surf/roleplay/paper/PaperMain.kt | 5 +- .../paper/command/ActiveIdentityCommand.kt | 22 ++-- .../paper/listener/ListenerManager.kt | 19 ++- .../paper/mechanics/AbstractMechanic.kt | 9 +- .../surf/roleplay/paper/mechanics/Mechanic.kt | 2 +- .../roleplay/paper/mechanics/idcard/IdCard.kt | 47 +++---- ...dCardMechanicImpl.kt => IdCardMechanic.kt} | 4 +- .../paper/mechanics/idcard/IdCardNpc.kt | 3 +- .../idcard/dialogs/CreateIdDialog.kt | 68 +++++++--- .../idcard/listeners/IdCardHandler.kt | 8 +- .../paper/mechanics/rentable/Rentable.kt | 100 ++++++++------- .../mechanics/rentable/RentableMechanic.kt | 4 +- .../paper/mechanics/weapon/WeaponMechanic.kt | 4 +- .../roleplay/paper/player/PaperRpPlayer.kt | 2 - .../paper/player/PaperRpPlayerManager.kt | 5 + .../paper}/player/PlayerIdentityFetcher.kt | 5 +- .../paper/player/identity/RpIdentity.kt | 8 +- .../paper/player/license/HasLicenses.kt | 2 + .../paper/player/license/IdentityLicense.kt | 9 ++ .../player/license/PaperLicenseService.kt | 56 ++++++--- .../server/player/RpPlayerManagerImpl.kt | 4 - .../server/player/db/RpPlayerRepository.kt | 6 +- .../player/license/LicenseExpirationJob.kt | 24 ---- .../player/license/LicensePacketListener.kt | 29 +++++ .../server/player/license/LicenseService.kt | 26 ++++ 32 files changed, 335 insertions(+), 323 deletions(-) create mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/network/packets/ServerboundCreateLicensePacket.kt create mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/network/packets/ServerboundDeleteLicensePacket.kt delete mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/LicenseService.kt rename surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/{IdCardMechanicImpl.kt => IdCardMechanic.kt} (77%) rename {surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common => surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper}/player/PlayerIdentityFetcher.kt (86%) delete mode 100644 surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/LicenseExpirationJob.kt create mode 100644 surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/LicensePacketListener.kt create mode 100644 surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/LicenseService.kt diff --git a/settings.gradle.kts b/settings.gradle.kts index ac99d0c..1c72896 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -15,9 +15,7 @@ plugins { } include("surf-roleplay-core:surf-roleplay-core-common") -include("surf-roleplay-core:surf-roleplay-core-client") include("surf-roleplay-paper") -include("surf-roleplay-velocity") include("surf-roleplay-server") include("surf-roleplay-mod:surf-roleplay-mod-common") diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/network/packets/ServerboundCreateLicensePacket.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/network/packets/ServerboundCreateLicensePacket.kt new file mode 100644 index 0000000..ac84f15 --- /dev/null +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/network/packets/ServerboundCreateLicensePacket.kt @@ -0,0 +1,11 @@ +package dev.slne.surf.roleplay.core.common.network.packets + +import dev.slne.surf.cloud.api.common.meta.SurfNettyPacket +import dev.slne.surf.cloud.api.common.netty.network.protocol.PacketFlow +import dev.slne.surf.cloud.api.common.netty.network.protocol.boolean.BooleanResponsePacket +import dev.slne.surf.roleplay.core.common.player.license.NetworkIdentityLicense +import kotlinx.serialization.Serializable + +@SurfNettyPacket("roleplay:serverbound:create-license", PacketFlow.SERVERBOUND) +@Serializable +class ServerboundCreateLicensePacket(val license: NetworkIdentityLicense) : BooleanResponsePacket() \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/network/packets/ServerboundDeleteLicensePacket.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/network/packets/ServerboundDeleteLicensePacket.kt new file mode 100644 index 0000000..bcff4f0 --- /dev/null +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/network/packets/ServerboundDeleteLicensePacket.kt @@ -0,0 +1,18 @@ +package dev.slne.surf.roleplay.core.common.network.packets + +import dev.slne.surf.cloud.api.common.meta.SurfNettyPacket +import dev.slne.surf.cloud.api.common.netty.network.protocol.PacketFlow +import dev.slne.surf.cloud.api.common.netty.network.protocol.boolean.BooleanResponsePacket +import dev.slne.surf.roleplay.core.common.player.identity.RpIdentityType +import kotlinx.serialization.Contextual +import kotlinx.serialization.Serializable +import net.kyori.adventure.key.Key +import java.util.* + +@SurfNettyPacket("roleplay:serverbound:delete-license", PacketFlow.BIDIRECTIONAL) +@Serializable +class ServerboundDeleteLicensePacket( + val uuid: @Contextual UUID, + val identityType: RpIdentityType, + val licenseKey: @Contextual Key +) : BooleanResponsePacket() \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/RpPlayerManager.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/RpPlayerManager.kt index 499480b..a87d9c0 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/RpPlayerManager.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/RpPlayerManager.kt @@ -3,6 +3,7 @@ package dev.slne.surf.roleplay.core.common.player import com.github.benmanes.caffeine.cache.Caffeine import com.sksamuel.aedile.core.expireAfterAccess import dev.slne.surf.surfapi.core.api.util.toObjectList +import it.unimi.dsi.fastutil.objects.ObjectList import org.springframework.scheduling.annotation.Scheduled import org.springframework.stereotype.Component import java.util.* @@ -17,7 +18,7 @@ abstract class RpPlayerManager { .expireAfterAccess(30.minutes) .build { createPlayer(it) } - val players get() = cache.asMap().values.toObjectList() + val players: ObjectList get() = cache.asMap().values.toObjectList() abstract fun createPlayer(uuid: UUID): RpPlayer abstract fun onlineUuids(): List diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/LicenseService.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/LicenseService.kt deleted file mode 100644 index 1a2e7fc..0000000 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/LicenseService.kt +++ /dev/null @@ -1,118 +0,0 @@ -@file:OptIn(InternalRoleplayApi::class) - -package dev.slne.surf.roleplay.core.common.player.license - -import dev.slne.surf.cloud.api.common.util.toObjectSet -import dev.slne.surf.roleplay.core.common.player.RpPlayer -import dev.slne.surf.roleplay.core.common.player.identity.RpIdentity -import it.unimi.dsi.fastutil.objects.Object2ObjectMap -import it.unimi.dsi.fastutil.objects.ObjectSet -import net.kyori.adventure.key.Key -import org.jetbrains.annotations.Unmodifiable -import org.springframework.beans.factory.getBean -import org.springframework.context.ApplicationContext -import org.springframework.stereotype.Component - -@Component -abstract class LicenseService( - private val context: ApplicationContext -) { - - /** - * All licenses available in the game. - */ - val licenses: @Unmodifiable ObjectSet - get() = context.getBeansOfType(License::class.java) - .values - .toObjectSet() - - /** - * Retrieves a license of the specified type. - * - * @param T The type of the license to retrieve. - * @param license The class object of the license type. - * @return An instance of the requested license type. - */ - fun getLicense(license: Class): T = context.getBean(license) - - /** - * Returns the license by its key. - * - * @param key the key of the license to retrieve. - * @return the license instance if found, or null if not found. - */ - fun getLicenseByKey(key: Key): License? = licenses.find { it.key == key } - - /** - * Returns the license by its key. - * - * @param key the key of the license to retrieve. - * @return the license instance if found. - * @throws IllegalArgumentException if the license is not found. - */ - fun getLicenseByKeyOrThrow(key: Key): License = - getLicenseByKey(key) ?: error("License with key $key not found in the context.") - - /** - * Creates a new license for the given identity. - * - * @param identityLicense the license to create. - * @return the result of the license creation, including success status and any unobtainable reasons. - */ - abstract suspend fun createLicense(identityLicense: IdentityLicense): IdentityLicense - - /** - * Confiscates a license from the given identity. - * - * @param identity the identity from which the license will be confiscated. - * @param license the license to be confiscated. - * @param confiscatedBy the player who is confiscating the license. - * @param confiscatedReason the reason for confiscation. - * @return a result indicating whether the confiscation was successful. - */ - abstract suspend fun confiscateLicense( - identity: RpIdentity, - license: License, - confiscatedBy: RpPlayer, - confiscatedReason: String - ): Boolean - - /** - * Removes a license from the given identity. - * - * @param identity the identity from which the license will be removed. - * @param license the license to be removed. - * @return true if the removal was successful, false otherwise. - */ - abstract suspend fun removeLicense( - identity: RpIdentity, - license: License - ): Boolean - - /** - * Retrieves all expired licenses grouped by their respective identities. - * - * This method scans through the available licenses and identifies those - * that have expired. The expired licenses are returned as a mapping - * of identities to their associated expired licenses. - * - * @return A map where each key is an [dev.slne.surf.roleplay.paper.player.identity.RpIdentity] and the corresponding value - * is a set of [IdentityLicense] objects representing the expired licenses - * for that identity. - */ - abstract suspend fun getAllExpiredLicenses(): Object2ObjectMap> - - companion object { - val instance get() = InternalContextHolder.instance.context.getBean() - } -} - -/** - * Convenience function to get a license by its type, or throw an exception if not found. - * - * @param T the type of the license to retrieve. - * @return the license instance if found. - * @throws IllegalArgumentException if the license is not found. - */ -inline fun LicenseService.getLicense() = - getLicense(T::class.java) \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/NetworkIdentityLicense.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/NetworkIdentityLicense.kt index bac935b..b75c199 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/NetworkIdentityLicense.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/license/NetworkIdentityLicense.kt @@ -1,12 +1,16 @@ package dev.slne.surf.roleplay.core.common.player.license +import dev.slne.surf.roleplay.core.common.player.identity.RpIdentityType import kotlinx.serialization.Contextual import kotlinx.serialization.Serializable import net.kyori.adventure.key.Key import java.time.ZonedDateTime +import java.util.* @Serializable data class NetworkIdentityLicense( + val owner: @Contextual UUID, + val identityType: RpIdentityType, val licenseKey: @Contextual Key, val expiresAt: @Contextual ZonedDateTime?, val createdAt: @Contextual ZonedDateTime = ZonedDateTime.now() diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/transaction/utils/BalanceType.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/transaction/utils/BalanceType.kt index 9fa51ca..b5dce35 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/transaction/utils/BalanceType.kt +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/transaction/utils/BalanceType.kt @@ -1,38 +1,31 @@ package dev.slne.surf.roleplay.core.common.transaction.utils -import dev.slne.surf.roleplay.core.common.player.identity.RpIdentity -import dev.slne.surf.roleplay.core.common.player.identity.identities.CivilianIdentity -import dev.slne.surf.roleplay.core.common.player.identity.identities.PoliceIdentity -import dev.slne.surf.roleplay.core.common.player.identity.identities.RescueServiceIdentity +import dev.slne.surf.roleplay.core.common.player.identity.RpIdentityType -enum class BalanceType(val currencyName: (RpIdentity) -> String) { +enum class BalanceType(private val currencyName: (RpIdentityType) -> String) { CASH({ when (it) { - is CivilianIdentity -> "civilian_cash" - is PoliceIdentity -> "police_cash" - is RescueServiceIdentity -> "rescue_service_cash" - else -> error("Unknown identity type: ${it::class.simpleName}") + RpIdentityType.CIVILIAN -> "civilian_cash" + RpIdentityType.POLICE -> "police_cash" + RpIdentityType.RESCUE_SERVICE -> "rescue_service_cash" } }), BANK({ when (it) { - is CivilianIdentity -> "civilian_bank" - is PoliceIdentity -> "police_bank" - is RescueServiceIdentity -> "rescue_service_bank" - else -> error("Unknown identity type: ${it::class.simpleName}") + RpIdentityType.CIVILIAN -> "civilian_bank" + RpIdentityType.POLICE -> "police_bank" + RpIdentityType.RESCUE_SERVICE -> "rescue_service_bank" } }), CRYPTO({ when (it) { - is CivilianIdentity -> "civilian_crypto" - is PoliceIdentity -> "police_crypto" - is RescueServiceIdentity -> "rescue_service_crypto" - else -> error("Unknown identity type: ${it::class.simpleName}") + RpIdentityType.CIVILIAN -> "civilian_crypto" + RpIdentityType.POLICE -> "police_crypto" + RpIdentityType.RESCUE_SERVICE -> "rescue_service_crypto" } }); - fun getCurrencyName(identity: RpIdentity) = - currencyName(identity).let { "roleplay_$it" } + fun getCurrencyName(type: RpIdentityType) = "roleplay_${currencyName(type)}" } \ No newline at end of file diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/PaperMain.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/PaperMain.kt index 0923c52..4cb1984 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/PaperMain.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/PaperMain.kt @@ -1,16 +1,15 @@ package dev.slne.surf.roleplay.paper import com.github.shynixn.mccoroutine.folia.SuspendingJavaPlugin +import dev.slne.surf.roleplay.RoleplayApplication import dev.slne.surf.roleplay.core.common.RpInstance import dev.slne.surf.roleplay.paper.command.activeIdentityCommand import dev.slne.surf.roleplay.paper.command.balanceCommand import org.bukkit.plugin.java.JavaPlugin import org.springframework.beans.factory.getBean -@OptIn(InternalRoleplayApi::class) class PaperMain : SuspendingJavaPlugin() { - - private val rpInstance get() = InternalContextHolder.instance.context.getBean() + private val rpInstance get() = RoleplayApplication.context.getBean() override suspend fun onLoadAsync() { rpInstance.onLoad() diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/command/ActiveIdentityCommand.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/command/ActiveIdentityCommand.kt index d122c0f..76abd41 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/command/ActiveIdentityCommand.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/command/ActiveIdentityCommand.kt @@ -1,27 +1,23 @@ package dev.slne.surf.roleplay.paper.command -import com.github.shynixn.mccoroutine.folia.launch import dev.jorel.commandapi.kotlindsl.commandAPICommand import dev.jorel.commandapi.kotlindsl.playerExecutor import dev.slne.surf.roleplay.paper.player.rpPlayer -import dev.slne.surf.roleplay.paper.plugin import dev.slne.surf.surfapi.core.api.messages.adventure.sendText fun activeIdentityCommand() = commandAPICommand("active-identity") { playerExecutor { player, args -> - plugin.launch { - val rpPlayer = player.rpPlayer - val activeIdentity = rpPlayer.activeIdentity + val rpPlayer = player.rpPlayer + val activeIdentity = rpPlayer.activeIdentity - player.sendText { - appendPrefix() + player.sendText { + appendPrefix() - info("Deine aktive Identität: ") - if (activeIdentity != null) { - append(activeIdentity.type) - } else { - variableValue("Keine aktive Identität gesetzt") - } + info("Deine aktive Identität: ") + if (activeIdentity != null) { + append(activeIdentity.type) + } else { + variableValue("Keine aktive Identität gesetzt") } } } diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/listener/ListenerManager.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/listener/ListenerManager.kt index 1439768..b5357b1 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/listener/ListenerManager.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/listener/ListenerManager.kt @@ -14,8 +14,9 @@ import com.github.shynixn.mccoroutine.folia.launch import com.github.shynixn.mccoroutine.folia.regionDispatcher import dev.jorel.commandapi.kotlindsl.commandAPICommand import dev.jorel.commandapi.kotlindsl.playerExecutor -import dev.slne.surf.roleplay.paper.spring.RpPacketListener +import dev.slne.surf.cloud.api.common.util.objectSetOf import dev.slne.surf.roleplay.paper.plugin +import dev.slne.surf.roleplay.paper.spring.RpPacketListener import dev.slne.surf.surfapi.bukkit.api.builder.ItemStack import dev.slne.surf.surfapi.core.api.messages.adventure.playSound import io.papermc.paper.datacomponent.DataComponentTypes @@ -62,6 +63,12 @@ class ListenerManager : Listener { @RpPacketListener class ArrowHitListener : PacketListener { + private val blockSounds = objectSetOf( + Sounds.ENTITY_ARROW_HIT, + Sounds.ENTITY_ARROW_SHOOT, + Sounds.ENTITY_ARROW_SHOOT + ) + override fun onPacketSend(event: PacketSendEvent) { if (event.packetType == PacketType.Play.Server.SPAWN_ENTITY) { val packet = WrapperPlayServerSpawnEntity(event) @@ -70,18 +77,10 @@ class ListenerManager : Listener { if (type == EntityTypes.ARROW) { event.isCancelled = true } - } - - if (event.packetType == PacketType.Play.Server.SOUND_EFFECT) { + } else if (event.packetType == PacketType.Play.Server.SOUND_EFFECT) { val packet = WrapperPlayServerSoundEffect(event) val sound = packet.sound - val blockSounds = setOf( - Sounds.ENTITY_ARROW_HIT, - Sounds.ENTITY_ARROW_SHOOT, - Sounds.ENTITY_ARROW_SHOOT - ) - if (sound in blockSounds) { event.isCancelled = true } diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/AbstractMechanic.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/AbstractMechanic.kt index f11a468..1197d0a 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/AbstractMechanic.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/AbstractMechanic.kt @@ -1,8 +1,11 @@ -@file:OptIn(InternalRoleplayApi::class) - package dev.slne.surf.roleplay.paper.mechanics import dev.slne.surf.roleplay.core.common.RpLifecycle -abstract class AbstractMechanic(val name: String) : RpLifecycle { +abstract class AbstractMechanic : RpLifecycle { + private val annotation by lazy { + javaClass.getAnnotation(Mechanic::class.java) ?: error("@Mechanic annotation is missing!") + } + + val name by lazy { annotation.name } } \ No newline at end of file diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/Mechanic.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/Mechanic.kt index 8510cb1..51c5a42 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/Mechanic.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/Mechanic.kt @@ -5,4 +5,4 @@ import org.springframework.stereotype.Component @Retention(AnnotationRetention.RUNTIME) @Target(AnnotationTarget.CLASS) @Component -annotation class Mechanic() +annotation class Mechanic(val name: String) diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/IdCard.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/IdCard.kt index 81b2f3d..cdf2908 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/IdCard.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/IdCard.kt @@ -1,6 +1,6 @@ package dev.slne.surf.roleplay.paper.mechanics.idcard -import dev.slne.surf.surfapi.bukkit.api.builder.ItemStack +import dev.slne.surf.surfapi.bukkit.api.builder.buildItem import dev.slne.surf.surfapi.bukkit.api.builder.buildLore import dev.slne.surf.surfapi.bukkit.api.builder.displayName import dev.slne.surf.surfapi.core.api.font.toSmallCaps @@ -15,30 +15,31 @@ object IdCard { internal val formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy") val idCardKey = NamespacedKey("surf-roleplay-mechanic", "id_card") - fun idCard(firstName: String, lastName: String, birthDate: LocalDate) = - ItemStack(Material.FEATHER) { - displayName { - primary("Personalausweis") + fun idCard( + firstName: String, + lastName: String, + birthDate: LocalDate + ) = buildItem(Material.FEATHER) { + displayName { primary("Personalausweis") } + buildLore { + line { + spacer(" — ") + variableKey("Vorname: ".toSmallCaps()) + variableValue(firstName) } - buildLore { - line { - spacer(" - ") - variableKey("Vorname: ".toSmallCaps()) - variableValue(firstName) - } - line { - spacer(" - ") - variableKey("nachname: ".toSmallCaps()) - variableValue(lastName) - } - line { - spacer(" - ") - variableKey("geburtsdatum: ".toSmallCaps()) - variableValue(formatter.format(birthDate)) - } + line { + spacer(" — ") + variableKey("Nachname: ".toSmallCaps()) + variableValue(lastName) } - editPersistentDataContainer { - it.set(idCardKey, PersistentDataType.BYTE, 1.toByte()) + line { + spacer(" — ") + variableKey("Geburtsdatum: ".toSmallCaps()) + variableValue(formatter.format(birthDate)) } } + editPersistentDataContainer { + it.set(idCardKey, PersistentDataType.BYTE, 1.toByte()) + } + } } \ No newline at end of file diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/IdCardMechanicImpl.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/IdCardMechanic.kt similarity index 77% rename from surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/IdCardMechanicImpl.kt rename to surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/IdCardMechanic.kt index 3dcd817..919ffa3 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/IdCardMechanicImpl.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/IdCardMechanic.kt @@ -3,8 +3,8 @@ package dev.slne.surf.roleplay.paper.mechanics.idcard import dev.slne.surf.roleplay.paper.mechanics.AbstractMechanic import dev.slne.surf.roleplay.paper.mechanics.Mechanic -@Mechanic -class IdCardMechanicImpl : AbstractMechanic("IdCardMechanic") { +@Mechanic("IdCardMechanic") +class IdCardMechanic : AbstractMechanic() { override suspend fun onEnable() { IdCardNpc.spawnNpc() } diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/IdCardNpc.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/IdCardNpc.kt index 6659c23..97e0596 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/IdCardNpc.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/IdCardNpc.kt @@ -3,6 +3,7 @@ package dev.slne.surf.roleplay.paper.mechanics.idcard import dev.slne.surf.npc.api.dsl.npc import dev.slne.surf.npc.api.surfNpcApi import dev.slne.surf.roleplay.paper.plugin +import dev.slne.surf.surfapi.bukkit.api.extensions.server object IdCardNpc { const val NPC_NAME = "idcard_npc" @@ -19,7 +20,7 @@ object IdCardNpc { skin = npcSkin location { - world = "world" + world = server.worlds.first().name x = 2.0 y = 100.0 z = 0.0 diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/dialogs/CreateIdDialog.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/dialogs/CreateIdDialog.kt index 3036b4b..1ddce04 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/dialogs/CreateIdDialog.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/dialogs/CreateIdDialog.kt @@ -4,8 +4,8 @@ package dev.slne.surf.roleplay.paper.mechanics.idcard.dialogs import com.github.shynixn.mccoroutine.folia.launch -import dev.slne.surf.roleplay.paper.player.identity.identities.CivilianIdentity import dev.slne.surf.roleplay.paper.mechanics.idcard.IdCard +import dev.slne.surf.roleplay.paper.player.identity.identities.CivilianIdentity import dev.slne.surf.roleplay.paper.player.rpPlayer import dev.slne.surf.roleplay.paper.plugin import dev.slne.surf.surfapi.bukkit.api.dialog.base @@ -15,16 +15,23 @@ import dev.slne.surf.surfapi.bukkit.api.dialog.clearDialogs import dev.slne.surf.surfapi.bukkit.api.dialog.dialog import dev.slne.surf.surfapi.bukkit.api.dialog.type import dev.slne.surf.surfapi.bukkit.api.nms.NmsUseWithCaution +import dev.slne.surf.surfapi.core.api.command.builder.CommandExceptionBuilder +import dev.slne.surf.surfapi.core.api.messages.adventure.appendNewline import io.papermc.paper.dialog.Dialog import io.papermc.paper.registry.data.dialog.ActionButton import io.papermc.paper.registry.data.dialog.DialogBase.DialogAfterAction import net.kyori.adventure.text.format.TextDecoration import java.time.LocalDate import java.time.Year +import java.time.format.DateTimeParseException private val nameRegex = "^[a-zA-ZÄÖÜäöüß]{3,16}".toRegex() private val nameRegexDashes = "^[a-zA-ZÄÖÜäöüß-]{3,16}".toRegex() +private const val FIRST_NAME_INPUT = "first_name" +private const val LAST_NAME_INPUT = "last_name" +private const val BIRTH_DATE_INPUT = "birth_date" + fun createIdDialog( firstName: String? = null, lastName: String? = null, @@ -46,28 +53,26 @@ fun createIdDialog( } input { - text("first_name") { + text(FIRST_NAME_INPUT) { label { text("Vorname") } - firstName?.let { initial(it) } + initial = firstName maxLength(16) width(400) } - } - input { - text("last_name") { + + text(LAST_NAME_INPUT) { label { text("Nachname") } - lastName?.let { initial(it) } + initial = lastName maxLength(16) width(400) } - } - input { - text("birth_date") { + + text(BIRTH_DATE_INPUT) { label { text("Geburtsdatum ") spacer("[DD.MM.JJJJ]") } - birthDateString?.let { initial(it) } + initial = birthDateString maxLength(10) width(400) } @@ -87,15 +92,17 @@ private fun confirmCreationButton(): ActionButton = actionButton { action { customPlayerClick { info, player -> - val firstName = info.getText("first_name") ?: "" - val lastName = info.getText("last_name") ?: "" - val birthDateString = info.getText("birth_date") ?: "" + val firstName = info.getText(FIRST_NAME_INPUT) ?: "" + val lastName = info.getText(LAST_NAME_INPUT) ?: "" + val birthDateString = info.getText(BIRTH_DATE_INPUT) ?: "" val isValidFirstNameLength = firstName.matches(nameRegex) val isValidLastNameLength = lastName.matches(nameRegex) val isValidFirstName = firstName.matches(nameRegexDashes) val isValidLastName = lastName.matches(nameRegexDashes) - val isValidBirthDateString = validateDate(birthDateString) + val parsedBirthDate = runCatching { LocalDate.parse(birthDateString, IdCard.formatter) } + + val isValidBirthDateString = validateDate(parsedBirthDate) if (!isValidBirthDateString || !isValidFirstName || !isValidLastName || !isValidFirstNameLength || !isValidLastNameLength) { player.showDialog( @@ -129,6 +136,16 @@ private fun confirmCreationButton(): ActionButton = actionButton { if (!isValidBirthDateString) { val now = LocalDate.now() val validYear = now.minusYears(100) + val exception = parsedBirthDate.exceptionOrNull() + val exceptionMessage = + if (exception != null && exception is DateTimeParseException) { + CommandExceptionBuilder( + exception.message, + exception.parsedString, + exception.errorIndex + ).build(null) + } else null + plainMessage(400) { error("Das angegebene Geburtsdatum ist ungültig. Bitte gib ein gültiges Datum im folgenden Format ein: ") variableValue("TT.MM.JJJJ") @@ -138,6 +155,11 @@ private fun confirmCreationButton(): ActionButton = actionButton { error(" und nicht nach ") variableValue(now.year) error(" liegen.") + + if (exceptionMessage != null) { + appendNewline(2) + append(exceptionMessage) + } } } } @@ -145,8 +167,6 @@ private fun confirmCreationButton(): ActionButton = actionButton { return@customPlayerClick } - val birthDate = LocalDate.parse(birthDateString, IdCard.formatter) - plugin.launch { val rpPlayer = player.rpPlayer val identity = rpPlayer.createOrUpdateIdentity( @@ -154,13 +174,12 @@ private fun confirmCreationButton(): ActionButton = actionButton { uuid = player.uniqueId, firstName = firstName, lastName = lastName, - dateOfBirth = birthDate + dateOfBirth = parsedBirthDate.getOrThrow() ) ) rpPlayer.setActiveIdentity(identity) - - player.showDialog(idCreationSuccess(firstName, lastName, birthDate)) + player.showDialog(idCreationSuccess(firstName, lastName, parsedBirthDate.getOrThrow())) } } } @@ -202,6 +221,7 @@ private fun idCreationSuccess( base { title { success("Dein Personalausweises wurde erfolgreich mit folgenden Angaben erstellt:") } afterAction(DialogAfterAction.NONE) + preventClosingWithEscape() body { plainMessage(400) { @@ -245,6 +265,14 @@ private fun cancelCreationButton() = actionButton { } } +private fun validateDate(result: Result): Boolean { + val date = result.getOrNull() ?: return false + + val currentYear = Year.now().value + val minYear = currentYear - 100 + return date.year in minYear..currentYear +} + private fun validateDate(dateString: String): Boolean { val parts = dateString.split(".") diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/listeners/IdCardHandler.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/listeners/IdCardHandler.kt index 194d7f0..e288653 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/listeners/IdCardHandler.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/idcard/listeners/IdCardHandler.kt @@ -10,6 +10,7 @@ import dev.slne.surf.roleplay.paper.player.rpPlayer import dev.slne.surf.roleplay.paper.plugin import dev.slne.surf.surfapi.core.api.messages.adventure.playSound import dev.slne.surf.surfapi.core.api.messages.adventure.sendText +import net.kyori.adventure.sound.Sound.Source import org.bukkit.Sound import org.bukkit.event.EventHandler import org.bukkit.event.Listener @@ -19,8 +20,7 @@ import org.springframework.stereotype.Component class IdCardHandler : Listener { private val idCardNpc - get() = surfNpcApi.getNpc(IdCardNpc.NPC_NAME) - ?: error("The IDCard NPC is not registered") + get() = surfNpcApi.getNpc(IdCardNpc.NPC_NAME) ?: error("The IDCard NPC is not registered") @EventHandler fun onNpcInteract(event: NpcInteractEvent) { @@ -40,8 +40,8 @@ class IdCardHandler : Listener { player.playSound(true) { type(Sound.BLOCK_NOTE_BLOCK_BASS) - volume(.5f) - source(net.kyori.adventure.sound.Sound.Source.MUSIC) + volume(0.5f) + source(Source.MUSIC) } return@launch } diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/Rentable.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/Rentable.kt index 7c71e21..a658323 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/Rentable.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/Rentable.kt @@ -1,11 +1,19 @@ package dev.slne.surf.roleplay.paper.mechanics.rentable +import dev.slne.surf.roleplay.core.common.player.RpPlayer +import dev.slne.surf.roleplay.paper.mechanics.rentable.RentableMechanic.RentCollectResult import dev.slne.surf.roleplay.paper.mechanics.rentable.events.RentableMemberAddEvent +import dev.slne.surf.roleplay.paper.mechanics.rentable.events.RentableMemberAddEvent.MemberAddFailureReason +import dev.slne.surf.roleplay.paper.mechanics.rentable.events.RentableMemberAddEvent.MemberAddResult import dev.slne.surf.roleplay.paper.mechanics.rentable.events.RentableMemberRemoveEvent +import dev.slne.surf.roleplay.paper.mechanics.rentable.events.RentableMemberRemoveEvent.MemberRemoveFailureReason +import dev.slne.surf.roleplay.paper.mechanics.rentable.events.RentableMemberRemoveEvent.MemberRemoveResult import dev.slne.surf.roleplay.paper.mechanics.rentable.events.RentableOwnerChangeEvent +import dev.slne.surf.roleplay.paper.mechanics.rentable.events.RentableOwnerChangeEvent.* import dev.slne.surf.roleplay.paper.mechanics.rentable.events.RentableRentCollectEvent import dev.slne.surf.roleplay.paper.mechanics.rentable.utils.DoorContainer -import dev.slne.surf.roleplay.core.common.player.RpPlayer +import dev.slne.surf.roleplay.paper.player.PaperRpPlayer +import dev.slne.surf.surfapi.core.api.collection.TransformingObjectSet import dev.slne.surf.surfapi.core.api.messages.adventure.buildText import dev.slne.surf.surfapi.core.api.util.freeze import dev.slne.surf.surfapi.core.api.util.mutableObjectSetOf @@ -14,6 +22,7 @@ import it.unimi.dsi.fastutil.objects.ObjectSet import net.kyori.adventure.key.Key import net.kyori.adventure.text.ComponentLike import java.time.ZonedDateTime +import java.util.* import java.util.concurrent.atomic.AtomicBoolean import kotlin.time.Duration @@ -28,23 +37,28 @@ abstract class Rentable( doorContainers: ObjectSet = objectSetOf() ) : ComponentLike { - private val _members = mutableObjectSetOf() + private val _members = mutableObjectSetOf() private val _storageContainers = mutableObjectSetOf() private val _doorContainers = mutableObjectSetOf() - - val storageContainers = _storageContainers.freeze() - val doorContainers = _doorContainers.freeze() - private val collectingRent = AtomicBoolean(false) - init { _storageContainers.addAll(storageContainers) _doorContainers.addAll(doorContainers) } - var owner: RpPlayer? = null - val members get() = _members.freeze() + val storageContainers = _storageContainers.freeze() + val doorContainers = _doorContainers.freeze() + + private var ownerUuid: UUID? = null + var owner: PaperRpPlayer? + get() = ownerUuid?.let(PaperRpPlayer::get) + set(value) { + ownerUuid = value?.uuid + } + + + val members = TransformingObjectSet(_members, PaperRpPlayer::get, PaperRpPlayer::uuid).freeze() val isRented: Boolean get() = owner != null var lastRentCollection: ZonedDateTime? = null @@ -53,13 +67,13 @@ abstract class Rentable( * * @return The result of the rent collection, indicating success or failure. */ - suspend fun collectRent(): RentableMechanic.RentCollectResult { + suspend fun collectRent(): RentCollectResult { if (!collectingRent.compareAndSet(false, true)) { // exit quickly if already collecting - return RentableMechanic.RentCollectResult.ALREADY_COLLECTING + return RentCollectResult.ALREADY_COLLECTING } try { - val currentOwner = owner ?: return RentableMechanic.RentCollectResult.NOT_RENTED + val currentOwner = owner ?: return RentCollectResult.NOT_RENTED val currentBankBalance = currentOwner.getBankBalance() val event = RentableRentCollectEvent( @@ -70,19 +84,19 @@ abstract class Rentable( event.post() if (event.isCancelled) { - return RentableMechanic.RentCollectResult.EVENT_CANCELLED + return RentCollectResult.EVENT_CANCELLED } val rent = event.amount if (rent > currentBankBalance) { - return RentableMechanic.RentCollectResult.NOT_ENOUGH_MONEY + return RentCollectResult.NOT_ENOUGH_MONEY } currentOwner.removeBankBalance(rent) lastRentCollection = ZonedDateTime.now() - return RentableMechanic.RentCollectResult.SUCCESS + return RentCollectResult.SUCCESS } finally { collectingRent.set(false) } @@ -96,31 +110,31 @@ abstract class Rentable( * @return The result of the owner change event, indicating success or failure. */ suspend fun setOwner( - player: RpPlayer?, - reason: RentableOwnerChangeEvent.OwnerChangeReason - ): RentableOwnerChangeEvent.OwnerSetResult { + player: PaperRpPlayer?, + reason: OwnerChangeReason + ): OwnerSetResult { val event = RentableOwnerChangeEvent(this, this, owner, player, reason) event.post() if (event.isCancelled) { - return RentableOwnerChangeEvent.OwnerSetResult.Failure( - RentableOwnerChangeEvent.OwnerSetFailureReason.EventCancelled( + return OwnerSetResult.Failure( + OwnerSetFailureReason.EventCancelled( event.cancelReason ?: "Unbekannt" ) ) } if (player == null) { - owner = null + ownerUuid = null lastRentCollection = null _members.clear() - return RentableOwnerChangeEvent.OwnerSetResult.Success + return OwnerSetResult.Success } if (player == owner) { - return RentableOwnerChangeEvent.OwnerSetResult.Failure( - RentableOwnerChangeEvent.OwnerSetFailureReason.AlreadyOwned + return OwnerSetResult.Failure( + OwnerSetFailureReason.AlreadyOwned ) } @@ -128,8 +142,8 @@ abstract class Rentable( val ownedRentables = mechanic.getOwnedRentablesByPlayer(player) if (ownedRentables.size >= maxRentables) { - return RentableOwnerChangeEvent.OwnerSetResult.Failure( - RentableOwnerChangeEvent.OwnerSetFailureReason.AlreadyOwningTooManyRentables( + return OwnerSetResult.Failure( + OwnerSetFailureReason.AlreadyOwningTooManyRentables( ownedRentables.size, maxRentables ) @@ -139,8 +153,8 @@ abstract class Rentable( val currentMoney = player.getBankBalance() if (currentMoney < rent) { - return RentableOwnerChangeEvent.OwnerSetResult.Failure( - RentableOwnerChangeEvent.OwnerSetFailureReason.NotEnoughMoney( + return OwnerSetResult.Failure( + OwnerSetFailureReason.NotEnoughMoney( currentMoney = currentMoney, requiredMoney = rent ) @@ -150,15 +164,15 @@ abstract class Rentable( owner = player val result = collectRent() - if (result != RentableMechanic.RentCollectResult.SUCCESS) { + if (result != RentCollectResult.SUCCESS) { owner = null - return RentableOwnerChangeEvent.OwnerSetResult.Failure( - RentableOwnerChangeEvent.OwnerSetFailureReason.RentCollectionFailed(result) + return OwnerSetResult.Failure( + OwnerSetFailureReason.RentCollectionFailed(result) ) } - return RentableOwnerChangeEvent.OwnerSetResult.Success + return OwnerSetResult.Success } /** @@ -167,21 +181,21 @@ abstract class Rentable( * @param player The player to add as a member. * @return The result of the member addition event, indicating success or failure. */ - suspend fun addMember(player: RpPlayer): RentableMemberAddEvent.MemberAddResult { + suspend fun addMember(player: RpPlayer): MemberAddResult { if (isMember(player)) { - return RentableMemberAddEvent.MemberAddResult.Failure(RentableMemberAddEvent.MemberAddFailureReason.AlreadyMember) + return MemberAddResult.Failure(MemberAddFailureReason.AlreadyMember) } val event = RentableMemberAddEvent(this, this, player) event.post() if (event.isCancelled) { - return RentableMemberAddEvent.MemberAddResult.Failure(RentableMemberAddEvent.MemberAddFailureReason.EventCancelled) + return MemberAddResult.Failure(MemberAddFailureReason.EventCancelled) } - _members.add(player) + _members.add(player.uuid) - return RentableMemberAddEvent.MemberAddResult.Success + return MemberAddResult.Success } /** @@ -190,21 +204,21 @@ abstract class Rentable( * @param player The player to remove from the members. * @return The result of the member removal event, indicating success or failure. */ - suspend fun removeMember(player: RpPlayer): RentableMemberRemoveEvent.MemberRemoveResult { + suspend fun removeMember(player: RpPlayer): MemberRemoveResult { if (!isMember(player)) { - return RentableMemberRemoveEvent.MemberRemoveResult.Failure(RentableMemberRemoveEvent.MemberRemoveFailureReason.NotMember) + return MemberRemoveResult.Failure(MemberRemoveFailureReason.NotMember) } val event = RentableMemberRemoveEvent(this, this, player) event.post() if (event.isCancelled) { - return RentableMemberRemoveEvent.MemberRemoveResult.Failure(RentableMemberRemoveEvent.MemberRemoveFailureReason.EventCancelled) + return MemberRemoveResult.Failure(MemberRemoveFailureReason.EventCancelled) } - _members.remove(player) + _members.remove(player.uuid) - return RentableMemberRemoveEvent.MemberRemoveResult.Success + return MemberRemoveResult.Success } /** @@ -213,7 +227,7 @@ abstract class Rentable( * @param player The player to check. * @return True if the player is a member, false otherwise. */ - fun isMember(player: RpPlayer) = _members.contains(player) || owner == player + fun isMember(player: RpPlayer) = _members.contains(player.uuid) || ownerUuid == player.uuid override fun asComponent() = buildText { variableValue(key.asString()) diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/RentableMechanic.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/RentableMechanic.kt index f642aa0..9e66b28 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/RentableMechanic.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/RentableMechanic.kt @@ -14,8 +14,8 @@ import java.time.ZonedDateTime import java.util.concurrent.TimeUnit import kotlin.time.Duration.Companion.seconds -@Mechanic -class RentableMechanic : AbstractMechanic("RentableMechanic") { +@Mechanic("RentableMechanic") +class RentableMechanic : AbstractMechanic() { private val _rentables = mutableObjectSetOf() val rentables = _rentables.freeze() diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/weapon/WeaponMechanic.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/weapon/WeaponMechanic.kt index 2603a0b..9afd574 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/weapon/WeaponMechanic.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/weapon/WeaponMechanic.kt @@ -5,8 +5,8 @@ import dev.slne.surf.roleplay.paper.mechanics.Mechanic import dev.slne.surf.surfapi.core.api.util.freeze import dev.slne.surf.surfapi.core.api.util.mutableObjectSetOf -@Mechanic -class WeaponMechanic : AbstractMechanic("WeaponMechanic") { +@Mechanic("WeaponMechanic") +class WeaponMechanic : AbstractMechanic() { private val _weapons = mutableObjectSetOf() val weapons = _weapons.freeze() } \ No newline at end of file diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/PaperRpPlayer.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/PaperRpPlayer.kt index e07cd73..617054e 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/PaperRpPlayer.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/PaperRpPlayer.kt @@ -2,12 +2,10 @@ package dev.slne.surf.roleplay.paper.player import dev.slne.surf.roleplay.RoleplayApplication import dev.slne.surf.roleplay.core.common.player.RpPlayer -import dev.slne.surf.roleplay.core.common.player.getIdentity import dev.slne.surf.roleplay.core.common.player.identity.RpIdentityType import dev.slne.surf.roleplay.core.common.transaction.utils.BalanceType import dev.slne.surf.roleplay.paper.player.identity.PaperIdentityService import dev.slne.surf.roleplay.paper.player.identity.RpIdentity -import dev.slne.surf.roleplay.paper.player.identity.identities.CivilianIdentity import dev.slne.surf.roleplay.paper.player.license.HasLicenses import dev.slne.surf.roleplay.paper.player.license.License import dev.slne.surf.roleplay.paper.player.license.utils.LicenseRemovedReason diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/PaperRpPlayerManager.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/PaperRpPlayerManager.kt index 3a40e7a..b976a5e 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/PaperRpPlayerManager.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/PaperRpPlayerManager.kt @@ -1,13 +1,18 @@ package dev.slne.surf.roleplay.paper.player +import dev.slne.surf.roleplay.core.common.player.RpPlayer import dev.slne.surf.roleplay.core.common.player.RpPlayerManager import dev.slne.surf.roleplay.paper.player.identity.RpIdentity import dev.slne.surf.surfapi.bukkit.api.extensions.server +import io.papermc.paper.datacomponent.item.attribute.AttributeModifierDisplay.override +import it.unimi.dsi.fastutil.objects.ObjectList import org.springframework.stereotype.Component import java.util.* @Component class PaperRpPlayerManager : RpPlayerManager() { + override val players get() = super.players as ObjectList + override fun createPlayer(uuid: UUID) = PaperRpPlayer(uuid) override fun onlineUuids() = server.onlinePlayers.map { it.uniqueId } diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/PlayerIdentityFetcher.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/PlayerIdentityFetcher.kt similarity index 86% rename from surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/PlayerIdentityFetcher.kt rename to surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/PlayerIdentityFetcher.kt index 65d25bb..d28264c 100644 --- a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/PlayerIdentityFetcher.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/PlayerIdentityFetcher.kt @@ -1,4 +1,4 @@ -package dev.slne.surf.roleplay.core.common.player +package dev.slne.surf.roleplay.paper.player import dev.slne.surf.cloud.api.common.player.OfflineCloudPlayer import dev.slne.surf.cloud.api.common.player.task.PrePlayerJoinTask @@ -11,8 +11,7 @@ class PlayerIdentityFetcher : PrePlayerJoinTask { override suspend fun preJoin(player: OfflineCloudPlayer): PrePlayerJoinTask.Result { try { - player.rpPlayer().fetchIdentities() - + PaperRpPlayer[player.uuid].fetchIdentities() return PrePlayerJoinTask.Result.ALLOWED } catch (e: Throwable) { log.atSevere() diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/identity/RpIdentity.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/identity/RpIdentity.kt index b6c5ae2..6879e6c 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/identity/RpIdentity.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/identity/RpIdentity.kt @@ -143,7 +143,7 @@ abstract class RpIdentity : HasRpTransactions, HasLicenses { ) override suspend fun getBalance(balanceType: BalanceType): Int { - val currencyName = balanceType.getCurrencyName(this) + val currencyName = balanceType.getCurrencyName(type) ?: throw IllegalArgumentException("Unknown balance type: $balanceType") return currencyMap[balanceType] ?: 0 @@ -153,7 +153,7 @@ abstract class RpIdentity : HasRpTransactions, HasLicenses { balanceType: BalanceType, amount: Int ): Boolean { - val currencyName = balanceType.getCurrencyName(this) + val currencyName = balanceType.getCurrencyName(type) ?: throw IllegalArgumentException("Unknown balance type: $balanceType") return if (amount > 0) { @@ -168,7 +168,7 @@ abstract class RpIdentity : HasRpTransactions, HasLicenses { balanceType: BalanceType, amount: Int ): Boolean { - val currencyName = balanceType.getCurrencyName(this) + val currencyName = balanceType.getCurrencyName(type) ?: throw IllegalArgumentException("Unknown balance type: $balanceType") return if (amount > 0 && (currencyMap[balanceType] ?: 0) >= amount) { @@ -183,7 +183,7 @@ abstract class RpIdentity : HasRpTransactions, HasLicenses { balanceType: BalanceType, limit: Int ): ObjectLinkedOpenHashSet { - val currencyName = balanceType.getCurrencyName(this) + val currencyName = balanceType.getCurrencyName(type) ?: throw IllegalArgumentException("Unknown balance type: $balanceType") return ObjectLinkedOpenHashSet() diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/HasLicenses.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/HasLicenses.kt index 633a1ed..a9451e7 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/HasLicenses.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/HasLicenses.kt @@ -73,6 +73,8 @@ interface HasLicenses { * @return A boolean indicating whether the player has the license. */ fun hasLicense(license: License) = hasLicense(license::class.java) + + fun getExpiredLicenses() = licenses.filter { it.isExpired } } /** diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/IdentityLicense.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/IdentityLicense.kt index d56101b..adc5023 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/IdentityLicense.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/IdentityLicense.kt @@ -1,5 +1,6 @@ package dev.slne.surf.roleplay.paper.player.license +import dev.slne.surf.roleplay.core.common.player.license.NetworkIdentityLicense import dev.slne.surf.roleplay.paper.player.identity.RpIdentity import java.time.ZonedDateTime @@ -24,6 +25,14 @@ data class IdentityLicense( */ val isExpired get() = expiresAt?.isBefore(ZonedDateTime.now()) ?: false + fun toNetwork() = NetworkIdentityLicense( + identity.uuid, + identity.type, + license.key, + expiresAt, + createdAt + ) + companion object { /** * Creates an [IdentityLicense] from a [License] and an [dev.slne.surf.roleplay.paper.player.identity.RpIdentity]. diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/PaperLicenseService.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/PaperLicenseService.kt index fd9f2c2..d885bcf 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/PaperLicenseService.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/PaperLicenseService.kt @@ -1,11 +1,13 @@ package dev.slne.surf.roleplay.paper.player.license +import dev.slne.surf.cloud.api.client.netty.packet.awaitOrThrow +import dev.slne.surf.roleplay.core.common.network.packets.ServerboundCreateLicensePacket +import dev.slne.surf.roleplay.core.common.network.packets.ServerboundDeleteLicensePacket import dev.slne.surf.roleplay.core.common.player.RpPlayer -import dev.slne.surf.roleplay.core.common.player.RpPlayerManager +import dev.slne.surf.roleplay.paper.player.PaperRpPlayerManager import dev.slne.surf.roleplay.paper.player.identity.RpIdentity import dev.slne.surf.roleplay.paper.player.license.utils.LicenseRemovedReason -import it.unimi.dsi.fastutil.objects.Object2ObjectMap -import it.unimi.dsi.fastutil.objects.ObjectSet +import dev.slne.surf.surfapi.core.api.util.mapAsync import org.springframework.beans.factory.ObjectProvider import org.springframework.scheduling.annotation.Scheduled import org.springframework.stereotype.Service @@ -14,20 +16,20 @@ import java.util.concurrent.TimeUnit @Service class PaperLicenseService( private val licenses: ObjectProvider, - private val rpPlayerManager: RpPlayerManager + private val rpPlayerManager: PaperRpPlayerManager ) { fun all() = licenses.asSequence() suspend fun createLicense(identityLicense: IdentityLicense): IdentityLicense { - + ServerboundCreateLicensePacket(identityLicense.toNetwork()).awaitOrThrow() + return identityLicense } suspend fun removeLicense( identity: RpIdentity, license: License - ): Boolean { - - } + ): Boolean = ServerboundDeleteLicensePacket(identity.uuid, identity.type, license.key) + .awaitOrThrow() suspend fun confiscateLicense( identity: RpIdentity, @@ -35,20 +37,42 @@ class PaperLicenseService( confiscatedBy: RpPlayer, confiscatedReason: String ): Boolean { + val player = identity.player + val parentLicense = + player.getIdentity(identity.type)?.getLicense(license::class.java) ?: return false - } + val parentResult = player.removeLicense( + license, + LicenseRemovedReason.Confiscated(confiscatedBy, confiscatedReason) + ) - fun getAllExpiredLicenses(): Object2ObjectMap> { + val childrenResults = license.children.mapAsync { childLicense -> + if (player.hasLicense(childLicense)) { + player.removeLicense( + childLicense, + LicenseRemovedReason.ConfiscatedChild( + parentLicense, + confiscatedBy, + confiscatedReason + ) + ) + } else { + true + } + } + + return parentResult && childrenResults.all { it } } - @Scheduled(fixedDelay = 1, timeUnit = TimeUnit.SECONDS) - fun removeExpiredLicenses() { - val expired = getAllExpiredLicenses() + fun getAllExpiredLicenses() = rpPlayerManager.players + .mapNotNull { it.activeIdentity } + .flatMap { id -> id.getExpiredLicenses().map { license -> id to license } } - for ((identity, expiredLicenses) in expired) { - for (license in expiredLicenses) { + @Scheduled(fixedDelay = 1, timeUnit = TimeUnit.SECONDS) + suspend fun removeExpiredLicenses() { + getAllExpiredLicenses() + .mapAsync { (identity, license) -> identity.removeLicense(license.license, LicenseRemovedReason.Expired) } - } } } \ No newline at end of file diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/RpPlayerManagerImpl.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/RpPlayerManagerImpl.kt index c63f75d..01a4862 100644 --- a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/RpPlayerManagerImpl.kt +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/RpPlayerManagerImpl.kt @@ -21,10 +21,6 @@ class RpPlayerManagerImpl(private val rpPlayerService: RpPlayerService) : RpPlay override fun createPlayer(uuid: UUID) = ServerRpPlayer(uuid) override fun onlineUuids() = CloudPlayerManager.getOnlinePlayers().uuidSnapshot() - override suspend fun fetchIdentities(uuid: UUID): Set { - rpPlayerService - } - // suspend fun updateUsername( // rpPlayer: RpPlayerImpl, // username: String diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/db/RpPlayerRepository.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/db/RpPlayerRepository.kt index 825bd48..4d47fb3 100644 --- a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/db/RpPlayerRepository.kt +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/db/RpPlayerRepository.kt @@ -40,7 +40,7 @@ class RpPlayerRepository { private suspend fun findIdentityModelByType( uuid: UUID, type: RpIdentityType - ): RpPlayerIdentityBaseModel<*>? { + ): RpPlayerIdentityBaseModel? { val playerId = findPlayerId(uuid) ?: return null val modelClass = when (type) { RpIdentityType.CIVILIAN -> RpPlayerCivilianIdentityModel @@ -54,7 +54,7 @@ class RpPlayerRepository { suspend fun createIdentity(uuid: UUID, creationData: RpIdentityCreationData) { val playerModel = findOrCreateModel(uuid) - fun RpPlayerIdentityBaseModel<*>.applyCommonData() { + fun RpPlayerIdentityBaseModel.applyCommonData() { this.player = playerModel this.firstName = creationData.firstName this.lastName = creationData.lastName @@ -82,7 +82,7 @@ class RpPlayerRepository { suspend fun updateIdentity(uuid: UUID, updateData: RpIdentityUpdateData): Boolean { val existingModel = findIdentityModelByType(uuid, updateData.identityType) ?: return false - fun RpPlayerIdentityBaseModel<*>.applyCommonUpdate() { + fun RpPlayerIdentityBaseModel.applyCommonUpdate() { updateData.firstName?.let { this.firstName = it } updateData.lastName?.let { this.lastName = it } updateData.dateOfBirth?.let { this.dateOfBirth = it } diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/LicenseExpirationJob.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/LicenseExpirationJob.kt deleted file mode 100644 index 755883a..0000000 --- a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/LicenseExpirationJob.kt +++ /dev/null @@ -1,24 +0,0 @@ -@file:OptIn(InternalRoleplayApi::class) - -package dev.slne.surf.roleplay.server.player.license - -import dev.slne.surf.roleplay.core.common.player.license.LicenseService -import dev.slne.surf.roleplay.core.common.player.license.utils.LicenseRemovedReason -import org.springframework.scheduling.annotation.Scheduled -import org.springframework.stereotype.Component -import java.util.concurrent.TimeUnit - -@Component -class LicenseExpirationJob { - - @Scheduled(fixedDelay = 1, timeUnit = TimeUnit.SECONDS) - suspend fun tick() { - val licenses = LicenseService.instance.getAllExpiredLicenses() - - licenses.forEach { (identity, expiredLicenses) -> - expiredLicenses.forEach { expiredLicense -> - identity.removeLicense(expiredLicense.license, LicenseRemovedReason.Expired) - } - } - } -} \ No newline at end of file diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/LicensePacketListener.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/LicensePacketListener.kt new file mode 100644 index 0000000..1288e5a --- /dev/null +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/LicensePacketListener.kt @@ -0,0 +1,29 @@ +package dev.slne.surf.roleplay.server.player.license + +import dev.slne.surf.cloud.api.common.meta.SurfNettyPacketHandler +import dev.slne.surf.cloud.api.common.netty.network.protocol.respond +import dev.slne.surf.roleplay.core.common.network.packets.ServerboundCreateLicensePacket +import dev.slne.surf.roleplay.core.common.network.packets.ServerboundDeleteLicensePacket +import org.springframework.stereotype.Component + +@Suppress("unused") +@Component +class LicensePacketListener(private val licenseService: LicenseService) { + + @SurfNettyPacketHandler + suspend fun handleCreateLicense(packet: ServerboundCreateLicensePacket) { + licenseService.createLicense(packet.license) + packet.respond(true) + } + + @SurfNettyPacketHandler + suspend fun handleDeleteLicense(packet: ServerboundDeleteLicensePacket) { + val deleted = licenseService.deleteLicense( + packet.uuid, + packet.identityType, + packet.licenseKey + ) + + packet.respond(deleted) + } +} \ No newline at end of file diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/LicenseService.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/LicenseService.kt new file mode 100644 index 0000000..030c357 --- /dev/null +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/LicenseService.kt @@ -0,0 +1,26 @@ +package dev.slne.surf.roleplay.server.player.license + +import dev.slne.surf.roleplay.core.common.player.identity.RpIdentityType +import dev.slne.surf.roleplay.core.common.player.license.NetworkIdentityLicense +import dev.slne.surf.roleplay.server.player.license.db.LicenseRepository +import net.kyori.adventure.key.Key +import org.springframework.stereotype.Service +import java.util.* + +@Service +class LicenseService(private val licenseRepository: LicenseRepository) { + + suspend fun createLicense(license: NetworkIdentityLicense) { + licenseRepository.createLicense( + license.owner, + license.identityType, + license.licenseKey, + license.expiresAt, + license.createdAt + ) + } + + suspend fun deleteLicense(uuid: UUID, identityType: RpIdentityType, licenseKey: Key): Boolean { + return licenseRepository.deleteLicense(uuid, identityType, licenseKey) > 0 + } +} \ No newline at end of file From 383d9b6d250331016fb087974263b8ca13f9b446 Mon Sep 17 00:00:00 2001 From: twisti Date: Sun, 24 Aug 2025 15:35:37 +0200 Subject: [PATCH 11/11] Add server-side identity management and refactor license handling for modularity. --- .../network/packets/IdentityResponsePacket.kt | 11 ++ ...ServerboundCreateOrUpdateIdentityPacket.kt | 12 ++ .../ServerboundFetchIdentitiesByUuidPacket.kt | 20 +++ .../common/player/identity/NetworkIdentity.kt | 50 +++++++ .../surf/roleplay/paper/PaperBootstrap.kt | 2 +- .../rentable/commands/RentableCommand.kt | 16 +-- .../roleplay/paper/player/PaperRpPlayer.kt | 10 +- .../paper/player/events/RpPlayerDeathEvent.kt | 9 +- .../paper/player/events/RpPlayerJoinEvent.kt | 4 +- .../player/identity/PaperIdentityService.kt | 33 ++--- .../paper/player/identity/RpIdentity.kt | 41 +++++- .../dialogs/IdentitySelectorDialog.kt | 6 +- .../identity/identities/CivilianIdentity.kt | 25 ++-- .../identity/identities/PoliceIdentity.kt | 32 +++-- .../identities/RescueServiceIdentity.kt | 31 +++-- .../listener/IdentityOnlineListener.kt | 33 ++--- .../license/dialogs/BuyLicenseDialog.kt | 66 +++++---- .../license/dialogs/BuyLicensesDialog.kt | 58 ++++---- .../player/license/dialogs/LicenseDialog.kt | 67 +++++---- .../player/license/dialogs/MyLicenseDialog.kt | 12 +- .../license/dialogs/MyLicensesDialog.kt | 29 ++-- .../license/listeners/LicenseBuyHandler.kt | 5 +- .../server/player/RpPlayerManagerImpl.kt | 128 +----------------- .../roleplay/server/player/ServerRpPlayer.kt | 32 +++++ .../server/player/db/RpPlayerModel.kt | 20 +-- .../server/player/db/RpPlayerRepository.kt | 84 ------------ .../identity/RpIdentityPacketListener.kt | 24 ++++ .../player/identity/RpIdentityService.kt | 13 ++ .../identity/db/RpIdentityRepository.kt | 108 +++++++++++++++ .../identity/db/RpPlayerIdentityBaseModel.kt | 5 +- .../civilian/RpPlayerCivilianIdentityModel.kt | 10 ++ .../police/RpPlayerPoliceIdentityModel.kt | 12 ++ .../RpPlayerRescueServiceIdentityModel.kt | 11 ++ .../player/license/db/IdentityLicenseModel.kt | 36 +---- .../utils/LicensePermissionRegistry.kt | 14 -- 35 files changed, 592 insertions(+), 477 deletions(-) create mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/network/packets/IdentityResponsePacket.kt create mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/network/packets/ServerboundCreateOrUpdateIdentityPacket.kt create mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/network/packets/ServerboundFetchIdentitiesByUuidPacket.kt create mode 100644 surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/NetworkIdentity.kt create mode 100644 surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/RpIdentityPacketListener.kt create mode 100644 surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/RpIdentityService.kt create mode 100644 surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/RpIdentityRepository.kt delete mode 100644 surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/utils/LicensePermissionRegistry.kt diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/network/packets/IdentityResponsePacket.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/network/packets/IdentityResponsePacket.kt new file mode 100644 index 0000000..6070ad6 --- /dev/null +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/network/packets/IdentityResponsePacket.kt @@ -0,0 +1,11 @@ +package dev.slne.surf.roleplay.core.common.network.packets + +import dev.slne.surf.cloud.api.common.meta.SurfNettyPacket +import dev.slne.surf.cloud.api.common.netty.network.protocol.PacketFlow +import dev.slne.surf.cloud.api.common.netty.packet.ResponseNettyPacket +import dev.slne.surf.roleplay.core.common.player.identity.NetworkIdentity +import kotlinx.serialization.Serializable + +@SurfNettyPacket("roleplay:response:identity", PacketFlow.BIDIRECTIONAL) +@Serializable +class IdentityResponsePacket(val identity: NetworkIdentity) : ResponseNettyPacket() \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/network/packets/ServerboundCreateOrUpdateIdentityPacket.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/network/packets/ServerboundCreateOrUpdateIdentityPacket.kt new file mode 100644 index 0000000..3e46e8c --- /dev/null +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/network/packets/ServerboundCreateOrUpdateIdentityPacket.kt @@ -0,0 +1,12 @@ +package dev.slne.surf.roleplay.core.common.network.packets + +import dev.slne.surf.cloud.api.common.meta.SurfNettyPacket +import dev.slne.surf.cloud.api.common.netty.network.protocol.PacketFlow +import dev.slne.surf.cloud.api.common.netty.packet.RespondingNettyPacket +import dev.slne.surf.roleplay.core.common.player.identity.NetworkIdentity +import kotlinx.serialization.Serializable + +@SurfNettyPacket("roleplay:serverbound:create-or-update-identity", PacketFlow.SERVERBOUND) +@Serializable +class ServerboundCreateOrUpdateIdentityPacket(val identity: NetworkIdentity) : + RespondingNettyPacket() \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/network/packets/ServerboundFetchIdentitiesByUuidPacket.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/network/packets/ServerboundFetchIdentitiesByUuidPacket.kt new file mode 100644 index 0000000..538348a --- /dev/null +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/network/packets/ServerboundFetchIdentitiesByUuidPacket.kt @@ -0,0 +1,20 @@ +package dev.slne.surf.roleplay.core.common.network.packets + +import dev.slne.surf.cloud.api.common.meta.SurfNettyPacket +import dev.slne.surf.cloud.api.common.netty.network.protocol.PacketFlow +import dev.slne.surf.cloud.api.common.netty.packet.RespondingNettyPacket +import dev.slne.surf.cloud.api.common.netty.packet.ResponseNettyPacket +import dev.slne.surf.roleplay.core.common.player.identity.NetworkIdentity +import kotlinx.serialization.Contextual +import kotlinx.serialization.Serializable +import java.util.* + +@SurfNettyPacket("roleplay:serverbound:fetch-identies-by-uuid", PacketFlow.SERVERBOUND) +@Serializable +class ServerboundFetchIdentitiesByUuidPacket(val uuid: @Contextual UUID) : + RespondingNettyPacket() + +@SurfNettyPacket("roleplay:response:fetch-identies-by-uuid", PacketFlow.BIDIRECTIONAL) +@Serializable +class FetchIdentitiesByUuidPacketResponse(val identies: List) : + ResponseNettyPacket() \ No newline at end of file diff --git a/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/NetworkIdentity.kt b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/NetworkIdentity.kt new file mode 100644 index 0000000..5c79c9c --- /dev/null +++ b/surf-roleplay-core/surf-roleplay-core-common/src/main/kotlin/dev/slne/surf/roleplay/core/common/player/identity/NetworkIdentity.kt @@ -0,0 +1,50 @@ +package dev.slne.surf.roleplay.core.common.player.identity + +import kotlinx.serialization.Contextual +import kotlinx.serialization.Serializable +import java.time.LocalDate +import java.time.ZonedDateTime +import java.util.* + +@Serializable +sealed class NetworkIdentity(val type: RpIdentityType) { + abstract val uuid: @Contextual UUID + abstract val firstName: String + abstract val lastName: String + abstract val dateOfBirth: @Contextual LocalDate + abstract val createdAt: @Contextual ZonedDateTime + abstract val updatedAt: @Contextual ZonedDateTime + + @Serializable + data class Civilian( + override val uuid: @Contextual UUID, + override val firstName: String, + override val lastName: String, + override val dateOfBirth: @Contextual LocalDate, + override val createdAt: @Contextual ZonedDateTime = ZonedDateTime.now(), + override val updatedAt: @Contextual ZonedDateTime = ZonedDateTime.now() + ) : NetworkIdentity(RpIdentityType.CIVILIAN) + + @Serializable + data class Police( + override val uuid: @Contextual UUID, + override val firstName: String, + override val lastName: String, + override val dateOfBirth: @Contextual LocalDate, + val badgeNumber: String, + val rank: String, + override val createdAt: @Contextual ZonedDateTime = ZonedDateTime.now(), + override val updatedAt: @Contextual ZonedDateTime = ZonedDateTime.now() + ) : NetworkIdentity(RpIdentityType.POLICE) + + @Serializable + data class RescueService( + override val uuid: @Contextual UUID, + override val firstName: String, + override val lastName: String, + override val dateOfBirth: @Contextual LocalDate, + val rank: String, + override val createdAt: @Contextual ZonedDateTime = ZonedDateTime.now(), + override val updatedAt: @Contextual ZonedDateTime = ZonedDateTime.now() + ) : NetworkIdentity(RpIdentityType.RESCUE_SERVICE) +} \ No newline at end of file diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/PaperBootstrap.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/PaperBootstrap.kt index a597a93..2a025b2 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/PaperBootstrap.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/PaperBootstrap.kt @@ -9,7 +9,7 @@ import io.papermc.paper.plugin.bootstrap.PluginBootstrap @Suppress("UnstableApiUsage") class PaperBootstrap : PluginBootstrap { override fun bootstrap(context: BootstrapContext) { - ContextHolder.instance.context = + RoleplayApplication.context = CloudInstance.startSpringApplication(RoleplayApplication::class) } } \ No newline at end of file diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/commands/RentableCommand.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/commands/RentableCommand.kt index 8adc989..0159a14 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/commands/RentableCommand.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/mechanics/rentable/commands/RentableCommand.kt @@ -3,27 +3,26 @@ package dev.slne.surf.roleplay.paper.mechanics.rentable.commands import com.github.shynixn.mccoroutine.folia.launch import dev.jorel.commandapi.arguments.ArgumentSuggestions import dev.jorel.commandapi.kotlindsl.* -import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.events.OwnerChangeReason -import dev.slne.surf.roleplay.api.common.mechanic.rentable.utils.events.OwnerSetResult -import dev.slne.surf.roleplay.paper.mechanics.rentable.RentableMechanic.getByKey -import dev.slne.surf.roleplay.paper.mechanics.rentable.RentableMechanic.rentables +import dev.slne.surf.roleplay.paper.mechanics.rentable.RentableMechanic +import dev.slne.surf.roleplay.paper.mechanics.rentable.events.RentableOwnerChangeEvent.OwnerChangeReason +import dev.slne.surf.roleplay.paper.mechanics.rentable.events.RentableOwnerChangeEvent.OwnerSetResult import dev.slne.surf.roleplay.paper.player.rpPlayer import dev.slne.surf.roleplay.paper.plugin import dev.slne.surf.surfapi.core.api.messages.adventure.appendNewline import dev.slne.surf.surfapi.core.api.messages.adventure.sendText import org.bukkit.NamespacedKey -fun rentableCommand() = commandAPICommand("rentable") { +fun rentableCommand(mechanic: RentableMechanic) = commandAPICommand("rentable") { subcommand("rent") { namespacedKeyArgument("rentableKey") { replaceSuggestions(ArgumentSuggestions.stringCollection { info -> - rentables.map { it.key.asString() } + mechanic.rentables.map { it.key.asString() } }) } playerExecutor { player, args -> val rentableKey: NamespacedKey by args - val rentable = getByKey(rentableKey) ?: run { + val rentable = mechanic.getByKey(rentableKey) ?: run { player.sendText { appendPrefix() @@ -72,8 +71,7 @@ fun rentableCommand() = commandAPICommand("rentable") { variableValue(rentableKey.asString()) error(" konnte nicht gemietet werden: ") appendNewline(2) - - result.reason.message(this) + append(result.reason.message) } } } diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/PaperRpPlayer.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/PaperRpPlayer.kt index 617054e..30f9842 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/PaperRpPlayer.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/PaperRpPlayer.kt @@ -9,10 +9,12 @@ import dev.slne.surf.roleplay.paper.player.identity.RpIdentity import dev.slne.surf.roleplay.paper.player.license.HasLicenses import dev.slne.surf.roleplay.paper.player.license.License import dev.slne.surf.roleplay.paper.player.license.utils.LicenseRemovedReason +import dev.slne.surf.surfapi.bukkit.api.extensions.server import dev.slne.surf.surfapi.core.api.messages.adventure.appendNewline import dev.slne.surf.surfapi.core.api.messages.adventure.buildText import dev.slne.surf.surfapi.core.api.util.freeze import dev.slne.surf.surfapi.core.api.util.mutableObjectSetOf +import io.papermc.paper.datacomponent.item.attribute.AttributeModifierDisplay.override import org.springframework.beans.factory.getBean import java.util.* @@ -25,6 +27,8 @@ class PaperRpPlayer(uuid: UUID) : RpPlayer(uuid), HasLicenses { var activeIdentity: RpIdentity? = null private set + val player get() = server.getPlayer(uuid) + override val licenses get() = activeIdentity?.licenses ?: error("Tried accessing licenses of a player without an active identity $uuid") @@ -43,12 +47,6 @@ class PaperRpPlayer(uuid: UUID) : RpPlayer(uuid), HasLicenses { fun addIdentity(identity: RpIdentity) = _identities.add(identity) - suspend fun createIdentity(identity: T) = - identityService.createIdentity(identity) - - suspend fun updateIdentity(identity: T) = - identityService.updateIdentity(identity) - suspend fun createOrUpdateIdentity(identity: T) = identityService.createOrUpdateIdentity(identity) diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/events/RpPlayerDeathEvent.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/events/RpPlayerDeathEvent.kt index 5931dba..03e7588 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/events/RpPlayerDeathEvent.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/events/RpPlayerDeathEvent.kt @@ -1,8 +1,8 @@ package dev.slne.surf.roleplay.paper.player.events -import dev.slne.surf.cloud.api.client.paper.player.toCloudOfflinePlayer import dev.slne.surf.cloud.api.common.event.CloudEvent -import dev.slne.surf.roleplay.api.common.player.RpPlayer +import dev.slne.surf.roleplay.paper.player.PaperRpPlayer +import dev.slne.surf.roleplay.paper.player.rpPlayer import org.bukkit.block.Block import org.bukkit.entity.Entity import org.bukkit.entity.Player @@ -20,7 +20,7 @@ import org.bukkit.event.entity.PlayerDeathEvent */ class RpPlayerDeathEvent( source: Any, - val player: RpPlayer, + val player: PaperRpPlayer, bukkitEvent: PlayerDeathEvent ) : CloudEvent(source) { @@ -30,8 +30,7 @@ class RpPlayerDeathEvent( var killerBlock: Block? = null private set - fun killerRpPlayer() = - (killerEntity as? Player)?.let { RpPlayer.Companion[it.toCloudOfflinePlayer()] } + fun killerRpPlayer() = (killerEntity as? Player)?.rpPlayer init { val player = bukkitEvent.player diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/events/RpPlayerJoinEvent.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/events/RpPlayerJoinEvent.kt index 6b51915..527ed20 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/events/RpPlayerJoinEvent.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/events/RpPlayerJoinEvent.kt @@ -1,9 +1,9 @@ package dev.slne.surf.roleplay.paper.player.events import dev.slne.surf.cloud.api.common.event.CloudEvent -import dev.slne.surf.roleplay.core.common.player.RpPlayer +import dev.slne.surf.roleplay.paper.player.PaperRpPlayer class RpPlayerJoinEvent( source: Any, - val player: RpPlayer, + val player: PaperRpPlayer, ) : CloudEvent(source) \ No newline at end of file diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/identity/PaperIdentityService.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/identity/PaperIdentityService.kt index c273042..d06d8ba 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/identity/PaperIdentityService.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/identity/PaperIdentityService.kt @@ -1,30 +1,25 @@ package dev.slne.surf.roleplay.paper.player.identity +import dev.slne.surf.cloud.api.client.netty.packet.fireAndAwaitOrThrow +import dev.slne.surf.roleplay.core.common.network.packets.ServerboundCreateOrUpdateIdentityPacket +import dev.slne.surf.roleplay.core.common.network.packets.ServerboundFetchIdentitiesByUuidPacket import org.springframework.stereotype.Service -import java.util.UUID +import java.util.* @Service class PaperIdentityService { - suspend fun fetchIdentities(uuid: UUID): Set { - TODO("Not yet implemented") - } - - suspend fun createIdentity( - identity: T - ): T { - TODO("Not yet implemented") - } - - suspend fun updateIdentity( - identity: T - ): T? { - TODO("Not yet implemented") - } + suspend fun fetchIdentities(uuid: UUID) = ServerboundFetchIdentitiesByUuidPacket(uuid) + .fireAndAwaitOrThrow() + .identies + .map(RpIdentity::fromNetwork) + .toSet() + @Suppress("UNCHECKED_CAST") suspend fun createOrUpdateIdentity( identity: T - ): T { - TODO("Not yet implemented") - } + ): T = ServerboundCreateOrUpdateIdentityPacket(identity.toNetwork()) + .fireAndAwaitOrThrow() + .identity + .let(RpIdentity::fromNetwork) as T } \ No newline at end of file diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/identity/RpIdentity.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/identity/RpIdentity.kt index 6879e6c..088943b 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/identity/RpIdentity.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/identity/RpIdentity.kt @@ -2,11 +2,15 @@ package dev.slne.surf.roleplay.paper.player.identity import dev.slne.surf.roleplay.RoleplayApplication import dev.slne.surf.roleplay.core.common.player.RpPlayer +import dev.slne.surf.roleplay.core.common.player.identity.NetworkIdentity import dev.slne.surf.roleplay.core.common.player.identity.RpIdentityType import dev.slne.surf.roleplay.core.common.transaction.HasRpTransactions import dev.slne.surf.roleplay.core.common.transaction.RpTransaction import dev.slne.surf.roleplay.core.common.transaction.utils.BalanceType import dev.slne.surf.roleplay.paper.player.PaperRpPlayer +import dev.slne.surf.roleplay.paper.player.identity.identities.CivilianIdentity +import dev.slne.surf.roleplay.paper.player.identity.identities.PoliceIdentity +import dev.slne.surf.roleplay.paper.player.identity.identities.RescueServiceIdentity import dev.slne.surf.roleplay.paper.player.license.* import dev.slne.surf.roleplay.paper.player.license.events.RpPlayerLicenseAddedEvent import dev.slne.surf.roleplay.paper.player.license.events.RpPlayerLicenseRemovedEvent @@ -19,14 +23,12 @@ import dev.slne.surf.surfapi.core.api.util.mutableObjectSetOf import dev.slne.surf.surfapi.core.api.util.objectSetOf import it.unimi.dsi.fastutil.objects.ObjectLinkedOpenHashSet import kotlinx.serialization.Contextual -import kotlinx.serialization.Serializable import kotlinx.serialization.Transient import org.springframework.beans.factory.getBean import java.time.LocalDate import java.time.ZonedDateTime import java.util.* -@Serializable abstract class RpIdentity : HasRpTransactions, HasLicenses { abstract val uuid: @Contextual UUID abstract val type: RpIdentityType @@ -44,6 +46,8 @@ abstract class RpIdentity : HasRpTransactions, HasLicenses { @Transient override val licenses = _licenses.freeze() + abstract fun toNetwork(): NetworkIdentity + fun addLicense(license: IdentityLicense) { _licenses.add(license) } @@ -195,5 +199,38 @@ abstract class RpIdentity : HasRpTransactions, HasLicenses { companion object { private val licenseService get() = RoleplayApplication.context.getBean() + + + fun fromNetwork(network: NetworkIdentity) = when (network) { + is NetworkIdentity.Civilian -> CivilianIdentity( + network.uuid, + network.firstName, + network.lastName, + network.dateOfBirth, + network.createdAt, + network.updatedAt + ) + + is NetworkIdentity.Police -> PoliceIdentity( + network.uuid, + network.firstName, + network.lastName, + network.dateOfBirth, + network.badgeNumber, + network.rank, + network.createdAt, + network.updatedAt + ) + + is NetworkIdentity.RescueService -> RescueServiceIdentity( + network.uuid, + network.firstName, + network.lastName, + network.dateOfBirth, + network.rank, + network.createdAt, + network.updatedAt + ) + } } } \ No newline at end of file diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/identity/dialogs/IdentitySelectorDialog.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/identity/dialogs/IdentitySelectorDialog.kt index 9839e46..a22922a 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/identity/dialogs/IdentitySelectorDialog.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/identity/dialogs/IdentitySelectorDialog.kt @@ -4,7 +4,7 @@ package dev.slne.surf.roleplay.paper.player.identity.dialogs import com.github.shynixn.mccoroutine.folia.launch -import dev.slne.surf.roleplay.api.common.player.RpPlayer +import dev.slne.surf.roleplay.paper.player.PaperRpPlayer import dev.slne.surf.roleplay.paper.plugin import dev.slne.surf.surfapi.bukkit.api.dialog.base import dev.slne.surf.surfapi.bukkit.api.dialog.builder.actionButton @@ -15,7 +15,7 @@ import dev.slne.surf.surfapi.bukkit.api.nms.NmsUseWithCaution import dev.slne.surf.surfapi.core.api.messages.adventure.appendNewline import io.papermc.paper.registry.data.dialog.DialogBase -fun createIdentitySelectorDialog(player: RpPlayer) = dialog { +fun createIdentitySelectorDialog(player: PaperRpPlayer) = dialog { val identities = player.identities base { @@ -56,7 +56,7 @@ fun createIdentitySelectorDialog(player: RpPlayer) = dialog { } private fun createIdentitySelectorButtons( - player: RpPlayer, + player: PaperRpPlayer, ) = player.identities.map { identity -> actionButton { label(identity.type.asComponent()) diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/identity/identities/CivilianIdentity.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/identity/identities/CivilianIdentity.kt index 1647aee..46a1b26 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/identity/identities/CivilianIdentity.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/identity/identities/CivilianIdentity.kt @@ -1,14 +1,13 @@ package dev.slne.surf.roleplay.paper.player.identity.identities -import dev.slne.surf.roleplay.paper.player.identity.RpIdentity +import dev.slne.surf.roleplay.core.common.player.identity.NetworkIdentity import dev.slne.surf.roleplay.core.common.player.identity.RpIdentityType +import dev.slne.surf.roleplay.paper.player.identity.RpIdentity import kotlinx.serialization.Contextual -import kotlinx.serialization.Serializable import java.time.LocalDate import java.time.ZonedDateTime import java.util.* -@Serializable class CivilianIdentity( override val uuid: @Contextual UUID, override var firstName: String, @@ -16,15 +15,17 @@ class CivilianIdentity( override var dateOfBirth: @Contextual LocalDate, override val createdAt: @Contextual ZonedDateTime = ZonedDateTime.now(), override var updatedAt: @Contextual ZonedDateTime = ZonedDateTime.now() -) : RpIdentity( - uuid, - RpIdentityType.CIVILIAN, - firstName, - lastName, - dateOfBirth, - createdAt, - updatedAt -) { +) : RpIdentity() { + override val type = RpIdentityType.CIVILIAN + + override fun toNetwork() = NetworkIdentity.Civilian( + uuid = uuid, + firstName = firstName, + lastName = lastName, + dateOfBirth = dateOfBirth, + createdAt = createdAt, + updatedAt = updatedAt + ) override fun toString(): String { return "CivilianIdentity() ${super.toString()}" diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/identity/identities/PoliceIdentity.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/identity/identities/PoliceIdentity.kt index 1e6c274..ac23bd4 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/identity/identities/PoliceIdentity.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/identity/identities/PoliceIdentity.kt @@ -1,14 +1,13 @@ package dev.slne.surf.roleplay.paper.player.identity.identities -import dev.slne.surf.roleplay.paper.player.identity.RpIdentity +import dev.slne.surf.roleplay.core.common.player.identity.NetworkIdentity import dev.slne.surf.roleplay.core.common.player.identity.RpIdentityType +import dev.slne.surf.roleplay.paper.player.identity.RpIdentity import kotlinx.serialization.Contextual -import kotlinx.serialization.Serializable import java.time.LocalDate import java.time.ZonedDateTime import java.util.* -@Serializable class PoliceIdentity( override val uuid: @Contextual UUID, override var firstName: String, @@ -18,18 +17,21 @@ class PoliceIdentity( val rank: String, override val createdAt: @Contextual ZonedDateTime = ZonedDateTime.now(), override var updatedAt: @Contextual ZonedDateTime = ZonedDateTime.now() -) : RpIdentity( - uuid, - RpIdentityType.POLICE, - firstName, - lastName, - dateOfBirth, - createdAt, - updatedAt -) { - override fun toString(): String { - val parent = super.toString() +) : RpIdentity() { + override val type = RpIdentityType.POLICE - return "PoliceIdentityImpl(badgeNumber='$badgeNumber', rank='$rank', $parent)" + override fun toNetwork() = NetworkIdentity.Police( + uuid = uuid, + firstName = firstName, + lastName = lastName, + dateOfBirth = dateOfBirth, + badgeNumber = badgeNumber, + rank = rank, + createdAt = createdAt, + updatedAt = updatedAt + ) + + override fun toString(): String { + return "PoliceIdentity(rank='$rank') ${super.toString()}" } } \ No newline at end of file diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/identity/identities/RescueServiceIdentity.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/identity/identities/RescueServiceIdentity.kt index 4504a6f..8191c86 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/identity/identities/RescueServiceIdentity.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/identity/identities/RescueServiceIdentity.kt @@ -1,14 +1,13 @@ package dev.slne.surf.roleplay.paper.player.identity.identities -import dev.slne.surf.roleplay.paper.player.identity.RpIdentity +import dev.slne.surf.roleplay.core.common.player.identity.NetworkIdentity import dev.slne.surf.roleplay.core.common.player.identity.RpIdentityType +import dev.slne.surf.roleplay.paper.player.identity.RpIdentity import kotlinx.serialization.Contextual -import kotlinx.serialization.Serializable import java.time.LocalDate import java.time.ZonedDateTime import java.util.* -@Serializable class RescueServiceIdentity( override val uuid: @Contextual UUID, override var firstName: String, @@ -17,18 +16,20 @@ class RescueServiceIdentity( val rank: String, override val createdAt: @Contextual ZonedDateTime = ZonedDateTime.now(), override var updatedAt: @Contextual ZonedDateTime = ZonedDateTime.now() -) : RpIdentity( - uuid, - RpIdentityType.RESCUE_SERVICE, - firstName, - lastName, - dateOfBirth, - createdAt, - updatedAt -) { - override fun toString(): String { - val parent = super.toString() +) : RpIdentity() { + override val type = RpIdentityType.RESCUE_SERVICE - return "RescueServiceIdentityImpl(rank='$rank', $parent)" + override fun toNetwork() = NetworkIdentity.RescueService( + uuid = uuid, + firstName = firstName, + lastName = lastName, + dateOfBirth = dateOfBirth, + rank = rank, + createdAt = createdAt, + updatedAt = updatedAt + ) + + override fun toString(): String { + return "RescueServiceIdentity(rank='$rank') ${super.toString()}" } } \ No newline at end of file diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/identity/listener/IdentityOnlineListener.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/identity/listener/IdentityOnlineListener.kt index 1ee8f34..0a63657 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/identity/listener/IdentityOnlineListener.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/identity/listener/IdentityOnlineListener.kt @@ -1,35 +1,28 @@ package dev.slne.surf.roleplay.paper.player.identity.listener -import com.github.shynixn.mccoroutine.folia.launch +import dev.slne.surf.cloud.api.common.event.CloudEventHandler import dev.slne.surf.roleplay.paper.player.events.RpPlayerJoinEvent import dev.slne.surf.roleplay.paper.player.identity.dialogs.createIdentitySelectorDialog -import dev.slne.surf.roleplay.paper.plugin -import org.bukkit.event.EventHandler -import org.bukkit.event.EventPriority -import org.bukkit.event.Listener import org.springframework.stereotype.Component +@Suppress("unused") @Component -class IdentityOnlineListener : Listener { +class IdentityOnlineListener { - @EventHandler(priority = EventPriority.LOWEST) + @CloudEventHandler fun onRpPlayerJoin(event: RpPlayerJoinEvent) { - plugin.launch { - val player = event.player - val identities = player.identities + val player = event.player + val identities = player.identities - if (identities.isEmpty()) { - return@launch - } + if (identities.isEmpty()) return - if (identities.size == 1) { - val identity = identities.first() - player.setActiveIdentity(identity) + if (identities.size == 1) { + val identity = identities.first() + player.setActiveIdentity(identity) - return@launch - } - - player.cloudPlayer.player?.showDialog(createIdentitySelectorDialog(player)) + return } + + player.player?.showDialog(createIdentitySelectorDialog(player)) } } \ No newline at end of file diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/dialogs/BuyLicenseDialog.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/dialogs/BuyLicenseDialog.kt index dd03a31..21b8023 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/dialogs/BuyLicenseDialog.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/dialogs/BuyLicenseDialog.kt @@ -3,9 +3,11 @@ package dev.slne.surf.roleplay.paper.player.license.dialogs import com.github.shynixn.mccoroutine.folia.launch -import dev.slne.surf.roleplay.api.common.player.RpPlayer -import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity +import dev.slne.surf.roleplay.paper.player.PaperRpPlayer +import dev.slne.surf.roleplay.paper.player.identity.RpIdentity import dev.slne.surf.roleplay.paper.player.license.IdentityLicense +import dev.slne.surf.roleplay.paper.player.license.License +import dev.slne.surf.roleplay.paper.player.license.PaperLicenseService import dev.slne.surf.roleplay.paper.player.license.utils.UnobtainableReason import dev.slne.surf.roleplay.paper.plugin import dev.slne.surf.surfapi.bukkit.api.dialog.base @@ -15,14 +17,14 @@ import dev.slne.surf.surfapi.bukkit.api.dialog.type import dev.slne.surf.surfapi.core.api.messages.adventure.appendNewline import io.papermc.paper.dialog.Dialog import io.papermc.paper.registry.data.dialog.DialogBase -import it.unimi.dsi.fastutil.objects.ObjectSet suspend fun buyLicenseDialog( - player: RpPlayer, + player: PaperRpPlayer, identity: RpIdentity, license: License, + licenseService: PaperLicenseService ): Dialog { - val canObtain = license.canObtain(identity) + val unobtainableReasons = license.canObtain(identity) return dialog { base { @@ -50,19 +52,18 @@ suspend fun buyLicenseDialog( appendLicenseDependencies(player, license.dependencies) appendNewline(2) - if (canObtain.first) { + if (unobtainableReasons.isEmpty()) { info("Klicke auf ") variableValue(""""Erwerben"""") info(", um die Lizenz zu kaufen.") } else { error("Du kannst diese Lizenz nicht erwerben:") appendNewline(2) - canObtain.second.forEachIndexed { index, reason -> + unobtainableReasons.forEachIndexed { index, reason -> if (index > 0) { appendNewline(2) } - - reason.message(this) + append(reason.message) } } } @@ -70,22 +71,23 @@ suspend fun buyLicenseDialog( } type { - if (canObtain.first) { + if (unobtainableReasons.isEmpty()) { confirmation( - buyLicenseButton(player, identity, license), - backButton(player, identity) + buyLicenseButton(player, identity, license, licenseService), + backButton(player, identity, licenseService) ) } else { - notice(backButton(player, identity)) + notice(backButton(player, identity, licenseService)) } } } } private fun buyLicenseButton( - player: RpPlayer, + player: PaperRpPlayer, identity: RpIdentity, - license: License + license: License, + licenseService: PaperLicenseService ) = actionButton { label { success("Erwerben") } tooltip { @@ -105,23 +107,32 @@ private fun buyLicenseButton( player, identity, license, - result.reason + result.reason, + licenseService ) ) return@launch } - it.showDialog(boughtLicenseNotice(player, identity, result.license!!)) + it.showDialog( + boughtLicenseNotice( + player, + identity, + result.license!!, + licenseService + ) + ) } } } } private fun boughtLicenseNotice( - player: RpPlayer, + player: PaperRpPlayer, identity: RpIdentity, - license: IdentityLicense + license: IdentityLicense, + licenseService: PaperLicenseService ): Dialog = dialog { base { title { success("Lizenz erworben") } @@ -147,7 +158,7 @@ private fun boughtLicenseNotice( action { playerCallback { - it.showDialog(myLicenseDialog(player, identity, license)) + it.showDialog(myLicenseDialog(player, identity, license, licenseService)) } } } @@ -155,10 +166,11 @@ private fun boughtLicenseNotice( } private fun cannotBuyLicenseNotice( - player: RpPlayer, + player: PaperRpPlayer, identity: RpIdentity, license: License, - reason: ObjectSet, + reason: Set, + licenseService: PaperLicenseService ): Dialog = dialog { base { title { error("Lizenz kann nicht erworben werden") } @@ -198,7 +210,7 @@ private fun cannotBuyLicenseNotice( action { playerCallback { plugin.launch { - it.showDialog(buyLicenseDialog(player, identity, license)) + it.showDialog(buyLicenseDialog(player, identity, license, licenseService)) } } } @@ -206,13 +218,17 @@ private fun cannotBuyLicenseNotice( } } -private fun backButton(player: RpPlayer, identity: RpIdentity) = actionButton { +private fun backButton( + player: PaperRpPlayer, + identity: RpIdentity, + licenseService: PaperLicenseService +) = actionButton { label { text("Zurück") } tooltip { info("Klicke, um zur Übersicht der erwerbbaren Lizenzen zurückzukehren.") } action { playerCallback { - it.showDialog(buyLicensesDialog(player, identity)) + it.showDialog(buyLicensesDialog(player, identity, licenseService)) } } } \ No newline at end of file diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/dialogs/BuyLicensesDialog.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/dialogs/BuyLicensesDialog.kt index 1e4e749..8a04389 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/dialogs/BuyLicensesDialog.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/dialogs/BuyLicensesDialog.kt @@ -3,9 +3,10 @@ package dev.slne.surf.roleplay.paper.player.license.dialogs import com.github.shynixn.mccoroutine.folia.launch -import dev.slne.surf.roleplay.api.common.player.RpPlayer -import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity -import dev.slne.surf.roleplay.api.player.license.LicenseService +import dev.slne.surf.roleplay.paper.player.PaperRpPlayer +import dev.slne.surf.roleplay.paper.player.identity.RpIdentity +import dev.slne.surf.roleplay.paper.player.license.PaperLicenseService +import dev.slne.surf.roleplay.paper.player.license.dialogs.backButton import dev.slne.surf.roleplay.paper.plugin import dev.slne.surf.surfapi.bukkit.api.dialog.base import dev.slne.surf.surfapi.bukkit.api.dialog.builder.actionButton @@ -14,8 +15,12 @@ import dev.slne.surf.surfapi.bukkit.api.dialog.type import dev.slne.surf.surfapi.core.api.messages.adventure.appendNewline import io.papermc.paper.registry.data.dialog.DialogBase -fun buyLicensesDialog(player: RpPlayer, identity: RpIdentity) = dialog { - val actions = buildDialogList(player, identity) +fun buyLicensesDialog( + player: PaperRpPlayer, + identity: RpIdentity, + licenseService: PaperLicenseService +) = dialog { + val actions = buildDialogList(player, identity, licenseService) base { title { primary("Lizenzen erwerben") } @@ -42,45 +47,50 @@ fun buyLicensesDialog(player: RpPlayer, identity: RpIdentity) = dialog { type { if (actions.isEmpty()) { - notice(backButton(player, identity)) + notice(backButton(player, identity, licenseService)) } else { multiAction { actions.forEach { action(it) } columns(1) - exitAction(backButton(player, identity)) + exitAction(backButton(player, identity, licenseService)) } } } } -private fun backButton(player: RpPlayer, identity: RpIdentity) = actionButton { +private fun backButton( + player: PaperRpPlayer, + identity: RpIdentity, + licenseService: PaperLicenseService +) = actionButton { label { text("Zurück") } tooltip { info("Klicke, um zum Hauptmenü zurückzukehren.") } action { playerCallback { - it.showDialog(licenseDialog(player, identity)) + it.showDialog(licenseDialog(player, identity, licenseService)) } } } private fun buildDialogList( - player: RpPlayer, - identity: RpIdentity -) = LicenseService.licenses.filterNot { - identity.hasLicense(it) -}.map { license -> - actionButton { - label(license.displayName) - tooltip { info("Klicke, um zur Detailansicht zu gelangen.") } - width(300) + player: PaperRpPlayer, + identity: RpIdentity, + licenseService: PaperLicenseService +) = licenseService.all() + .filterNot { identity.hasLicense(it) } + .map { license -> + actionButton { + label(license.displayName) + tooltip { info("Klicke, um zur Detailansicht zu gelangen.") } + width(300) - action { - playerCallback { - plugin.launch { - it.showDialog(buyLicenseDialog(player, identity, license)) + action { + playerCallback { + plugin.launch { + it.showDialog(buyLicenseDialog(player, identity, license, licenseService)) + } } } } - } -} \ No newline at end of file + }.toList() \ No newline at end of file diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/dialogs/LicenseDialog.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/dialogs/LicenseDialog.kt index 2f95936..af37e07 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/dialogs/LicenseDialog.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/dialogs/LicenseDialog.kt @@ -2,9 +2,11 @@ package dev.slne.surf.roleplay.paper.player.license.dialogs -import dev.slne.surf.roleplay.api.common.player.RpPlayer -import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity +import dev.slne.surf.roleplay.paper.player.PaperRpPlayer +import dev.slne.surf.roleplay.paper.player.identity.RpIdentity import dev.slne.surf.roleplay.paper.player.license.IdentityLicense +import dev.slne.surf.roleplay.paper.player.license.License +import dev.slne.surf.roleplay.paper.player.license.PaperLicenseService import dev.slne.surf.surfapi.bukkit.api.dialog.base import dev.slne.surf.surfapi.bukkit.api.dialog.builder.actionButton import dev.slne.surf.surfapi.bukkit.api.dialog.dialog @@ -21,10 +23,9 @@ import net.kyori.adventure.text.format.TextDecoration import java.time.Duration import java.time.LocalDateTime import java.time.format.DateTimeFormatter -import kotlin.collections.map fun SurfComponentBuilder.appendLicenseDependencies( - player: RpPlayer, + player: PaperRpPlayer, dependencies: ObjectSet ) { variableKey("Voraussetzungen: ") @@ -122,7 +123,11 @@ private fun buildRelativeString(from: LocalDateTime, to: LocalDateTime): String return if (to.isAfter(from)) "in $joined" else "vor $joined" } -fun licenseDialog(player: RpPlayer, identity: RpIdentity) = dialog { +fun licenseDialog( + player: PaperRpPlayer, + identity: RpIdentity, + licenseService: PaperLicenseService +) = dialog { base { title { primary("Lizenzsystem v1.0") } afterAction(DialogBase.DialogAfterAction.NONE) @@ -154,32 +159,42 @@ fun licenseDialog(player: RpPlayer, identity: RpIdentity) = dialog { type { multiAction { columns(1) - action(myLicensesButton(player, identity)) - action(buyLicensesButton(player, identity)) + action(myLicensesButton(player, identity, licenseService)) + action(buyLicensesButton(player, identity, licenseService)) } } } -private fun myLicensesButton(player: RpPlayer, identity: RpIdentity): ActionButton = actionButton { - label { text("Meine Lizenzen") } - tooltip { info("Klicke, um deine Lizenzen zu sehen.") } - width(400) - - action { - playerCallback { - it.showDialog(myLicensesDialog(player, identity)) +private fun myLicensesButton( + player: PaperRpPlayer, + identity: RpIdentity, + licenseService: PaperLicenseService +): ActionButton = + actionButton { + label { text("Meine Lizenzen") } + tooltip { info("Klicke, um deine Lizenzen zu sehen.") } + width(400) + + action { + playerCallback { + it.showDialog(myLicensesDialog(player, identity, licenseService)) + } } } -} -private fun buyLicensesButton(player: RpPlayer, identity: RpIdentity): ActionButton = actionButton { - label { text("Lizenz erwerben") } - tooltip { info("Klicke, um eine Lizenz zu erwerben.") } - width(400) - - action { - playerCallback { - it.showDialog(buyLicensesDialog(player, identity)) +private fun buyLicensesButton( + player: PaperRpPlayer, + identity: RpIdentity, + licenseService: PaperLicenseService +): ActionButton = + actionButton { + label { text("Lizenz erwerben") } + tooltip { info("Klicke, um eine Lizenz zu erwerben.") } + width(400) + + action { + playerCallback { + it.showDialog(buyLicensesDialog(player, identity, licenseService)) + } } - } -} \ No newline at end of file + } \ No newline at end of file diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/dialogs/MyLicenseDialog.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/dialogs/MyLicenseDialog.kt index 4898873..a743e4b 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/dialogs/MyLicenseDialog.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/dialogs/MyLicenseDialog.kt @@ -2,9 +2,10 @@ package dev.slne.surf.roleplay.paper.player.license.dialogs -import dev.slne.surf.roleplay.api.common.player.RpPlayer -import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity +import dev.slne.surf.roleplay.paper.player.PaperRpPlayer +import dev.slne.surf.roleplay.paper.player.identity.RpIdentity import dev.slne.surf.roleplay.paper.player.license.IdentityLicense +import dev.slne.surf.roleplay.paper.player.license.PaperLicenseService import dev.slne.surf.surfapi.bukkit.api.dialog.base import dev.slne.surf.surfapi.bukkit.api.dialog.dialog import dev.slne.surf.surfapi.bukkit.api.dialog.type @@ -13,9 +14,10 @@ import io.papermc.paper.dialog.Dialog import io.papermc.paper.registry.data.dialog.DialogBase fun myLicenseDialog( - player: RpPlayer, + player: PaperRpPlayer, identity: RpIdentity, - identityLicense: IdentityLicense + identityLicense: IdentityLicense, + licenseService: PaperLicenseService ): Dialog = dialog { val license = identityLicense.license @@ -51,7 +53,7 @@ fun myLicenseDialog( action { playerCallback { - it.showDialog(myLicensesDialog(player, identity)) + it.showDialog(myLicensesDialog(player, identity, licenseService)) } } } diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/dialogs/MyLicensesDialog.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/dialogs/MyLicensesDialog.kt index 572680f..a7d28bd 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/dialogs/MyLicensesDialog.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/dialogs/MyLicensesDialog.kt @@ -2,8 +2,9 @@ package dev.slne.surf.roleplay.paper.player.license.dialogs -import dev.slne.surf.roleplay.api.common.player.RpPlayer -import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity +import dev.slne.surf.roleplay.paper.player.PaperRpPlayer +import dev.slne.surf.roleplay.paper.player.identity.RpIdentity +import dev.slne.surf.roleplay.paper.player.license.PaperLicenseService import dev.slne.surf.surfapi.bukkit.api.dialog.base import dev.slne.surf.surfapi.bukkit.api.dialog.builder.actionButton import dev.slne.surf.surfapi.bukkit.api.dialog.dialog @@ -12,8 +13,12 @@ import dev.slne.surf.surfapi.core.api.messages.adventure.appendNewline import dev.slne.surf.surfapi.core.api.util.toObjectSet import io.papermc.paper.registry.data.dialog.DialogBase -fun myLicensesDialog(player: RpPlayer, identity: RpIdentity) = dialog { - val dialogList = buildDialogList(player, identity) +fun myLicensesDialog( + player: PaperRpPlayer, + identity: RpIdentity, + licenseService: PaperLicenseService +) = dialog { + val dialogList = buildDialogList(player, identity, licenseService) base { title { primary("Meine Lizenzen") } @@ -38,24 +43,30 @@ fun myLicensesDialog(player: RpPlayer, identity: RpIdentity) = dialog { addAll(dialogList) buttonWidth(300) columns(1) - exitAction(backButton(player, identity)) + exitAction(backButton(player, identity, licenseService)) } } } -private fun backButton(player: RpPlayer, identity: RpIdentity) = actionButton { +private fun backButton( + player: PaperRpPlayer, + identity: RpIdentity, + licenseService: PaperLicenseService +) = actionButton { label { text("Zurück") } tooltip { info("Klicke, um zum Hauptmenü zurückzukehren.") } action { playerCallback { - it.showDialog(licenseDialog(player, identity)) + it.showDialog(licenseDialog(player, identity, licenseService)) } } } private fun buildDialogList( - player: RpPlayer, identity: RpIdentity + player: PaperRpPlayer, + identity: RpIdentity, + licenseService: PaperLicenseService ) = player.licenses.map { license -> - myLicenseDialog(player, identity, license) + myLicenseDialog(player, identity, license, licenseService) }.toObjectSet() \ No newline at end of file diff --git a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/listeners/LicenseBuyHandler.kt b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/listeners/LicenseBuyHandler.kt index d243760..78ac112 100644 --- a/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/listeners/LicenseBuyHandler.kt +++ b/surf-roleplay-paper/src/main/kotlin/dev/slne/surf/roleplay/paper/player/license/listeners/LicenseBuyHandler.kt @@ -5,6 +5,7 @@ import com.github.shynixn.mccoroutine.folia.launch import dev.slne.surf.npc.api.event.NpcInteractEvent import dev.slne.surf.npc.api.surfNpcApi import dev.slne.surf.roleplay.paper.player.license.LicenseNpc +import dev.slne.surf.roleplay.paper.player.license.PaperLicenseService import dev.slne.surf.roleplay.paper.player.license.dialogs.licenseDialog import dev.slne.surf.roleplay.paper.player.rpPlayer import dev.slne.surf.roleplay.paper.plugin @@ -14,7 +15,7 @@ import org.bukkit.event.Listener import org.springframework.stereotype.Component @Component -class LicenseBuyHandler : Listener { +class LicenseBuyHandler(private val paperLicenseService: PaperLicenseService) : Listener { private val licenseNpc get() = surfNpcApi.getNpc(LicenseNpc.NPC_NAME) @@ -38,7 +39,7 @@ class LicenseBuyHandler : Listener { } plugin.launch(plugin.entityDispatcher(player)) { - player.showDialog(licenseDialog(rpPlayer, activeIdentity)) + player.showDialog(licenseDialog(rpPlayer, activeIdentity, paperLicenseService)) } } diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/RpPlayerManagerImpl.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/RpPlayerManagerImpl.kt index 01a4862..0058536 100644 --- a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/RpPlayerManagerImpl.kt +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/RpPlayerManagerImpl.kt @@ -1,18 +1,8 @@ package dev.slne.surf.roleplay.server.player import dev.slne.surf.cloud.api.common.player.CloudPlayerManager -import dev.slne.surf.roleplay.core.common.player.RpPlayer import dev.slne.surf.roleplay.core.common.player.RpPlayerManager -import dev.slne.surf.roleplay.core.common.player.identity.RpIdentity -import dev.slne.surf.roleplay.server.player.identity.db.impl.police.RpPlayerPoliceIdentityModel -import dev.slne.surf.roleplay.server.player.RpPlayerService -import dev.slne.surf.roleplay.server.player.identity.db.impl.civilian.RpPlayerCivilianIdentityModel -import dev.slne.surf.roleplay.server.player.identity.db.impl.rescueservice.RpPlayerRescueServiceIdentityModel -import dev.slne.surf.surfapi.core.api.util.getCallerClass -import kotlinx.coroutines.Dispatchers -import org.jetbrains.exposed.sql.transactions.experimental.newSuspendedTransaction import org.springframework.stereotype.Component -import java.time.ZonedDateTime import java.util.* @Component @@ -33,120 +23,4 @@ class RpPlayerManagerImpl(private val rpPlayerService: RpPlayerService) : RpPlay // it.updatedAt = rpPlayer.updatedAt // } // } - - @Suppress("UNCHECKED_CAST") - suspend fun createIdentity( - player: RpPlayerImpl, - identity: T - ): T = newSuspendedTransaction(Dispatchers.IO) { - val rpPlayerModel = rpPlayerManagerImpl.findOrCreate(player.uuid) - - val identity = when (identity) { - is RpIdentity.CivilianIdentity -> { - RpPlayerCivilianIdentityModel.new { - this.player = rpPlayerModel - firstName = identity.firstName - lastName = identity.lastName - dateOfBirth = identity.dateOfBirth - createdAt = identity.createdAt - updatedAt = identity.updatedAt - } - } - - is RpIdentity.PoliceIdentity -> { - RpPlayerPoliceIdentityModel.new { - this.player = rpPlayerModel - firstName = identity.firstName - lastName = identity.lastName - dateOfBirth = identity.dateOfBirth - badgeNumber = identity.badgeNumber - rank = identity.rank - createdAt = identity.createdAt - updatedAt = identity.updatedAt - } - } - - is RpIdentity.RescueServiceIdentity -> { - RpPlayerRescueServiceIdentityModel.new { - this.player = rpPlayerModel - firstName = identity.firstName - lastName = identity.lastName - dateOfBirth = identity.dateOfBirth - rank = identity.rank - createdAt = identity.createdAt - updatedAt = identity.updatedAt - } - } - - else -> error("Unsupported identity type: ${identity::class.qualifiedName}") - } - - val api = identity.toApi(player) - player.addIdentity(api) - - api as T - } - - suspend fun createOrUpdateIdentity( - player: RpPlayerImpl, - identity: T - ): T = newSuspendedTransaction(Dispatchers.IO) { - val entity = findIdentityByType(player, identity) - - if (entity == null) { - return@newSuspendedTransaction createIdentity(player, identity) - } - - updateIdentity(player, identity) - } - - suspend fun updateIdentity( - player: RpPlayerImpl, - identity: T, - ): T = newSuspendedTransaction(Dispatchers.IO) { - val entity = findIdentityByType(player, identity) - - identity.updatedAt = ZonedDateTime.now() - - when (entity) { - is RpPlayerCivilianIdentityModel -> { - entity.firstName = identity.firstName - entity.lastName = identity.lastName - entity.dateOfBirth = identity.dateOfBirth - entity.updatedAt = identity.updatedAt - } - - is RpPlayerPoliceIdentityModel -> { - identity as RpIdentity.PoliceIdentity - - entity.firstName = identity.firstName - entity.lastName = identity.lastName - entity.dateOfBirth = identity.dateOfBirth - entity.badgeNumber = identity.badgeNumber - entity.rank = identity.rank - entity.updatedAt = identity.updatedAt - } - - is RpPlayerRescueServiceIdentityModel -> { - identity as RpIdentity.RescueServiceIdentity - - entity.firstName = identity.firstName - entity.lastName = identity.lastName - entity.dateOfBirth = identity.dateOfBirth - entity.rank = identity.rank - entity.updatedAt = identity.updatedAt - } - - else -> error("Unsupported identity type: ${identity::class.qualifiedName}") - } - - identity - } - - override suspend fun get(uuid: UUID): RpPlayer { - println("Caller: " + getCallerClass(1)) - return cache.get(uuid) - } -} - -val rpPlayerManagerImpl get() = RpPlayerManager.INSTANCE as RpPlayerManagerImpl \ No newline at end of file +} \ No newline at end of file diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/ServerRpPlayer.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/ServerRpPlayer.kt index d694d93..7e5e675 100644 --- a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/ServerRpPlayer.kt +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/ServerRpPlayer.kt @@ -1,7 +1,39 @@ package dev.slne.surf.roleplay.server.player import dev.slne.surf.roleplay.core.common.player.RpPlayer +import dev.slne.surf.roleplay.core.common.transaction.RpTransaction +import dev.slne.surf.roleplay.core.common.transaction.utils.BalanceType +import it.unimi.dsi.fastutil.objects.ObjectLinkedOpenHashSet +import net.kyori.adventure.text.Component import java.util.UUID class ServerRpPlayer(uuid: UUID) : RpPlayer(uuid) { + override suspend fun getBalance(balanceType: BalanceType): Int { + TODO("Not yet implemented") + } + + override suspend fun addBalance( + balanceType: BalanceType, + amount: Int + ): Boolean { + TODO("Not yet implemented") + } + + override suspend fun removeBalance( + balanceType: BalanceType, + amount: Int + ): Boolean { + TODO("Not yet implemented") + } + + override suspend fun getBalanceHistory( + balanceType: BalanceType, + limit: Int + ): ObjectLinkedOpenHashSet { + TODO("Not yet implemented") + } + + override fun asComponent(): Component { + TODO("Not yet implemented") + } } \ No newline at end of file diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/db/RpPlayerModel.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/db/RpPlayerModel.kt index 8a6c072..6398471 100644 --- a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/db/RpPlayerModel.kt +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/db/RpPlayerModel.kt @@ -1,18 +1,14 @@ -package dev.slne.surf.roleplay.core.player.db +package dev.slne.surf.roleplay.server.player.db -import dev.slne.surf.roleplay.core.player.RpPlayerImpl -import dev.slne.surf.roleplay.server.player.identity.db.impl.police.RpPlayerPoliceIdentityModel -import dev.slne.surf.roleplay.server.player.db.RpPlayerTable import dev.slne.surf.roleplay.server.player.identity.db.impl.civilian.RpPlayerCivilianIdentityModel import dev.slne.surf.roleplay.server.player.identity.db.impl.civilian.RpPlayerCivilianIdentityTable +import dev.slne.surf.roleplay.server.player.identity.db.impl.police.RpPlayerPoliceIdentityModel import dev.slne.surf.roleplay.server.player.identity.db.impl.police.RpPlayerPoliceIdentityTable import dev.slne.surf.roleplay.server.player.identity.db.impl.rescueservice.RpPlayerRescueServiceIdentityModel import dev.slne.surf.roleplay.server.player.identity.db.impl.rescueservice.RpPlayerRescueServiceIdentityTable -import kotlinx.coroutines.Dispatchers import org.jetbrains.exposed.dao.LongEntity import org.jetbrains.exposed.dao.LongEntityClass import org.jetbrains.exposed.dao.id.EntityID -import org.jetbrains.exposed.sql.transactions.experimental.newSuspendedTransaction class RpPlayerModel(id: EntityID) : LongEntity(id) { @@ -27,16 +23,4 @@ class RpPlayerModel(id: EntityID) : LongEntity(id) { val civilianIdentity by RpPlayerCivilianIdentityModel optionalBackReferencedOn RpPlayerCivilianIdentityTable.player val policeIdentity by RpPlayerPoliceIdentityModel optionalBackReferencedOn RpPlayerPoliceIdentityTable.player val rescueServiceIdentity by RpPlayerRescueServiceIdentityModel optionalBackReferencedOn RpPlayerRescueServiceIdentityTable.player - - suspend fun toApi() = newSuspendedTransaction(Dispatchers.IO) { - RpPlayerImpl(uuid = uuid).apply { - civilianIdentity?.let { addIdentity(it.toApi(this)) } - policeIdentity?.let { addIdentity(it.toApi(this)) } - rescueServiceIdentity?.let { addIdentity(it.toApi(this)) } - - this.username = this@RpPlayerModel.username - this.createdAt = this@RpPlayerModel.createdAt - this.updatedAt = this@RpPlayerModel.updatedAt - } - } } \ No newline at end of file diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/db/RpPlayerRepository.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/db/RpPlayerRepository.kt index 4d47fb3..bb4fa7f 100644 --- a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/db/RpPlayerRepository.kt +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/db/RpPlayerRepository.kt @@ -2,14 +2,6 @@ package dev.slne.surf.roleplay.server.player.db import dev.slne.surf.cloud.api.common.util.singleOrNullOrThrow import dev.slne.surf.cloud.api.server.plugin.CoroutineTransactional -import dev.slne.surf.roleplay.core.common.player.identity.RpIdentityType -import dev.slne.surf.roleplay.core.common.player.identity.create.RpIdentityCreationData -import dev.slne.surf.roleplay.core.common.player.identity.update.RpIdentityUpdateData -import dev.slne.surf.roleplay.core.player.db.RpPlayerModel -import dev.slne.surf.roleplay.server.player.identity.db.impl.police.RpPlayerPoliceIdentityModel -import dev.slne.surf.roleplay.server.player.identity.db.RpPlayerIdentityBaseModel -import dev.slne.surf.roleplay.server.player.identity.db.impl.civilian.RpPlayerCivilianIdentityModel -import dev.slne.surf.roleplay.server.player.identity.db.impl.rescueservice.RpPlayerRescueServiceIdentityModel import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq import org.springframework.stereotype.Repository import java.time.ZonedDateTime @@ -36,80 +28,4 @@ class RpPlayerRepository { RpPlayerModel.findSingleByAndUpdate(RpPlayerTable.uuid eq uuid) { it.username = username } - - private suspend fun findIdentityModelByType( - uuid: UUID, - type: RpIdentityType - ): RpPlayerIdentityBaseModel? { - val playerId = findPlayerId(uuid) ?: return null - val modelClass = when (type) { - RpIdentityType.CIVILIAN -> RpPlayerCivilianIdentityModel - RpIdentityType.POLICE -> RpPlayerPoliceIdentityModel - RpIdentityType.RESCUE_SERVICE -> RpPlayerRescueServiceIdentityModel - } - - return modelClass.find { modelClass.identityTable.player eq playerId }.singleOrNullOrThrow() - } - - suspend fun createIdentity(uuid: UUID, creationData: RpIdentityCreationData) { - val playerModel = findOrCreateModel(uuid) - - fun RpPlayerIdentityBaseModel.applyCommonData() { - this.player = playerModel - this.firstName = creationData.firstName - this.lastName = creationData.lastName - this.dateOfBirth = creationData.dateOfBirth - } - - when (creationData) { - is RpIdentityCreationData.Civilian -> RpPlayerCivilianIdentityModel.new { - applyCommonData() - } - - is RpIdentityCreationData.Police -> RpPlayerPoliceIdentityModel.new { - applyCommonData() - this.badgeNumber = creationData.badgeNumber - this.rank = creationData.rank - } - - is RpIdentityCreationData.RescueService -> RpPlayerRescueServiceIdentityModel.new { - applyCommonData() - this.rank = creationData.rank - } - } - } - - suspend fun updateIdentity(uuid: UUID, updateData: RpIdentityUpdateData): Boolean { - val existingModel = findIdentityModelByType(uuid, updateData.identityType) ?: return false - - fun RpPlayerIdentityBaseModel.applyCommonUpdate() { - updateData.firstName?.let { this.firstName = it } - updateData.lastName?.let { this.lastName = it } - updateData.dateOfBirth?.let { this.dateOfBirth = it } - } - - when (existingModel) { - is RpPlayerCivilianIdentityModel -> { - if (updateData !is RpIdentityUpdateData.Civilian) return false - existingModel.applyCommonUpdate() - } - - is RpPlayerPoliceIdentityModel -> { - if (updateData !is RpIdentityUpdateData.Police) return false - existingModel.applyCommonUpdate() - updateData.badgeNumber?.let { existingModel.badgeNumber = it } - updateData.rank?.let { existingModel.rank = it } - } - - is RpPlayerRescueServiceIdentityModel -> { - if (updateData !is RpIdentityUpdateData.RescueService) return false - existingModel.applyCommonUpdate() - updateData.rank?.let { existingModel.rank = it } - } - - else -> error("Unsupported identity model type: ${existingModel::class.qualifiedName}") - } - - return true - } } \ No newline at end of file diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/RpIdentityPacketListener.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/RpIdentityPacketListener.kt new file mode 100644 index 0000000..a3cda56 --- /dev/null +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/RpIdentityPacketListener.kt @@ -0,0 +1,24 @@ +package dev.slne.surf.roleplay.server.player.identity + +import dev.slne.surf.cloud.api.common.meta.SurfNettyPacketHandler +import dev.slne.surf.roleplay.core.common.network.packets.FetchIdentitiesByUuidPacketResponse +import dev.slne.surf.roleplay.core.common.network.packets.IdentityResponsePacket +import dev.slne.surf.roleplay.core.common.network.packets.ServerboundCreateOrUpdateIdentityPacket +import dev.slne.surf.roleplay.core.common.network.packets.ServerboundFetchIdentitiesByUuidPacket +import org.springframework.stereotype.Component + +@Component +class RpIdentityPacketListener(private val rpIdentityService: RpIdentityService) { + + @SurfNettyPacketHandler + suspend fun handleFetchIdentitiesByUuid(packet: ServerboundFetchIdentitiesByUuidPacket) { + val identities = rpIdentityService.fetchByUuid(packet.uuid) + packet.respond(FetchIdentitiesByUuidPacketResponse(identities)) + } + + @SurfNettyPacketHandler + suspend fun handleCreateOrUpdateIdentity(packet: ServerboundCreateOrUpdateIdentityPacket) { + val created = rpIdentityService.createOrUpdateIdentity(packet.identity) + packet.respond(IdentityResponsePacket(created)) + } +} \ No newline at end of file diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/RpIdentityService.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/RpIdentityService.kt new file mode 100644 index 0000000..16475fc --- /dev/null +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/RpIdentityService.kt @@ -0,0 +1,13 @@ +package dev.slne.surf.roleplay.server.player.identity + +import dev.slne.surf.roleplay.core.common.player.identity.NetworkIdentity +import dev.slne.surf.roleplay.server.player.identity.db.RpIdentityRepository +import org.springframework.stereotype.Service +import java.util.* + +@Service +class RpIdentityService(private val rpIdentityRepository: RpIdentityRepository) { + suspend fun fetchByUuid(uuid: UUID) = rpIdentityRepository.findByUuid(uuid) + suspend fun createOrUpdateIdentity(identity: NetworkIdentity) = + rpIdentityRepository.updateOrCreateIdentity(identity.uuid, identity) +} \ No newline at end of file diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/RpIdentityRepository.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/RpIdentityRepository.kt new file mode 100644 index 0000000..d949edf --- /dev/null +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/RpIdentityRepository.kt @@ -0,0 +1,108 @@ +package dev.slne.surf.roleplay.server.player.identity.db + +import dev.slne.surf.cloud.api.common.util.singleOrNullOrThrow +import dev.slne.surf.roleplay.core.common.player.identity.NetworkIdentity +import dev.slne.surf.roleplay.core.common.player.identity.RpIdentityType +import dev.slne.surf.roleplay.server.player.db.RpPlayerRepository +import dev.slne.surf.roleplay.server.player.identity.db.impl.civilian.RpPlayerCivilianIdentityModel +import dev.slne.surf.roleplay.server.player.identity.db.impl.police.RpPlayerPoliceIdentityModel +import dev.slne.surf.roleplay.server.player.identity.db.impl.rescueservice.RpPlayerRescueServiceIdentityModel +import org.springframework.stereotype.Repository +import java.util.* + +@Repository +class RpIdentityRepository(private val rpPlayerRepository: RpPlayerRepository) { + + suspend fun findByUuid(uuid: UUID): List { + val player = rpPlayerRepository.findOrCreateModel(uuid) + + return listOfNotNull( + player.civilianIdentity?.toNetwork(), + player.policeIdentity?.toNetwork(), + player.rescueServiceIdentity?.toNetwork() + ) + } + + private suspend fun findIdentityModelByType( + uuid: UUID, + type: RpIdentityType + ): RpPlayerIdentityBaseModel? { + val playerId = rpPlayerRepository.findPlayerId(uuid) ?: return null + val modelClass = when (type) { + RpIdentityType.CIVILIAN -> RpPlayerCivilianIdentityModel + RpIdentityType.POLICE -> RpPlayerPoliceIdentityModel + RpIdentityType.RESCUE_SERVICE -> RpPlayerRescueServiceIdentityModel + } + + return modelClass.find { modelClass.identityTable.player eq playerId }.singleOrNullOrThrow() + } + + suspend fun createIdentity(uuid: UUID, identity: NetworkIdentity): NetworkIdentity { + val playerModel = rpPlayerRepository.findOrCreateModel(uuid) + + fun RpPlayerIdentityBaseModel.applyCommonData() { + this.player = playerModel + this.firstName = identity.firstName + this.lastName = identity.lastName + this.dateOfBirth = identity.dateOfBirth + } + + val created = when (identity) { + is NetworkIdentity.Civilian -> RpPlayerCivilianIdentityModel.new { + applyCommonData() + } + + is NetworkIdentity.Police -> RpPlayerPoliceIdentityModel.new { + applyCommonData() + this.badgeNumber = identity.badgeNumber + this.rank = identity.rank + } + + is NetworkIdentity.RescueService -> RpPlayerRescueServiceIdentityModel.new { + applyCommonData() + this.rank = identity.rank + } + } + + return created.toNetwork() + } + + suspend fun updateOrCreateIdentity(uuid: UUID, identity: NetworkIdentity): NetworkIdentity { + val existingModel = + findIdentityModelByType(uuid, identity.type) ?: return createIdentity(uuid, identity) + + fun RpPlayerIdentityBaseModel.applyCommonUpdate() = apply { + this.firstName = identity.firstName + this.lastName = identity.lastName + this.dateOfBirth = identity.dateOfBirth + } + + val updated = when (existingModel) { + is RpPlayerCivilianIdentityModel -> { + require(identity is NetworkIdentity.Civilian) { "Invalid identity type: ${identity::class.qualifiedName}. Expected: ${NetworkIdentity.Civilian::class.qualifiedName}" } + existingModel.applyCommonUpdate() + } + + is RpPlayerPoliceIdentityModel -> { + require(identity is NetworkIdentity.Police) { "Invalid identity type: ${identity::class.qualifiedName}. Expected: ${NetworkIdentity.Police::class.qualifiedName}" } + existingModel.apply { + applyCommonUpdate() + this.badgeNumber = identity.badgeNumber + this.rank = identity.rank + } + } + + is RpPlayerRescueServiceIdentityModel -> { + require(identity is NetworkIdentity.RescueService) { "Invalid identity type: ${identity::class.qualifiedName}. Expected: ${NetworkIdentity.RescueService::class.qualifiedName}" } + existingModel.apply { + applyCommonUpdate() + this.rank = identity.rank + } + } + + else -> error("Unsupported identity type: ${identity::class.qualifiedName}") + } + + return updated.toNetwork() + } +} \ No newline at end of file diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/RpPlayerIdentityBaseModel.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/RpPlayerIdentityBaseModel.kt index 38782cb..bc85e80 100644 --- a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/RpPlayerIdentityBaseModel.kt +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/RpPlayerIdentityBaseModel.kt @@ -2,7 +2,8 @@ package dev.slne.surf.roleplay.server.player.identity.db import dev.slne.surf.cloud.api.server.exposed.table.AuditableLongEntity import dev.slne.surf.cloud.api.server.exposed.table.AuditableLongEntityClass -import dev.slne.surf.roleplay.core.player.db.RpPlayerModel +import dev.slne.surf.roleplay.core.common.player.identity.NetworkIdentity +import dev.slne.surf.roleplay.server.player.db.RpPlayerModel import org.jetbrains.exposed.dao.id.EntityID abstract class RpPlayerIdentityBaseModel( @@ -14,6 +15,8 @@ abstract class RpPlayerIdentityBaseModel( var firstName by table.firstName var lastName by table.lastName var dateOfBirth by table.dateOfBirth + + abstract fun toNetwork(): NetworkIdentity } abstract class RpPlayerIdentityBaseClass(val identityTable: RpPlayerIdentityBaseTable) : diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/civilian/RpPlayerCivilianIdentityModel.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/civilian/RpPlayerCivilianIdentityModel.kt index c4f959a..f61300a 100644 --- a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/civilian/RpPlayerCivilianIdentityModel.kt +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/civilian/RpPlayerCivilianIdentityModel.kt @@ -1,5 +1,6 @@ package dev.slne.surf.roleplay.server.player.identity.db.impl.civilian +import dev.slne.surf.roleplay.core.common.player.identity.NetworkIdentity import dev.slne.surf.roleplay.server.player.identity.db.RpPlayerIdentityBaseClass import dev.slne.surf.roleplay.server.player.identity.db.RpPlayerIdentityBaseModel import org.jetbrains.exposed.dao.id.EntityID @@ -8,4 +9,13 @@ class RpPlayerCivilianIdentityModel(id: EntityID) : RpPlayerIdentityBaseModel(id, RpPlayerCivilianIdentityTable) { companion object : RpPlayerIdentityBaseClass(RpPlayerCivilianIdentityTable) + + override fun toNetwork() = NetworkIdentity.Civilian( + uuid = player.uuid, + firstName = firstName, + lastName = lastName, + dateOfBirth = dateOfBirth, + createdAt = createdAt, + updatedAt = updatedAt + ) } \ No newline at end of file diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/police/RpPlayerPoliceIdentityModel.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/police/RpPlayerPoliceIdentityModel.kt index d9a50ca..4edf26f 100644 --- a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/police/RpPlayerPoliceIdentityModel.kt +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/police/RpPlayerPoliceIdentityModel.kt @@ -1,5 +1,6 @@ package dev.slne.surf.roleplay.server.player.identity.db.impl.police +import dev.slne.surf.roleplay.core.common.player.identity.NetworkIdentity import dev.slne.surf.roleplay.server.player.identity.db.RpPlayerIdentityBaseClass import dev.slne.surf.roleplay.server.player.identity.db.RpPlayerIdentityBaseModel import org.jetbrains.exposed.dao.id.EntityID @@ -11,4 +12,15 @@ class RpPlayerPoliceIdentityModel(id: EntityID) : var badgeNumber by RpPlayerPoliceIdentityTable.badgeNumber var rank by RpPlayerPoliceIdentityTable.rank + + override fun toNetwork() = NetworkIdentity.Police( + uuid = player.uuid, + firstName = firstName, + lastName = lastName, + dateOfBirth = dateOfBirth, + badgeNumber = badgeNumber, + rank = rank, + createdAt = createdAt, + updatedAt = updatedAt + ) } \ No newline at end of file diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/rescueservice/RpPlayerRescueServiceIdentityModel.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/rescueservice/RpPlayerRescueServiceIdentityModel.kt index 0e99d7d..5f6ab10 100644 --- a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/rescueservice/RpPlayerRescueServiceIdentityModel.kt +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/identity/db/impl/rescueservice/RpPlayerRescueServiceIdentityModel.kt @@ -1,5 +1,6 @@ package dev.slne.surf.roleplay.server.player.identity.db.impl.rescueservice +import dev.slne.surf.roleplay.core.common.player.identity.NetworkIdentity import dev.slne.surf.roleplay.server.player.identity.db.RpPlayerIdentityBaseClass import dev.slne.surf.roleplay.server.player.identity.db.RpPlayerIdentityBaseModel import org.jetbrains.exposed.dao.id.EntityID @@ -12,4 +13,14 @@ class RpPlayerRescueServiceIdentityModel(id: EntityID) : ) var rank by RpPlayerRescueServiceIdentityTable.rank + + override fun toNetwork() = NetworkIdentity.RescueService( + uuid = player.uuid, + firstName = firstName, + lastName = lastName, + dateOfBirth = dateOfBirth, + rank = rank, + createdAt = createdAt, + updatedAt = updatedAt + ) } \ No newline at end of file diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/db/IdentityLicenseModel.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/db/IdentityLicenseModel.kt index 64e97e7..d02fb05 100644 --- a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/db/IdentityLicenseModel.kt +++ b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/db/IdentityLicenseModel.kt @@ -1,11 +1,7 @@ package dev.slne.surf.roleplay.server.player.license.db -import dev.slne.surf.roleplay.api.common.player.identity.RpIdentity -import dev.slne.surf.roleplay.api.player.license.LicenseService -import dev.slne.surf.roleplay.core.common.player.license.IdentityLicense import dev.slne.surf.roleplay.core.common.player.license.NetworkIdentityLicense -import dev.slne.surf.roleplay.core.player.db.RpPlayerModel -import dev.slne.surf.surfapi.core.api.messages.adventure.key +import dev.slne.surf.roleplay.server.player.db.RpPlayerModel import org.jetbrains.exposed.dao.LongEntity import org.jetbrains.exposed.dao.LongEntityClass import org.jetbrains.exposed.dao.id.EntityID @@ -21,37 +17,11 @@ class IdentityLicenseModel(id: EntityID) : LongEntity(id) { var expiresAt by IdentityLicenseTable.expiresAt var createdAt by IdentityLicenseTable.createdAt - fun toApi(identity: RpIdentity): IdentityLicense { - val license = IdentityLicense( - identity = identity, - license = LicenseService.getLicenseByKeyOrThrow(key(license)), - expiresAt = expiresAt, - createdAt = createdAt - ) - - return license - } - fun toNetwork() = NetworkIdentityLicense( + owner = player.uuid, + identityType = identity, licenseKey = license, expiresAt = expiresAt, createdAt = createdAt ) - - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (other !is IdentityLicenseModel) return false - - if (player != other.player) return false - if (license != other.license) return false - if (identity != other.identity) return false - - return true - } - - override fun hashCode(): Int { - var result = player.hashCode() - result = 31 * result + license.hashCode() - return result - } } \ No newline at end of file diff --git a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/utils/LicensePermissionRegistry.kt b/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/utils/LicensePermissionRegistry.kt deleted file mode 100644 index 24fa7b4..0000000 --- a/surf-roleplay-server/src/main/kotlin/dev/slne/surf/roleplay/server/player/license/utils/LicensePermissionRegistry.kt +++ /dev/null @@ -1,14 +0,0 @@ -package dev.slne.surf.roleplay.core.player.license.utils - -import dev.slne.surf.surfapi.bukkit.api.permission.PermissionRegistry -import net.kyori.adventure.key.Key - -object LicensePermissionRegistry : PermissionRegistry() { - - private const val PREFIX = "surf.roleplay.license" - - fun createLicensePermission(key: Key) = create( - "${PREFIX}.license.${key.asString().replace(":", "-").replace("_", "-")}" - ) - -} \ No newline at end of file