From 2995b59070d9dfd15e1cb5998c09d5806fb4b228 Mon Sep 17 00:00:00 2001 From: Thijs Wiefferink Date: Thu, 10 Apr 2014 22:34:51 +0200 Subject: [PATCH 1/2] Adds AreaShop V1.1 code to GitHub --- AreaShop/bin/.gitignore | 1 - .../AreaShop/AreaShop$RegionEventType.class | Bin 0 -> 1624 bytes .../evolutioncoding/AreaShop/AreaShop.class | Bin 0 -> 14118 bytes .../AreaShop/CommandManager.class | Bin 0 -> 11821 bytes .../AreaShop/FileManager.class | Bin 0 -> 34327 bytes .../AreaShop/LanguageManager.class | Bin 0 -> 5268 bytes .../evolutioncoding/AreaShop/RentCheck.class | Bin 0 -> 722 bytes .../AreaShop/RightClickListener.class | Bin 0 -> 2955 bytes .../AreaShop/SignBreakListener.class | Bin 0 -> 5686 bytes .../AreaShop/SignChangeListener.class | Bin 0 -> 8218 bytes AreaShop/config.yml | 49 +- AreaShop/lang/EN.yml | 62 +- AreaShop/lang/NL.yml | 52 +- AreaShop/plugin.yml | 32 +- .../nl/evolutioncoding/AreaShop/AreaShop.java | 81 +- ...{ShopCommands.java => CommandManager.java} | 877 ++++--- .../{ShopManager.java => FileManager.java} | 2293 +++++++++-------- .../AreaShop/SignBreakListener.java | 5 + .../AreaShop/SignChangeListener.java | 14 +- 19 files changed, 1956 insertions(+), 1510 deletions(-) delete mode 100644 AreaShop/bin/.gitignore create mode 100644 AreaShop/bin/nl/evolutioncoding/AreaShop/AreaShop$RegionEventType.class create mode 100644 AreaShop/bin/nl/evolutioncoding/AreaShop/AreaShop.class create mode 100644 AreaShop/bin/nl/evolutioncoding/AreaShop/CommandManager.class create mode 100644 AreaShop/bin/nl/evolutioncoding/AreaShop/FileManager.class create mode 100644 AreaShop/bin/nl/evolutioncoding/AreaShop/LanguageManager.class create mode 100644 AreaShop/bin/nl/evolutioncoding/AreaShop/RentCheck.class create mode 100644 AreaShop/bin/nl/evolutioncoding/AreaShop/RightClickListener.class create mode 100644 AreaShop/bin/nl/evolutioncoding/AreaShop/SignBreakListener.class create mode 100644 AreaShop/bin/nl/evolutioncoding/AreaShop/SignChangeListener.class rename AreaShop/src/nl/evolutioncoding/AreaShop/{ShopCommands.java => CommandManager.java} (62%) rename AreaShop/src/nl/evolutioncoding/AreaShop/{ShopManager.java => FileManager.java} (72%) diff --git a/AreaShop/bin/.gitignore b/AreaShop/bin/.gitignore deleted file mode 100644 index 998e0dd..0000000 --- a/AreaShop/bin/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/nl diff --git a/AreaShop/bin/nl/evolutioncoding/AreaShop/AreaShop$RegionEventType.class b/AreaShop/bin/nl/evolutioncoding/AreaShop/AreaShop$RegionEventType.class new file mode 100644 index 0000000000000000000000000000000000000000..4b8732d97057d352386d45c9b0e05380ea8d40a0 GIT binary patch literal 1624 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 literal 0 HcmV?d00001 diff --git a/AreaShop/bin/nl/evolutioncoding/AreaShop/CommandManager.class b/AreaShop/bin/nl/evolutioncoding/AreaShop/CommandManager.class new file mode 100644 index 0000000000000000000000000000000000000000..78a6a708a2a48550702cb2fbe6740d6b03e899bd GIT binary patch literal 11821 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 literal 0 HcmV?d00001 diff --git a/AreaShop/bin/nl/evolutioncoding/AreaShop/FileManager.class b/AreaShop/bin/nl/evolutioncoding/AreaShop/FileManager.class new file mode 100644 index 0000000000000000000000000000000000000000..f8d5675dc40091002886a3645f3ce35b59ed9692 GIT binary patch literal 34327 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 F{}1R%eXRfh literal 0 HcmV?d00001 diff --git a/AreaShop/bin/nl/evolutioncoding/AreaShop/RentCheck.class b/AreaShop/bin/nl/evolutioncoding/AreaShop/RentCheck.class new file mode 100644 index 0000000000000000000000000000000000000000..bd87eb80c5850184260d4d30a456697ddd2e4042 GIT binary patch literal 722 zcma)4O;5r=5Pb`1r4&$5{Qe+*QAq5;lfjrM2`BUbhI=WSvQoFCwEQm<#l(X@z#nCt z7DP{k!_MwZ-g`6i+OO}APXL!FDu^+hO2^RK+IcyRd>{0YAJ=7WpncV-egS*cyPR%Vj3&$svf&OZBmC%@hQ z`BwnDaZ5poK(l2=^_h&Bb&QOa%#0gWD%xi2T4EwI6&)~A6HbR|B-3$Y+R-iDRuB+) zf(os+@5X#u8=vX$LHXKIOEhn0H5-6WCvnj(8*cM+ZUp{e+9<7FD zIQs=6;fHgH3<(4}GUIv>rC6?_5-S8s!;zs%kg*B{6#`Xp!_s@RlViF)sEwJrKy^Hm z)XX8xHsm;G3^)_Uw7||KGZzR1hn`LDjO>Pbe)fGo`9lJDZ+|+I6ub8rpjBPlx0-OE=+@C`b9q8)r z>J&UG(D*;Ns@Q~j7Br=M4Wf^?o0()DZQ( z>k_Chbn%+UbMzpwN^D0&L0Dj85l25zMFScIRt|7ogQFes?v5j)?eV^jBa7C~?-^T$ zCPWo93)J{hc#w9v2o*c=xPU_9gR@g?o!Ua$JsP*t&`grujXesU5Lo4ll%H1dB%b2> z6WyJ?qy2q}L4h^?g5_~;n7t}mT=Z~TJU%L2B+XV8`@o}7K`IG02f5T0a`Dl20Wk&7 zFprOphe#MHYZ(rpT}20;^%f_O2(jVrNPOX(Cmfr~z#TkHD7HWY3PH=jzFQ(AX--&65EJ|G|4ZH#E4JQu)=w+R9;GaI>+LOuw-$#jw(Mun<&>FZnujPCE11Y+?W8UbGKF&CO3eQy zXqK&tdS1xgmkRKdYPsq%~0ilxY9U>4Ly84b_d&TiwisE zu|wbvc721Y{O_l4i%AKa2iJWU2LkhGD?x9=_o$k~!KOJJX$dS0o@*%!1@7S%y{Yu` z;3){@re7Ma9-G7X98O-tt3Kltjdziz2c_~S%(#H#KEUh)z_|rLs}Jz%1HkJGfb}_2 z2l~EAxDwFxXI}feDyCao+U^C literal 0 HcmV?d00001 diff --git a/AreaShop/bin/nl/evolutioncoding/AreaShop/SignBreakListener.class b/AreaShop/bin/nl/evolutioncoding/AreaShop/SignBreakListener.class new file mode 100644 index 0000000000000000000000000000000000000000..43be7eaa4ee7615f281e9d17415a89e3a00e82db GIT binary patch literal 5686 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 literal 0 HcmV?d00001 diff --git a/AreaShop/config.yml b/AreaShop/config.yml index 2df7791..2ea5603 100644 --- a/AreaShop/config.yml +++ b/AreaShop/config.yml @@ -16,6 +16,10 @@ debug: false language: EN ## Maximum total amount of rents and buys together maximumTotal: 1 +## Enable Schematic saving and restoring in general +enableSchematics: true +## Maximum number of blocks to save to or restore from a .schemetic +maximumBlocks: 1000000 ########## RENTING ########## ## The tag you have to write on the sign for renting a region @@ -41,6 +45,27 @@ flagsRented: members: +%player% greeting: '%region% is rented by %player% until %until%' +## Enable or disable saving and restoring for rents that don't have their individual option set +useRentRestore: false +## For the following events you can specify if you want to restore or save the region to a schematic +## After 'save:' or 'restore:' you enter the name of the file, %region% will be replaced by the region name (.schematic will be added automatically) +## If your regions are all the same size you could use just 1 file as the restore file, just enter a name without %region% +## Be carefull with these options, it could crash your server or destroy (parts of) your world if used wrong! +rentSchematicProfiles: + default: + created: + save: 'rent-%region%' + restore: '' + deleted: + save: '' + restore: 'rent-%region%' + rented: + save: '' + restore: '' + unrented: + save: '' + restore: 'rent-%region%' + ########## BUYING ########## ## The tag you have to write on the sign for renting a region buySign: '[buy]' @@ -61,4 +86,26 @@ flagsForSale: ## All region flags can be used + members, owners, priority and parent. flagsSold: members: +%player% - greeting: '%region% is bought by %player%' \ No newline at end of file + greeting: '%region% is bought by %player%' + +## Enable or disable saving and restoring for buys that don't have their individual option set +useBuyRestore: false +## For the following events you can specify if you want to restore or save the region to a schematic +## After 'save:' or 'restore:' you enter the name of the file, %region% will be replaced by the region name (.schematic will be added automatically) +## If your regions are all the same size you could use just 1 file as the restore file, just enter a name without %region% +## Be carefull with these options, it could crash your server or destroy (parts of) your world if used wrong! +## ('bought' and 'sold' are from the players perspective) +buySchematicProfiles: + default: + created: + save: 'buy-%region%' + restore: '' + deleted: + save: '' + restore: 'buy-%region%' + bought: + save: '' + restore: '' + sold: + save: '' + restore: 'buy-%region%' \ No newline at end of file diff --git a/AreaShop/lang/EN.yml b/AreaShop/lang/EN.yml index b300727..c3b818d 100644 --- a/AreaShop/lang/EN.yml +++ b/AreaShop/lang/EN.yml @@ -19,7 +19,7 @@ rent-maximum: "You can't rent more than %0% region(s)" rent-payError: "Something went wrong with paying, try again later" rent-rented: "You rented %0% until %1%" rent-extended: "You extended your rent of %0% until %1%" -rent-extend: "You can extend your rent by rightclicking the sign again or using /rs rent" +rent-extend: "You can extend your rent by rightclicking the sign again or using /as rent" rent-lowMoneyExtend: "You don't have enough money to extend the rent (you have %0% and you need %1%)" rent-lowMoneyRent: "You don't have enough money to rent this region (you have %0% and you need %1%)" rent-someoneElse: "Someone else already rented this region" @@ -51,24 +51,18 @@ sell-soldYours: "Your region has been sold" sell-noPermission: "You don't have permission to sell a region" sell-noPermissionOther: "You don't have permission to sell another region" -rentsigns-updated: "All signs for renting have been updated" -rentsigns-notUpdated: "Not all signs have been updated, maybe reload fixes it" -rentsgins-noPermission: "You don't have permission to update all rentsigns" +rents-updated: "All signs and regions for renting have been updated" +rents-notUpdated: "Not all signs have been updated, maybe reload fixes it" +rents-noPermission: "You don't have permission to update all rent signs and regions" -buysigns-updated: "All signs for selling have been updated" -buysigns-notUpdated: "Not all signs have been updated, maybe reload fixes it" -buysigns-noPermission: "You don't have permission to update all buysigns" - -rentregions-updated: "All renting regions have been updated" -rentregions-noPermission: "You don't have permission to update all renting regions" - -buyregions-updated: "All buying regions have been updated" -buyregions-noPermission: "You don't have permission to update all buying regions" +buys-updated: "All signs and regions for selling have been updated" +buys-notUpdated: "Not all signs have been updated, maybe reload fixes it" +buys-noPermission: "You don't have permission to update all buy signs and regions" reload-reloaded: "The config has been reloaded successfully" reload-noPermission: "You don't have permission to reload the config" -info-help: "/rs info " +info-help: "/as info " info-all-rents: "Regions registered for renting: %0%" info-all-noRents: "There are no regions registered for renting" info-all-buys: "Regions registered for buying: %0%" @@ -81,12 +75,12 @@ info-sold: "Sold regions: %0%" info-noSold: "No regions are sold" info-forsale: "Regions for sale: %0%" info-noForsale: "All regions are sold" -info-playerHelp: "/rs info player " +info-playerHelp: "/as info player " info-playerRents: "Regions rented by %0%: %1%" info-playerNoRents: "%0% has not rented a region" info-playerBuys: "Regions bought by %0%: %1%" info-playerNoBuys: "%0% has not bought a region" -info-regionHelp: "/rs info region " +info-regionHelp: "/as info region " info-regionNoRenting: "%0% is not registered for renting" info-regionRenting: "&6Renting details for %0%" info-regionRentedBy: "Rented by: %0% until %1%" @@ -98,6 +92,8 @@ info-regionBoughtBy: "Bought by: %0%" info-regionSign: "Sign position: world=%0%, X=%1%, Y=%2%, Z=%3%" info-regionPriceDuration: "Price: %0% for each %1%" info-regionPrice: "Price: %0%" +info-regionRestore: "Restoring enabled: %0%" +info-regionRestoreProfile: "Restoring profile: %0%" help-header: "Help page, commands that you can execute" help-alias: "Command aliases: /areashop, /as" @@ -109,8 +105,32 @@ help-unrent: "&6/as unrent &7-&r Unrent a region" help-unrentOwn: "&6/as unrent &7-&r Unrent your own region" help-sell: "&6/as sell &7-&r Sell a region" help-sellOwn: "&6/as sell &7-&r Sell your own region" -help-updaterentsigns: "&6/as updaterentsigns &7-&r Update all rent signs" -help-updatebuysigns: "&6/as updatebuysigns &7-&r Update all buy signs" -help-updaterentregions: "&6/as updaterentregions &7-&r Update all rent regions" -help-updatebuyregions: "&6/as updatebuyregions &7-&r Update all buy regions" -help-reload: "&6/as reload &7-&r Reload the config and languages" \ No newline at end of file +help-updaterents: "&6/as updaterents &7-&r Update all rent signs and regions" +help-updatebuys: "&6/as updatebuys &7-&r Update all buy signs and regions" +help-reload: "&6/as reload &7-&r Reload the config and languages" +help-rentrestore: "&6/as rentrestore &7-&r Set the profile for restoring and on/off " +help-buyrestore: "&6/as buyrestore &7-&r Set the profile for restoring and on/off" + +rentrestore-help: "/as rentrestore [profile]" +rentrestore-noPermission: "You don't have permission to change the restore settings of a rent" +rentrestore-notRegistered: "%0% is not registered as a rent" +rentrestore-invalidSetting: "'%0%' is not a valid state, should be true, false or general" +rentrestore-success: "Succesfully set the restore setting of %0% to '%1%'" +rentrestore-successProfile: "Succesfully set the restore setting of %0% to '%1%' and the profile to '%2%'" + +buyrestore-help: "/as buyrestore [profile]" +buyrestore-noPermission: "You don't have permission to change the restore settings of a buy" +buyrestore-notRegistered: "%0% is not registered as a buy" +buyrestore-invalidSetting: "'%0%' is not a valid state, should be true, false or general" +buyrestore-success: "Succesfully set the restore setting of %0% to '%1%'" +buyrestore-successProfile: "Succesfully set the restore setting of %0% to '%1%' and the profile to '%2%'" + + + + + + + + + + diff --git a/AreaShop/lang/NL.yml b/AreaShop/lang/NL.yml index 43ffc9a..1f2b18a 100644 --- a/AreaShop/lang/NL.yml +++ b/AreaShop/lang/NL.yml @@ -10,7 +10,7 @@ total-maximum: "Je kunt niet meer dan %0% gebied(en) in totaal huren en kopen" cmd-onlyByPlayer: "Dit commando kan alleen door een speler uitgevoert worden" -cmd-notValid: "Dat commando is niet geldig , gebruik '/rs help' voor informatie" +cmd-notValid: "Dat commando is niet geldig , gebruik '/as help' voor informatie" rent-regionNotRentable: "Dat gebied is niet beschikbaar om te huren" rent-help: "/as rent " @@ -19,7 +19,7 @@ rent-maximum: "Je kunt niet meer dan %0% gebied(en) huren" rent-payError: "Er is iets mis gegaan met betalen, probeer het later opnieuw" rent-rented: "Je hebt %0% tot %1% gehuurd" rent-extended: "Je hebt je huur van %0% verlengt tot %1%" -rent-extend: "Je kunt je huur verlengen door opnieuw op het bordje te klikken of gebruik te maken van /rs rent" +rent-extend: "Je kunt je huur verlengen door opnieuw op het bordje te klikken of gebruik te maken van /as rent" rent-lowMoneyExtend: "Je hebt niet genoeg geld om de huur te verlengen (je hebt %0% van de %1%)" rent-lowMoneyRent: "Je hebt niet genoeg geld om het gebied te huren (je hebt %0% van de %1%)" rent-someoneElse: "Iemand anders heeft dit gebied al gehuurd" @@ -51,19 +51,13 @@ sell-soldYours: "Je gebied is verkocht" sell-noPermission: "Je hebt geen toestemming om een gebied te verkopen" sell-noPermissionOther: "Je hebt geen toestemming om een gebied van iemand anders te verkopen" -rentsigns-updated: "Alle bordjes voor de verhuur zijn geupdate" -rentsigns-notUpdated: "Niet alle bordjes zijn geupdate, een reload zou het op kunnen lossen" -rentsgins-noPermission: "Je hebt geen toestemming om alle verhuur bordjes te updaten" +rents-updated: "Alle borden en gebieden voor de verhuur zijn geupdate" +rents-notUpdated: "Niet alle borden zijn geupdate, een reload zou het op kunnen lossen" +rents-noPermission: "Je hebt geen toestemming om alle verhuur borden en gebieden te updaten" -buysigns-updated: "All bordjes voor de verkoop zijn geupdate" -buysigns-notUpdated: "Niet alle bordjes zijn geupdate, een reload zou het op kunnen lossen" -buysigns-noPermission: "Je hebt geen toestemming om alle verkoop bordjes te updaten" - -rentregions-updated: "Alle verhuur gebieden zijn geupdate" -rentregions-noPermission: "Je hebt geen toestemming om de verhuur gebieden te updaten" - -buyregions-updated: "Alle verkoop gebieden zijn geupdate" -buyregions-noPermission: "Je hebt geen toestemming om alle verkoop gebieden te updaten" +buys-updated: "Alle borden en gebieden voor de verkoop zijn geupdate" +buys-notUpdated: "Niet alle borden zijn geupdate, een reload zou het op kunnen lossen" +buys-noPermission: "Je hebt geen toestemming om alle verkoop borden en gebieden te updaten" reload-reloaded: "De config is succesvol opnieuw ingeladen" reload-noPermission: "Je hebt geen toestemming om de config opnieuw in te laden" @@ -81,12 +75,12 @@ info-sold: "Verkochte gebieden: %0%" info-noSold: "Alle gebieden zijn verkocht" info-forsale: "Gebieden te koop: %0%" info-noForsale: "Alle gebieden zijn verkocht" -info-playerHelp: "/rs info player " +info-playerHelp: "/as info player " info-playerRents: "Gebieden gehuurd door %0%: %1%" info-playerNoRents: "%0% heeft geen gebied gehuurd" info-playerBuys: "Gebieden gekocht door %0%: %1%" info-playerNoBuys: "%0% heeft geen gebieden gekocht" -info-regionHelp: "/rs info region " +info-regionHelp: "/as info region " info-regionNoRenting: "%0% is niet geregistreerd voor verhuur" info-regionRenting: "&6Huur informatie voor %0%" info-regionRentedBy: "Gehuurd door: %0% tot %1%" @@ -98,6 +92,8 @@ info-regionBoughtBy: "Gekocht door: %0%" info-regionSign: "Plek van het bordje: wereld=%0%, X=%1%, Y=%2%, Z=%3%" info-regionPriceDuration: "Prijs: %0% voor elke %1%" info-regionPrice: "Prijs: %0%" +info-regionRestore: "Herstellen ingeschakeld: %0%" +info-regionRestoreProfile: "Herstel profiel: %0%" help-header: "Help pagina, commando's die jij kunt uitvoeren" help-alias: "Commando aliassen: /areashop, /as" @@ -109,8 +105,22 @@ help-unrent: "&6/as unrent &7-&r Stop de huur van een gebied" help-unrentOwn: "&6/as unrent &7-&r Stop de huur van een eigen gebied" help-sell: "&6/as sell &7-&r Verkoop een gebied" help-sellOwn: "&6/as sell &7-&r Verkoop een eigen gebied" -help-updaterentsigns: "&6/as updaterentsigns &7-&r Update alle huur borden" -help-updatebuysigns: "&6/as updatebuysigns &7-&r Update alle koop borden" -help-updaterentregions: "&6/as updaterentregions &7-&r Update alle huur gebieden" -help-updatebuyregions: "&6/as updatebuyregions &7-&r Update alle koop gebieden" -help-reload: "&6/as reload &7-&r Herlaad de config en de taalbestanden" \ No newline at end of file +help-updaterents: "&6/as updaterents &7-&r Update alle huur borden en gebieden" +help-updatebuys: "&6/as updatebuys &7-&r Update alle koop borden en gebieden" +help-reload: "&6/as reload &7-&r Herlaad de config en de taalbestanden" +help-rentrestore: "&6/as rentrestore &7-&r Laat dit huur gebied herstellen of niet" +help-buyrestore: "&6/as buyrestore &7-&r Laat dit koop gebied herstellen of niet" + +rentrestore-help: "/as rentrestore " +rentrestore-noPermission: "Je hebt geen toestemming om herstel instellingen te veranderen bij een huur gebied" +rentrestore-notRegistered: "%0% is niet geregistreerd als een huur gebied" +rentrestore-invalidSetting: "'%0%' is geen goede optie, gebruik true, false of general" +rentrestore-success: "Succesvol de herstel optie gezet van %0% naar '%1%'" +rentrestore-successProfile: "Succesvol de herstel optie gezet van %0% naar '%1%' en het profiel naar '%2%'" + +buyrestore-help: "/as buyrestore " +buyrestore-noPermission: "Je hebt geen toestemming om herstel instellingen te veranderen bij geen koop gebied" +buyrestore-notRegistered: "%0% is niet geregistreerd als een koop gebied" +buyrestore-invalidSetting: "'%0%' is geen goede optie, gebruik true, false of general +buyrestore-success: "Succesvol de herstel optie gezet van %0% naar '%1%'" +buyrestore-successProfile: "Succesvol de herstel optie gezet van %0% naar '%1%' en het profiel naar '%2%'" \ No newline at end of file diff --git a/AreaShop/plugin.yml b/AreaShop/plugin.yml index b7bb4e6..002a961 100644 --- a/AreaShop/plugin.yml +++ b/AreaShop/plugin.yml @@ -1,7 +1,7 @@ name: AreaShop main: nl.evolutioncoding.AreaShop.AreaShop -version: 1.0 -depend: [Vault, WorldGuard] +version: 1.1 +depend: [Vault, WorldGuard, WorldEdit] commands: AreaShop: description: For all commands use /as help @@ -22,11 +22,11 @@ permissions: areashop.buy: true areashop.unrent: true areashop.info: true - areashop.updaterentsigns: true - areashop.updatebuysigns: true - areashop.updaterentregions: true - areashop.updatebuyregions: true + areashop.updaterents: true + areashop.updatebuys: true areashop.reload: true + areashop.rentrestore: true + areashop.buyrestore: true areashop.help: description: Allows you to see the help pages default: true @@ -63,18 +63,18 @@ permissions: areashop.info: description: Allows you check the status of regions and players default: true - areashop.updaterentsigns: - description: Allows you to update all rent signs + areashop.updaterents: + description: Allows you to update all rent signs and regions default: op - areashop.updatebuysigns: - description: Allows you to update all buy signs - default: op - areashop.updaterentregions: - description: Allows you to update all rent regions - default: op - areashop.updatebuyregions: - description: Allows you to update all buy regions + areashop.updatebuys: + description: Allows you to update all buy signs and regions default: op areashop.reload: description: Allows you to reload the config + default: op + areashop.rentrestore: + description: Allows you to change the restore settings of a rent + default: op + areashop.buyrestore: + description: Allows you to change the restore settings of a buy default: op \ No newline at end of file diff --git a/AreaShop/src/nl/evolutioncoding/AreaShop/AreaShop.java b/AreaShop/src/nl/evolutioncoding/AreaShop/AreaShop.java index a2cf487..ac8e8a6 100644 --- a/AreaShop/src/nl/evolutioncoding/AreaShop/AreaShop.java +++ b/AreaShop/src/nl/evolutioncoding/AreaShop/AreaShop.java @@ -14,6 +14,7 @@ import org.bukkit.plugin.Plugin; import org.bukkit.plugin.RegisteredServiceProvider; import org.bukkit.plugin.java.JavaPlugin; +import com.sk89q.worldedit.bukkit.WorldEditPlugin; import com.sk89q.worldguard.bukkit.WorldGuardPlugin; /** @@ -23,15 +24,18 @@ import com.sk89q.worldguard.bukkit.WorldGuardPlugin; public final class AreaShop extends JavaPlugin { /* General variables */ private WorldGuardPlugin worldGuard = null; + private WorldEditPlugin worldEdit = null; private Economy economy = null; - private ShopManager shopManager = null; + private FileManager fileManager = null; private LanguageManager languageManager = null; private boolean configOk = false; private boolean debug = false; private String chatprefix = null; - /* Folder where the language files will be stored */ + /* Folders where the files will be stored */ public final String languageFolder = "lang"; + public final String schematicFolder = "schem"; + public final String schematicExtension = ".schematic"; /* Euro tag for in the config */ public final String currencyEuro = "%euro%"; @@ -46,6 +50,8 @@ public final class AreaShop extends JavaPlugin { public final String keyPlayer = "player"; public final String keyRentedUntil = "rented"; public final String keyName = "name"; + public final String keyRestore = "restore"; + public final String keySchemProfile = "profile"; /* Keys for replacing parts of flags */ public final String tagPlayerName = "%player%"; @@ -54,6 +60,22 @@ public final class AreaShop extends JavaPlugin { public final String tagDuration = "%duration%"; public final String tagRentedUntil = "%until%"; + /* Enum for type of event */ + public enum RegionEventType { + CREATED("Created"), + DELETED("Deleted"), + BOUGHT("Bought"), + SOLD("Sold"); + + private final String value; + private RegionEventType(String value) { + this.value = value; + } + public String getValue() { + return value; + } + } + /** @@ -76,6 +98,15 @@ public final class AreaShop extends JavaPlugin { } else { worldGuard = (WorldGuardPlugin)plugin; } + + /* Check if WorldEdit is present */ + plugin = getServer().getPluginManager().getPlugin("WorldEdit"); + if (plugin == null || !(plugin instanceof WorldEditPlugin)) { + this.getLogger().info("Error: WorldEdit plugin is not present or has not loaded correctly"); + error = true; + } else { + worldEdit = (WorldEditPlugin)plugin; + } /* Check if Vault is present */ RegisteredServiceProvider economyProvider = getServer().getServicesManager().getRegistration(net.milkbowl.vault.economy.Economy.class); @@ -93,10 +124,10 @@ public final class AreaShop extends JavaPlugin { chatprefix = this.config().getString("chatPrefix"); /* Load all data from files */ - shopManager = new ShopManager(this); - error = error & !shopManager.loadRents(); - shopManager.checkRents(); - error = error & !shopManager.loadBuys(); + fileManager = new FileManager(this); + error = error & !fileManager.loadRents(); + fileManager.checkRents(); + error = error & !fileManager.loadBuys(); if(error) { this.getLogger().info("The plugin has not started, fix the errors listed above"); @@ -111,7 +142,7 @@ public final class AreaShop extends JavaPlugin { new RentCheck(this).runTaskTimer(this, checkDelay, checkDelay); /* Bind commands for this plugin */ - getCommand("AreaShop").setExecutor(new ShopCommands(this)); + getCommand("AreaShop").setExecutor(new CommandManager(this)); } } @@ -123,7 +154,7 @@ public final class AreaShop extends JavaPlugin { /* set variables to null to prevent memory leaks */ worldGuard = null; economy = null; - shopManager = null; + fileManager = null; languageManager = null; configOk = false; debug = false; @@ -137,6 +168,14 @@ public final class AreaShop extends JavaPlugin { return worldGuard; } + /** + * Function to get the WorldEdit plugin + * @return WorldEditPlugin + */ + public WorldEditPlugin getWorldEdit() { + return worldEdit; + } + /** * Function to get the WorldGuard plugin * @return WorldGuardPlugin @@ -154,11 +193,11 @@ public final class AreaShop extends JavaPlugin { } /** - * Method to get the ShopManager - * @return The shopManager + * Method to get the FileManager + * @return The fileManager */ - public ShopManager getShopManager() { - return shopManager; + public FileManager getShopManager() { + return fileManager; } /** @@ -267,17 +306,17 @@ public final class AreaShop extends JavaPlugin { } else if(target.hasPermission("areashop.sellown")) { messages.add(languageManager.getLang("help-sellOwn")); } - if(target.hasPermission("areashop.updaterentsigns")) { - messages.add(languageManager.getLang("help-updaterentsigns")); + if(target.hasPermission("areashop.updaterents")) { + messages.add(languageManager.getLang("help-updaterents")); } - if(target.hasPermission("areashop.updatebuysigns")) { - messages.add(languageManager.getLang("help-updatebuysigns")); + if(target.hasPermission("areashop.updatebuys")) { + messages.add(languageManager.getLang("help-updatebuys")); } - if(target.hasPermission("areashop.updaterentregions")) { - messages.add(languageManager.getLang("help-updaterentregions")); + if(target.hasPermission("areashop.setrentrestore")) { + messages.add(languageManager.getLang("help-rentrestore")); } - if(target.hasPermission("areashop.updatebuyregions")) { - messages.add(languageManager.getLang("help-updatebuyregions")); + if(target.hasPermission("areashop.setbuyrestore")) { + messages.add(languageManager.getLang("help-buyrestore")); } if(target.hasPermission("areashop.reload")) { messages.add(languageManager.getLang("help-reload")); @@ -438,7 +477,7 @@ public final class AreaShop extends JavaPlugin { configOk = this.checkConfig(); chatprefix = this.config().getString("chatPrefix"); languageManager = new LanguageManager(this); - shopManager.checkRents(); + fileManager.checkRents(); } } diff --git a/AreaShop/src/nl/evolutioncoding/AreaShop/ShopCommands.java b/AreaShop/src/nl/evolutioncoding/AreaShop/CommandManager.java similarity index 62% rename from AreaShop/src/nl/evolutioncoding/AreaShop/ShopCommands.java rename to AreaShop/src/nl/evolutioncoding/AreaShop/CommandManager.java index 3cd842c..458bd05 100644 --- a/AreaShop/src/nl/evolutioncoding/AreaShop/ShopCommands.java +++ b/AreaShop/src/nl/evolutioncoding/AreaShop/CommandManager.java @@ -1,406 +1,471 @@ -package nl.evolutioncoding.AreaShop; - -import java.text.SimpleDateFormat; -import java.util.HashMap; -import java.util.Iterator; - -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -public class ShopCommands implements CommandExecutor { - AreaShop plugin; - - /** - * Constructor - * @param plugin The AreaShop plugin - */ - public ShopCommands(AreaShop plugin) { - this.plugin = plugin; - } - - @Override - public boolean onCommand(CommandSender sender, Command command, String alias, String[] args) { - if(command.getName().equalsIgnoreCase("AreaShop")) { - ShopManager shopManager = plugin.getShopManager(); - - /* Commands with 1 argument or more */ - if(args.length > 0 && args[0] != null) { - /* Help command */ - if(args[0].equalsIgnoreCase("help")) { - plugin.showHelp(sender); - } - - /* Renting command */ - else if(args[0].equalsIgnoreCase("rent")) { - if (!(sender instanceof Player)) { - plugin.message(sender, "onlyByPlayer"); - return true; - } - Player player = (Player)sender; - if(args.length > 1 && args[1] != null) { - shopManager.rent(player, args[1]); - } else { - plugin.message(sender, "rent-help"); - } - } - - /* Buying command */ - else if(args[0].equalsIgnoreCase("buy")) { - if (!(sender instanceof Player)) { - plugin.message(sender, "onlyByPlayer"); - return true; - } - Player player = (Player)sender; - if(args.length > 1 && args[1] != null) { - shopManager.buy(player, args[1]); - } else { - plugin.message(player, "buy-help"); - } - } - - /* Info command */ - else if(args[0].equalsIgnoreCase("info")) { - if(args.length > 1 && args[1] != null) { - if(args[1].equalsIgnoreCase("all")) { - String message = ""; - /* Message for rents */ - Iterator it = shopManager.getRents().keySet().iterator(); - if(it.hasNext()) { - message = shopManager.getRent(it.next()).get(plugin.keyName); - while(it.hasNext()) { - message += ", " + shopManager.getRent(it.next()).get(plugin.keyName); - } - } - if(message.equals("")) { - plugin.message(sender, "info-all-noRents"); - } else { - plugin.message(sender, "info-all-rents", message); - } - - /* Message for buys */ - it = shopManager.getBuys().keySet().iterator(); - if(it.hasNext()) { - message = shopManager.getBuy(it.next()).get(plugin.keyName); - while(it.hasNext()) { - message += ", " + shopManager.getBuy(it.next()).get(plugin.keyName); - } - } - if(message.equals("")) { - plugin.message(sender, "info-all-noBuys"); - } else { - plugin.message(sender, "info-all-buys", message); - } - } - else if(args[1].equalsIgnoreCase("rented")) { - String message = ""; - Iterator it = shopManager.getRents().keySet().iterator(); - boolean first = true; - while(it.hasNext()) { - String next = shopManager.getRent(it.next()).get(plugin.keyName); - if(shopManager.getRent(next).get(plugin.keyPlayer) != null) { - if(!first) { - message += ", " + next; - } else { - first = false; - message = next; - } - } - } - if(message.equals("")) { - plugin.message(sender, "info-noRented"); - } else { - plugin.message(sender, "info-rented", message); - } - } else if(args[1].equalsIgnoreCase("forrent")) { - String message = ""; - Iterator it = shopManager.getRents().keySet().iterator(); - boolean first = true; - while(it.hasNext()) { - String next = shopManager.getRent(it.next()).get(plugin.keyName); - if(shopManager.getRent(next).get(plugin.keyPlayer) == null) { - if(!first) { - message += ", " + next; - } else { - first = false; - message = next; - } - } - } - if(message.equals("")) { - plugin.message(sender, "info-noUnrented"); - } else { - plugin.message(sender, "info-unrented", message); - } - } else if(args[1].equalsIgnoreCase("sold")) { - String message = ""; - Iterator it = shopManager.getBuys().keySet().iterator(); - boolean first = true; - while(it.hasNext()) { - String next = shopManager.getBuy(it.next()).get(plugin.keyName); - if(shopManager.getBuy(next).get(plugin.keyPlayer) != null) { - if(!first) { - message += ", "; - } else { - first = false; - } - message += next; - } - } - if(message.equals("")) { - plugin.message(sender, "info-noSold"); - } else { - plugin.message(sender, "info-sold", message); - } - } else if(args[1].equalsIgnoreCase("forsale")) { - String message = ""; - Iterator it = shopManager.getBuys().keySet().iterator(); - boolean first = true; - while(it.hasNext()) { - String next = shopManager.getBuy(it.next()).get(plugin.keyName); - if(shopManager.getBuy(next).get(plugin.keyPlayer) == null) { - if(!first) { - message += ", " + next; - } else { - first = false; - message = next; - } - } - } - if(message.equals("")) { - plugin.message(sender, "info-noForsale"); - } else { - plugin.message(sender, "info-forsale", message); - } - } else if(args[1].equalsIgnoreCase("player")) { - if(args.length > 2 && args[2] != null) { - String message = ""; - Iterator it = shopManager.getRents().keySet().iterator(); - boolean first = true; - while(it.hasNext()) { - String next = shopManager.getRent(it.next()).get(plugin.keyName); - if(shopManager.getRent(next).get(plugin.keyPlayer) != null && shopManager.getRent(next).get(plugin.keyPlayer).equalsIgnoreCase(args[2])) { - if(!first) { - message += ", " + next; - } else { - first = false; - message = next; - } - } - } - if(message.equals("")) { - plugin.message(sender, "info-playerNoRents", args[2]); - } else { - plugin.message(sender, "info-playerRents", args[2], message); - } - - message = ""; - it = shopManager.getBuys().keySet().iterator(); - first = true; - while(it.hasNext()) { - String next = shopManager.getBuy(it.next()).get(plugin.keyName); - if(shopManager.getBuy(next).get(plugin.keyPlayer) != null && shopManager.getBuy(next).get(plugin.keyPlayer).equalsIgnoreCase(args[2])) { - if(!first) { - message += ", "; - } else { - first = false; - } - message += next; - } - } - if(message.equals("")) { - plugin.message(sender, "info-playerNoBuys", args[2]); - } else { - plugin.message(sender, "info-playerBuys", args[2], message); - } - } else { - plugin.message(sender, "info-playerHelp"); - } - } else if(args[1].equalsIgnoreCase("region")) { - if(args.length > 2 && args[2] != null) { - - HashMap rent = shopManager.getRent(args[2]); - HashMap buy = shopManager.getBuy(args[2]); - - if(rent == null) { - plugin.message(sender, "info-regionRenting", args[2]); - plugin.message(sender, "info-regionNoRenting", args[2]); - } else { - plugin.message(sender, "info-regionRenting", rent.get(plugin.keyName)); - plugin.message(sender, "info-regionSign", rent.get(plugin.keyWorld), rent.get(plugin.keyX), rent.get(plugin.keyY), rent.get(plugin.keyZ)); - plugin.message(sender, "info-regionPriceDuration", plugin.getCurrencyCharacter() + rent.get(plugin.keyPrice), rent.get(plugin.keyDuration)); - if(rent.get(plugin.keyPlayer) == null) { - plugin.message(sender, "info-regionNotRented"); - } else { - SimpleDateFormat dateFull = new SimpleDateFormat("dd MMMMMMMMMMMMMMMMM yyyy HH:mm"); - plugin.message(sender, "info-regionRentedBy", rent.get(plugin.keyPlayer), dateFull.format(Long.parseLong(rent.get(plugin.keyRentedUntil)))); - } - } - - if(buy == null) { - plugin.message(sender, "info-regionBuying", args[2]); - plugin.message(sender, "info-regionNoBuying", args[2]); - } else { - plugin.message(sender, "info-regionBuying", buy.get(plugin.keyName)); - plugin.message(sender, "info-regionSign", buy.get(plugin.keyWorld), buy.get(plugin.keyX), buy.get(plugin.keyY), buy.get(plugin.keyZ)); - plugin.message(sender, "info-regionPrice", plugin.getCurrencyCharacter() + buy.get(plugin.keyPrice)); - if(buy.get(plugin.keyPlayer) == null) { - plugin.message(sender, "info-regionNotBought"); - } else { - plugin.message(sender, "info-regionBoughtBy", buy.get(plugin.keyPlayer)); - } - } - } else { - plugin.message(sender, "info-regionHelp"); - } - } else { - plugin.message(sender, "info-help"); - } - } else { - plugin.message(sender, "info-help"); - } - } - - /* Unrenting command */ - else if(args[0].equalsIgnoreCase("unrent")) { - if(args.length > 1 && args[1] != null) { - HashMap rent = shopManager.getRent(args[1]); - if(rent == null) { - plugin.message(sender, "unrent-notRegistered"); - } else { - if(rent.get(plugin.keyPlayer) == null) { - plugin.message(sender, "unrent-notRented"); - } else { - if(sender.hasPermission("areashop.unrent")) { - plugin.message(sender, "unrent-other", rent.get(plugin.keyPlayer)); - shopManager.unRent(args[1]); - } else { - if(sender.hasPermission("areashop.unrentown")) { - if(rent.get(plugin.keyPlayer).equals(sender.getName())) { - plugin.message(sender, "unrent-unrented"); - shopManager.unRent(args[1]); - } else { - plugin.message(sender, "unrent-noPermissionOther"); - } - } else { - plugin.message(sender, "unrent-noPermission"); - } - } - } - } - } else { - plugin.message(sender, "unrent-help"); - } - } - - /* Selling command */ - else if(args[0].equalsIgnoreCase("sell")) { - if(args.length > 1 && args[1] != null) { - HashMap buy = shopManager.getBuy(args[1]); - if(buy == null) { - plugin.message(sender, "sell-notRegistered"); - } else { - if(buy.get(plugin.keyPlayer) == null) { - plugin.message(sender, "sell-notBought"); - } else { - if(sender.hasPermission("areashop.sell")) { - plugin.message(sender, "sell-sold", buy.get(plugin.keyPlayer)); - shopManager.unBuy(args[1]); - } else { - if(sender.hasPermission("areashop.sellown")) { - if(buy.get(plugin.keyPlayer).equals(sender.getName())) { - plugin.message(sender, "sell-soldYours"); - shopManager.unBuy(args[1]); - } else { - plugin.message(sender, "sell-noPermissionOther"); - } - } else { - plugin.message(sender, "sell-noPermission"); - } - } - } - } - } else { - plugin.message(sender, "sell-help"); - } - } - - /* UpdateRentSigns command */ - else if(args[0].equalsIgnoreCase("updaterentsigns")) { - - if(sender.hasPermission("areashop.updaterentsigns")) { - boolean result = plugin.getShopManager().updateRentSigns(); - if(result) { - plugin.message(sender, "rentsigns-updated"); - } else { - plugin.message(sender, "rentsigns-notUpdated"); - } - - } else { - plugin.message(sender, "rentsigns-noPermission"); - } - } - - /* UpdateBuySigns command */ - else if(args[0].equalsIgnoreCase("updatebuysigns")) { - - if(sender.hasPermission("areashop.updatebuysigns")) { - boolean result = plugin.getShopManager().updateBuySigns(); - if(result) { - plugin.message(sender, "buysigns-updated"); - } else { - plugin.message(sender, "buysigns-notUpdated"); - } - } else { - plugin.message(sender, "buysigns-noPermission"); - } - } - - /* updaterentregions command */ - else if(args[0].equalsIgnoreCase("updaterentregions")) { - - if(sender.hasPermission("areashop.updaterentregions")) { - plugin.getShopManager().updateRentRegions(); - plugin.message(sender, "rentregions-updated"); - } else { - plugin.message(sender, "rentregions-noPermission"); - } - } - - /* updatebuyregions command */ - else if(args[0].equalsIgnoreCase("updatebuyregions")) { - - if(sender.hasPermission("areashop.updatebuyregions")) { - plugin.getShopManager().updateBuyRegions(); - plugin.message(sender, "buyregions-updated"); - } else { - plugin.message(sender, "buyregions-noPermission"); - } - } - - /* reload command */ - else if(args[0].equalsIgnoreCase("reload")) { - - if(sender.hasPermission("areashop.reload")) { - plugin.reload(); - plugin.message(sender, "reload-reloaded"); - } else { - plugin.message(sender, "reload-noPermission"); - } - } - - /* Not a valid command */ - else { - plugin.message(sender, "cmd-notValid"); - } - - } else { - plugin.showHelp(sender); - } - return true; - } - return false; - } - -} +package nl.evolutioncoding.AreaShop; + +import java.text.SimpleDateFormat; +import java.util.HashMap; +import java.util.Iterator; + +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +public class CommandManager implements CommandExecutor { + AreaShop plugin; + + /** + * Constructor + * @param plugin The AreaShop plugin + */ + public CommandManager(AreaShop plugin) { + this.plugin = plugin; + } + + @Override + public boolean onCommand(CommandSender sender, Command command, String alias, String[] args) { + if(command.getName().equalsIgnoreCase("AreaShop")) { + FileManager fileManager = plugin.getShopManager(); + + /* Commands with 1 argument or more */ + if(args.length > 0 && args[0] != null) { + /* Help command */ + if(args[0].equalsIgnoreCase("help")) { + plugin.showHelp(sender); + } + + /* Renting command */ + else if(args[0].equalsIgnoreCase("rent")) { + if (!(sender instanceof Player)) { + plugin.message(sender, "onlyByPlayer"); + return true; + } + Player player = (Player)sender; + if(args.length > 1 && args[1] != null) { + fileManager.rent(player, args[1]); + } else { + plugin.message(sender, "rent-help"); + } + } + + /* Buying command */ + else if(args[0].equalsIgnoreCase("buy")) { + if (!(sender instanceof Player)) { + plugin.message(sender, "onlyByPlayer"); + return true; + } + Player player = (Player)sender; + if(args.length > 1 && args[1] != null) { + fileManager.buy(player, args[1]); + } else { + plugin.message(player, "buy-help"); + } + } + + /* Info command */ + else if(args[0].equalsIgnoreCase("info")) { + if(args.length > 1 && args[1] != null) { + if(args[1].equalsIgnoreCase("all")) { + String message = ""; + /* Message for rents */ + Iterator it = fileManager.getRents().keySet().iterator(); + if(it.hasNext()) { + message = fileManager.getRent(it.next()).get(plugin.keyName); + while(it.hasNext()) { + message += ", " + fileManager.getRent(it.next()).get(plugin.keyName); + } + } + if(message.equals("")) { + plugin.message(sender, "info-all-noRents"); + } else { + plugin.message(sender, "info-all-rents", message); + } + + /* Message for buys */ + it = fileManager.getBuys().keySet().iterator(); + if(it.hasNext()) { + message = fileManager.getBuy(it.next()).get(plugin.keyName); + while(it.hasNext()) { + message += ", " + fileManager.getBuy(it.next()).get(plugin.keyName); + } + } + if(message.equals("")) { + plugin.message(sender, "info-all-noBuys"); + } else { + plugin.message(sender, "info-all-buys", message); + } + } + else if(args[1].equalsIgnoreCase("rented")) { + String message = ""; + Iterator it = fileManager.getRents().keySet().iterator(); + boolean first = true; + while(it.hasNext()) { + String next = fileManager.getRent(it.next()).get(plugin.keyName); + if(fileManager.getRent(next).get(plugin.keyPlayer) != null) { + if(!first) { + message += ", " + next; + } else { + first = false; + message = next; + } + } + } + if(message.equals("")) { + plugin.message(sender, "info-noRented"); + } else { + plugin.message(sender, "info-rented", message); + } + } else if(args[1].equalsIgnoreCase("forrent")) { + String message = ""; + Iterator it = fileManager.getRents().keySet().iterator(); + boolean first = true; + while(it.hasNext()) { + String next = fileManager.getRent(it.next()).get(plugin.keyName); + if(fileManager.getRent(next).get(plugin.keyPlayer) == null) { + if(!first) { + message += ", " + next; + } else { + first = false; + message = next; + } + } + } + if(message.equals("")) { + plugin.message(sender, "info-noUnrented"); + } else { + plugin.message(sender, "info-unrented", message); + } + } else if(args[1].equalsIgnoreCase("sold")) { + String message = ""; + Iterator it = fileManager.getBuys().keySet().iterator(); + boolean first = true; + while(it.hasNext()) { + String next = fileManager.getBuy(it.next()).get(plugin.keyName); + if(fileManager.getBuy(next).get(plugin.keyPlayer) != null) { + if(!first) { + message += ", "; + } else { + first = false; + } + message += next; + } + } + if(message.equals("")) { + plugin.message(sender, "info-noSold"); + } else { + plugin.message(sender, "info-sold", message); + } + } else if(args[1].equalsIgnoreCase("forsale")) { + String message = ""; + Iterator it = fileManager.getBuys().keySet().iterator(); + boolean first = true; + while(it.hasNext()) { + String next = fileManager.getBuy(it.next()).get(plugin.keyName); + if(fileManager.getBuy(next).get(plugin.keyPlayer) == null) { + if(!first) { + message += ", " + next; + } else { + first = false; + message = next; + } + } + } + if(message.equals("")) { + plugin.message(sender, "info-noForsale"); + } else { + plugin.message(sender, "info-forsale", message); + } + } else if(args[1].equalsIgnoreCase("player")) { + if(args.length > 2 && args[2] != null) { + String message = ""; + Iterator it = fileManager.getRents().keySet().iterator(); + boolean first = true; + while(it.hasNext()) { + String next = fileManager.getRent(it.next()).get(plugin.keyName); + if(fileManager.getRent(next).get(plugin.keyPlayer) != null && fileManager.getRent(next).get(plugin.keyPlayer).equalsIgnoreCase(args[2])) { + if(!first) { + message += ", " + next; + } else { + first = false; + message = next; + } + } + } + if(message.equals("")) { + plugin.message(sender, "info-playerNoRents", args[2]); + } else { + plugin.message(sender, "info-playerRents", args[2], message); + } + + message = ""; + it = fileManager.getBuys().keySet().iterator(); + first = true; + while(it.hasNext()) { + String next = fileManager.getBuy(it.next()).get(plugin.keyName); + if(fileManager.getBuy(next).get(plugin.keyPlayer) != null && fileManager.getBuy(next).get(plugin.keyPlayer).equalsIgnoreCase(args[2])) { + if(!first) { + message += ", "; + } else { + first = false; + } + message += next; + } + } + if(message.equals("")) { + plugin.message(sender, "info-playerNoBuys", args[2]); + } else { + plugin.message(sender, "info-playerBuys", args[2], message); + } + } else { + plugin.message(sender, "info-playerHelp"); + } + } else if(args[1].equalsIgnoreCase("region")) { + if(args.length > 2 && args[2] != null) { + + HashMap rent = fileManager.getRent(args[2]); + HashMap buy = fileManager.getBuy(args[2]); + + if(rent == null) { + plugin.message(sender, "info-regionRenting", args[2]); + plugin.message(sender, "info-regionNoRenting", args[2]); + } else { + plugin.message(sender, "info-regionRenting", rent.get(plugin.keyName)); + plugin.message(sender, "info-regionSign", rent.get(plugin.keyWorld), rent.get(plugin.keyX), rent.get(plugin.keyY), rent.get(plugin.keyZ)); + plugin.message(sender, "info-regionPriceDuration", plugin.getCurrencyCharacter() + rent.get(plugin.keyPrice), rent.get(plugin.keyDuration)); + if(rent.get(plugin.keyPlayer) == null) { + plugin.message(sender, "info-regionNotRented"); + } else { + SimpleDateFormat dateFull = new SimpleDateFormat("dd MMMMMMMMMMMMMMMMM yyyy HH:mm"); + plugin.message(sender, "info-regionRentedBy", rent.get(plugin.keyPlayer), dateFull.format(Long.parseLong(rent.get(plugin.keyRentedUntil)))); + } + if(sender.hasPermission("areashop.rentrestore")) { + plugin.message(sender, "info-regionRestore", rent.get(plugin.keyRestore)); + plugin.message(sender, "info-regionRestoreProfile", rent.get(plugin.keySchemProfile)); + } + } + + if(buy == null) { + plugin.message(sender, "info-regionBuying", args[2]); + plugin.message(sender, "info-regionNoBuying", args[2]); + } else { + plugin.message(sender, "info-regionBuying", buy.get(plugin.keyName)); + plugin.message(sender, "info-regionSign", buy.get(plugin.keyWorld), buy.get(plugin.keyX), buy.get(plugin.keyY), buy.get(plugin.keyZ)); + plugin.message(sender, "info-regionPrice", plugin.getCurrencyCharacter() + buy.get(plugin.keyPrice)); + if(buy.get(plugin.keyPlayer) == null) { + plugin.message(sender, "info-regionNotBought"); + } else { + plugin.message(sender, "info-regionBoughtBy", buy.get(plugin.keyPlayer)); + } + if(sender.hasPermission("areashop.buyrestore")) { + plugin.message(sender, "info-regionRestore", buy.get(plugin.keyRestore)); + plugin.message(sender, "info-regionRestoreProfile", buy.get(plugin.keySchemProfile)); + } + } + } else { + plugin.message(sender, "info-regionHelp"); + } + } else { + plugin.message(sender, "info-help"); + } + } else { + plugin.message(sender, "info-help"); + } + } + + /* Unrenting command */ + else if(args[0].equalsIgnoreCase("unrent")) { + if(args.length > 1 && args[1] != null) { + HashMap rent = fileManager.getRent(args[1]); + if(rent == null) { + plugin.message(sender, "unrent-notRegistered"); + } else { + if(rent.get(plugin.keyPlayer) == null) { + plugin.message(sender, "unrent-notRented"); + } else { + if(sender.hasPermission("areashop.unrent")) { + plugin.message(sender, "unrent-other", rent.get(plugin.keyPlayer)); + fileManager.unRent(args[1]); + } else { + if(sender.hasPermission("areashop.unrentown")) { + if(rent.get(plugin.keyPlayer).equals(sender.getName())) { + plugin.message(sender, "unrent-unrented"); + fileManager.unRent(args[1]); + } else { + plugin.message(sender, "unrent-noPermissionOther"); + } + } else { + plugin.message(sender, "unrent-noPermission"); + } + } + } + } + } else { + plugin.message(sender, "unrent-help"); + } + } + + /* Selling command */ + else if(args[0].equalsIgnoreCase("sell")) { + if(args.length > 1 && args[1] != null) { + HashMap buy = fileManager.getBuy(args[1]); + if(buy == null) { + plugin.message(sender, "sell-notRegistered"); + } else { + if(buy.get(plugin.keyPlayer) == null) { + plugin.message(sender, "sell-notBought"); + } else { + if(sender.hasPermission("areashop.sell")) { + plugin.message(sender, "sell-sold", buy.get(plugin.keyPlayer)); + fileManager.unBuy(args[1]); + } else { + if(sender.hasPermission("areashop.sellown")) { + if(buy.get(plugin.keyPlayer).equals(sender.getName())) { + plugin.message(sender, "sell-soldYours"); + fileManager.unBuy(args[1]); + } else { + plugin.message(sender, "sell-noPermissionOther"); + } + } else { + plugin.message(sender, "sell-noPermission"); + } + } + } + } + } else { + plugin.message(sender, "sell-help"); + } + } + + /* UpdateRents command */ + else if(args[0].equalsIgnoreCase("updaterents")) { + + if(sender.hasPermission("areashop.updaterents")) { + boolean result = plugin.getShopManager().updateRentSigns(); + plugin.getShopManager().updateRentRegions(); + if(result) { + plugin.message(sender, "rents-updated"); + } else { + plugin.message(sender, "rents-notUpdated"); + } + + } else { + plugin.message(sender, "rents-noPermission"); + } + } + + /* UpdateBuys command */ + else if(args[0].equalsIgnoreCase("updatebuys")) { + + if(sender.hasPermission("areashop.updatebuys")) { + boolean result = plugin.getShopManager().updateBuySigns(); + if(result) { + plugin.message(sender, "buys-updated"); + } else { + plugin.message(sender, "buys-notUpdated"); + } + } else { + plugin.message(sender, "buys-noPermission"); + } + } + + /* setRentRestore command*/ + else if(args[0].equalsIgnoreCase("rentrestore")) { + if(sender.hasPermission("areashop.rentrestore")) { + if(args.length > 2 && args[1] != null && args[2] != null) { + HashMap rent = fileManager.getRent(args[1]); + if(rent == null) { + plugin.message(sender, "rentrestore-notRegistered", args[1]); + } else { + String value = null; + if(args[2].equalsIgnoreCase("true")) { + rent.put(plugin.keyRestore, "true"); + value = "true"; + } else if(args[2].equalsIgnoreCase("false")) { + rent.put(plugin.keyRestore, "false"); + value = "false"; + } else if(args[2].equalsIgnoreCase("general")) { + rent.put(plugin.keyRestore, "general"); + value = "general"; + } else { + plugin.message(sender, "rentrestore-invalidSetting", args[2]); + } + if(value != null) { + if(args.length > 3) { + rent.put(plugin.keySchemProfile, args[3]); + plugin.message(sender, "rentrestore-successProfile", rent.get(plugin.keyName), value, args[3]); + } else { + plugin.message(sender, "rentrestore-success", rent.get(plugin.keyName), value); + } + fileManager.saveRents(); + } + } + } else { + plugin.message(sender, "rentrestore-help"); + } + } else { + plugin.message(sender, "rentrestore-noPermission"); + } + } + + /* setBuyRestore command*/ + else if(args[0].equalsIgnoreCase("buyrestore")) { + if(sender.hasPermission("areashop.buyrestore")) { + if(args.length > 2 && args[1] != null && args[2] != null) { + HashMap buy = fileManager.getBuy(args[1]); + if(buy == null) { + plugin.message(sender, "buyrestore-notRegistered", args[1]); + } else { + String value = null; + if(args[2].equalsIgnoreCase("true")) { + buy.put(plugin.keyRestore, "true"); + value = "true"; + } else if(args[2].equalsIgnoreCase("false")) { + buy.put(plugin.keyRestore, "false"); + value = "false"; + } else if(args[2].equalsIgnoreCase("general")) { + buy.put(plugin.keyRestore, "general"); + value = "general"; + } else { + plugin.message(sender, "buyrestore-invalidSetting", args[2]); + } + if(value != null) { + if(args.length > 3) { + buy.put(plugin.keySchemProfile, args[3]); + plugin.message(sender, "buyrestore-successProfile", buy.get(plugin.keyName), value, args[3]); + } else { + plugin.message(sender, "buyrestore-success", buy.get(plugin.keyName), value); + } + fileManager.saveBuys(); + } + } + } else { + plugin.message(sender, "buyrestore-help"); + } + } else { + plugin.message(sender, "buyrestore-noPermission"); + } + } + + /* reload command */ + else if(args[0].equalsIgnoreCase("reload")) { + + if(sender.hasPermission("areashop.reload")) { + plugin.reload(); + plugin.message(sender, "reload-reloaded"); + } else { + plugin.message(sender, "reload-noPermission"); + } + } + + /* Not a valid command */ + else { + plugin.message(sender, "cmd-notValid"); + } + + } else { + plugin.showHelp(sender); + } + return true; + } + return false; + } + +} diff --git a/AreaShop/src/nl/evolutioncoding/AreaShop/ShopManager.java b/AreaShop/src/nl/evolutioncoding/AreaShop/FileManager.java similarity index 72% rename from AreaShop/src/nl/evolutioncoding/AreaShop/ShopManager.java rename to AreaShop/src/nl/evolutioncoding/AreaShop/FileManager.java index 441f9be..90299fb 100644 --- a/AreaShop/src/nl/evolutioncoding/AreaShop/ShopManager.java +++ b/AreaShop/src/nl/evolutioncoding/AreaShop/FileManager.java @@ -1,1021 +1,1272 @@ -package nl.evolutioncoding.AreaShop; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.text.DecimalFormat; -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.Date; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Set; - -import net.milkbowl.vault.economy.EconomyResponse; - -import org.bukkit.Bukkit; -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.block.Sign; -import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.entity.Player; - -import com.sk89q.worldguard.bukkit.WorldGuardPlugin; -import com.sk89q.worldguard.domains.DefaultDomain; -import com.sk89q.worldguard.protection.regions.ProtectedRegion; -import com.sk89q.worldguard.protection.regions.ProtectedRegion.CircularInheritanceException; -import com.sk89q.worldguard.protection.databases.ProtectionDatabaseException; -import com.sk89q.worldguard.protection.flags.BooleanFlag; -import com.sk89q.worldguard.protection.flags.DefaultFlag; -import com.sk89q.worldguard.protection.flags.DoubleFlag; -import com.sk89q.worldguard.protection.flags.EnumFlag; -import com.sk89q.worldguard.protection.flags.Flag; -import com.sk89q.worldguard.protection.flags.IntegerFlag; -import com.sk89q.worldguard.protection.flags.InvalidFlagFormat; -import com.sk89q.worldguard.protection.flags.SetFlag; -import com.sk89q.worldguard.protection.flags.StateFlag; -import com.sk89q.worldguard.protection.flags.StateFlag.State; -import com.sk89q.worldguard.protection.flags.StringFlag; - -public class ShopManager { - private AreaShop plugin = null; - private ObjectInputStream input = null; - private ObjectOutputStream output = null; - private HashMap> rents = null; - private HashMap> buys = null; - private String rentPath = null; - private String buyPath = null; - - /** - * Constructor, initialize variabeles - * @param plugin - */ - public ShopManager(AreaShop plugin) { - this.plugin = plugin; - rents = new HashMap<>(); - buys = new HashMap<>(); - rentPath = plugin.getDataFolder().getPath() + File.separator + "rents"; - buyPath = plugin.getDataFolder().getPath() + File.separator + "buys"; - - } - - /** - * Add a rent to the list - * @param regionName Name of the region that can be rented - * @param rent Map containing all the info for a rent - */ - public void addRent(String regionName, HashMap rent) { - rents.put(regionName.toLowerCase(), rent); - this.saveRents(); - } - - /** - * Add a buy to the list - * @param regionName Name of the region that can be buyed - * @param buy Map containing all the info for a buy - */ - public void addBuy(String regionName, HashMap buy) { - buys.put(regionName.toLowerCase(), buy); - this.saveBuys(); - } - - /** - * Get a rent from the list - * @param regionName Name of the rent you want to get - * @return The Map with all the values from the rent - */ - public HashMap getRent(String regionName) { - return rents.get(regionName.toLowerCase()); - } - - /** - * Get a buy from the list - * @param regionName Name of the buy you want to get - * @return The Map with all the values from the buy - */ - public HashMap getBuy(String regionName) { - return buys.get(regionName.toLowerCase()); - } - - /** - * Get all rents - * @return The Map with all the values from the rents - */ - public HashMap> getRents() { - return rents; - } - - /** - * Get all buys - * @return The Map with all the values from the buys - */ - public HashMap> getBuys() { - return buys; - } - - /** - * Save all rents to disk - */ - public void saveRents() { - try { - output = new ObjectOutputStream(new FileOutputStream(rentPath)); - output.writeObject(rents); - output.close(); - } catch (IOException e) { - plugin.getLogger().info("File could not be saved: " + rentPath); - } - - } - - /** - * Save all buys to disk - */ - public void saveBuys() { - try { - output = new ObjectOutputStream(new FileOutputStream(buyPath)); - output.writeObject(buys); - output.close(); - } catch (IOException e) { - plugin.getLogger().info("File could not be saved: " + buyPath); - } - - } - - /** - * Unrent a region, reset to unrented - * @param regionName Region that should be unrented - */ - public void unRent(String regionName) { - regionName = regionName.toLowerCase(); - HashMap rent = rents.get(regionName); - - /* Get the time until the region will be rented */ - Long rentedUntil = Long.parseLong(rent.get(plugin.keyRentedUntil)); - Long currentTime = Calendar.getInstance().getTimeInMillis(); - Double timeLeft = (double) ((rentedUntil - currentTime)); - double price = Double.parseDouble(rent.get(plugin.keyPrice)); - double percentage = Integer.parseInt(plugin.config().getString("rentMoneyBack")) / 100; - - Calendar calendar = Calendar.getInstance(); - calendar.setTimeInMillis(0); - - String duration = rent.get(plugin.keyDuration); - duration = duration.replace("month", "M"); - duration = duration.replace("months", "M"); - char durationChar = duration.charAt(duration.indexOf(' ')+1); - int durationInt = Integer.parseInt(duration.substring(0, duration.indexOf(' '))); - - if(durationChar == 'm') { - calendar.add(Calendar.MINUTE, durationInt); - } else if(durationChar == 'h') { - calendar.add(Calendar.HOUR, durationInt); - } else if(durationChar == 'd') { - calendar.add(Calendar.DAY_OF_MONTH, durationInt); - } else if(durationChar == 'M') { - calendar.add(Calendar.MONTH, durationInt); - } else if(durationChar == 'y') { - calendar.add(Calendar.YEAR, durationInt); - } - Double timePeriod = (double) (calendar.getTimeInMillis()); - double periods = timeLeft / timePeriod; - double moneyBack = periods * price * percentage; - if(moneyBack > 0) { - /* Give back the money */ - EconomyResponse r = plugin.getEconomy().depositPlayer(rent.get(plugin.keyPlayer), moneyBack); - if(!r.transactionSuccess()) { - plugin.getLogger().info("Something went wrong with paying back money while unrenting"); - } - } - - /* Set the flags and options for the region */ - plugin.getShopManager().setRegionFlags(regionName, plugin.config().getConfigurationSection("flagsForRent"), true); - - /* Debug message */ - plugin.debug(rent.get(plugin.keyPlayer) + " has unrented " + rent.get(plugin.keyName) + ", got " + plugin.getCurrencyCharacter() + moneyBack + " money back"); - - /* Remove the player and renteduntil values */ - rent.remove(plugin.keyPlayer); - rent.remove(plugin.keyRentedUntil); - this.addRent(regionName, rent); - - /* Change the sign to [Rentable] */ - this.updateRentSign(regionName); - - this.saveRents(); - } - - /** - * Sell a buyed region, get part of the money back - * @param regionName - */ - public void unBuy(String regionName) { - regionName = regionName.toLowerCase(); - HashMap buy = buys.get(regionName); - - /* Give part of the buying price back */ - double price = Double.parseDouble(buy.get(plugin.keyPrice)); - double percentage = Integer.parseInt(plugin.config().getString("buyMoneyBack")) / 100; - double moneyBack = price * percentage; - if(moneyBack > 0) { - /* Give back the money */ - EconomyResponse r = plugin.getEconomy().depositPlayer(buy.get(plugin.keyPlayer), moneyBack); - if(!r.transactionSuccess()) { - plugin.getLogger().info("Something went wrong with paying back money while unrenting"); - } - } - - /* Set the flags and options for the region */ - plugin.getShopManager().setRegionFlags(regionName, plugin.config().getConfigurationSection("flagsForSale"), false); - - /* Debug message */ - plugin.debug(buy.get(plugin.keyPlayer) + " has sold " + buy.get(plugin.keyName) + ", got " + plugin.getCurrencyCharacter() + moneyBack + " money back"); - - /* Remove the player and buyeduntil values */ - buy.remove(plugin.keyPlayer); - this.addBuy(regionName, buy); - - /* Change the sign to [Buyable] */ - this.updateBuySign(regionName); - - this.saveBuys(); - } - - /** - * Unrent region that have no time left - */ - public void checkRents() { - /* Check if regions and signs are still present */ - Object[] rentNames = rents.keySet().toArray(); - for(int i=0; i rent = rents.get((String)rentNames[i]); - String rentedUntil = rent.get(plugin.keyRentedUntil); - if(rentedUntil != null) { - Calendar now = Calendar.getInstance(); - Calendar until = Calendar.getInstance(); - until.setTime(new Date(Long.parseLong(rent.get(plugin.keyRentedUntil)))); - if(now.after(until)) { - /* Send message to the player if online */ - Player player = Bukkit.getPlayer(rent.get(plugin.keyPlayer)); - if(player != null) { - plugin.message(player, "unrent-expired", rent.get(plugin.keyName)); - } - this.unRent(rent.get(plugin.keyName)); - } - } - } - } - - /** - * Rent a region - * @param player The player that wants to rent the region - * @param regionName The name of the region you want to rent - * @return true if it succeeded and false if not - */ - public boolean rent(Player player, String regionName) { - regionName = regionName.toLowerCase(); - HashMap rent = plugin.getShopManager().getRent(regionName); - if(rent == null) { - plugin.message(player, "rent-regionNotRentable"); - return false; - } - Block block = Bukkit.getWorld(rent.get(plugin.keyWorld)).getBlockAt(Integer.parseInt(rent.get(plugin.keyX)), Integer.parseInt(rent.get(plugin.keyY)), Integer.parseInt(rent.get(plugin.keyZ))); - - /* Check if the player has permission */ - if(player.hasPermission("areashop.rent")) { - boolean extend = player.getName().equals(rent.get(plugin.keyPlayer)); - /* Check if the region is available for renting */ - if(rent.get(plugin.keyPlayer) == null || extend) { - - if(!extend) { - /* Check if the player can still rent */ - int rentNumber = 0; - Iterator it = rents.keySet().iterator(); - while(it.hasNext()) { - if(player.getName().equals(rents.get(it.next()).get(plugin.keyPlayer))) { - rentNumber++; - } - } - int buyNumber = 0; - it = buys.keySet().iterator(); - while(it.hasNext()) { - if(player.getName().equals(buys.get(it.next()).get(plugin.keyPlayer))) { - buyNumber++; - } - } - int maximumRents = Integer.parseInt(plugin.config().getString("maximumRents")); - if(maximumRents != -1 && rentNumber >= maximumRents) { - plugin.message(player, "rent-maximum", maximumRents); - return false; - } - int maximumTotal = Integer.parseInt(plugin.config().getString("maximumTotal")); - if(maximumTotal != -1 && (rentNumber+buyNumber) >= maximumTotal) { - plugin.message(player, "total-maximum", maximumTotal); - return false; - } - } - - Double price = Double.parseDouble(rent.get(plugin.keyPrice)); - if(plugin.getEconomy().has(player.getName(), block.getWorld().getName(), price)) { - Sign sign = (Sign)block.getState(); - - /* Substract the money from the players balance */ - EconomyResponse r = plugin.getEconomy().withdrawPlayer(player.getName(), price); - if(!r.transactionSuccess()) { - plugin.message(player, "rent-payError"); - return false; - } - - /* Get the time until the region will be rented */ - Calendar calendar = Calendar.getInstance(); - if(extend) { - calendar.setTimeInMillis(Long.parseLong(rent.get(plugin.keyRentedUntil))); - } - - String duration = rent.get(plugin.keyDuration); - duration = duration.replace("month", "M"); - duration = duration.replace("months", "M"); - char durationChar = duration.charAt(duration.indexOf(' ')+1); - int durationInt = Integer.parseInt(duration.substring(0, duration.indexOf(' '))); - if(durationChar == 'm') { - calendar.add(Calendar.MINUTE, durationInt); - } else if(durationChar == 'h') { - calendar.add(Calendar.HOUR, durationInt); - } else if(durationChar == 'd') { - calendar.add(Calendar.DAY_OF_MONTH, durationInt); - } else if(durationChar == 'M') { - calendar.add(Calendar.MONTH, durationInt); - } else if(durationChar == 'y') { - calendar.add(Calendar.YEAR, durationInt); - } - SimpleDateFormat dateFull = new SimpleDateFormat("dd MMMMMMMMMMMMMMMMM yyyy HH:mm"); - - /* Add values to the rent and send it to ShopManager */ - rent.put(plugin.keyRentedUntil, String.valueOf(calendar.getTimeInMillis())); - rent.put(plugin.keyPlayer, player.getName()); - plugin.getShopManager().addRent(sign.getLine(1), rent); - - /* Change the sign */ - this.updateRentSign(regionName); - - /* Set the flags and options for the region */ - plugin.getShopManager().setRegionFlags(regionName, plugin.config().getConfigurationSection("flagsRented"), true); - - /* Send message to the player */ - if(extend) { - plugin.message(player, "rent-extended", sign.getLine(1), dateFull.format(calendar.getTime())); - } else { - plugin.message(player, "rent-rented", sign.getLine(1), dateFull.format(calendar.getTime())); - plugin.message(player, "rent-extend"); - } - plugin.debug(player.getName() + " has rented region " + rent.get(plugin.keyName) + " for " + plugin.getCurrencyCharacter() + price + " until " + dateFull.format(calendar.getTime())); - - this.saveRents(); - return true; - } else { - /* Player has not enough money */ - if(extend) { - plugin.message(player, "rent-lowMoneyExtend", plugin.getCurrencyCharacter() + plugin.getEconomy().getBalance(player.getName(), block.getWorld().getName()), plugin.getCurrencyCharacter() + price); - } else { - plugin.message(player, "rent-lowMoneyRent", plugin.getCurrencyCharacter() + plugin.getEconomy().getBalance(player.getName(), block.getWorld().getName()), plugin.getCurrencyCharacter() + price); - } - } - } else { - plugin.message(player, "rent-someoneElse"); - } - } else { - plugin.message(player, "rent-noPermission"); - } - return false; - } - - - /** - * Buy a region - * @param player The player that wants to buy the region - * @param regionName The name of the region you want to buy - * @return true if it succeeded and false if not - */ - public boolean buy(Player player, String regionName) { - regionName = regionName.toLowerCase(); - HashMap buy = plugin.getShopManager().getBuy(regionName); - if(buy == null) { - plugin.message(player, "rent-notBuyable"); - return true; - } - Block block = Bukkit.getWorld(buy.get(plugin.keyWorld)).getBlockAt(Integer.parseInt(buy.get(plugin.keyX)), Integer.parseInt(buy.get(plugin.keyY)), Integer.parseInt(buy.get(plugin.keyZ))); - - /* Check if the player has permission */ - if(player.hasPermission("areashop.buy")) { - if(buy.get(plugin.keyPlayer) == null) { - - /* Check if the player can still buy */ - int buyNumber = 0; - Iterator it = buys.keySet().iterator(); - while(it.hasNext()) { - if(player.getName().equals(buys.get(it.next()).get(plugin.keyPlayer))) { - buyNumber++; - } - } - int rentNumber = 0; - it = rents.keySet().iterator(); - while(it.hasNext()) { - if(player.getName().equals(rents.get(it.next()).get(plugin.keyPlayer))) { - rentNumber++; - } - } - int maximumBuys = Integer.parseInt(plugin.config().getString("maximumBuys")); - if(maximumBuys != -1 && buyNumber >= maximumBuys) { - plugin.message(player, "buy-maximum", maximumBuys); - return false; - } - int maximumTotal = Integer.parseInt(plugin.config().getString("maximumTotal")); - if(maximumTotal != -1 && (rentNumber+buyNumber) >= maximumTotal) { - plugin.message(player, "total-maximum", maximumTotal); - return false; - } - - /* Check if the player has enough money */ - Double price = Double.parseDouble(buy.get(plugin.keyPrice)); - if(plugin.getEconomy().has(player.getName(), block.getWorld().getName(), price)) { - Sign sign = (Sign)block.getState(); - - /* Substract the money from the players balance */ - EconomyResponse r = plugin.getEconomy().withdrawPlayer(player.getName(), price); - if(!r.transactionSuccess()) { - plugin.message(player, "buy-payError"); - return false; - } - - /* Add values to the buy and send it to ShopManager */ - buy.put(plugin.keyPlayer, player.getName()); - plugin.getShopManager().addBuy(sign.getLine(1), buy); - - /* Change the sign */ - this.updateBuySign(regionName); - - /* Set the flags and options for the region */ - plugin.getShopManager().setRegionFlags(regionName, plugin.config().getConfigurationSection("flagsSold"), false); - - /* Send message to the player */ - plugin.message(player, "buy-succes", sign.getLine(1)); - plugin.debug(player.getName() + " has bought region " + buy.get(plugin.keyName) + " for " + plugin.getCurrencyCharacter() + price); - - this.saveBuys(); - return true; - } else { - /* Player has not enough money */ - plugin.message(player, "buy-lowMoney", plugin.getCurrencyCharacter() + plugin.getEconomy().getBalance(player.getName(), block.getWorld().getName()), plugin.getCurrencyCharacter() + price); - } - } else { - if(player.getName().equals(buy.get(plugin.keyPlayer))) { - plugin.message(player, "buy-yours"); - } else { - plugin.message(player, "buy-someoneElse"); - } - } - } else { - plugin.message(player, "buy-noPermission"); - } - return false; - } - - /** - * Remove a rent from the list - * @param regionName - */ - public boolean removeRent(String regionName) { - regionName = regionName.toLowerCase(); - boolean result = false; - HashMap rent = rents.get(regionName); - if(rent != null) { - if(rent.get(plugin.keyPlayer) != null) { - this.unRent(regionName); - } - /* Delete the sign and the variable */ - Bukkit.getWorld(rent.get(plugin.keyWorld)).getBlockAt(Integer.parseInt(rent.get(plugin.keyX)), Integer.parseInt(rent.get(plugin.keyY)), Integer.parseInt(rent.get(plugin.keyZ))).setType(Material.AIR); - rents.remove(regionName); - this.saveRents(); - result = true; - } - return result; - } - - /** - * Remove a buy from the list - * @param regionName - */ - public boolean removeBuy(String regionName) { - regionName = regionName.toLowerCase(); - boolean result = false; - HashMap buy = buys.get(regionName); - if(buy != null) { - if(buy.get(plugin.keyPlayer) != null) { - this.unBuy(regionName); - } - /* Delete the sign and the variable */ - Bukkit.getWorld(buy.get(plugin.keyWorld)).getBlockAt(Integer.parseInt(buy.get(plugin.keyX)), Integer.parseInt(buy.get(plugin.keyY)), Integer.parseInt(buy.get(plugin.keyZ))).setType(Material.AIR); - buys.remove(regionName); - this.saveBuys(); - result = true; - } - return result; - } - - - /** - * Loads the rents from disk - * @return true if the file is read successfully, else false - */ - @SuppressWarnings("unchecked") - public boolean loadRents() { - boolean error = false; - rents.clear(); - File file = new File(rentPath); - if(file.exists()) { - /* Load all rents from file */ - try { - input = new ObjectInputStream(new FileInputStream(rentPath)); - rents = (HashMap>)input.readObject(); - input.close(); - } catch (IOException | ClassNotFoundException e) { - plugin.getLogger().info("Error: Something went wrong reading file: " + rentPath); - error = true; - } - - if(!error) { - /* Check if regions and signs are still present */ - Object[] rentNames = rents.keySet().toArray(); - for(int i=0; i rent = rents.get(name); - - /* If region is gone delete the rent and the sign */ - if(plugin.getWorldGuard().getRegionManager(Bukkit.getWorld(rent.get(plugin.keyWorld))).getRegion(name) == null) { - this.removeRent(name); - plugin.getLogger().info(name + " does not exist anymore, rent has been deleted"); - } - - /* If the sign is gone remove the rent */ - Block block = Bukkit.getWorld(rent.get(plugin.keyWorld)).getBlockAt(Integer.parseInt(rent.get(plugin.keyX)), Integer.parseInt(rent.get(plugin.keyY)), Integer.parseInt(rent.get(plugin.keyZ))); - boolean remove = true; - if(block.getType() == Material.WALL_SIGN || block.getType() == Material.SIGN_POST) { - remove = false; - } - if(remove) { - /* remove the rent */ - if(this.removeRent(name)) { - plugin.getLogger().info("Rent for " + name + " has been deleted, sign is not present"); - } - } - } - - /* Output info to console */ - if(rents.keySet().size() == 1) { - plugin.debug(rents.keySet().size() + " rent loaded"); - } else { - plugin.debug(rents.keySet().size() + " rents loaded"); - } - } - - } else { - this.saveRents(); - plugin.getLogger().info("New file for rents created, should only happen when starting for the first time"); - } - return !error; - } - - /** - * Load the buys file from disk - * @return true if the file is read successfully, else false - */ - @SuppressWarnings("unchecked") - public boolean loadBuys() { - boolean error = false; - buys.clear(); - File file = new File(buyPath); - if(file.exists()) { - /* Load all buys from file */ - try { - input = new ObjectInputStream(new FileInputStream(buyPath)); - buys = (HashMap>)input.readObject(); - input.close(); - } catch (IOException | ClassNotFoundException e) { - plugin.getLogger().info("Error: Something went wrong reading file: " + buyPath); - error = true; - } - - if(!error) { - /* Check if regions and signs are still present */ - Object[] buyNames = buys.keySet().toArray(); - for(int i=0; i buy = buys.get(name); - - /* If region is gone delete the buy and the sign */ - if(plugin.getWorldGuard().getRegionManager(Bukkit.getWorld(buy.get(plugin.keyWorld))).getRegion(name) == null) { - this.removeBuy(name); - plugin.getLogger().info("Region '" + name + "' does not exist anymore, buy has been deleted"); - } - - /* If the sign is gone remove the buy */ - Block block = Bukkit.getWorld(buy.get(plugin.keyWorld)).getBlockAt(Integer.parseInt(buy.get(plugin.keyX)), Integer.parseInt(buy.get(plugin.keyY)), Integer.parseInt(buy.get(plugin.keyZ))); - boolean remove = true; - if(block.getType() == Material.WALL_SIGN || block.getType() == Material.SIGN_POST) { - remove = false; - } - if(remove) { - /* remove the buy */ - if(this.removeBuy(name)) { - plugin.getLogger().info("Buy for region '" + name + "' has been deleted, sign is not present"); - } - } - } - - /* Output info to console */ - if(buys.keySet().size() == 1) { - plugin.debug(buys.keySet().size() + " buy loaded"); - } else { - plugin.debug(buys.keySet().size() + " buys loaded"); - } - } - - } else { - this.saveBuys(); - plugin.getLogger().info("New file for buys created, should only happen when starting for the first time"); - } - return !error; - } - - /** - * Update the sign linked to the rent - * @param regionName The region name of wich the sign has to be updated - * @return true if it succeeded, false if not - */ - public boolean updateRentSign(String regionName) { - regionName = regionName.toLowerCase(); - boolean result = false; - HashMap rent = this.getRent(regionName); - if(rent != null) { - /* Get values */ - String world = rent.get(plugin.keyWorld); - String x = rent.get(plugin.keyX); - String y = rent.get(plugin.keyY); - String z = rent.get(plugin.keyZ); - String duration = rent.get(plugin.keyDuration); - String price = rent.get(plugin.keyPrice); - String player = rent.get(plugin.keyPlayer); - String until = rent.get(plugin.keyRentedUntil); - String name = rent.get(plugin.keyName); - Block block = Bukkit.getWorld(world).getBlockAt(Integer.parseInt(x), Integer.parseInt(y), Integer.parseInt(z)); - - if(block.getType() == Material.WALL_SIGN || block.getType() == Material.SIGN_POST) { - Sign sign = (Sign)block.getState(); - if(player == null) { - /* Not rented */ - sign.setLine(0, plugin.fixColors(plugin.config().getString("signRentable"))); - sign.setLine(1, name); - sign.setLine(2, duration); - sign.setLine(3, plugin.getCurrencyCharacter() + price); - - } else { - /* Rented */ - SimpleDateFormat date = new SimpleDateFormat("dd-MM HH:mm"); - String dateString = date.format(new Date(Long.parseLong(until))); - - sign.setLine(0, plugin.fixColors(plugin.config().getString("signRented"))); - sign.setLine(1, name); - sign.setLine(2, player); - sign.setLine(3, dateString); - } - sign.update(); - result = true; - } - } - return result; - } - - /** - * Update the sign linked to the buy - * @param regionName The region name of wich the sign has to be updated - * @return true if it succeeded, false if not - */ - public boolean updateBuySign(String regionName) { - regionName = regionName.toLowerCase(); - boolean result = false; - HashMap buy = this.getBuy(regionName); - if(buy != null) { - /* Get values */ - String world = buy.get(plugin.keyWorld); - String x = buy.get(plugin.keyX); - String y = buy.get(plugin.keyY); - String z = buy.get(plugin.keyZ); - String price = buy.get(plugin.keyPrice); - String player = buy.get(plugin.keyPlayer); - String name = buy.get(plugin.keyName); - Block block = Bukkit.getWorld(world).getBlockAt(Integer.parseInt(x), Integer.parseInt(y), Integer.parseInt(z)); - - if(block.getType() == Material.WALL_SIGN || block.getType() == Material.SIGN_POST) { - Sign sign = (Sign)block.getState(); - if(player == null) { - /* Not buyed */ - sign.setLine(0, plugin.fixColors(plugin.config().getString("signBuyable"))); - sign.setLine(1, name); - sign.setLine(2, plugin.getCurrencyCharacter() + price); - - } else { - /* Buyed */ - sign.setLine(0, plugin.fixColors(plugin.config().getString("signBuyed"))); - sign.setLine(1, name); - sign.setLine(2, player); - } - sign.update(); - result = true; - } - } - return result; - } - - /** - * Update all rent signs - * @return true if all signs are updated, otherwise false - */ - public boolean updateRentSigns() { - boolean result = true; - - Object[] rentNames = rents.keySet().toArray(); - for(int i=0; i rent = this.getRent(regionName); - if(rent != null) { - if(rent.get(plugin.keyPlayer) == null) { - this.setRegionFlags(regionName, plugin.config().getConfigurationSection("flagsForRent"), true); - } else { - this.setRegionFlags(regionName, plugin.config().getConfigurationSection("flagsRented"), true); - } - } - } - - - /** - * Update all regions registered for renting - */ - public void updateRentRegions() { - Object[] rentNames = rents.keySet().toArray(); - for(int i=0; i buy = this.getBuy(regionName); - if(buy != null) { - if(buy.get(plugin.keyPlayer) == null) { - this.setRegionFlags(regionName, plugin.config().getConfigurationSection("flagsForSale"), false); - } else { - this.setRegionFlags(regionName, plugin.config().getConfigurationSection("flagsSold"), false); - } - } - } - - /** - * Update all regions registered for buying - */ - public void updateBuyRegions() { - Object[] buyNames = buys.keySet().toArray(); - for(int i=0; i flagNames = flags.getKeys(false); - WorldGuardPlugin worldGuard = plugin.getWorldGuard(); - Flag flagType = null; - Object flagValue = null; - - /* Replace tags with values, for example %player% to NLThijs48 */ - HashMap info; - if(isRent) { - info = this.getRent(regionName); - } else { - info = this.getBuy(regionName); - } - - ProtectedRegion region = plugin.getWorldGuard().getRegionManager(Bukkit.getWorld(info.get(plugin.keyWorld))).getRegion(regionName); - - String playerName = info.get(plugin.keyPlayer); - String price = plugin.getCurrencyCharacter() + info.get(plugin.keyPrice); - String duration = info.get(plugin.keyDuration); - String until = null; - if(isRent && playerName != null) { - SimpleDateFormat dateFull = new SimpleDateFormat("dd MMMMMMMMMMMMMMMMM yyyy HH:mm"); - until = dateFull.format(Long.parseLong(info.get(plugin.keyRentedUntil))); - } - - Iterator it = flagNames.iterator(); - while(it.hasNext()) { - String flagName = it.next(); - String value = flags.getString(flagName); - - if(value != null && playerName != null) { - value = value.replace(plugin.tagPlayerName, playerName); - } - if(value != null) { - value = value.replace(plugin.tagRegionName, info.get(plugin.keyName)); - } - if(value != null && price != null) { - value = value.replace(plugin.tagPrice, price); - } - if(value != null && duration != null) { - value = value.replace(plugin.tagDuration, duration); - } - if(value != null && until != null) { - value = value.replace(plugin.tagRentedUntil, until); - } - - /* Check for a couple of options or use as flag */ - if(flagName.equalsIgnoreCase("members")) { - /* Split the string and parse all values */ - String[] names = value.split("\\s*,\\s*"); - DefaultDomain members = region.getMembers(); - for(int i=0; i " + value); - } catch(NumberFormatException e) { - plugin.getLogger().info("The value of flag " + flagName + " is not a number"); - result = false; - } - } else if(flagName.equalsIgnoreCase("parent")) { - ProtectedRegion parentRegion = worldGuard.getRegionManager(Bukkit.getWorld(info.get(plugin.keyWorld))).getRegion(value); - if(parentRegion != null) { - try { - region.setParent(parentRegion); - } catch (CircularInheritanceException e) { - plugin.getLogger().info("The parent set in the config is not correct (circular inheritance)"); - } - } else { - plugin.getLogger().info("The parent set in the config is not correct (region does not exist)"); - } - } else { - flagType = null; - flagValue = null; - - try { - flagType = DefaultFlag.fuzzyMatchFlag(flagName); - if(flagType != null) { - flagValue = flagType.parseInput(worldGuard, null, value); - } - } catch (InvalidFlagFormat e) { - plugin.getLogger().info("The value of flag " + flagName + " is wrong"); - result = false; - } - if(flagValue != null && flagType != null) { - if(flagType instanceof StateFlag) { - if(value.equals("")) { - region.setFlag((StateFlag)flagType, null); - } else { - region.setFlag((StateFlag)flagType, (State)flagValue); - } - } else if(flagType instanceof BooleanFlag) { - if(value.equals("")) { - region.setFlag((BooleanFlag)flagType, null); - } else { - region.setFlag((BooleanFlag)flagType, (Boolean)flagValue); - } - } else if(flagType instanceof IntegerFlag) { - if(value.equals("")) { - region.setFlag((IntegerFlag)flagType, null); - } else { - region.setFlag((IntegerFlag)flagType, (Integer)flagValue); - } - } else if(flagType instanceof DoubleFlag) { - if(value.equals("")) { - region.setFlag((DoubleFlag)flagType, null); - } else { - region.setFlag((DoubleFlag)flagType, (Double)flagValue); - } - } else if(flagType instanceof StringFlag) { - if(value.equals("")) { - region.setFlag((StringFlag)flagType, null); - } else { - region.setFlag((StringFlag)flagType, (String)flagValue); - } - } else if(flagType instanceof SetFlag) { - if(value.equals("")) { - region.setFlag((SetFlag)flagType, null); - } else { - region.setFlag((SetFlag)flagType, (Set)flagValue); - } - } /* else if(flagType instanceof LocationFlag) { - region.setFlag((LocationFlag)flagType, (Location)flagValue); - } */ else if(flagType instanceof EnumFlag) { - if(value.equals("")) { - region.setFlag((EnumFlag)flagType, null); - } else { - region.setFlag((EnumFlag)flagType, (Enum)flagValue); - } - } else { - result = false; - } - plugin.debug("Region " + region.getId() + ", flag " + flagName + " --> " + value); - } else { - result = false; - } - } - } - - try { - worldGuard.getRegionManager(Bukkit.getWorld(info.get(plugin.keyWorld))).save(); - plugin.debug("Regions saved"); - } catch (ProtectionDatabaseException e) { - plugin.getLogger().info("Error: regions could not be saved"); - } - return result; - } -} - - - - - - - - - - - - - - - +package nl.evolutioncoding.AreaShop; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Set; + +import net.milkbowl.vault.economy.EconomyResponse; +import nl.evolutioncoding.AreaShop.AreaShop.RegionEventType; + +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.block.Sign; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.entity.Player; + +import com.sk89q.worldedit.CuboidClipboard; +import com.sk89q.worldedit.EditSession; +import com.sk89q.worldedit.EmptyClipboardException; +import com.sk89q.worldedit.LocalSession; +import com.sk89q.worldedit.MaxChangedBlocksException; +import com.sk89q.worldedit.Vector; +import com.sk89q.worldedit.bukkit.BukkitWorld; +import com.sk89q.worldedit.data.DataException; +import com.sk89q.worldedit.schematic.SchematicFormat; +import com.sk89q.worldguard.bukkit.WorldGuardPlugin; +import com.sk89q.worldguard.domains.DefaultDomain; +import com.sk89q.worldguard.protection.regions.ProtectedRegion; +import com.sk89q.worldguard.protection.regions.ProtectedRegion.CircularInheritanceException; +import com.sk89q.worldguard.protection.databases.ProtectionDatabaseException; +import com.sk89q.worldguard.protection.flags.BooleanFlag; +import com.sk89q.worldguard.protection.flags.DefaultFlag; +import com.sk89q.worldguard.protection.flags.DoubleFlag; +import com.sk89q.worldguard.protection.flags.EnumFlag; +import com.sk89q.worldguard.protection.flags.Flag; +import com.sk89q.worldguard.protection.flags.IntegerFlag; +import com.sk89q.worldguard.protection.flags.InvalidFlagFormat; +import com.sk89q.worldguard.protection.flags.SetFlag; +import com.sk89q.worldguard.protection.flags.StateFlag; +import com.sk89q.worldguard.protection.flags.StateFlag.State; +import com.sk89q.worldguard.protection.flags.StringFlag; + +public class FileManager { + private AreaShop plugin = null; + private ObjectInputStream input = null; + private ObjectOutputStream output = null; + private HashMap> rents = null; + private HashMap> buys = null; + private String rentPath = null; + private String buyPath = null; + private String schemFolder = null; + + /** + * Constructor, initialize variabeles + * @param plugin + */ + public FileManager(AreaShop plugin) { + this.plugin = plugin; + rents = new HashMap<>(); + buys = new HashMap<>(); + rentPath = plugin.getDataFolder().getPath() + File.separator + "rents"; + buyPath = plugin.getDataFolder().getPath() + File.separator + "buys"; + schemFolder = plugin.getDataFolder() + File.separator + plugin.schematicFolder; + File schemFile = new File(schemFolder); + if(!schemFile.exists()) { + schemFile.mkdirs(); + } + } + + /** + * Add a rent to the list + * @param regionName Name of the region that can be rented + * @param rent Map containing all the info for a rent + */ + public void addRent(String regionName, HashMap rent) { + rents.put(regionName.toLowerCase(), rent); + this.saveRents(); + } + + /** + * Add a buy to the list + * @param regionName Name of the region that can be buyed + * @param buy Map containing all the info for a buy + */ + public void addBuy(String regionName, HashMap buy) { + buys.put(regionName.toLowerCase(), buy); + this.saveBuys(); + } + + /** + * Checks an event and handles saving to and restoring from schematic for it + * @param regionName The name of the region for which this is the event + * @param isRent Is it a rent or noet? + * @param type The type of event + */ + public void handleSchematicEvent(String regionName, boolean isRent, RegionEventType type) { + plugin.debug("regionName = " + regionName); + plugin.debug("isrent = " + isRent); + plugin.debug("type = " + type.getValue()); + // Check for the general killswitch + if(!plugin.config().getBoolean("enableSchematics")) { + return; + } + // Get the info about the region + HashMap info; + if(isRent) { + info = this.getRent(regionName); + } else { + info = this.getBuy(regionName); + } + // Check the individual options + if(isRent) { + if("false".equalsIgnoreCase(info.get(plugin.keyRestore))) { + return; + } else if("true".equalsIgnoreCase(info.get(plugin.keyRestore))) { + } else { + if(!plugin.config().getBoolean("useRentRestore")) { + return; + } + } + } else { + if("false".equalsIgnoreCase(info.get(plugin.keyRestore))) { + return; + } else if("true".equalsIgnoreCase(info.get(plugin.keyRestore))) { + } else { + if(!plugin.config().getBoolean("useBuyRestore")) { + return; + } + } + } + // Get the safe and restore names + String save = null; + String restore = null; + if(type == RegionEventType.CREATED) { + if(isRent) { + save = plugin.config().getString("rentSchematicProfiles."+info.get(plugin.keySchemProfile)+".created.save"); + if(save == null) { + plugin.config().getString("rentSchematicProfiles.default.created.save"); + } + restore = plugin.config().getString("rentSchematicProfiles."+info.get(plugin.keySchemProfile)+".created.restore"); + if(restore == null) { + plugin.config().getString("rentSchematicProfiles.default.created.restore"); + } + } else { + save = plugin.config().getString("buySchematicProfiles."+info.get(plugin.keySchemProfile)+".created.save"); + if(save == null) { + plugin.config().getString("buySchematicProfiles.default.created.save"); + } + restore = plugin.config().getString("buySchematicProfiles."+info.get(plugin.keySchemProfile)+".created.restore"); + if(restore == null) { + plugin.config().getString("buySchematicProfiles.default.created.restore"); + } + } + } else if(type == RegionEventType.DELETED) { + if(isRent) { + save = plugin.config().getString("rentSchematicProfiles."+info.get(plugin.keySchemProfile)+".deleted.save"); + if(save == null) { + plugin.config().getString("rentSchematicProfiles.default.deleted.save"); + } + restore = plugin.config().getString("rentSchematicProfiles."+info.get(plugin.keySchemProfile)+".deleted.restore"); + if(restore == null) { + plugin.config().getString("rentSchematicProfiles.default.deleted.restore"); + } + } else { + save = plugin.config().getString("buySchematicProfiles."+info.get(plugin.keySchemProfile)+".deleted.save"); + if(save == null) { + plugin.config().getString("buySchematicProfiles.default.deleted.save"); + } + restore = plugin.config().getString("buySchematicProfiles."+info.get(plugin.keySchemProfile)+".deleted.restore"); + if(restore == null) { + plugin.config().getString("buySchematicProfiles.default.deleted.restore"); + } + } + } else if(type == RegionEventType.BOUGHT) { + if(isRent) { + save = plugin.config().getString("rentSchematicProfiles."+info.get(plugin.keySchemProfile)+".rented.save"); + if(save == null) { + plugin.config().getString("rentSchematicProfiles.default.rented.save"); + } + restore = plugin.config().getString("rentSchematicProfiles."+info.get(plugin.keySchemProfile)+".rented.restore"); + if(restore == null) { + plugin.config().getString("rentSchematicProfiles.default.rented.restore"); + } + } else { + save = plugin.config().getString("buySchematicProfiles."+info.get(plugin.keySchemProfile)+".bought.save"); + if(save == null) { + plugin.config().getString("buySchematicProfiles.default.bought.save"); + } + restore = plugin.config().getString("buySchematicProfiles."+info.get(plugin.keySchemProfile)+".bought.restore"); + if(restore == null) { + plugin.config().getString("buySchematicProfiles.default.bought.restore"); + } + } + } else if(type == RegionEventType.SOLD) { + if(isRent) { + save = plugin.config().getString("rentSchematicProfiles."+info.get(plugin.keySchemProfile)+".unrented.save"); + if(save == null) { + plugin.config().getString("rentSchematicProfiles.default.unrented.save"); + } + restore = plugin.config().getString("rentSchematicProfiles."+info.get(plugin.keySchemProfile)+".unrented.restore"); + if(restore == null) { + plugin.config().getString("rentSchematicProfiles.default.unrented.restore"); + } + } else { + save = plugin.config().getString("buySchematicProfiles."+info.get(plugin.keySchemProfile)+".sold.save"); + if(save == null) { + plugin.config().getString("buySchematicProfiles.default.sold.save"); + } + restore = plugin.config().getString("buySchematicProfiles."+info.get(plugin.keySchemProfile)+".sold.restore"); + if(restore == null) { + plugin.config().getString("buySchematicProfiles.default.sold.restore"); + } + } + } + // Save the region if needed + if(save != null && save.length() != 0) { + save = save.replace(plugin.tagRegionName, info.get(plugin.keyName)); + this.saveRegionBlocks(regionName, info.get(plugin.keyWorld), save); + } + // Restore the region if needed + if(restore != null && restore.length() != 0) { + restore = restore.replace(plugin.tagRegionName, info.get(plugin.keyName)); + this.restoreRegionBlocks(regionName, info.get(plugin.keyWorld), restore); + } + } + + /** + * Save all blocks in a region for restoring later + * @param regionName The name of the region + * @param world The world that it is in + * @param fileName The name of the file to save to (extension and folder will be added) + * @return + */ + public boolean saveRegionBlocks(String regionName, String world, String fileName) { + plugin.debug("Saving schematic for " + regionName); + regionName = regionName.toLowerCase(); + boolean result = true; + EditSession editSession = new EditSession(new BukkitWorld(Bukkit.getWorld(world)), plugin.config().getInt("maximumBlocks")); + ProtectedRegion region = plugin.getWorldGuard().getRegionManager(Bukkit.getWorld(world)).getRegion(regionName); + // Get the origin and size of the region + Vector origin = new Vector(region.getMinimumPoint().getBlockX(), region.getMinimumPoint().getBlockY(), region.getMinimumPoint().getBlockZ()); + Vector size = (new Vector(region.getMaximumPoint().getBlockX(), region.getMaximumPoint().getBlockY(), region.getMaximumPoint().getBlockZ()).subtract(origin)).add(new Vector(1,1,1)); + + // The path to save the schematic + File saveFile = new File(schemFolder + File.separator + fileName + plugin.schematicExtension); + + // Save the schematic + editSession.enableQueue(); + CuboidClipboard clipboard = new CuboidClipboard(size, origin); + clipboard.copy(editSession); + try { + SchematicFormat.MCEDIT.save(clipboard, saveFile); + } catch (IOException | DataException e) { + result = false; + } + editSession.flushQueue(); + if(result) { + plugin.debug("Saved schematic for " + regionName); + } else { + plugin.debug("Not saved " + regionName); + } + return result; + } + + /** + * Restore all blocks in a region for restoring later + * @param regionName The name of the region + * @param world The world that it is in + * @param fileName The name of the file to save to (extension and folder will be added) + * @return + */ + public boolean restoreRegionBlocks(String regionName, String world, String fileName) { + plugin.debug("Restoring schematic for " + regionName); + regionName = regionName.toLowerCase(); + boolean result = true; + EditSession editSession = new EditSession(new BukkitWorld(Bukkit.getWorld(world)), plugin.config().getInt("maximumBlocks")); + ProtectedRegion region = plugin.getWorldGuard().getRegionManager(Bukkit.getWorld(world)).getRegion(regionName); + // Get the origin and size of the region + Vector origin = new Vector(region.getMinimumPoint().getBlockX(), region.getMinimumPoint().getBlockY(), region.getMinimumPoint().getBlockZ()); + + // The path to save the schematic + File saveFile = new File(schemFolder + File.separator + fileName + plugin.schematicExtension); + + LocalSession localSession = new LocalSession(plugin.getWorldEdit().getLocalConfiguration()); + editSession.enableQueue(); + try { + localSession.setClipboard(SchematicFormat.MCEDIT.load(saveFile)); + localSession.getClipboard().place(editSession, origin, false); + } catch (MaxChangedBlocksException | EmptyClipboardException | IOException | DataException e) { + result = false; + } + editSession.flushQueue(); + + //we.flushBlockBag(localPlayer, editSession); + if(result) { + plugin.debug("Restored schematic for " + regionName); + } else { + plugin.debug("Not restored " + regionName); + } + return result; + } + + /** + * Get a rent from the list + * @param regionName Name of the rent you want to get + * @return The Map with all the values from the rent + */ + public HashMap getRent(String regionName) { + return rents.get(regionName.toLowerCase()); + } + + /** + * Get a buy from the list + * @param regionName Name of the buy you want to get + * @return The Map with all the values from the buy + */ + public HashMap getBuy(String regionName) { + return buys.get(regionName.toLowerCase()); + } + + /** + * Get all rents + * @return The Map with all the values from the rents + */ + public HashMap> getRents() { + return rents; + } + + /** + * Get all buys + * @return The Map with all the values from the buys + */ + public HashMap> getBuys() { + return buys; + } + + /** + * Save all rents to disk + */ + public void saveRents() { + try { + output = new ObjectOutputStream(new FileOutputStream(rentPath)); + output.writeObject(rents); + output.close(); + } catch (IOException e) { + plugin.getLogger().info("File could not be saved: " + rentPath); + } + + } + + /** + * Save all buys to disk + */ + public void saveBuys() { + try { + output = new ObjectOutputStream(new FileOutputStream(buyPath)); + output.writeObject(buys); + output.close(); + } catch (IOException e) { + plugin.getLogger().info("File could not be saved: " + buyPath); + } + + } + + /** + * Unrent a region, reset to unrented + * @param regionName Region that should be unrented + */ + public void unRent(String regionName) { + regionName = regionName.toLowerCase(); + HashMap rent = rents.get(regionName); + + /* Get the time until the region will be rented */ + Long rentedUntil = Long.parseLong(rent.get(plugin.keyRentedUntil)); + Long currentTime = Calendar.getInstance().getTimeInMillis(); + Double timeLeft = (double) ((rentedUntil - currentTime)); + double price = Double.parseDouble(rent.get(plugin.keyPrice)); + double percentage = Integer.parseInt(plugin.config().getString("rentMoneyBack")) / 100; + + Calendar calendar = Calendar.getInstance(); + calendar.setTimeInMillis(0); + + String duration = rent.get(plugin.keyDuration); + duration = duration.replace("month", "M"); + duration = duration.replace("months", "M"); + char durationChar = duration.charAt(duration.indexOf(' ')+1); + int durationInt = Integer.parseInt(duration.substring(0, duration.indexOf(' '))); + + if(durationChar == 'm') { + calendar.add(Calendar.MINUTE, durationInt); + } else if(durationChar == 'h') { + calendar.add(Calendar.HOUR, durationInt); + } else if(durationChar == 'd') { + calendar.add(Calendar.DAY_OF_MONTH, durationInt); + } else if(durationChar == 'M') { + calendar.add(Calendar.MONTH, durationInt); + } else if(durationChar == 'y') { + calendar.add(Calendar.YEAR, durationInt); + } + Double timePeriod = (double) (calendar.getTimeInMillis()); + double periods = timeLeft / timePeriod; + double moneyBack = periods * price * percentage; + if(moneyBack > 0) { + /* Give back the money */ + EconomyResponse r = plugin.getEconomy().depositPlayer(rent.get(plugin.keyPlayer), moneyBack); + if(!r.transactionSuccess()) { + plugin.getLogger().info("Something went wrong with paying back money while unrenting"); + } + } + + this.handleSchematicEvent(regionName, true, RegionEventType.SOLD); + + /* Set the flags and options for the region */ + plugin.getShopManager().setRegionFlags(regionName, plugin.config().getConfigurationSection("flagsForRent"), true); + + /* Debug message */ + plugin.debug(rent.get(plugin.keyPlayer) + " has unrented " + rent.get(plugin.keyName) + ", got " + plugin.getCurrencyCharacter() + moneyBack + " money back"); + + /* Remove the player and renteduntil values */ + rent.remove(plugin.keyPlayer); + rent.remove(plugin.keyRentedUntil); + this.addRent(regionName, rent); + + /* Change the sign to [Rentable] */ + this.updateRentSign(regionName); + + this.saveRents(); + } + + /** + * Sell a buyed region, get part of the money back + * @param regionName + */ + public void unBuy(String regionName) { + regionName = regionName.toLowerCase(); + HashMap buy = buys.get(regionName); + + /* Give part of the buying price back */ + double price = Double.parseDouble(buy.get(plugin.keyPrice)); + double percentage = Integer.parseInt(plugin.config().getString("buyMoneyBack")) / 100; + double moneyBack = price * percentage; + if(moneyBack > 0) { + /* Give back the money */ + EconomyResponse r = plugin.getEconomy().depositPlayer(buy.get(plugin.keyPlayer), moneyBack); + if(!r.transactionSuccess()) { + plugin.getLogger().info("Something went wrong with paying back money while unrenting"); + } + } + + this.handleSchematicEvent(regionName, false, RegionEventType.SOLD); + + /* Set the flags and options for the region */ + plugin.getShopManager().setRegionFlags(regionName, plugin.config().getConfigurationSection("flagsForSale"), false); + + /* Debug message */ + plugin.debug(buy.get(plugin.keyPlayer) + " has sold " + buy.get(plugin.keyName) + ", got " + plugin.getCurrencyCharacter() + moneyBack + " money back"); + + /* Remove the player and buyeduntil values */ + buy.remove(plugin.keyPlayer); + this.addBuy(regionName, buy); + + /* Change the sign to [Buyable] */ + this.updateBuySign(regionName); + + this.saveBuys(); + } + + /** + * Unrent region that have no time left + */ + public void checkRents() { + /* Check if regions and signs are still present */ + Object[] rentNames = rents.keySet().toArray(); + for(int i=0; i rent = rents.get((String)rentNames[i]); + String rentedUntil = rent.get(plugin.keyRentedUntil); + if(rentedUntil != null) { + Calendar now = Calendar.getInstance(); + Calendar until = Calendar.getInstance(); + until.setTime(new Date(Long.parseLong(rent.get(plugin.keyRentedUntil)))); + if(now.after(until)) { + /* Send message to the player if online */ + Player player = Bukkit.getPlayer(rent.get(plugin.keyPlayer)); + if(player != null) { + plugin.message(player, "unrent-expired", rent.get(plugin.keyName)); + } + this.unRent(rent.get(plugin.keyName)); + } + } + } + } + + /** + * Rent a region + * @param player The player that wants to rent the region + * @param regionName The name of the region you want to rent + * @return true if it succeeded and false if not + */ + public boolean rent(Player player, String regionName) { + regionName = regionName.toLowerCase(); + HashMap rent = plugin.getShopManager().getRent(regionName); + if(rent == null) { + plugin.message(player, "rent-regionNotRentable"); + return false; + } + Block block = Bukkit.getWorld(rent.get(plugin.keyWorld)).getBlockAt(Integer.parseInt(rent.get(plugin.keyX)), Integer.parseInt(rent.get(plugin.keyY)), Integer.parseInt(rent.get(plugin.keyZ))); + + /* Check if the player has permission */ + if(player.hasPermission("areashop.rent")) { + boolean extend = player.getName().equals(rent.get(plugin.keyPlayer)); + /* Check if the region is available for renting */ + if(rent.get(plugin.keyPlayer) == null || extend) { + + if(!extend) { + /* Check if the player can still rent */ + int rentNumber = 0; + Iterator it = rents.keySet().iterator(); + while(it.hasNext()) { + if(player.getName().equals(rents.get(it.next()).get(plugin.keyPlayer))) { + rentNumber++; + } + } + int buyNumber = 0; + it = buys.keySet().iterator(); + while(it.hasNext()) { + if(player.getName().equals(buys.get(it.next()).get(plugin.keyPlayer))) { + buyNumber++; + } + } + int maximumRents = Integer.parseInt(plugin.config().getString("maximumRents")); + if(maximumRents != -1 && rentNumber >= maximumRents) { + plugin.message(player, "rent-maximum", maximumRents); + return false; + } + int maximumTotal = Integer.parseInt(plugin.config().getString("maximumTotal")); + if(maximumTotal != -1 && (rentNumber+buyNumber) >= maximumTotal) { + plugin.message(player, "total-maximum", maximumTotal); + return false; + } + } + + Double price = Double.parseDouble(rent.get(plugin.keyPrice)); + if(plugin.getEconomy().has(player.getName(), block.getWorld().getName(), price)) { + Sign sign = (Sign)block.getState(); + + /* Substract the money from the players balance */ + EconomyResponse r = plugin.getEconomy().withdrawPlayer(player.getName(), price); + if(!r.transactionSuccess()) { + plugin.message(player, "rent-payError"); + return false; + } + + /* Get the time until the region will be rented */ + Calendar calendar = Calendar.getInstance(); + if(extend) { + calendar.setTimeInMillis(Long.parseLong(rent.get(plugin.keyRentedUntil))); + } + + String duration = rent.get(plugin.keyDuration); + duration = duration.replace("month", "M"); + duration = duration.replace("months", "M"); + char durationChar = duration.charAt(duration.indexOf(' ')+1); + int durationInt = Integer.parseInt(duration.substring(0, duration.indexOf(' '))); + if(durationChar == 'm') { + calendar.add(Calendar.MINUTE, durationInt); + } else if(durationChar == 'h') { + calendar.add(Calendar.HOUR, durationInt); + } else if(durationChar == 'd') { + calendar.add(Calendar.DAY_OF_MONTH, durationInt); + } else if(durationChar == 'M') { + calendar.add(Calendar.MONTH, durationInt); + } else if(durationChar == 'y') { + calendar.add(Calendar.YEAR, durationInt); + } + SimpleDateFormat dateFull = new SimpleDateFormat("dd MMMMMMMMMMMMMMMMM yyyy HH:mm"); + + /* Add values to the rent and send it to FileManager */ + rent.put(plugin.keyRentedUntil, String.valueOf(calendar.getTimeInMillis())); + rent.put(plugin.keyPlayer, player.getName()); + plugin.getShopManager().addRent(sign.getLine(1), rent); + + this.handleSchematicEvent(regionName, true, RegionEventType.BOUGHT); + + /* Change the sign */ + this.updateRentSign(regionName); + + /* Set the flags and options for the region */ + plugin.getShopManager().setRegionFlags(regionName, plugin.config().getConfigurationSection("flagsRented"), true); + + /* Send message to the player */ + if(extend) { + plugin.message(player, "rent-extended", sign.getLine(1), dateFull.format(calendar.getTime())); + } else { + plugin.message(player, "rent-rented", sign.getLine(1), dateFull.format(calendar.getTime())); + plugin.message(player, "rent-extend"); + } + plugin.debug(player.getName() + " has rented region " + rent.get(plugin.keyName) + " for " + plugin.getCurrencyCharacter() + price + " until " + dateFull.format(calendar.getTime())); + + this.saveRents(); + return true; + } else { + /* Player has not enough money */ + if(extend) { + plugin.message(player, "rent-lowMoneyExtend", plugin.getCurrencyCharacter() + plugin.getEconomy().getBalance(player.getName(), block.getWorld().getName()), plugin.getCurrencyCharacter() + price); + } else { + plugin.message(player, "rent-lowMoneyRent", plugin.getCurrencyCharacter() + plugin.getEconomy().getBalance(player.getName(), block.getWorld().getName()), plugin.getCurrencyCharacter() + price); + } + } + } else { + plugin.message(player, "rent-someoneElse"); + } + } else { + plugin.message(player, "rent-noPermission"); + } + return false; + } + + + /** + * Buy a region + * @param player The player that wants to buy the region + * @param regionName The name of the region you want to buy + * @return true if it succeeded and false if not + */ + public boolean buy(Player player, String regionName) { + regionName = regionName.toLowerCase(); + HashMap buy = plugin.getShopManager().getBuy(regionName); + if(buy == null) { + plugin.message(player, "rent-notBuyable"); + return true; + } + Block block = Bukkit.getWorld(buy.get(plugin.keyWorld)).getBlockAt(Integer.parseInt(buy.get(plugin.keyX)), Integer.parseInt(buy.get(plugin.keyY)), Integer.parseInt(buy.get(plugin.keyZ))); + + /* Check if the player has permission */ + if(player.hasPermission("areashop.buy")) { + if(buy.get(plugin.keyPlayer) == null) { + + /* Check if the player can still buy */ + int buyNumber = 0; + Iterator it = buys.keySet().iterator(); + while(it.hasNext()) { + if(player.getName().equals(buys.get(it.next()).get(plugin.keyPlayer))) { + buyNumber++; + } + } + int rentNumber = 0; + it = rents.keySet().iterator(); + while(it.hasNext()) { + if(player.getName().equals(rents.get(it.next()).get(plugin.keyPlayer))) { + rentNumber++; + } + } + int maximumBuys = Integer.parseInt(plugin.config().getString("maximumBuys")); + if(maximumBuys != -1 && buyNumber >= maximumBuys) { + plugin.message(player, "buy-maximum", maximumBuys); + return false; + } + int maximumTotal = Integer.parseInt(plugin.config().getString("maximumTotal")); + if(maximumTotal != -1 && (rentNumber+buyNumber) >= maximumTotal) { + plugin.message(player, "total-maximum", maximumTotal); + return false; + } + + /* Check if the player has enough money */ + Double price = Double.parseDouble(buy.get(plugin.keyPrice)); + if(plugin.getEconomy().has(player.getName(), block.getWorld().getName(), price)) { + Sign sign = (Sign)block.getState(); + + /* Substract the money from the players balance */ + EconomyResponse r = plugin.getEconomy().withdrawPlayer(player.getName(), price); + if(!r.transactionSuccess()) { + plugin.message(player, "buy-payError"); + return false; + } + + /* Add values to the buy and send it to FileManager */ + buy.put(plugin.keyPlayer, player.getName()); + plugin.getShopManager().addBuy(sign.getLine(1), buy); + + this.handleSchematicEvent(regionName, false, RegionEventType.BOUGHT); + + /* Change the sign */ + this.updateBuySign(regionName); + + /* Set the flags and options for the region */ + plugin.getShopManager().setRegionFlags(regionName, plugin.config().getConfigurationSection("flagsSold"), false); + + /* Send message to the player */ + plugin.message(player, "buy-succes", sign.getLine(1)); + plugin.debug(player.getName() + " has bought region " + buy.get(plugin.keyName) + " for " + plugin.getCurrencyCharacter() + price); + + this.saveBuys(); + return true; + } else { + /* Player has not enough money */ + plugin.message(player, "buy-lowMoney", plugin.getCurrencyCharacter() + plugin.getEconomy().getBalance(player.getName(), block.getWorld().getName()), plugin.getCurrencyCharacter() + price); + } + } else { + if(player.getName().equals(buy.get(plugin.keyPlayer))) { + plugin.message(player, "buy-yours"); + } else { + plugin.message(player, "buy-someoneElse"); + } + } + } else { + plugin.message(player, "buy-noPermission"); + } + return false; + } + + /** + * Remove a rent from the list + * @param regionName + */ + public boolean removeRent(String regionName) { + regionName = regionName.toLowerCase(); + boolean result = false; + HashMap rent = rents.get(regionName); + if(rent != null) { + if(rent.get(plugin.keyPlayer) != null) { + this.unRent(regionName); + } + /* Delete the sign and the variable */ + Bukkit.getWorld(rent.get(plugin.keyWorld)).getBlockAt(Integer.parseInt(rent.get(plugin.keyX)), Integer.parseInt(rent.get(plugin.keyY)), Integer.parseInt(rent.get(plugin.keyZ))).setType(Material.AIR); + rents.remove(regionName); + this.saveRents(); + result = true; + } + return result; + } + + /** + * Remove a buy from the list + * @param regionName + */ + public boolean removeBuy(String regionName) { + regionName = regionName.toLowerCase(); + boolean result = false; + HashMap buy = buys.get(regionName); + if(buy != null) { + if(buy.get(plugin.keyPlayer) != null) { + this.unBuy(regionName); + } + /* Delete the sign and the variable */ + Bukkit.getWorld(buy.get(plugin.keyWorld)).getBlockAt(Integer.parseInt(buy.get(plugin.keyX)), Integer.parseInt(buy.get(plugin.keyY)), Integer.parseInt(buy.get(plugin.keyZ))).setType(Material.AIR); + buys.remove(regionName); + this.saveBuys(); + result = true; + } + return result; + } + + + /** + * Loads the rents from disk + * @return true if the file is read successfully, else false + */ + @SuppressWarnings("unchecked") + public boolean loadRents() { + boolean error = false; + rents.clear(); + File file = new File(rentPath); + if(file.exists()) { + /* Load all rents from file */ + try { + input = new ObjectInputStream(new FileInputStream(rentPath)); + rents = (HashMap>)input.readObject(); + input.close(); + } catch (IOException | ClassNotFoundException e) { + plugin.getLogger().info("Error: Something went wrong reading file: " + rentPath); + error = true; + } + + if(!error) { + /* Check if regions and signs are still present */ + Object[] rentNames = rents.keySet().toArray(); + for(int i=0; i rent = rents.get(name); + + /* If region is gone delete the rent and the sign */ + if(plugin.getWorldGuard().getRegionManager(Bukkit.getWorld(rent.get(plugin.keyWorld))).getRegion(name) == null) { + this.removeRent(name); + plugin.getLogger().info(name + " does not exist anymore, rent has been deleted"); + } else { + /* If the sign is gone remove the rent */ + Block block = Bukkit.getWorld(rent.get(plugin.keyWorld)).getBlockAt(Integer.parseInt(rent.get(plugin.keyX)), Integer.parseInt(rent.get(plugin.keyY)), Integer.parseInt(rent.get(plugin.keyZ))); + if(!(block.getType() == Material.WALL_SIGN || block.getType() == Material.SIGN_POST)) { + /* remove the rent */ + if(this.removeRent(name)) { + plugin.getLogger().info("Rent for " + name + " has been deleted, sign is not present"); + } + } else { + /* If the name of the region is not in the map, add it and save the file again with lowercase regionName */ + if(rent.get(plugin.keyName) == null) { + rent.put(plugin.keyName, name); + this.removeRent(name); + this.addRent(name.toLowerCase(), rent); + } + if(rent.get(plugin.keyRestore) == null) { + rent.put(plugin.keyRestore, "general"); + } + if(rent.get(plugin.keySchemProfile) == null) { + rent.put(plugin.keySchemProfile, "default"); + } + } + } + } + + /* Output info to console */ + if(rents.keySet().size() == 1) { + plugin.debug(rents.keySet().size() + " rent loaded"); + } else { + plugin.debug(rents.keySet().size() + " rents loaded"); + } + } + } else { + plugin.getLogger().info("New file for rents created, should only happen when starting for the first time"); + } + this.saveRents(); + return !error; + } + + /** + * Load the buys file from disk + * @return true if the file is read successfully, else false + */ + @SuppressWarnings("unchecked") + public boolean loadBuys() { + boolean error = false; + buys.clear(); + File file = new File(buyPath); + if(file.exists()) { + /* Load all buys from file */ + try { + input = new ObjectInputStream(new FileInputStream(buyPath)); + buys = (HashMap>)input.readObject(); + input.close(); + } catch (IOException | ClassNotFoundException e) { + plugin.getLogger().info("Error: Something went wrong reading file: " + buyPath); + error = true; + } + + if(!error) { + /* Check if regions and signs are still present */ + Object[] buyNames = buys.keySet().toArray(); + for(int i=0; i buy = buys.get(name); + + /* If region is gone delete the buy and the sign */ + if(plugin.getWorldGuard().getRegionManager(Bukkit.getWorld(buy.get(plugin.keyWorld))).getRegion(name) == null) { + this.removeBuy(name); + plugin.getLogger().info("Region '" + name + "' does not exist anymore, buy has been deleted"); + } else { + /* If the sign is gone remove the buy */ + Block block = Bukkit.getWorld(buy.get(plugin.keyWorld)).getBlockAt(Integer.parseInt(buy.get(plugin.keyX)), Integer.parseInt(buy.get(plugin.keyY)), Integer.parseInt(buy.get(plugin.keyZ))); + if(!(block.getType() == Material.WALL_SIGN || block.getType() == Material.SIGN_POST)) { + /* remove the buy */ + if(this.removeBuy(name)) { + plugin.getLogger().info("Buy for region '" + name + "' has been deleted, sign is not present"); + } + } else { + /* If the name of the region is not in the map, add it and save the file again with lowercase regionName */ + if(buy.get(plugin.keyName) == null) { + buy.put(plugin.keyName, name); + this.removeBuy(name); + this.addBuy(name.toLowerCase(), buy); + } + if(buy.get(plugin.keyRestore) == null) { + buy.put(plugin.keyRestore, "general"); + } + if(buy.get(plugin.keySchemProfile) == null) { + buy.put(plugin.keySchemProfile, "default"); + } + } + } + } + + /* Output info to console */ + if(buys.keySet().size() == 1) { + plugin.debug(buys.keySet().size() + " buy loaded"); + } else { + plugin.debug(buys.keySet().size() + " buys loaded"); + } + } + } else { + plugin.getLogger().info("New file for buys created, should only happen when starting for the first time"); + } + this.saveBuys(); + return !error; + } + + /** + * Update the sign linked to the rent + * @param regionName The region name of wich the sign has to be updated + * @return true if it succeeded, false if not + */ + public boolean updateRentSign(String regionName) { + regionName = regionName.toLowerCase(); + boolean result = false; + HashMap rent = this.getRent(regionName); + if(rent != null) { + /* Get values */ + String world = rent.get(plugin.keyWorld); + String x = rent.get(plugin.keyX); + String y = rent.get(plugin.keyY); + String z = rent.get(plugin.keyZ); + String duration = rent.get(plugin.keyDuration); + String price = rent.get(plugin.keyPrice); + String player = rent.get(plugin.keyPlayer); + String until = rent.get(plugin.keyRentedUntil); + String name = rent.get(plugin.keyName); + Block block = Bukkit.getWorld(world).getBlockAt(Integer.parseInt(x), Integer.parseInt(y), Integer.parseInt(z)); + + if(block.getType() == Material.WALL_SIGN || block.getType() == Material.SIGN_POST) { + Sign sign = (Sign)block.getState(); + if(player == null) { + /* Not rented */ + sign.setLine(0, plugin.fixColors(plugin.config().getString("signRentable"))); + sign.setLine(1, name); + sign.setLine(2, duration); + sign.setLine(3, plugin.getCurrencyCharacter() + price); + + } else { + /* Rented */ + SimpleDateFormat date = new SimpleDateFormat("dd-MM HH:mm"); + String dateString = date.format(new Date(Long.parseLong(until))); + + sign.setLine(0, plugin.fixColors(plugin.config().getString("signRented"))); + sign.setLine(1, name); + sign.setLine(2, player); + sign.setLine(3, dateString); + } + sign.update(); + result = true; + } + } + return result; + } + + /** + * Update the sign linked to the buy + * @param regionName The region name of wich the sign has to be updated + * @return true if it succeeded, false if not + */ + public boolean updateBuySign(String regionName) { + regionName = regionName.toLowerCase(); + boolean result = false; + HashMap buy = this.getBuy(regionName); + if(buy != null) { + /* Get values */ + String world = buy.get(plugin.keyWorld); + String x = buy.get(plugin.keyX); + String y = buy.get(plugin.keyY); + String z = buy.get(plugin.keyZ); + String price = buy.get(plugin.keyPrice); + String player = buy.get(plugin.keyPlayer); + String name = buy.get(plugin.keyName); + Block block = Bukkit.getWorld(world).getBlockAt(Integer.parseInt(x), Integer.parseInt(y), Integer.parseInt(z)); + + if(block.getType() == Material.WALL_SIGN || block.getType() == Material.SIGN_POST) { + Sign sign = (Sign)block.getState(); + if(player == null) { + /* Not buyed */ + sign.setLine(0, plugin.fixColors(plugin.config().getString("signBuyable"))); + sign.setLine(1, name); + sign.setLine(2, plugin.getCurrencyCharacter() + price); + + } else { + /* Buyed */ + sign.setLine(0, plugin.fixColors(plugin.config().getString("signBuyed"))); + sign.setLine(1, name); + sign.setLine(2, player); + } + sign.update(); + result = true; + } + } + return result; + } + + /** + * Update all rent signs + * @return true if all signs are updated, otherwise false + */ + public boolean updateRentSigns() { + boolean result = true; + + Object[] rentNames = rents.keySet().toArray(); + for(int i=0; i rent = this.getRent(regionName); + if(rent != null) { + if(rent.get(plugin.keyPlayer) == null) { + this.setRegionFlags(regionName, plugin.config().getConfigurationSection("flagsForRent"), true); + } else { + this.setRegionFlags(regionName, plugin.config().getConfigurationSection("flagsRented"), true); + } + } + } + + + /** + * Update all regions registered for renting + */ + public void updateRentRegions() { + Object[] rentNames = rents.keySet().toArray(); + for(int i=0; i buy = this.getBuy(regionName); + if(buy != null) { + if(buy.get(plugin.keyPlayer) == null) { + this.setRegionFlags(regionName, plugin.config().getConfigurationSection("flagsForSale"), false); + } else { + this.setRegionFlags(regionName, plugin.config().getConfigurationSection("flagsSold"), false); + } + } + } + + /** + * Update all regions registered for buying + */ + public void updateBuyRegions() { + Object[] buyNames = buys.keySet().toArray(); + for(int i=0; i flagNames = flags.getKeys(false); + WorldGuardPlugin worldGuard = plugin.getWorldGuard(); + Flag flagType = null; + Object flagValue = null; + + /* Replace tags with values, for example %player% to NLThijs48 */ + HashMap info; + if(isRent) { + info = this.getRent(regionName); + } else { + info = this.getBuy(regionName); + } + + ProtectedRegion region = plugin.getWorldGuard().getRegionManager(Bukkit.getWorld(info.get(plugin.keyWorld))).getRegion(regionName); + + String playerName = info.get(plugin.keyPlayer); + String price = plugin.getCurrencyCharacter() + info.get(plugin.keyPrice); + String duration = info.get(plugin.keyDuration); + String until = null; + if(isRent && playerName != null) { + SimpleDateFormat dateFull = new SimpleDateFormat("dd MMMMMMMMMMMMMMMMM yyyy HH:mm"); + until = dateFull.format(Long.parseLong(info.get(plugin.keyRentedUntil))); + } + + Iterator it = flagNames.iterator(); + while(it.hasNext()) { + String flagName = it.next(); + String value = flags.getString(flagName); + + if(value != null && playerName != null) { + value = value.replace(plugin.tagPlayerName, playerName); + } + if(value != null) { + value = value.replace(plugin.tagRegionName, info.get(plugin.keyName)); + } + if(value != null && price != null) { + value = value.replace(plugin.tagPrice, price); + } + if(value != null && duration != null) { + value = value.replace(plugin.tagDuration, duration); + } + if(value != null && until != null) { + value = value.replace(plugin.tagRentedUntil, until); + } + + /* Check for a couple of options or use as flag */ + if(flagName.equalsIgnoreCase("members")) { + /* Split the string and parse all values */ + String[] names = value.split("\\s*,\\s*"); + DefaultDomain members = region.getMembers(); + for(int i=0; i " + value); + } catch(NumberFormatException e) { + plugin.getLogger().info("The value of flag " + flagName + " is not a number"); + result = false; + } + } else if(flagName.equalsIgnoreCase("parent")) { + ProtectedRegion parentRegion = worldGuard.getRegionManager(Bukkit.getWorld(info.get(plugin.keyWorld))).getRegion(value); + if(parentRegion != null) { + try { + region.setParent(parentRegion); + } catch (CircularInheritanceException e) { + plugin.getLogger().info("The parent set in the config is not correct (circular inheritance)"); + } + } else { + plugin.getLogger().info("The parent set in the config is not correct (region does not exist)"); + } + } else { + flagType = null; + flagValue = null; + + try { + flagType = DefaultFlag.fuzzyMatchFlag(flagName); + if(flagType != null) { + flagValue = flagType.parseInput(worldGuard, null, value); + } + } catch (InvalidFlagFormat e) { + plugin.getLogger().info("The value of flag " + flagName + " is wrong"); + result = false; + } + if(flagValue != null && flagType != null) { + if(flagType instanceof StateFlag) { + if(value.equals("")) { + region.setFlag((StateFlag)flagType, null); + } else { + region.setFlag((StateFlag)flagType, (State)flagValue); + } + } else if(flagType instanceof BooleanFlag) { + if(value.equals("")) { + region.setFlag((BooleanFlag)flagType, null); + } else { + region.setFlag((BooleanFlag)flagType, (Boolean)flagValue); + } + } else if(flagType instanceof IntegerFlag) { + if(value.equals("")) { + region.setFlag((IntegerFlag)flagType, null); + } else { + region.setFlag((IntegerFlag)flagType, (Integer)flagValue); + } + } else if(flagType instanceof DoubleFlag) { + if(value.equals("")) { + region.setFlag((DoubleFlag)flagType, null); + } else { + region.setFlag((DoubleFlag)flagType, (Double)flagValue); + } + } else if(flagType instanceof StringFlag) { + if(value.equals("")) { + region.setFlag((StringFlag)flagType, null); + } else { + region.setFlag((StringFlag)flagType, (String)flagValue); + } + } else if(flagType instanceof SetFlag) { + if(value.equals("")) { + region.setFlag((SetFlag)flagType, null); + } else { + region.setFlag((SetFlag)flagType, (Set)flagValue); + } + } /* else if(flagType instanceof LocationFlag) { + region.setFlag((LocationFlag)flagType, (Location)flagValue); + } */ else if(flagType instanceof EnumFlag) { + if(value.equals("")) { + region.setFlag((EnumFlag)flagType, null); + } else { + region.setFlag((EnumFlag)flagType, (Enum)flagValue); + } + } else { + result = false; + } + plugin.debug("Region " + region.getId() + ", flag " + flagName + " --> " + value); + } else { + result = false; + } + } + } + + try { + worldGuard.getRegionManager(Bukkit.getWorld(info.get(plugin.keyWorld))).save(); + } catch (ProtectionDatabaseException e) { + plugin.getLogger().info("Error: regions could not be saved"); + } + return result; + } +} + + + + + + + + + + + + + + + diff --git a/AreaShop/src/nl/evolutioncoding/AreaShop/SignBreakListener.java b/AreaShop/src/nl/evolutioncoding/AreaShop/SignBreakListener.java index ca6f2b5..f988308 100644 --- a/AreaShop/src/nl/evolutioncoding/AreaShop/SignBreakListener.java +++ b/AreaShop/src/nl/evolutioncoding/AreaShop/SignBreakListener.java @@ -2,6 +2,8 @@ package nl.evolutioncoding.AreaShop; import java.util.HashMap; +import nl.evolutioncoding.AreaShop.AreaShop.RegionEventType; + import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.Sign; @@ -46,7 +48,9 @@ public final class SignBreakListener implements Listener { && rent.get(plugin.keyZ).equals(String.valueOf(block.getZ())) ) { /* Remove the rent if the player has permission */ if(event.getPlayer().hasPermission("areashop.destroyrent")) { + plugin.getShopManager().handleSchematicEvent(sign.getLine(1), true, RegionEventType.DELETED); boolean result = plugin.getShopManager().removeRent(sign.getLine(1)); + if(result) { event.getPlayer().sendMessage(plugin.fixColors(plugin.config().getString("chatPrefix")) + "Renting of the region succesfully removed"); } @@ -60,6 +64,7 @@ public final class SignBreakListener implements Listener { && buy.get(plugin.keyZ).equals(String.valueOf(block.getZ())) ) { /* Remove the buy if the player has permission */ if(event.getPlayer().hasPermission("areashop.destroybuy")) { + plugin.getShopManager().handleSchematicEvent(sign.getLine(1), false, RegionEventType.DELETED); boolean result = plugin.getShopManager().removeBuy(sign.getLine(1)); if(result) { event.getPlayer().sendMessage(plugin.fixColors(plugin.config().getString("chatPrefix")) + "Buying of the region succesfully removed"); diff --git a/AreaShop/src/nl/evolutioncoding/AreaShop/SignChangeListener.java b/AreaShop/src/nl/evolutioncoding/AreaShop/SignChangeListener.java index 78a6f1d..343041e 100644 --- a/AreaShop/src/nl/evolutioncoding/AreaShop/SignChangeListener.java +++ b/AreaShop/src/nl/evolutioncoding/AreaShop/SignChangeListener.java @@ -2,6 +2,8 @@ package nl.evolutioncoding.AreaShop; import java.util.HashMap; +import nl.evolutioncoding.AreaShop.AreaShop.RegionEventType; + import org.bukkit.entity.Player; import org.bukkit.event.Listener; import org.bukkit.event.EventHandler; @@ -95,7 +97,7 @@ public final class SignChangeListener implements Listener { event.setLine(1, regionManager.getRegion(secondLine).getId()); event.setLine(3, plugin.getCurrencyCharacter() + fourthLine); - /* Add rent to the ShopManager */ + /* Add rent to the FileManager */ HashMap rent = new HashMap(); rent.put(plugin.keyWorld, event.getBlock().getWorld().getName()); rent.put(plugin.keyX, String.valueOf(event.getBlock().getX())); @@ -104,7 +106,11 @@ public final class SignChangeListener implements Listener { rent.put(plugin.keyDuration, thirdLine); rent.put(plugin.keyPrice, fourthLine); rent.put(plugin.keyName, regionManager.getRegion(secondLine).getId()); + rent.put(plugin.keyRestore, "general"); + rent.put(plugin.keySchemProfile, "default"); + plugin.getShopManager().addRent(secondLine, rent); + plugin.getShopManager().handleSchematicEvent(secondLine, true, RegionEventType.CREATED); /* Set the flags for the region */ plugin.getShopManager().setRegionFlags(secondLine, plugin.config().getConfigurationSection("flagsForRent"), true); @@ -152,7 +158,7 @@ public final class SignChangeListener implements Listener { event.setLine(1, regionManager.getRegion(secondLine).getId()); event.setLine(2, plugin.getCurrencyCharacter() + thirdLine); - /* Add buy to the ShopManager */ + /* Add buy to the FileManager */ HashMap buy = new HashMap(); buy.put(plugin.keyWorld, event.getBlock().getWorld().getName()); buy.put(plugin.keyX, String.valueOf(event.getBlock().getX())); @@ -160,7 +166,11 @@ public final class SignChangeListener implements Listener { buy.put(plugin.keyZ, String.valueOf(event.getBlock().getZ())); buy.put(plugin.keyPrice, thirdLine); buy.put(plugin.keyName, regionManager.getRegion(secondLine).getId()); + buy.put(plugin.keyRestore, "general"); + buy.put(plugin.keySchemProfile, "default"); + plugin.getShopManager().addBuy(secondLine, buy); + plugin.getShopManager().handleSchematicEvent(secondLine, false, RegionEventType.CREATED); /* Set the flags for the region */ plugin.getShopManager().setRegionFlags(secondLine, plugin.config().getConfigurationSection("flagsForSale"), false); From 3b1522bad887660582ad9a9d493587048cefc6aa Mon Sep 17 00:00:00 2001 From: Thijs Wiefferink Date: Thu, 10 Apr 2014 22:37:55 +0200 Subject: [PATCH 2/2] Throw away trash --- .../AreaShop/AreaShop$RegionEventType.class | Bin 1624 -> 0 bytes .../nl/evolutioncoding/AreaShop/AreaShop.class | Bin 14118 -> 0 bytes .../AreaShop/CommandManager.class | Bin 11821 -> 0 bytes .../evolutioncoding/AreaShop/FileManager.class | Bin 34327 -> 0 bytes .../AreaShop/LanguageManager.class | Bin 5268 -> 0 bytes .../nl/evolutioncoding/AreaShop/RentCheck.class | Bin 722 -> 0 bytes .../AreaShop/RightClickListener.class | Bin 2955 -> 0 bytes .../AreaShop/SignBreakListener.class | Bin 5686 -> 0 bytes .../AreaShop/SignChangeListener.class | Bin 8218 -> 0 bytes 9 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 AreaShop/bin/nl/evolutioncoding/AreaShop/AreaShop$RegionEventType.class delete mode 100644 AreaShop/bin/nl/evolutioncoding/AreaShop/AreaShop.class delete mode 100644 AreaShop/bin/nl/evolutioncoding/AreaShop/CommandManager.class delete mode 100644 AreaShop/bin/nl/evolutioncoding/AreaShop/FileManager.class delete mode 100644 AreaShop/bin/nl/evolutioncoding/AreaShop/LanguageManager.class delete mode 100644 AreaShop/bin/nl/evolutioncoding/AreaShop/RentCheck.class delete mode 100644 AreaShop/bin/nl/evolutioncoding/AreaShop/RightClickListener.class delete mode 100644 AreaShop/bin/nl/evolutioncoding/AreaShop/SignBreakListener.class delete mode 100644 AreaShop/bin/nl/evolutioncoding/AreaShop/SignChangeListener.class diff --git a/AreaShop/bin/nl/evolutioncoding/AreaShop/AreaShop$RegionEventType.class b/AreaShop/bin/nl/evolutioncoding/AreaShop/AreaShop$RegionEventType.class deleted file mode 100644 index 4b8732d97057d352386d45c9b0e05380ea8d40a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1624 zcmbVMZBNrs6n?JV)@~HUsuO${QMV~hMDc}*8>6tnfP})5MZc7B9W|vTT}Q%y@W<%X zXfzT(`=gBKUM4P}iP=8v_S}2UbDrnir~UEs%RYb!ET}la@W6AkeAjndq2qgXf79_A z*+Rf=Ys=p`d>CEj4LUY=xfibO?Qj(lhJn}iuAOylDlom)HiKGRH4AIzEW>1_7t|?& zm^CY=gow?otk0L$7$Vk6g&?E5w%g(iM&(aiD-4J(mGzm+>r126LS@~w7#_XowY`?B zyN>6C(+o-~U8Uwlf0Jv7YB(+Q(Og2lnE=CC9Z8&Hh~+x@snl^|<>OoFYMiQvbwm-< zplY}%M01xDt~j}@Llq~QhHHdA zOe%d`91)hcM5#|w=^k$(fya2N;t9iG*G=y=L%ywJ3ORU_=-*VX^~^}8$dlU&Pbcy`zd=&aNQCu(!Oah|50dfD@MAW8D3iW0-<|Gczhup=LX z{5ZK!p-)OIKP+qw&`KtjD|uF~WKzm7gq?uF^TMhWN6FIzI7#(`6uqHX{9b+qs~M*h z!}x?V?=d99^AY2M3@^#>O4PV2!x0&d#*7;>yrq7lVx^5Cs}^bFl2wbgF=EwXZQQcn zBmIu>PvAEFCuO$+b)Ugy6fuTbzUgZKVd90_7V5~APq?M z^Q5pu>dF!!N%fSE`%<@f63P|Ao4|t(YL-?;S<%b~+x$qf}?i@v9hqB`2)aedJhDZtm34>)m(f8($Pe`D-nstyBiiI&2W29qTgxwsE}!LBH7*0 znd$9~rW^WWneJ%3;ezm%aKjn+S!MN^{96;rSY%lyoQyC{Z|zF-HKck^n!mZh8t<0z zEQ@sxrXp@+Dz>niBhfTdT|TjiVGpg~Iix)=Djkle zJHoMysngL+g@S`srn-8}zHmC)rEqmR1~XZMVD12$x24T^3P-Qgu~@-$2f$=>Ws*rV z-ZjviNhWj(GL5P>(X7S>dd&gr{B$}FT&-in%osgOr>WQ#HXyzAI@O?uQ<2^Vo$Aor z4&kG>B$LGIWa0)ejMzQJdsQ;ph26{o?|x}QH9)Z{79KE@I?csO`mHu3g7MX6JZ(nS z#?#T5PA36~Rbzn32Vh&c51b&o!Z=#kqD7EOCz2RG1vp95>Of+Ew2RPIB@?0?IxPaY zUv(hrbhulsK(SncrB6IpYf3~+KNZkggU+PY#l*DEpduP2t@Q@^ zNSD?|gNn&7t#b@2Awyc{8B|JT(h3_?P8HJXGHA4FnFa-@QpUOs8lzfKgT|>=uR-Hg ztIwc`s+BNkvTAKM=y=si8FYebWef_b)>eb+RcpYY8LIUugJ!GNg$B)2t&0qruUb0{ zTBur=8g!~^U2f1~)wNr_61s!#^3k1` z=MbPlchgsyD!@efNXOM3=jGL}Jh=y{QKx&Mi#ZQnLc8eeKDv)-l53{nNDaE59#D%{ zED;8#9qP(F+wt&e^wBrq{f{Jah}6Di&_ncXHF0aA+j8m?uv5#4BDTdEVi=X+rl8p3 zcbJ-*lgUJKK`^(|pju2YnhM4f=^(su3eF^$NCtbtYABWnN6bjDD*@-&m5vSgX^D zRwbS`l~(bC=`^=Mn_}Tqs&P2|QbcCbjM$9f=eI-=MxhHoWje(cUWXX#kqgdGKc`>% z=od`2hnmP?r#9$WdJdjI%+y{D)0nK@TETy1=LOI+Nc2}=JyMp^>diC!^gO*FvEVmI zZ>IfsZmgz5Z0RL~UZz(NVN{v|J@lTr8ny#=gYsW?52AbxoTzEx0|}9dGKvxtgs)7dMlB`Ww9#m>OW~Yi%}c&X8HN)BYMF{AAiC&R!6&g z(oL~wmy7TKy`VE^CA`E$KIi8GF7k09;#n^DZ9)D6Z*K4?_CfId;bh9h*kRmgi;s($ zsz=&{9A=Z8s-JbJ0PAcRT*_rgc$1mXC%cLIYaFe-wQl$mbcW_D$eFvGe$BFWO(6J^mF zB^@oY^xaC-rBY-%=J2WqpKjM@IUiU*4EkZcDAF%(VLHm2#|`vnbGh~-VYcwUsUJ_l zl%?(Ia98h&aKDu?`gj^L0GCuf3IqR=h%bqzRKi(`^UtLmOf%qLAR%kB#p`=02|R{yQUUD4f6k{_AUdJ+%GsuMeQd{>~h?g)YoUG zQmDU~7PxK44wQ!`R~ubJHj)Io=lMi~PvZGtXbXdBzMG*PSB4{ZakR0-z8ei*Xaz4g z{iZ|={@%wZ(2mY|Gljf36P5B^=hNV2+7o>yYK?fe+$uknkoq4TvH! zvkp0DCKj>s(oNBLB#3%-LD0`9^I{3}d!)6*;AUP5vkUk4o8n#ShuP4fvD02qqp&#L zfGwd))zb;J+WdsX-ms5by$TP%8ch$ti%6C3=QdvDvoE z_v`^3D&Z1d&T9-_E2%WxQarLksezBz4e!rvztj#?Gg-nNyhfMnmYOCoYg1hi zAsdR|9K(VjgM)loaX0n25(;SAO@oG{tWye zu6|NT-?3AiWRrb=g-s;GT}Y91z5xkSUm|V}IAbFA8x6jRZ-z?RVrN?7HXFfhH#cW+ z7iKoPB<~p?M*fh^=1erL^Oqo16}@5Fu~@Lv4C2lS78>#MttjF7Hg5^9k_cpZ{1t<5 z=Q|+Fh>9JG3)8WlK87q5UV|V$V(=a(PA$?#_?8K24I!(i;~Ik zfaITket_2M{4LDT1Ag^AChGE}k8ug$ayiOYfy>`9_+cJ|!h|C*IZqLu^*I}Kegwv6 zu?xqd;grtsHKk#syjXVsbODGT*=z9QjQYG3+5Rds*%wX84Qd|KtX+aBO7miSjj?{6 zpLFw-I{}?hZ7U4bMe&@QRca43XGoUj{W8Ip>>Y<=5ci@@0BKmn& zR@s4H!m;IHCAP+Oehy}0@luE@WenwKZcQmO7Ss8K?3z^fMM&P^CPNmlm$6cdmyB4P zUWIu&c$xl47^aCmLfXFt2Q{yI^bIIL9zOO6^xt8VE_5~c2LxOP8`-O{w(od#{$q9m z&*-0FpKcN`awy)(&fy+>&n?}gDb=9Pf6Yo)4T#QtVDN|hH|QK}K-8nf?Imoj6TE*I z{7?QD{6#9d9cc}2bdk=PT zGfh)oq~5+%>2fXvta~(t7~F0q6Yy1<-{9-{3|%vjfO+Y>zFIfrE&Gp!3gRH=v&S^x?82t@YH zU^s~UC5mj!x=GfxF*plRDk<4@4YgU5mq!*Rdq^h|);{Wj_Hu)^KmeOL*R!W_*i#BD zSA(?_54wipZJC#~8-9fBC&1lh$<2taO=M~wo;fZpj%?+~p0cMQi^us)IoxSj@WY(O z@rOGNMRb_cm|d+H$4|-oT@LeYWP)wG~*cx}ThustHEpR_WPgJy+EQBkJ`E zwWlbulfPzCX2hqVyqlD(P1K{>(nJ!^&duAp%zk;^#md}1*}A%8#JI_>;4>^CB3G8u zGIfix!eg`6P-)IetbUp6l&yhsw*)bwYwKY(OXSVnD)H=ajW~3+p`9bQzJ?l7CkPMO zp2#G-Ov#PmRu#g+{Z@1Q8yxijNXnD500${@u!FKcRLQ1aPWn63_bxE4~3b4O&*JpiTIsFQz(dIoJ@5% z+*wpjC(%?og=%OCM$W(iuA=GGK@D^^4zCl+*#oRN4lYe|zm(1Y}8+DjMV<@aKGk#^vL@DlovE~9_a<#dp) zV2!TgD!Q6y&}VrWUCSHkI*!u~d@rzt-Axj(}P0W0+38U+xH z;6piFG7d91`ag6buxhfp4ACg(FiEW5aty=zgq&GUgij~B4SV`BeEL`L{mt$0)^|`9 zWHpiQa+%Jgtm$xwYq1mfBA6rUJNzwzhIKrIhGre#C~NRO7jcn8T*vjp5TBJ#{Lrw( z(^+QBpZVN;;zx%ip1~5*@`*R(6Ym?AcoxqdhWPA!;vWq|yo2ZPTt&?DAm}2<>GlvL zc5Yq$5YHRp1q%wR3ZJHlVu^eCLa|UZit(Pc$sCGn`@usq^@4djlh!aaPJ3^vq0NrSNV+I=(#e6jWkx%t++xBw>V zQDB|q0xPgT3$=I-YVkaL@vm^`zlN`Uf!5P+V1h5g3%>+YdzrS;D=?>5VM?z-k>0Q* zVHpclN_k!En>X^=kcG6)f&bU6*13Eh<}0V``FxBOTBd=I$M#c$kK5|T1ja$f@v>nb zz+1qT#3acpYM-LM+DZ;ra@P=>E9xpax|@54c(dJ0?&fr^w{>0Nb_MX>*R%BI$GlO&eyyaY5 zYXg(4rG25bHm8VX)-?O^P2B-Hnm)FsK1vbWQ^T4l%S!{${~< z`60{NETiJx>qf#JIs_Y9_UImdOrxE2RGnh^goCtu9l-nYz~A?Re~<@$$_xHc9{3qA z_$M~F%AWgYF7Pgzg6V&e$KY8P2EfnfG5EC$tQh)0%1ui&c7mce8)g3#;@9*O_I7Q3jT~@%y!h`<(u7hvo(uymP zUlLCsosXq?2-^{!1ltSJr91_`=Qz5XtLd9iwkLTSKFO+~*AeL6q zXwAgC=`1`g&PKqW%WCZq1bM5AFQyO7?B=~eQ9A^y0M4-RR_5jtfk@G3@D)D3Bc zw^D^={+bWwe;IRVNGoou2cV+to-C*&3j!~#6qFLakm$`T8e62@O;Z$ua)q^v0t<@N z$Y?iRrO*{s6$$HdhxJ%D3R1$47mTVJCReqr^8Cz25 zh^011SEA^U-z!OrI2(knq^iWbp_y)!*@9wJ8D5mRZj=)RrL?Nli!$Gh(kLipRb{fk z^0DPPv7D^1L@ZWmP^q2jrduR*8R-|S%GX8d&Ec>@CUXZ02I4be9joamywe9UasscTnS2(_;SDq&>G)z~AFaqdRwCor$YJW_ zPU_(<M-E36)1 z-s1s!pFf4wUWhNqK7%j7F2Z+K7h~<0@OZwItNAi~oO1dv;90(nE9Bi;JwL3?;z4a84{4|J zqqv!SOk2%+wR8D#t%tv>_44<$e%_~T=O?ub`G?vLeoDK8pAm1x$Dmq=3$eYGrrpaE z;hC6%+Lg%mB#)b~#rX!b3TUI&s+FNth$5|0TLru#ROqGJnc8Z!Zq&wTavf9zd48bD zMbIcn@@Jad2KXSu2ecqsIv0Sp9kj(f-li>v1XJ2nK#RGNs z8vyNEKufS9HE#*Bh69>h`;_oc=_PFrS_Z#Qk7y^MRjO6eO`2TllxfF+wga@~+AN#4 zTw6|OYjUMijvZ8K>j16L`fX^1Bqw|-jXMA(L)x~Vj=}Finnp#cfNMk7O6Po9TbWdN zf|L6d%wi9w!go_0po!=rAe58;u&BTwmN|rD$w+7prh6T#EwtsIK&w`!e$|Yw^;H}J zv9pfJMNp;DxG_-WnF-aAWH*RBt8*uf&-snB;5TX=kC7`=R0jDhGRWsphyTh7uqx*b zW&zd`ATyAXD()=}?R@-|x5zO5-*sBm{{v(`y?y`y diff --git a/AreaShop/bin/nl/evolutioncoding/AreaShop/CommandManager.class b/AreaShop/bin/nl/evolutioncoding/AreaShop/CommandManager.class deleted file mode 100644 index 78a6a708a2a48550702cb2fbe6740d6b03e899bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11821 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 diff --git a/AreaShop/bin/nl/evolutioncoding/AreaShop/FileManager.class b/AreaShop/bin/nl/evolutioncoding/AreaShop/FileManager.class deleted file mode 100644 index f8d5675dc40091002886a3645f3ce35b59ed9692..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34327 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 F{}1R%eXRfh diff --git a/AreaShop/bin/nl/evolutioncoding/AreaShop/RentCheck.class b/AreaShop/bin/nl/evolutioncoding/AreaShop/RentCheck.class deleted file mode 100644 index bd87eb80c5850184260d4d30a456697ddd2e4042..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 722 zcma)4O;5r=5Pb`1r4&$5{Qe+*QAq5;lfjrM2`BUbhI=WSvQoFCwEQm<#l(X@z#nCt z7DP{k!_MwZ-g`6i+OO}APXL!FDu^+hO2^RK+IcyRd>{0YAJ=7WpncV-egS*cyPR%Vj3&$svf&OZBmC%@hQ z`BwnDaZ5poK(l2=^_h&Bb&QOa%#0gWD%xi2T4EwI6&)~A6HbR|B-3$Y+R-iDRuB+) zf(os+@5X#u8=vX$LHXKIOEhn0H5-6WCvnj(8*cM+ZUp{e+9<7FD zIQs=6;fHgH3<(4}GUIv>rC6?_5-S8s!;zs%kg*B{6#`Xp!_s@RlViF)sEwJrKy^Hm z)XX8xHsm;G3^)_Uw7||KGZzR1hn`LDjO>Pbe)fGo`9lJDZ+|+I6ub8rpjBPlx0-OE=+@C`b9q8)r z>J&UG(D*;Ns@Q~j7Br=M4Wf^?o0()DZQ( z>k_Chbn%+UbMzpwN^D0&L0Dj85l25zMFScIRt|7ogQFes?v5j)?eV^jBa7C~?-^T$ zCPWo93)J{hc#w9v2o*c=xPU_9gR@g?o!Ua$JsP*t&`grujXesU5Lo4ll%H1dB%b2> z6WyJ?qy2q}L4h^?g5_~;n7t}mT=Z~TJU%L2B+XV8`@o}7K`IG02f5T0a`Dl20Wk&7 zFprOphe#MHYZ(rpT}20;^%f_O2(jVrNPOX(Cmfr~z#TkHD7HWY3PH=jzFQ(AX--&65EJ|G|4ZH#E4JQu)=w+R9;GaI>+LOuw-$#jw(Mun<&>FZnujPCE11Y+?W8UbGKF&CO3eQy zXqK&tdS1xgmkRKdYPsq%~0ilxY9U>4Ly84b_d&TiwisE zu|wbvc721Y{O_l4i%AKa2iJWU2LkhGD?x9=_o$k~!KOJJX$dS0o@*%!1@7S%y{Yu` z;3){@re7Ma9-G7X98O-tt3Kltjdziz2c_~S%(#H#KEUh)z_|rLs}Jz%1HkJGfb}_2 z2l~EAxDwFxXI}feDyCao+U^C diff --git a/AreaShop/bin/nl/evolutioncoding/AreaShop/SignBreakListener.class b/AreaShop/bin/nl/evolutioncoding/AreaShop/SignBreakListener.class deleted file mode 100644 index 43be7eaa4ee7615f281e9d17415a89e3a00e82db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5686 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