diff --git a/src/main/java/org/ultramine/commands/CommandContext.java b/src/main/java/org/ultramine/commands/CommandContext.java index 8f17710..3a2caca 100644 --- a/src/main/java/org/ultramine/commands/CommandContext.java +++ b/src/main/java/org/ultramine/commands/CommandContext.java @@ -187,6 +187,21 @@ { broadcast(EnumChatFormatting.DARK_PURPLE, msg, args); } + + public void sendMessage(ICommandSender to, EnumChatFormatting tplColor, EnumChatFormatting argsColor, String msg, Object... args) + { + to.addChatMessage(formatMessage(tplColor, argsColor, msg, args)); + } + + public void sendMessage(ICommandSender to, EnumChatFormatting argsColor, String msg, Object... args) + { + sendMessage(to, EnumChatFormatting.GOLD, argsColor, msg, args); + } + + public void sendMessage(ICommandSender to, String msg, Object... args) + { + sendMessage(to, EnumChatFormatting.YELLOW, msg, args); + } public void throwBadUsage() { diff --git a/src/main/java/org/ultramine/economy/Account.java b/src/main/java/org/ultramine/economy/Account.java new file mode 100644 index 0000000..5019424 --- /dev/null +++ b/src/main/java/org/ultramine/economy/Account.java @@ -0,0 +1,47 @@ +package org.ultramine.economy; + +import java.util.HashMap; +import java.util.Map; + +import net.minecraft.nbt.NBTTagCompound; + +public abstract class Account +{ + protected final Map holdings = new HashMap(); + + public abstract String getName(); + + protected abstract void onHoldingsChange(Holdings holdings); + + protected abstract void onHoldingsCreate(Holdings holdings); + + public Holdings getHoldingsOf(Currency cur) + { + Holdings hlds = holdings.get(cur); + if(hlds == null) + { + hlds = new Holdings(this, cur); + onHoldingsCreate(hlds); + holdings.put(cur, hlds); + } + return hlds; + } + + public void writeToNBT(NBTTagCompound nbt) + { + for(Map.Entry ent : holdings.entrySet()) + { + nbt.setDouble(ent.getKey().getCode(), ent.getValue().getBalance()); + } + } + + public void readFromNBT(NBTTagCompound nbt) + { + for(Object code : nbt.func_150296_c()) + { + Currency cur = CurrencyRegistry.getCurrency((String)code); + if(cur != null) + holdings.put(cur, new Holdings(this, cur, nbt.getDouble((String)code))); + } + } +} diff --git a/src/main/java/org/ultramine/economy/Accounts.java b/src/main/java/org/ultramine/economy/Accounts.java new file mode 100644 index 0000000..caea8fb --- /dev/null +++ b/src/main/java/org/ultramine/economy/Accounts.java @@ -0,0 +1,22 @@ +package org.ultramine.economy; + +import org.ultramine.server.data.player.PlayerData; + +import net.minecraft.server.MinecraftServer; + +import com.mojang.authlib.GameProfile; + +public class Accounts +{ + public static Account getPlayer(GameProfile profile) + { + PlayerData data = MinecraftServer.getServer().getConfigurationManager().getDataLoader().getPlayerData(profile); + return data == null ? null : data.core().getAccount(); + } + + public static Account getPlayer(String username) + { + PlayerData data = MinecraftServer.getServer().getConfigurationManager().getDataLoader().getPlayerData(username); + return data == null ? null : data.core().getAccount(); + } +} diff --git a/src/main/java/org/ultramine/economy/Currency.java b/src/main/java/org/ultramine/economy/Currency.java new file mode 100644 index 0000000..e5ac3f4 --- /dev/null +++ b/src/main/java/org/ultramine/economy/Currency.java @@ -0,0 +1,40 @@ +package org.ultramine.economy; + +import java.text.DecimalFormat; +import java.text.NumberFormat; + +public final class Currency +{ + private static final NumberFormat dformat = new DecimalFormat("#0.##"); + + private final String code; + private final String sign; + private final String dispName; + + Currency(String code, String sign, String dispName) + { + this.code = code; + this.sign = sign; + this.dispName = dispName; + } + + public String getCode() + { + return code; + } + + public String getSign() + { + return sign; + } + + public String getDisplayName() + { + return dispName; + } + + public String format(double amount) + { + return dformat.format(amount) + sign; + } +} diff --git a/src/main/java/org/ultramine/economy/CurrencyRegistry.java b/src/main/java/org/ultramine/economy/CurrencyRegistry.java new file mode 100644 index 0000000..2b45f2c --- /dev/null +++ b/src/main/java/org/ultramine/economy/CurrencyRegistry.java @@ -0,0 +1,26 @@ +package org.ultramine.economy; + +import java.util.HashMap; +import java.util.Map; + +public final class CurrencyRegistry +{ + private static final Map currencies = new HashMap(); + + public static final Currency GSC = registerCurrency("GSC", "$", "dollar"); + + public static Currency registerCurrency(String code, String sign, String dispName) + { + code = code.toUpperCase(); + if(currencies.containsKey(code)) + throw new IllegalStateException("Currency with code "+code+" is already registered"); + Currency cur = new Currency(code, sign, dispName); + currencies.put(code, cur); + return cur; + } + + public static Currency getCurrency(String code) + { + return currencies.get(code.toUpperCase()); + } +} diff --git a/src/main/java/org/ultramine/economy/EconomyCommands.java b/src/main/java/org/ultramine/economy/EconomyCommands.java new file mode 100644 index 0000000..f908550 --- /dev/null +++ b/src/main/java/org/ultramine/economy/EconomyCommands.java @@ -0,0 +1,124 @@ +package org.ultramine.economy; + +import static net.minecraft.util.EnumChatFormatting.*; +import net.minecraft.entity.player.EntityPlayerMP; + +import org.ultramine.commands.Command; +import org.ultramine.commands.CommandContext; + +public class EconomyCommands +{ + @Command( + name = "pay", + aliases = {"mpay", "madd"}, + group = "economy", + permissions = {"command.economy.pay"}, + syntax = { + " ", + " " + } + ) + public static void pay(CommandContext ctx) + { + Currency cur = ctx.contains("currency") ? CurrencyRegistry.getCurrency(ctx.get("currency").asString()) : CurrencyRegistry.GSC; + ctx.check(cur != null, "economy.fail.currency"); + Holdings from = ctx.getSenderAsPlayer().getData().core().getAccount().getHoldingsOf(cur); + Holdings to = ctx.get("player").asPlayerData().core().getAccount().getHoldingsOf(cur); + double amount = ctx.get("amount").asDouble(); + from.transactChecked(to, amount); + ctx.sendMessage(DARK_GREEN, GREEN, "command.pay.sended", ctx.get("player").asString(), cur.format(amount)); + EntityPlayerMP maybeOnline = ctx.getServer().getConfigurationManager().getPlayerByUsername(ctx.get("player").asString()); + if(maybeOnline != null) + ctx.sendMessage(maybeOnline, DARK_GREEN, GREEN, "command.pay.received", cur.format(amount), ctx.getSenderAsPlayer().func_145748_c_()); + } + + @Command( + name = "money", + group = "economy", + permissions = {"command.economy.money", "command.economy.money.other"}, + syntax = { + "", + "", + " " + } + ) + public static void money(CommandContext ctx) + { + ctx.checkPermissionIfArg("player", "command.economy.money.other", "command.money.other.fail.perm"); + Currency cur = ctx.contains("currency") ? CurrencyRegistry.getCurrency(ctx.get("currency").asString()) :CurrencyRegistry.GSC; + ctx.check(cur != null, "economy.fail.currency"); + Holdings holdings = (ctx.contains("player") ? ctx.get("player").asPlayerData() : ctx.getSenderAsPlayer().getData()).core().getAccount().getHoldingsOf(cur); + ctx.sendMessage(DARK_GREEN, GREEN, "command.money.info", holdings.getAccount().getName(), cur.format(holdings.getBalance())); + } + + @Command( + name = "msub", + aliases = {"msubtract"}, + group = "economy", + permissions = {"command.economy.msub"}, + syntax = { + " ", + " " + } + ) + public static void msub(CommandContext ctx) + { + Currency cur = ctx.contains("currency") ? CurrencyRegistry.getCurrency(ctx.get("currency").asString()) : CurrencyRegistry.GSC; + ctx.check(cur != null, "economy.fail.currency"); + Holdings from = ctx.getSenderAsPlayer().getData().core().getAccount().getHoldingsOf(cur); + Holdings to = ctx.get("player").asPlayerData().core().getAccount().getHoldingsOf(cur); + double amount = ctx.get("amount").asDouble(); + ctx.check(amount > 0.0d, "economy.fail.negativeamount"); + to.subtract(amount); //result may be negative + from.add(amount); + ctx.sendMessage(DARK_GREEN, GREEN, "command.msub.sended", cur.format(amount), ctx.get("player").asString()); + EntityPlayerMP maybeOnline = ctx.getServer().getConfigurationManager().getPlayerByUsername(ctx.get("player").asString()); + if(maybeOnline != null) + ctx.sendMessage(maybeOnline, DARK_GREEN, GREEN, "command.msub.received", cur.format(amount)); + } + + @Command( + name = "mgive", + group = "economy", + permissions = {"command.economy.mgive"}, + syntax = { + " ", + " " + } + ) + public static void mgive(CommandContext ctx) + { + Currency cur = ctx.contains("currency") ? CurrencyRegistry.getCurrency(ctx.get("currency").asString()) : CurrencyRegistry.GSC; + ctx.check(cur != null, "economy.fail.currency"); + Holdings holdings = ctx.get("player").asPlayerData().core().getAccount().getHoldingsOf(cur); + double amount = ctx.get("amount").asDouble(); + holdings.add(amount); + ctx.sendMessage(DARK_GREEN, GREEN, "command.mgive.sended", ctx.get("player").asString(), cur.format(amount)); + EntityPlayerMP maybeOnline = ctx.getServer().getConfigurationManager().getPlayerByUsername(ctx.get("player").asString()); + if(maybeOnline != null) + ctx.sendMessage(maybeOnline, DARK_GREEN, GREEN, "command.mgive.received", cur.format(amount)); + } + + @Command( + name = "mset", + group = "economy", + permissions = {"command.economy.mset"}, + syntax = { + " ", + " " + } + ) + public static void mset(CommandContext ctx) + { + Currency cur = ctx.contains("currency") ? CurrencyRegistry.getCurrency(ctx.get("currency").asString()) : CurrencyRegistry.GSC; + ctx.check(cur != null, "economy.fail.currency"); + Holdings holdings = ctx.get("player").asPlayerData().core().getAccount().getHoldingsOf(cur); + double amount = ctx.get("amount").asDouble(); //may be negative + double last = holdings.getBalance(); + holdings.setBalance(amount); + ctx.sendMessage(DARK_GREEN, GREEN, "command.mset.sended", ctx.get("player").asString(), cur.format(last), cur.format(amount)); + EntityPlayerMP maybeOnline = ctx.getServer().getConfigurationManager().getPlayerByUsername(ctx.get("player").asString()); + if(maybeOnline != null) + ctx.sendMessage(maybeOnline, DARK_GREEN, GREEN, "command.mset.received", cur.format(last), cur.format(amount)); + } +} diff --git a/src/main/java/org/ultramine/economy/Holdings.java b/src/main/java/org/ultramine/economy/Holdings.java new file mode 100644 index 0000000..61f7175 --- /dev/null +++ b/src/main/java/org/ultramine/economy/Holdings.java @@ -0,0 +1,116 @@ +package org.ultramine.economy; + +import net.minecraft.command.CommandException; + +public class Holdings +{ + private final Account acc; + private final Currency cur; + + private double balance; + + Holdings(Account acc, Currency cur) + { + this.acc = acc; + this.cur = cur; + } + + Holdings(Account acc, Currency cur, double balance) + { + this(acc, cur); + this.balance = balance; + } + + public Account getAccount() + { + return acc; + } + + public Currency getCurrency() + { + return cur; + } + + public double getBalance() + { + return balance; + } + + void setBalanceSilently(double balance) + { + this.balance = balance; + } + + public void setBalance(double balance) + { + this.balance = balance; + acc.onHoldingsChange(this); + } + + public void add(double amount) + { + if(amount <= 0.0d) + throw new CommandException("economy.fail.negativeamount"); + this.balance += amount; + acc.onHoldingsChange(this); + } + + public void subtract(double amount) + { + if(amount <= 0.0d) + throw new CommandException("economy.fail.negativeamount"); + this.balance -= amount; + acc.onHoldingsChange(this); + } + + public void subtractChecked(double amount) + { + if((balance - amount) < 0.0d) + throw new CommandException("economy.fail.notenough"); + subtract(amount); + } + + public void divide(double amount) + { + this.balance /= amount; + acc.onHoldingsChange(this); + } + + public void multiply(double amount) + { + this.balance *= amount; + acc.onHoldingsChange(this); + } + + public boolean isNegative() + { + return this.balance < 0.0; + } + + public boolean hasEnough(double amount) + { + return amount <= this.balance; + } + + public boolean hasOver(double amount) + { + return amount < this.balance; + } + + public boolean hasUnder(double amount) + { + return amount > this.balance; + } + + public void transact(Holdings to, double amount) + { + this.subtract(amount); + to.add(amount); + } + + public void transactChecked(Holdings to, double amount) + { + this.subtractChecked(amount); + to.add(amount); + } +} diff --git a/src/main/java/org/ultramine/economy/HoldingsEvent.java b/src/main/java/org/ultramine/economy/HoldingsEvent.java new file mode 100644 index 0000000..c597163 --- /dev/null +++ b/src/main/java/org/ultramine/economy/HoldingsEvent.java @@ -0,0 +1,13 @@ +package org.ultramine.economy; + +import cpw.mods.fml.common.eventhandler.Event; + +public class HoldingsEvent extends Event +{ + public final Holdings holdings; + + protected HoldingsEvent(Holdings holdings) + { + this.holdings = holdings; + } +} diff --git a/src/main/java/org/ultramine/economy/PlayerAccount.java b/src/main/java/org/ultramine/economy/PlayerAccount.java new file mode 100644 index 0000000..74ed8ca --- /dev/null +++ b/src/main/java/org/ultramine/economy/PlayerAccount.java @@ -0,0 +1,34 @@ +package org.ultramine.economy; + +import net.minecraftforge.common.MinecraftForge; + +import org.ultramine.server.data.player.PlayerData; + +public class PlayerAccount extends Account +{ + private final PlayerData data; + + public PlayerAccount(PlayerData data) + { + this.data = data; + } + + @Override + public String getName() + { + return data.getProfile().getName(); + } + + @Override + protected void onHoldingsChange(Holdings holdings) + { + MinecraftForge.EVENT_BUS.post(new PlayerHoldingsEvent.ChangeEvent(holdings, data)); + data.save(); + } + + @Override + protected void onHoldingsCreate(Holdings holdings) + { + MinecraftForge.EVENT_BUS.post(new PlayerHoldingsEvent.CreateEvent(holdings, data)); + } +} diff --git a/src/main/java/org/ultramine/economy/PlayerHoldingsEvent.java b/src/main/java/org/ultramine/economy/PlayerHoldingsEvent.java new file mode 100644 index 0000000..09a3e76 --- /dev/null +++ b/src/main/java/org/ultramine/economy/PlayerHoldingsEvent.java @@ -0,0 +1,30 @@ +package org.ultramine.economy; + +import org.ultramine.server.data.player.PlayerData; + +public class PlayerHoldingsEvent extends HoldingsEvent +{ + public final PlayerData player; + + protected PlayerHoldingsEvent(Holdings holdings, PlayerData player) + { + super(holdings); + this.player = player; + } + + public static class CreateEvent extends PlayerHoldingsEvent + { + public CreateEvent(Holdings holdings, PlayerData player) + { + super(holdings, player); + } + } + + public static class ChangeEvent extends PlayerHoldingsEvent + { + public ChangeEvent(Holdings holdings, PlayerData player) + { + super(holdings, player); + } + } +} diff --git a/src/main/java/org/ultramine/server/UMEventHandler.java b/src/main/java/org/ultramine/server/UMEventHandler.java index a0db082..ca391ad 100644 --- a/src/main/java/org/ultramine/server/UMEventHandler.java +++ b/src/main/java/org/ultramine/server/UMEventHandler.java @@ -1,5 +1,6 @@ package org.ultramine.server; +import org.ultramine.economy.PlayerHoldingsEvent; import org.ultramine.server.UltramineServerConfig.ToolsConf.AutoBroacastConf; import org.ultramine.server.UltramineServerConfig.ToolsConf.AutoDebugInfoConf; import org.ultramine.server.chunk.ChunkProfiler; @@ -249,4 +250,11 @@ } } } + + @SideOnly(Side.SERVER) + @SubscribeEvent(priority = EventPriority.HIGH) + public void onHGoldingsCreate(PlayerHoldingsEvent.CreateEvent e) + { + e.holdings.setBalance(ConfigurationHandler.getServerConfig().tools.economy.startBalance); + } } diff --git a/src/main/java/org/ultramine/server/UltramineServerConfig.java b/src/main/java/org/ultramine/server/UltramineServerConfig.java index 3c69400..1b6ee0a 100644 --- a/src/main/java/org/ultramine/server/UltramineServerConfig.java +++ b/src/main/java/org/ultramine/server/UltramineServerConfig.java @@ -121,6 +121,7 @@ public AutoDebugInfoConf autoDebugInfo = new AutoDebugInfoConf(); public AutoBackupConf autobackup = new AutoBackupConf(); public WarpProtectionEntry[] warpProtection = new WarpProtectionEntry[0]; + public EconomyConf economy = new EconomyConf(); public static class AutoBroacastConf { @@ -157,6 +158,11 @@ public boolean mobSpawn; public boolean mobDamage; } + + public static class EconomyConf + { + public double startBalance = 30; + } } public static class DatabaseConf diff --git a/src/main/java/org/ultramine/server/UltramineServerModContainer.java b/src/main/java/org/ultramine/server/UltramineServerModContainer.java index 009b8af..1c7ef0a 100644 --- a/src/main/java/org/ultramine/server/UltramineServerModContainer.java +++ b/src/main/java/org/ultramine/server/UltramineServerModContainer.java @@ -37,6 +37,7 @@ import org.ultramine.commands.basic.TechCommands; import org.ultramine.commands.basic.VanillaCommands; import org.ultramine.commands.syntax.DefaultCompleters; +import org.ultramine.economy.EconomyCommands; import org.ultramine.permission.IPermissionManager; import org.ultramine.permission.commands.BasicPermissionCommands; import org.ultramine.server.chunk.ChunkProfiler; @@ -129,6 +130,7 @@ e.registerCommands(VanillaCommands.class); e.registerCommands(BasicCommands.class); e.registerCommands(TechCommands.class); + e.registerCommands(EconomyCommands.class); for(String perm : new String[]{ "command.help", diff --git a/src/main/java/org/ultramine/server/data/JDBCDataProvider.java b/src/main/java/org/ultramine/server/data/JDBCDataProvider.java index 15285ee..d2775d2 100644 --- a/src/main/java/org/ultramine/server/data/JDBCDataProvider.java +++ b/src/main/java/org/ultramine/server/data/JDBCDataProvider.java @@ -596,15 +596,16 @@ private PlayerData readPlayerData(NBTTagCompound nbt) { + PlayerData pdata = new PlayerData(mgr.getDataLoader()); List infos = mgr.getDataLoader().getDataExtProviders(); List data = new ArrayList(infos.size()); for(PlayerDataExtensionInfo info : infos) { - data.add(info.createFromNBT(nbt)); + data.add(info.createFromNBT(pdata, nbt)); } - - PlayerData pdata = new PlayerData(data); + + pdata.loadExtensions(data); if(nbt != null && nbt.hasKey("id") && nbt.hasKey("name")) pdata.setProfile(new GameProfile(UUID.fromString(nbt.getString("id")), nbt.getString("name"))); return pdata; diff --git a/src/main/java/org/ultramine/server/data/NBTFileDataProvider.java b/src/main/java/org/ultramine/server/data/NBTFileDataProvider.java index 1f73f5a..62d98b7 100644 --- a/src/main/java/org/ultramine/server/data/NBTFileDataProvider.java +++ b/src/main/java/org/ultramine/server/data/NBTFileDataProvider.java @@ -211,15 +211,17 @@ private PlayerData readPlayerData(NBTTagCompound nbt) { + PlayerData pdata = new PlayerData(mgr.getDataLoader()); + List infos = mgr.getDataLoader().getDataExtProviders(); List data = new ArrayList(infos.size()); for(PlayerDataExtensionInfo info : infos) { - data.add(info.createFromNBT(nbt)); + data.add(info.createFromNBT(pdata, nbt)); } - PlayerData pdata = new PlayerData(data); + pdata.loadExtensions(data); if(nbt != null && nbt.hasKey("id") && nbt.hasKey("name")) pdata.setProfile(new GameProfile(UUID.fromString(nbt.getString("id")), nbt.getString("name"))); return pdata; diff --git a/src/main/java/org/ultramine/server/data/ServerDataLoader.java b/src/main/java/org/ultramine/server/data/ServerDataLoader.java index 87f16ec..154d07d 100644 --- a/src/main/java/org/ultramine/server/data/ServerDataLoader.java +++ b/src/main/java/org/ultramine/server/data/ServerDataLoader.java @@ -147,7 +147,7 @@ for(PlayerData data : dataProvider.loadAllPlayerData()) { playerDataCache.put(data.getProfile().getId(), data); - namedPlayerDataCache.put(data.getProfile().getName(), data); + namedPlayerDataCache.put(data.getProfile().getName().toLowerCase(), data); } } @@ -230,7 +230,7 @@ { player.setData(data); playerDataCache.put(data.getProfile().getId(), data); - namedPlayerDataCache.put(data.getProfile().getName(), data); + namedPlayerDataCache.put(data.getProfile().getName().toLowerCase(), data); } else { @@ -273,6 +273,12 @@ getDataProvider().savePlayerData(player.getData()); } + public void savePlayerData(PlayerData data) + { + if(mgr.getPlayerByUsername(data.getProfile().getName()) == null) //only if offline + getDataProvider().savePlayerData(data); + } + public void syncReloadPlayer(EntityPlayerMP player) { GameProfile profile = player.getGameProfile(); @@ -288,7 +294,7 @@ { data = getDataProvider().loadPlayerData(profile); playerDataCache.put(data.getProfile().getId(), data); - namedPlayerDataCache.put(data.getProfile().getName(), data); + namedPlayerDataCache.put(data.getProfile().getName().toLowerCase(), data); } StatisticsFile stats = mgr.func_152602_a(player); if(stats == null) diff --git a/src/main/java/org/ultramine/server/data/player/PlayerCoreData.java b/src/main/java/org/ultramine/server/data/player/PlayerCoreData.java index 4b98a09..1a2f0c0 100644 --- a/src/main/java/org/ultramine/server/data/player/PlayerCoreData.java +++ b/src/main/java/org/ultramine/server/data/player/PlayerCoreData.java @@ -3,6 +3,8 @@ import java.util.HashMap; import java.util.Map; +import org.ultramine.economy.Account; +import org.ultramine.economy.PlayerAccount; import org.ultramine.server.Teleporter; import org.ultramine.server.util.WarpLocation; @@ -11,7 +13,8 @@ public class PlayerCoreData extends PlayerDataExtension { - private Map homes = new HashMap(); + private final Map homes = new HashMap(); + private final PlayerAccount account; //undatabased private Teleporter teleporter; @@ -19,6 +22,12 @@ private WarpLocation lastLocation; private String lastMessagedPlayer; + public PlayerCoreData(PlayerData data) + { + super(data); + this.account = new PlayerAccount(data); + } + public WarpLocation getHome(String name) { return homes.get(name); @@ -34,6 +43,11 @@ return homes; } + public Account getAccount() + { + return account; + } + public Teleporter getTeleporter() { return teleporter; @@ -86,6 +100,10 @@ homeList.appendTag(nbt1); } nbt.setTag("homes", homeList); + + NBTTagCompound accnbt = new NBTTagCompound(); + account.writeToNBT(accnbt); + nbt.setTag("acc", accnbt); } @Override @@ -97,5 +115,7 @@ NBTTagCompound nbt1 = homeList.getCompoundTagAt(i); homes.put(nbt1.getString("k"), WarpLocation.getFromNBT(nbt1.getCompoundTag("v"))); } + + account.readFromNBT(nbt.getCompoundTag("acc")); } } diff --git a/src/main/java/org/ultramine/server/data/player/PlayerData.java b/src/main/java/org/ultramine/server/data/player/PlayerData.java index 46f8e36..baf86d7 100644 --- a/src/main/java/org/ultramine/server/data/player/PlayerData.java +++ b/src/main/java/org/ultramine/server/data/player/PlayerData.java @@ -4,15 +4,24 @@ import java.util.List; import java.util.Map; +import org.ultramine.server.data.ServerDataLoader; + import com.mojang.authlib.GameProfile; public class PlayerData { - private GameProfile profile; + private final ServerDataLoader loader; private final Map, PlayerDataExtension> data = new HashMap, PlayerDataExtension>(); - private final PlayerCoreData coreData; + private PlayerCoreData coreData; + + private GameProfile profile; - public PlayerData(List list) + public PlayerData(ServerDataLoader loader) + { + this.loader = loader; + } + + public void loadExtensions(List list) { for(PlayerDataExtension o : list) data.put(o.getClass(), o); @@ -38,4 +47,9 @@ { return coreData; } + + public void save() + { + loader.savePlayerData(this); + } } diff --git a/src/main/java/org/ultramine/server/data/player/PlayerDataExtension.java b/src/main/java/org/ultramine/server/data/player/PlayerDataExtension.java index 90e919d..5459a7e 100644 --- a/src/main/java/org/ultramine/server/data/player/PlayerDataExtension.java +++ b/src/main/java/org/ultramine/server/data/player/PlayerDataExtension.java @@ -4,6 +4,13 @@ public abstract class PlayerDataExtension { + protected final PlayerData data; + + public PlayerDataExtension(PlayerData data) + { + this.data = data; + } + public abstract void writeToNBT(NBTTagCompound nbt); public abstract void readFromNBT(NBTTagCompound nbt); diff --git a/src/main/java/org/ultramine/server/data/player/PlayerDataExtensionInfo.java b/src/main/java/org/ultramine/server/data/player/PlayerDataExtensionInfo.java index 90aac1f..6735073 100644 --- a/src/main/java/org/ultramine/server/data/player/PlayerDataExtensionInfo.java +++ b/src/main/java/org/ultramine/server/data/player/PlayerDataExtensionInfo.java @@ -1,16 +1,27 @@ package org.ultramine.server.data.player; +import java.lang.reflect.Constructor; + import net.minecraft.nbt.NBTTagCompound; public class PlayerDataExtensionInfo { - private Class clazz; - private String nbtTagName; + private final Class clazz; + private final Constructor constructor; + private final String nbtTagName; public PlayerDataExtensionInfo(Class clazz, String nbtTagName) { this.clazz = clazz; this.nbtTagName = nbtTagName; + try + { + this.constructor = clazz.getConstructor(PlayerData.class); + } + catch(NoSuchMethodException e) + { + throw new RuntimeException("Bad PlayerDataExtension class " + clazz.getName(), e); + } } public Class getExtClass() @@ -23,11 +34,11 @@ return nbtTagName; } - private PlayerDataExtension makeNew() + private PlayerDataExtension makeNew(PlayerData pdata) { try { - return clazz.newInstance(); + return constructor.newInstance(pdata); } catch(Exception e) { @@ -35,9 +46,9 @@ } } - public PlayerDataExtension createFromNBT(NBTTagCompound nbt) + public PlayerDataExtension createFromNBT(PlayerData pdata, NBTTagCompound nbt) { - PlayerDataExtension data = makeNew(); + PlayerDataExtension data = makeNew(pdata); if(nbt != null) data.readFromNBT(nbt.getCompoundTag(nbtTagName)); return data; diff --git a/src/main/resources/assets/ultramine/lang/en_US.lang b/src/main/resources/assets/ultramine/lang/en_US.lang index bc42dcc..068abb9 100644 --- a/src/main/resources/assets/ultramine/lang/en_US.lang +++ b/src/main/resources/assets/ultramine/lang/en_US.lang @@ -70,6 +70,35 @@ command.pgroup.success.remove=Remove permission <%s> from group <%s> command.pgroup.success.meta=Set meta <%s> to <%s> for group <%s> +#Economy commands +economy.fail.currency=Specified currency is not exists +economy.fail.negativeamount=Amount must be greater than zero +economy.fail.notenough=Your account is not enough money to carry out this operation + +command.pay.usage=/pay [currency] +command.pay.description=Transfers specified amount to the account of another player +command.pay.sended=You are transferred to the account of the player %s amount of %s +command.pay.received=Received %s from the player %s + +command.money.usage=/money [player] [currency] +command.money.description=Displays information about your account or account of another player +command.money.info=On account of the player %s is %s + +command.mgive.usage=/mgive [currency] +command.mgive.description=Gives specified amount to the player's account +command.mgive.sended=Вы выдали игроку %s сумму в %s +command.mgive.received=Вам выдано %s + +command.mset.usage=/mset [currency] +command.mset.description=Sets the specified account balance for player +command.mset.sended=You has been changed balance of player %s account from %s to %s +command.mset.received=Your account balance is changed from %s to %s + +command.msub.usage=/msub [currency] +command.msub.description=Confiscates player's account specified amount +command.msub.sendedYou confiscated %s from the players account %s +command.msub.received=With your account confiscated %s + #Basic commands command.home.usage=/home [name] command.home.description=Teleports you to your home, sets with /sethome diff --git a/src/main/resources/assets/ultramine/lang/ru_RU.lang b/src/main/resources/assets/ultramine/lang/ru_RU.lang index 72812ef..67b1601 100644 --- a/src/main/resources/assets/ultramine/lang/ru_RU.lang +++ b/src/main/resources/assets/ultramine/lang/ru_RU.lang @@ -70,6 +70,35 @@ command.pgroup.success.remove=Remove permission <%s> from group <%s> command.pgroup.success.meta=Set meta <%s> to <%s> for group <%s> +#Economy commands +economy.fail.currency=Указанная валюта не существует +economy.fail.negativeamount=Сумма должна быть больше нуля +economy.fail.notenough=На вашем счету недостаточно средств для совершения данной операции + +command.pay.usage=/pay <игрок> [валюта] <сумма> +command.pay.description=Перечисляет указанную сумму на счет другого игрока +command.pay.sended=Вы перечислили на счет игрока %s сумму в %s +command.pay.received=Получено %s от игрока %s + +command.money.usage=/money [игрок] [валюта] +command.money.description=Показывает информацию о вашем счете или счете другого игрока +command.money.info=На счету игрока %s находится %s + +command.mgive.usage=/mgive <игрок> [валюта] <сумма> +command.mgive.description=Выдает игроку указанную сумму +command.mgive.sended=Вы выдали игроку %s сумму в %s +command.mgive.received=Вам выдано %s + +command.mset.usage=/mset <игрок> [валюта] <сумма> +command.mset.description=Устанавливает указанный баланс на счету игрока +command.mset.sended=Вы изменили баланс счета игрока %s с %s до %s +command.mset.received=Баланс вашего счета изменен с %s до %s + +command.msub.usage=/msub <игрок> [валюта] <сумма> +command.msub.description=Конфискует со счета игрока указанную сумму +command.msub.sended=Вы конфисковали %s со счета игрока %s +command.msub.received=С вашего счета конфисковано %s + #Basic commands command.home.usage=/home [название] command.home.description=Телепортация на точку дома, устанавливаемую командой /sethome