shops stuffs

This commit is contained in:
ZeroEpoch1969 2020-04-07 19:20:01 -07:00
parent 9485b62716
commit af935cb824
No known key found for this signature in database
GPG Key ID: A7BAB4E14F089CF3
26 changed files with 849 additions and 809 deletions

View File

@ -49,6 +49,7 @@
<orderEntry type="library" scope="PROVIDED" name="Maven: org.bukkit:bukkit:1.13-R0.1-SNAPSHOT" level="project" /> <orderEntry type="library" scope="PROVIDED" name="Maven: org.bukkit:bukkit:1.13-R0.1-SNAPSHOT" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.projectlombok:lombok:1.18.0" level="project" /> <orderEntry type="library" scope="PROVIDED" name="Maven: org.projectlombok:lombok:1.18.0" level="project" />
<orderEntry type="library" name="Maven: commons-io:commons-io:2.6" level="project" /> <orderEntry type="library" name="Maven: commons-io:commons-io:2.6" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-lang3:3.9" level="project" />
<orderEntry type="library" name="Maven: commons-codec:commons-codec:1.9" level="project" /> <orderEntry type="library" name="Maven: commons-codec:commons-codec:1.9" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.spigotmc:spigot:1.15-R0.1-SNAPSHOT" level="project" /> <orderEntry type="library" scope="PROVIDED" name="Maven: org.spigotmc:spigot:1.15-R0.1-SNAPSHOT" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.github.Pravian:Aero:5f82926" level="project" /> <orderEntry type="library" scope="PROVIDED" name="Maven: com.github.Pravian:Aero:5f82926" level="project" />
@ -80,8 +81,6 @@
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truecommons:truecommons-services:2.5.0" level="project" /> <orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truecommons:truecommons-services:2.5.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truecommons:truecommons-logging:2.5.0" level="project" /> <orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truecommons:truecommons-logging:2.5.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: javax.inject:javax.inject:1" level="project" /> <orderEntry type="library" scope="PROVIDED" name="Maven: javax.inject:javax.inject:1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.apache.httpcomponents:httpclient:4.5.10" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.apache.httpcomponents:httpcore:4.4.12" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.slf4j:jcl-over-slf4j:1.7.28" level="project" /> <orderEntry type="library" scope="PROVIDED" name="Maven: org.slf4j:jcl-over-slf4j:1.7.28" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truevfs:truevfs-driver-odf:0.12.1" level="project" /> <orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truevfs:truevfs-driver-odf:0.12.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truevfs:truevfs-comp-zipdriver:0.12.1" level="project" /> <orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truevfs:truevfs-comp-zipdriver:0.12.1" level="project" />
@ -163,5 +162,9 @@
<orderEntry type="library" scope="PROVIDED" name="Maven: org.ow2.asm:asm-tree:7.1" level="project" /> <orderEntry type="library" scope="PROVIDED" name="Maven: org.ow2.asm:asm-tree:7.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.ow2.asm:asm-analysis:7.1" level="project" /> <orderEntry type="library" scope="PROVIDED" name="Maven: org.ow2.asm:asm-analysis:7.1" level="project" />
<orderEntry type="library" name="Maven: me.rayzr522:jsonmessage:1.0.0" level="project" /> <orderEntry type="library" name="Maven: me.rayzr522:jsonmessage:1.0.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.github.vexsoftware:votifier:v1.9" level="project" />
<orderEntry type="library" name="Maven: org.apache.httpcomponents:httpclient:4.5.12" level="project" />
<orderEntry type="library" name="Maven: org.apache.httpcomponents:httpcore:4.4.13" level="project" />
<orderEntry type="library" name="Maven: commons-logging:commons-logging:1.2" level="project" />
</component> </component>
</module> </module>

View File

@ -205,6 +205,14 @@
<artifactId>jsonmessage</artifactId> <artifactId>jsonmessage</artifactId>
<version>1.0.0</version> <version>1.0.0</version>
</dependency> </dependency>
<dependency>
<groupId>com.github.vexsoftware</groupId>
<artifactId>votifier</artifactId>
<version>v1.9</version>
<scope>provided</scope>
</dependency>
</dependencies> </dependencies>
<build> <build>

View File

@ -4,12 +4,10 @@ import com.google.common.base.Strings;
import me.totalfreedom.totalfreedommod.admin.Admin; import me.totalfreedom.totalfreedommod.admin.Admin;
import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.config.ConfigEntry;
import me.totalfreedom.totalfreedommod.player.FPlayer; import me.totalfreedom.totalfreedommod.player.FPlayer;
import me.totalfreedom.totalfreedommod.playerverification.VPlayer;
import me.totalfreedom.totalfreedommod.rank.Displayable; import me.totalfreedom.totalfreedommod.rank.Displayable;
import me.totalfreedom.totalfreedommod.util.FLog; import me.totalfreedom.totalfreedommod.util.FLog;
import me.totalfreedom.totalfreedommod.util.FSync; import me.totalfreedom.totalfreedommod.util.FSync;
import me.totalfreedom.totalfreedommod.util.FUtil; import me.totalfreedom.totalfreedommod.util.FUtil;
import me.totalfreedom.totalfreedommod.admin.Admin;
import static me.totalfreedom.totalfreedommod.util.FUtil.playerMsg; import static me.totalfreedom.totalfreedommod.util.FUtil.playerMsg;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
@ -68,26 +66,12 @@ public class ChatManager extends FreedomService
return; return;
} }
if (message.equals("Connected using PickaxeChat for Android")) if (message.startsWith("Connected using PickaxeChat for "))
{ {
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
if (message.contains("nigger") || message.contains("nigga"))
{
event.setCancelled(true);
player.sendMessage(ChatColor.RED + "This is racist and therefore is prohibited.");
return;
}
if (message.contains("dyke") || message.contains("fag") || message.contains("kike"))
{
event.setCancelled(true);
player.sendMessage(ChatColor.RED + "This is homophobic and therefore is prohibited.");
return;
}
// Truncate messages that are too long - 256 characters is vanilla client max // Truncate messages that are too long - 256 characters is vanilla client max
if (message.length() > 256) if (message.length() > 256)
{ {
@ -95,7 +79,7 @@ public class ChatManager extends FreedomService
FSync.playerMsg(player, "Message was shortened because it was too long to send."); FSync.playerMsg(player, "Message was shortened because it was too long to send.");
} }
// Check for adminchat
final FPlayer fPlayer = plugin.pl.getPlayerSync(player); final FPlayer fPlayer = plugin.pl.getPlayerSync(player);
if (fPlayer.isLockedUp()) if (fPlayer.isLockedUp())
{ {
@ -103,6 +87,8 @@ public class ChatManager extends FreedomService
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
// Check for adminchat
if (fPlayer.inAdminChat()) if (fPlayer.inAdminChat())
{ {
FSync.adminChatMessage(player, message); FSync.adminChatMessage(player, message);
@ -129,7 +115,7 @@ public class ChatManager extends FreedomService
event.setMessage(message); event.setMessage(message);
// Make format // Make format
String format = "%1$s §8» §f%2$s"; String format = "%1$s §8\u00BB §f%2$s";
String tag = fPlayer.getTag(); String tag = fPlayer.getTag();
if (tag != null && !tag.isEmpty()) if (tag != null && !tag.isEmpty())
@ -233,6 +219,7 @@ public class ChatManager extends FreedomService
if (plugin.al.isAdmin(player)) if (plugin.al.isAdmin(player))
{ {
playerMsg(player, ChatColor.RED + "[REPORTS] " + ChatColor.GOLD + reporter.getName() + " has reported " + reported.getName() + " for " + report); playerMsg(player, ChatColor.RED + "[REPORTS] " + ChatColor.GOLD + reporter.getName() + " has reported " + reported.getName() + " for " + report);
FLog.info("[REPORTS] " + reporter.getName() + " has reported " + reported.getName() + " for " + report);
} }
} }
} }

View File

@ -22,6 +22,7 @@ import org.bukkit.event.block.BlockPistonExtendEvent;
import org.bukkit.event.block.BlockPistonRetractEvent; import org.bukkit.event.block.BlockPistonRetractEvent;
import org.bukkit.event.block.BlockRedstoneEvent; import org.bukkit.event.block.BlockRedstoneEvent;
import org.bukkit.event.block.LeavesDecayEvent; import org.bukkit.event.block.LeavesDecayEvent;
import org.bukkit.event.block.BlockGrowEvent;
import org.bukkit.event.entity.EntityCombustEvent; import org.bukkit.event.entity.EntityCombustEvent;
import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.EntityDeathEvent; import org.bukkit.event.entity.EntityDeathEvent;
@ -172,6 +173,12 @@ public class EventBlocker extends FreedomService
event.setCancelled(true); event.setCancelled(true);
} }
@EventHandler(priority = EventPriority.NORMAL)
public void onBlockGrowth(BlockGrowEvent event)
{
event.setCancelled(true);
}
@EventHandler(priority = EventPriority.HIGH) @EventHandler(priority = EventPriority.HIGH)
public void onFireworkExplode(FireworkExplodeEvent event) public void onFireworkExplode(FireworkExplodeEvent event)
{ {

View File

@ -49,7 +49,7 @@ public class Command_coins extends FreedomCommand
} }
} }
ShopData sd = plugin.sh.getData(p); ShopData sd = plugin.sh.getData(p);
msg(prefix + ChatColor.GREEN + (args.length > 0 ? p.getName() + " has " : "You have ") + ChatColor.RED + sd.getCoins() + ChatColor.GREEN + " coins." + " This will be in use shortly."); msg(prefix + ChatColor.GREEN + (args.length > 0 ? p.getName() + " has " : "You have ") + ChatColor.RED + sd.getCoins() + ChatColor.GREEN + " coins.");
return true; return true;
} }
} }

View File

@ -9,7 +9,7 @@ import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitRunnable;
@CommandPermissions(level = Rank.SENIOR_ADMIN, source = SourceType.BOTH) @CommandPermissions(level = Rank.OP, source = SourceType.BOTH)
@CommandParameters(description = "Makes random sounds to everyone online.", usage = "/<command>") @CommandParameters(description = "Makes random sounds to everyone online.", usage = "/<command>")
public class Command_deafen extends FreedomCommand public class Command_deafen extends FreedomCommand
{ {
@ -20,7 +20,6 @@ public class Command_deafen extends FreedomCommand
@Override @Override
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole) public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
{ {
for (final Player player : server.getOnlinePlayers())
{ {
for (double percent = 0.0; percent <= 1.0; percent += (1.0 / STEPS)) for (double percent = 0.0; percent <= 1.0; percent += (1.0 / STEPS))
{ {
@ -31,7 +30,7 @@ public class Command_deafen extends FreedomCommand
@Override @Override
public void run() public void run()
{ {
player.playSound(randomOffset(player.getLocation(), 5.0), Sound.values()[random.nextInt(Sound.values().length)], 100.0f, pitch); playerSender.playSound(randomOffset(playerSender.getLocation(), 5.0), Sound.values()[random.nextInt(Sound.values().length)], 100.0f, pitch);
} }
}.runTaskLater(plugin, Math.round(20.0 * percent * 2.0)); }.runTaskLater(plugin, Math.round(20.0 * percent * 2.0));
} }

View File

@ -9,6 +9,7 @@ import me.totalfreedom.totalfreedommod.rank.Rank;
import me.totalfreedom.totalfreedommod.util.FUtil; import me.totalfreedom.totalfreedommod.util.FUtil;
import static me.totalfreedom.totalfreedommod.util.FUtil.playerMsg; import static me.totalfreedom.totalfreedommod.util.FUtil.playerMsg;
import net.pravian.aero.util.Ips; import net.pravian.aero.util.Ips;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.GameMode; import org.bukkit.GameMode;
@ -19,14 +20,14 @@ import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.util.Vector; import org.bukkit.util.Vector;
@CommandPermissions(level = Rank.SENIOR_ADMIN, source = SourceType.ONLY_CONSOLE, blockHostConsole = true) @CommandPermissions(level = Rank.SENIOR_ADMIN, source = SourceType.ONLY_CONSOLE, blockHostConsole = true)
@CommandParameters(description = "Sends the specified player to their doom.", usage = "/<command> <playername>") @CommandParameters(description = "Sends the specified player to their doom.", usage = "/<command> <playername> [reason]")
public class Command_doom extends FreedomCommand public class Command_doom extends FreedomCommand
{ {
@Override @Override
public boolean run(final CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole) public boolean run(final CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
{ {
if (args.length != 1) if (args.length == 0)
{ {
return false; return false;
} }
@ -89,8 +90,17 @@ public class Command_doom extends FreedomCommand
// Shoot the player in the sky // Shoot the player in the sky
player.setVelocity(player.getVelocity().clone().add(new Vector(0, 20, 0))); player.setVelocity(player.getVelocity().clone().add(new Vector(0, 20, 0)));
String reason = null;
if (args.length > 1)
{
reason = StringUtils.join(ArrayUtils.subarray(args, 1, args.length - 1), " ");
}
final String kickReason = (reason == null ? "FUCKOFF, and get your shit together!" : reason);
// Log doom // Log doom
plugin.pul.logPunishment(new Punishment(player.getName(), Ips.getIp(player), sender.getName(), PunishmentType.DOOM, null)); plugin.pul.logPunishment(new Punishment(player.getName(), Ips.getIp(player), sender.getName(), PunishmentType.DOOM, reason));
new BukkitRunnable() new BukkitRunnable()
{ {
@ -115,10 +125,10 @@ public class Command_doom extends FreedomCommand
msg(sender, player.getName() + " has been banned and IP is: " + ip); msg(sender, player.getName() + " has been banned and IP is: " + ip);
// generate explosion // generate explosion
player.getWorld().createExplosion(player.getLocation(), 0F, false); player.getWorld().createExplosion(player.getLocation(), 0F, false);;
// kick player // kick player
player.kickPlayer(ChatColor.RED + "FUCKOFF, and get your shit together!"); player.kickPlayer(ChatColor.RED + kickReason);
} }
}.runTaskLater(plugin, 3L * 20L); }.runTaskLater(plugin, 3L * 20L);

View File

@ -0,0 +1,29 @@
package me.totalfreedom.totalfreedommod.command;
import me.totalfreedom.totalfreedommod.rank.Rank;
import me.totalfreedom.totalfreedommod.shop.ShopItem;
import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@CommandPermissions(level = Rank.OP, source = SourceType.ONLY_IN_GAME)
@CommandParameters(description = "Obtain a fire ball", usage = "/<command>")
public class Command_fireball extends FreedomCommand
{
@Override
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
{
if (plugin.sh.getData(playerSender).hasItem(ShopItem.FIRE_BALL))
{
playerSender.getInventory().addItem(plugin.sh.getFireBall());
msg("You have been given a Fire Ball", ChatColor.GREEN);
}
else
{
msg("You do not own a Fire Ball! Purchase one from the shop.", ChatColor.RED);
}
return true;
}
}

View File

@ -0,0 +1,29 @@
package me.totalfreedom.totalfreedommod.command;
import me.totalfreedom.totalfreedommod.rank.Rank;
import me.totalfreedom.totalfreedommod.shop.ShopItem;
import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@CommandPermissions(level = Rank.OP, source = SourceType.ONLY_IN_GAME)
@CommandParameters(description = "Obtain a grappling hook", usage = "/<command>")
public class Command_grapplinghook extends FreedomCommand
{
@Override
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
{
if (plugin.sh.getData(playerSender).hasItem(ShopItem.GRAPPLING_HOOK))
{
playerSender.getInventory().addItem(plugin.sh.getGrapplingHook());
msg("You have been given a Grappling Hook", ChatColor.GREEN);
}
else
{
msg("You do not own a Grappling Hook! Purchase one from the shop.", ChatColor.RED);
}
return true;
}
}

View File

@ -1,69 +0,0 @@
package me.totalfreedom.totalfreedommod.command;
import me.totalfreedom.totalfreedommod.rank.Rank;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.util.Vector;
import java.util.Random;
@CommandPermissions(level = Rank.OP, source = SourceType.ONLY_IN_GAME)
@CommandParameters(description = "i dont fucking know, what even", usage = "thot if you dont know what this does then dont use it")
public class Command_idfk extends FreedomCommand
{
public static final String[] DRUNK_LINES = new String[]{"i is thy best bitch in teh world xD xD xD",
"ooga boga ooga boga ooga boga ooga boga", "jake u dog fukr", "nero is a nice black pussy",
"robin has a perfect penis", "ABABABABABABABABABA ABAOBOABOBA", "agge is a fuckin egg",
"explosive errors == explosive arrows", "sync; echo 3 > /proc/sys/vm/drop_caches", "yeet",
"si", "bubble bass thicc :weary::sweat_drops: :ok_hand:", "diabeetus", "McDiabeto", "oh",
"say heck to diabetes im having chocolate cake"};
private static final Random random = new Random();
@Override
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
{
if (args.length == 0)
{
return false;
}
switch (args[0])
{
case "killmepls":
playerSender.setHealth(0);
msg("ok u wanted die u now die");
break;
case "robin":
msg("robin is a meme xD xD xD");
break;
case "succ":
playerSender.chat("mmmmm *suckle* *suckle* daddy");
break;
case "drunk":
msg(DRUNK_LINES[random.nextInt(DRUNK_LINES.length)]);
break;
case "zero":
msg("WATCH ZERO KARA HAJIMERU MAHOU NO SHO (GRIMOIRE OF ZERO) TODAY! https://kissanime.ru/anime/zero-kara-hajimeru-mahou-no-sho");
break;
case "boom":
msg("allahu akbar bitch");
playerSender.getWorld().createExplosion(playerSender.getLocation(), 0F);
break;
case "rocket":
playerSender.setVelocity(new Vector(0, 1000, 0));
msg("*insert shooting stars meme here*");
break;
case "fuck":
playerSender.chat("wow robin is gay xdxdxd");
msg("i tried");
msg("and as in i tried as in robin tried to code this in");
msg("lol xd");
break;
default:
return false;
}
return true;
}
}

View File

@ -0,0 +1,29 @@
package me.totalfreedom.totalfreedommod.command;
import me.totalfreedom.totalfreedommod.rank.Rank;
import me.totalfreedom.totalfreedommod.shop.ShopItem;
import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@CommandPermissions(level = Rank.OP, source = SourceType.ONLY_IN_GAME)
@CommandParameters(description = "Obtain a lightning rod", usage = "/<command>")
public class Command_lightningrod extends FreedomCommand
{
@Override
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
{
if (plugin.sh.getData(playerSender).hasItem(ShopItem.LIGHTNING_ROD))
{
playerSender.getInventory().addItem(plugin.sh.getLightningRod());
msg("You have been given a Lightning Rod", ChatColor.GREEN);
}
else
{
msg("You do not own a Lightning Rod! Purchase one from the shop.", ChatColor.RED);
}
return true;
}
}

View File

@ -1,212 +1,200 @@
package me.totalfreedom.totalfreedommod.command; package me.totalfreedom.totalfreedommod.command;
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
import me.totalfreedom.totalfreedommod.rank.Rank; import me.totalfreedom.totalfreedommod.rank.Rank;
import me.totalfreedom.totalfreedommod.shop.ShopData; import me.totalfreedom.totalfreedommod.shop.ShopData;
import me.totalfreedom.totalfreedommod.shop.ShopItem; import me.totalfreedom.totalfreedommod.shop.ShopItem;
import me.totalfreedom.totalfreedommod.util.FUtil; import org.apache.commons.lang.StringUtils;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@CommandPermissions(level = Rank.SENIOR_ADMIN, source = SourceType.ONLY_CONSOLE) @CommandPermissions(level = Rank.SENIOR_ADMIN, source = SourceType.ONLY_CONSOLE)
@CommandParameters(description = "Manage the shop", usage = "/<command> <coins: <add | set | remove> <amount> <player | all> | items: <give | remove> <player> <item>>", aliases = "ms") @CommandParameters(description = "Manage the shop", usage = "/<command> <coins: <add | set | remove> <amount> <player | all> | items: <give | take> <item> <player>", aliases = "ms")
public class Command_manageshop extends FreedomCommand public class Command_manageshop extends FreedomCommand
{ {
@Override @Override
public boolean run(final CommandSender sender, final Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole) public boolean run(final CommandSender sender, final Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
{ {
final String prefix = FUtil.colorize(ConfigEntry.SHOP_PREFIX.getString() + " "); if (args.length < 2)
if (args.length > 3)
{ {
if (args[0].equalsIgnoreCase("coins")) return false;
}
if (args[0].equals("coins"))
{
if (args.length < 4)
{ {
if (getPlayer(args[3]) != null || args[3].equals("all")) return false;
{ }
Player p = null; switch (args[1])
ShopData sd = null; {
if (!args[3].equals("all"))
case "add":
try
{ {
p = getPlayer(args[3]); int amount = Math.max(0, Math.min(1000000, Integer.parseInt(args[2])));
sd = plugin.sh.getData(p); if (!args[3].equals("all"))
{
Player player = getPlayer(args[3]);
if (player == null)
{
msg(PLAYER_NOT_FOUND);
return true;
}
ShopData shopData = plugin.sh.getData(player);
shopData.setCoins(shopData.getCoins() + amount);
plugin.sh.save(shopData);
msg("Successfully added " + amount + " coins to " + player.getName() + ". Their new balance is " + shopData.getCoins(), ChatColor.GREEN);
player.sendMessage(ChatColor.GREEN + sender.getName() + " gave you " + amount + " coins. Your new balance is " + shopData.getCoins());
return true;
}
else
{
for (Player player : server.getOnlinePlayers())
{
ShopData shopData = plugin.sh.getData(player);
shopData.setCoins(shopData.getCoins() + amount);
plugin.sh.save(shopData);
player.sendMessage(ChatColor.GREEN + sender.getName() + " gave you " + amount + " coins. Your new balance is " + shopData.getCoins());
}
msg("Successfully added " + amount + " coins to all online players.", ChatColor.GREEN);
return true;
}
} }
int newAmount; catch (NumberFormatException ex)
int num;
switch (args[1])
{ {
case "add": msg("Invalid number: " + args[2], ChatColor.RED);
try return true;
{
num = Math.max(0, Math.min(1000000, Integer.parseInt(args[2])));
if (!args[3].equals("all"))
{
newAmount = sd.getCoins() + num;
sd.setCoins(newAmount);
plugin.sh.save(sd);
msg(prefix + ChatColor.GREEN + "Gave " + ChatColor.RED + args[2] + ChatColor.GREEN + " coins to " + p.getName() + ", " + p.getName() + " now has " + ChatColor.RED + sd.getCoins() + ChatColor.GREEN + " coins.");
p.sendMessage(prefix + ChatColor.GREEN + sender.getName() + " gave you " + ChatColor.RED + args[2] + ChatColor.GREEN + " coins, you now have " + ChatColor.RED + sd.getCoins() + ChatColor.GREEN + " coins.");
return true;
}
else
{
for (Player player : server.getOnlinePlayers())
{
sd = plugin.sh.getData(player);
newAmount = sd.getCoins() + num;
sd.setCoins(newAmount);
plugin.sh.save(sd);
player.sendMessage(prefix + ChatColor.GREEN + sender.getName() + " gave you " + ChatColor.RED + args[2] + ChatColor.GREEN + " coins, you now have " + ChatColor.RED + sd.getCoins() + ChatColor.GREEN + " coins.");
}
msg(prefix + ChatColor.GREEN + "Gave " + ChatColor.RED + args[2] + ChatColor.GREEN + " coins to everyone.");
return true;
}
}
catch (NumberFormatException ex)
{
msg("Invalid number: " + args[2], ChatColor.RED);
return true;
}
case "set":
try
{
newAmount = Math.max(0, Math.min(1000000, Integer.parseInt(args[2])));
if (!args[3].equals("all"))
{
sd.setCoins(newAmount);
plugin.sh.save(sd);
msg(prefix + ChatColor.GREEN + "Set " + p.getName() + "'s coin amount to " + ChatColor.RED + newAmount + ChatColor.GREEN + ".");
p.sendMessage(prefix + ChatColor.GREEN + sender.getName() + " set your coin amount to " + args[2] + ChatColor.GREEN + ".");
return true;
}
else
{
newAmount = Math.max(0, Math.min(1000000, Integer.parseInt(args[2])));
for (Player player : server.getOnlinePlayers())
{
sd = plugin.sh.getData(player);
sd.setCoins(newAmount);
plugin.sh.save(sd);
player.sendMessage(prefix + ChatColor.GREEN + sender.getName() + " set your coin amount to " + args[2] + ChatColor.GREEN + ".");
}
msg(prefix + ChatColor.GREEN + "Set everyones's coin amount to " + ChatColor.RED + newAmount + ChatColor.GREEN + ".");
return true;
}
}
catch (NumberFormatException ex)
{
msg("Invalid number: " + args[2], ChatColor.RED);
return true;
}
case "remove":
try
{
num = Math.max(0, Math.min(1000000, Integer.parseInt(args[2])));
if (!args[3].equals("all"))
{
if (num > sd.getCoins())
{
msg(prefix + "You can't give a player a negative amount of coins, I'm sorry, you can't put anyone in debt.", ChatColor.RED);
return true;
}
newAmount = sd.getCoins() - num;
sd.setCoins(newAmount);
plugin.sh.save(sd);
msg(prefix + ChatColor.GREEN + "Took " + ChatColor.RED + args[2] + ChatColor.GREEN + " coins from " + p.getName() + ", " + p.getName() + " now has " + ChatColor.RED + sd.getCoins() + ChatColor.GREEN + " coins.");
p.sendMessage(prefix + ChatColor.GREEN + sender.getName() + " took " + ChatColor.RED + args[2] + ChatColor.GREEN + " coins from you, you now have " + ChatColor.RED + sd.getCoins() + ChatColor.GREEN + " coins.");
return true;
}
else
{
for (Player player : server.getOnlinePlayers())
{
sd = plugin.sh.getData(player);
if (num > sd.getCoins())
{
sd.setCoins(0);
}
newAmount = sd.getCoins() - num;
sd.setCoins(newAmount);
plugin.sh.save(sd);
player.sendMessage(prefix + ChatColor.GREEN + sender.getName() + " took " + ChatColor.RED + args[2] + ChatColor.GREEN + " coins from you, you now have " + ChatColor.RED + sd.getCoins() + ChatColor.GREEN + " coins.");
}
msg(prefix + ChatColor.GREEN + "Took " + ChatColor.RED + args[2] + ChatColor.GREEN + " coins from everyone.");
return true;
}
}
catch (NumberFormatException ex)
{
msg("Invalid number: " + args[2], ChatColor.RED);
return true;
}
default:
break;
} }
} case "remove":
else try
{
int amount = Math.max(0, Math.min(1000000, Integer.parseInt(args[2])));
if (!args[3].equals("all"))
{
Player player = getPlayer(args[3]);
if (player == null)
{
msg(PLAYER_NOT_FOUND);
return true;
}
ShopData shopData = plugin.sh.getData(player);
shopData.setCoins(shopData.getCoins() + amount);
if (shopData.getCoins() < 0)
{
shopData.setCoins(0);
}
plugin.sh.save(shopData);
msg("Successfully removed " + amount + " coins from " + player.getName() + ". Their new balance is " + shopData.getCoins(), ChatColor.GREEN);
player.sendMessage(ChatColor.RED + sender.getName() + " took " + amount + " coins from you. Your new balance is " + shopData.getCoins());
return true;
}
else
{
for (Player player : server.getOnlinePlayers())
{
ShopData shopData = plugin.sh.getData(player);
shopData.setCoins(shopData.getCoins() - amount);
if (shopData.getCoins() < 0)
{
shopData.setCoins(0);
}
plugin.sh.save(shopData);
player.sendMessage(ChatColor.RED + sender.getName() + " took " + amount + " coins from you. Your new balance is " + shopData.getCoins());
}
msg("Successfully took " + amount + " coins from all online players.", ChatColor.GREEN);
return true;
}
}
catch (NumberFormatException ex)
{
msg("Invalid number: " + args[2], ChatColor.RED);
return true;
}
case "set":
try
{
int amount = Math.max(0, Math.min(1000000, Integer.parseInt(args[2])));
Player player = getPlayer(args[3]);
if (player == null)
{
msg(PLAYER_NOT_FOUND);
return true;
}
ShopData shopData = plugin.sh.getData(player);
shopData.setCoins(amount);
plugin.sh.save(shopData);
msg("Successfully set " + player.getName() + "'s coins to " + amount, ChatColor.GREEN);
player.sendMessage(ChatColor.GREEN + sender.getName() + " set your coin balance to " + amount);
return true;
}
catch (NumberFormatException ex)
{
msg("Invalid number: " + args[2], ChatColor.RED);
return true;
}
}
}
else if (args[0].equals("items"))
{
if (args[1].equals("list"))
{
msg("List of all shop items: " + StringUtils.join(ShopItem.values(), ", "));
return true;
}
if (args.length < 4)
{
return false;
}
if (args[1].equals("give"))
{
ShopItem item = ShopItem.findItem(args[2].toUpperCase());
if (item == null)
{ {
msg(FreedomCommand.PLAYER_NOT_FOUND); msg(args[2] + " is not a valid item.", ChatColor.RED);
return true; return true;
} }
}
if (args[0].equalsIgnoreCase("items")) Player player = getPlayer(args[3]);
{ if (player == null)
switch (args[1])
{ {
case "give": msg(PLAYER_NOT_FOUND);
{ return true;
Player player = Bukkit.getPlayer(args[2]);
if (player == null)
{
msg(FreedomCommand.PLAYER_NOT_FOUND);
return true;
}
ShopItem item = ShopItem.findItem(args[3]);
if (item == null)
{
msg("Invalid item: " + item);
return true;
}
ShopData sd = plugin.sh.getData(player);
if (sd.hasItem(item))
{
msg("That player already has a(n) " + item.getName() + "!");
return true;
}
String key = sd.giveItem(item);
plugin.sh.save(sd);
FUtil.give(player, item, ChatColor.DARK_GRAY + key);
msg(prefix + ChatColor.GREEN + "Gave " + ChatColor.RED + player.getName() + ChatColor.GREEN + " a(n) " + item.getColoredName());
return true;
}
case "remove":
{
Player player = Bukkit.getPlayer(args[2]);
if (player == null)
{
msg(FreedomCommand.PLAYER_NOT_FOUND);
return true;
}
ShopItem item = ShopItem.findItem(args[3]);
if (item == null)
{
msg("Invalid item: " + item);
return true;
}
ShopData sd = plugin.sh.getData(player);
if (!sd.hasItem(item))
{
msg("That player doesn't have a(n) " + item.getName() + "!");
return true;
}
sd.takeItem(item);
plugin.sh.save(sd);
msg(prefix + ChatColor.GREEN + "Took " + ChatColor.RED + player.getName() + ChatColor.GREEN + "'s " + item.getColoredName());
return true;
}
} }
ShopData shopData = plugin.sh.getData(player);
shopData.giveItem(item);
plugin.sh.save(shopData);
msg("Successfully gave the " + item.getName() + " to " + player.getName(), ChatColor.GREEN);
player.sendMessage(ChatColor.GREEN + sender.getName() + " gave the " + item.getName() + " to you");
return true;
} }
else if (args[1].equals("take"))
{
ShopItem item = ShopItem.findItem(args[2].toUpperCase());
if (item == null)
{
msg(args[2] + " is not a valid item.", ChatColor.RED);
return true;
}
Player player = getPlayer(args[3]);
if (player == null)
{
msg(PLAYER_NOT_FOUND);
return true;
}
ShopData shopData = plugin.sh.getData(player);
shopData.removeItem(item);
plugin.sh.save(shopData);
msg("Successfully took the " + item.getName() + " from " + player.getName(), ChatColor.GREEN);
player.sendMessage(ChatColor.RED + sender.getName() + " took the " + item.getName() + " from you");
return true;
}
} }
return false; return false;
} }

View File

@ -104,13 +104,19 @@ public class Command_ride extends FreedomCommand
return true; return true;
} }
if (player.getName().equals("Catholic_Mario"))
{
msg("no", ChatColor.RED);
return true;
}
if (vPlayer.getRideMode().equals("ask") && !isAdmin(sender)) if (vPlayer.getRideMode().equals("ask") && !isAdmin(sender))
{ {
msg("Sent a request to the player."); msg("Sent a request to the player.", ChatColor.GREEN);
player.sendMessage(ChatColor.GRAY + sender.getName() + " has requested to ride you."); player.sendMessage(ChatColor.AQUA + sender.getName() + " has requested to ride you.");
player.sendMessage(ChatColor.GRAY + "Type " + ChatColor.DARK_GRAY + "/ride accept" + ChatColor.GRAY + " to allow the player to ride you."); player.sendMessage(ChatColor.AQUA + "Type " + ChatColor.GREEN + "/ride accept" + ChatColor.AQUA + " to allow the player to ride you.");
player.sendMessage(ChatColor.GRAY + "Type " + ChatColor.DARK_GRAY + "/ride deny" + ChatColor.GRAY + " to deny the player permission."); player.sendMessage(ChatColor.AQUA + "Type " + ChatColor.RED + "/ride deny" + ChatColor.AQUA + " to deny the player permission.");
player.sendMessage(ChatColor.GRAY + "Request will expire after 30 seconds."); player.sendMessage(ChatColor.AQUA + "Request will expire after 30 seconds.");
RIDE_REQUESTS.put(player, playerSender); RIDE_REQUESTS.put(player, playerSender);
FreedomCommandExecutor.timer.schedule(new TimerTask() FreedomCommandExecutor.timer.schedule(new TimerTask()
{ {
@ -122,8 +128,8 @@ public class Command_ride extends FreedomCommand
return; return;
} }
RIDE_REQUESTS.remove(player); RIDE_REQUESTS.remove(player);
msg("Request expired."); msg("Request expired.", ChatColor.RED);
player.sendMessage(ChatColor.GRAY + "Request expired."); player.sendMessage(ChatColor.RED + "Request expired.");
} }
}, 30000); }, 30000);
return true; return true;

View File

@ -0,0 +1,29 @@
package me.totalfreedom.totalfreedommod.command;
import me.totalfreedom.totalfreedommod.rank.Rank;
import me.totalfreedom.totalfreedommod.shop.ShopItem;
import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@CommandPermissions(level = Rank.OP, source = SourceType.ONLY_IN_GAME)
@CommandParameters(description = "Obtain a rideable ender pearl", usage = "/<command>")
public class Command_rideablepearl extends FreedomCommand
{
@Override
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
{
if (plugin.sh.getData(playerSender).hasItem(ShopItem.RIDEABLE_PEARL))
{
playerSender.getInventory().addItem(plugin.sh.getRideablePearl());
msg("You have been given a Rideable Ender Pearl", ChatColor.GREEN);
}
else
{
msg("You do not own a Rideable Ender Pearl! Purchase one from the shop.", ChatColor.RED);
}
return true;
}
}

View File

@ -1,175 +1,26 @@
package me.totalfreedom.totalfreedommod.command; package me.totalfreedom.totalfreedommod.command;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
import me.totalfreedom.totalfreedommod.rank.Rank; import me.totalfreedom.totalfreedommod.rank.Rank;
import me.totalfreedom.totalfreedommod.shop.ShopData; import me.totalfreedom.totalfreedommod.config.ConfigEntry;
import me.totalfreedom.totalfreedommod.shop.ShopItem;
import me.totalfreedom.totalfreedommod.util.FUtil;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.scheduler.BukkitRunnable;
@CommandPermissions(level = Rank.OP, source = SourceType.ONLY_IN_GAME) @CommandPermissions(level = Rank.OP, source = SourceType.ONLY_IN_GAME)
@CommandParameters(description = "Access the shop - this will be much simplified in the future.", usage = "/<command> <buy <item> | action | list>") @CommandParameters(description = "Open the shop GUI", usage = "/<command>", aliases = "sh")
public class Command_shop extends FreedomCommand public class Command_shop extends FreedomCommand
{ {
private final List<String> locations = Arrays.asList("Sofa", "Car", "Bed", "Kitchen", "Garage", "Basement", "Home Study");
private Map<CommandSender, String> featureCooldown = new HashMap<>();
@Override @Override
public boolean run(final CommandSender sender, final Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole) public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
{ {
if (!ConfigEntry.SHOP_ENABLED.getBoolean()) if (!ConfigEntry.SHOP_ENABLED.getBoolean())
{ {
msg("The shop is currently disabled!", ChatColor.RED); msg("The shop is currently disabled!", ChatColor.RED);
return true; return true;
} }
final String prefix = FUtil.colorize(ConfigEntry.SHOP_PREFIX.getString() + " "); playerSender.openInventory(plugin.sh.generateShopGUI(plugin.sh.getData(playerSender)));
ShopData sd = plugin.sh.getData(playerSender); return true;
if (args.length == 0)
{
msg(prefix + ChatColor.GREEN + "Balance: " + ChatColor.RED + sd.getCoins());
return true;
}
if (args.length == 1)
{
if (featureCooldown.containsKey(sender) && featureCooldown.containsValue(args[0]))
{
msg("You're on cooldown for this feature.", ChatColor.RED);
return true;
}
Random r = new Random();
switch (args[0])
{
case "daily":
{
sd.setCoins(sd.getCoins() + 100);
plugin.sh.save(sd);
msg(prefix + ChatColor.GREEN + "You received your 100 coins!");
cooldown(86400, sender, args[0]);
return true;
}
case "search":
{
int amount = FUtil.random(5, 10);
String location = locations.get(r.nextInt(locations.size()));
sd.setCoins(sd.getCoins() + amount);
plugin.sh.save(sd);
msg(prefix + ChatColor.AQUA + location + ChatColor.GREEN + " - Found " + ChatColor.RED + amount + ChatColor.GREEN + " coins!");
cooldown(30, sender, args[0]);
return true;
}
case "list":
case "items":
{
msg(prefix + ChatColor.GREEN + "Available items:");
for (ShopItem item : ShopItem.values())
{
if (!item.isPurchaseable())
{
continue;
}
msg(prefix + ChatColor.AQUA + item.getName() + ChatColor.GREEN + " - " + ChatColor.RED + item.getCost());
}
return true;
}
}
Player player = getPlayer(args[0]);
if (player == null)
{
msg(PLAYER_NOT_FOUND);
return true;
}
ShopData psd = plugin.sh.getData(player);
msg(prefix + ChatColor.AQUA + player.getName() + ChatColor.GREEN + "'s balance: " + ChatColor.RED + psd.getCoins());
return true;
}
if (args.length != 2)
{
return false;
}
switch (args[0])
{
case "buy":
{
ShopItem item = ShopItem.findItem(args[1]);
if (item == null || !item.isPurchaseable())
{
msg("Invalid item: " + item);
return true;
}
if (sd.hasItem(item))
{
msg(prefix + ChatColor.GREEN + "You already have that item! To get it, use " + ChatColor.RED + "/shop get " + item.name() + ChatColor.GREEN + "!");
return true;
}
if (item.getCost() > sd.getCoins())
{
msg(prefix + ChatColor.GREEN + "You don't have enough money for this item!");
return true;
}
String signature = sd.giveItem(item);
sd.setCoins(sd.getCoins() - item.getCost());
plugin.sh.save(sd);
ItemStack stack = new ItemStack(item.getMaterial(), 1);
ItemMeta meta = stack.getItemMeta();
meta.setDisplayName(item.getColoredName());
List<String> lore = new ArrayList<>();
lore.add(ChatColor.DARK_GRAY + signature);
meta.setLore(lore);
stack.setItemMeta(meta);
Inventory inv = playerSender.getInventory();
inv.setItem(inv.firstEmpty(), stack);
msg(prefix + ChatColor.GREEN + "You bought a " + item.getColoredName() + ChatColor.GREEN + "!");
return true;
}
case "get":
{
ShopItem item = ShopItem.findItem(args[1]);
if (item == null)
{
msg("Invalid item: " + item);
return true;
}
if (!sd.hasItem(item))
{
msg(prefix + ChatColor.GREEN + "You don't have that item! To buy it, use " + ChatColor.RED + "/shop buy " + item.name() + ChatColor.GREEN + "!");
return true;
}
Inventory inv = playerSender.getInventory();
inv.setItem(inv.firstEmpty(), sd.getItem(item));
msg(prefix + ChatColor.GREEN + "You got your " + item.getColoredName() + ChatColor.GREEN + "!");
return true;
}
default:
{
return false;
}
}
} }
private void cooldown(int seconds, CommandSender sender, String feature)
{
featureCooldown.put(sender, feature);
new BukkitRunnable()
{
@Override
public void run()
{
featureCooldown.remove(sender);
}
}.runTaskLater(plugin, seconds * 20);
}
} }

View File

@ -81,7 +81,13 @@ public enum ConfigEntry
DISCORD_SERVER_OWNER_ROLE_ID(String.class, "discord.server_owner_role_id"), DISCORD_SERVER_OWNER_ROLE_ID(String.class, "discord.server_owner_role_id"),
// //
SHOP_ENABLED(Boolean.class, "shop.enabled"), SHOP_ENABLED(Boolean.class, "shop.enabled"),
SHOP_TITLE(String.class, "shop.title"),
SHOP_PREFIX(String.class, "shop.prefix"), SHOP_PREFIX(String.class, "shop.prefix"),
SHOP_COINS_PER_VOTE(Integer.class, "shop.coins_per_vote"),
SHOP_PRICES_GRAPPLING_HOOK(Integer.class, "shop.prices.grappling_hook"),
SHOP_PRICES_LIGHTNING_ROD(Integer.class, "shop.prices.lightning_rod"),
SHOP_PRICES_FIRE_BALL(Integer.class, "shop.prices.fire_ball"),
SHOP_PRICES_RIDEABLE_PEARL(Integer.class, "shop.prices.rideable_pearl"),
// //
ADMINLIST_CLEAN_THESHOLD_HOURS(Integer.class, "adminlist.clean_threshold_hours"), ADMINLIST_CLEAN_THESHOLD_HOURS(Integer.class, "adminlist.clean_threshold_hours"),
ADMINLIST_CONSOLE_IS_SENIOR(Boolean.class, "adminlist.console_is_senior"), ADMINLIST_CONSOLE_IS_SENIOR(Boolean.class, "adminlist.console_is_senior"),

View File

@ -7,6 +7,7 @@ import java.util.Map;
import java.util.Random; import java.util.Random;
import java.util.Timer; import java.util.Timer;
import java.util.TimerTask; import java.util.TimerTask;
import java.util.UUID;
import javax.security.auth.login.FailedLoginException; import javax.security.auth.login.FailedLoginException;
import me.totalfreedom.totalfreedommod.FreedomService; import me.totalfreedom.totalfreedommod.FreedomService;
import me.totalfreedom.totalfreedommod.TotalFreedomMod; import me.totalfreedom.totalfreedommod.TotalFreedomMod;
@ -19,11 +20,18 @@ import me.totalfreedom.totalfreedommod.util.FLog;
import me.totalfreedom.totalfreedommod.util.FUtil; import me.totalfreedom.totalfreedommod.util.FUtil;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.Color;
import org.bukkit.FireworkEffect;
import org.bukkit.SoundCategory;
import org.bukkit.entity.Arrow; import org.bukkit.entity.Arrow;
import org.bukkit.entity.EnderPearl;
import org.bukkit.entity.Entity; import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType; import org.bukkit.entity.EntityType;
import org.bukkit.entity.Fireball; import org.bukkit.entity.Fireball;
import org.bukkit.entity.Firework;
import org.bukkit.entity.Projectile;
import org.bukkit.event.entity.ProjectileHitEvent; import org.bukkit.event.entity.ProjectileHitEvent;
import org.bukkit.event.entity.ProjectileLaunchEvent;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.Sound; import org.bukkit.Sound;
@ -37,7 +45,9 @@ import org.bukkit.event.player.PlayerFishEvent;
import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.PlayerInventory; import org.bukkit.inventory.PlayerInventory;
import org.bukkit.inventory.meta.FireworkMeta;
import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.scheduler.BukkitTask;
import org.bukkit.util.Vector; import org.bukkit.util.Vector;
public class ItemFun extends FreedomService public class ItemFun extends FreedomService
@ -47,41 +57,41 @@ public class ItemFun extends FreedomService
private final Random random = new Random(); private final Random random = new Random();
private static final String COOLDOWN_MESSAGE = ChatColor.RED + "You're on cooldown for this feature.";
private final Map<String, List<String>> cooldownTracker = new HashMap<>(); private final Map<String, List<String>> cooldownTracker = new HashMap<>();
private final Map<Player, Float> orientationTracker = new HashMap<>(); private final Map<Player, Float> orientationTracker = new HashMap<>();
private void cooldown(Player player, String feature, int seconds) private final List<UUID> FIRE_BALL_UUIDS = new ArrayList<>();
private void cooldown(Player player, ShopItem item, int seconds)
{ {
if (cooldownTracker.get(player.getName()) == null) if (cooldownTracker.get(player.getName()) == null)
{ {
List<String> featureList = new ArrayList<>(); List<String> featureList = new ArrayList<>();
featureList.add(feature); featureList.add(item.getDataName());
cooldownTracker.put(player.getName(), featureList); cooldownTracker.put(player.getName(), featureList);
} }
else else
{ {
cooldownTracker.get(player.getName()).add(feature); cooldownTracker.get(player.getName()).add(item.getDataName());
} }
new BukkitRunnable() BukkitTask thing = new BukkitRunnable()
{ {
@Override @Override
public void run() public void run()
{ {
cooldownTracker.get(player.getName()).remove(feature); cooldownTracker.get(player.getName()).remove(item.getDataName());
} }
}.runTaskLater(plugin, seconds * 20); }.runTaskLater(plugin, seconds * 20);
} }
public boolean onCooldown(Player player, String feature) public boolean onCooldown(Player player, ShopItem item)
{ {
if (cooldownTracker.get(player.getName()) == null) if (cooldownTracker.get(player.getName()) == null)
{ {
return false; return false;
} }
return cooldownTracker.get(player.getName()).contains(feature); return cooldownTracker.get(player.getName()).contains(item.getDataName());
} }
public ItemFun(TotalFreedomMod plugin) public ItemFun(TotalFreedomMod plugin)
@ -194,11 +204,6 @@ public class ItemFun extends FreedomService
break; break;
} }
/*if (player.getWorld().equals(plugin.wm.hubworld.getWorld()) && plugin.hwr.doRestrict(player))
{
break;
}*/
Location location = player.getLocation().clone(); Location location = player.getLocation().clone();
Vector playerPosition = location.toVector().add(new Vector(0.0, 1.65, 0.0)); Vector playerPosition = location.toVector().add(new Vector(0.0, 1.65, 0.0));
@ -292,58 +297,14 @@ public class ItemFun extends FreedomService
case BLAZE_ROD: case BLAZE_ROD:
{ {
if (!ConfigEntry.ALLOW_EXPLOSIONS.getBoolean()) if (!plugin.sh.isRealItem(plugin.sh.getData(player), ShopItem.LIGHTNING_ROD, player.getInventory().getItemInMainHand(), plugin.sh.getLightningRod()))
{ {
break; break;
} }
if (!plugin.al.isSeniorAdmin(player)) if (onCooldown(player, ShopItem.LIGHTNING_ROD))
{
break;
}
if (player.getWorld().equals(plugin.wm.masterBuilderWorld.getWorld()) && plugin.mbwr.doRestrict(player))
{
break;
}
event.setCancelled(true);
Block targetBlock;
if (event.getAction().equals(Action.LEFT_CLICK_AIR))
{
targetBlock = DepreciationAggregator.getTargetBlock(player, null, 120);
}
else
{
targetBlock = event.getClickedBlock();
}
if (targetBlock == null)
{
player.sendMessage("Can't resolve target block.");
break;
}
player.getWorld().createExplosion(targetBlock.getLocation(), 4F, true);
player.getWorld().strikeLightning(targetBlock.getLocation());
break;
}
case NETHER_STAR:
{
if (onCooldown(player, "nether_star"))
{
FUtil.playerMsg(player, COOLDOWN_MESSAGE);
break;
}
ShopData sd = plugin.sh.getData(player);
ItemStack stack = player.getInventory().getItemInMainHand();
if (!sd.validate(stack, ShopItem.THOR_STAR))
{ {
player.sendMessage(ChatColor.RED + "You're are currently on a cooldown for 10 seconds.");
break; break;
} }
@ -354,65 +315,43 @@ public class ItemFun extends FreedomService
{ {
player.getWorld().strikeLightning(targetBlock.getLocation()); player.getWorld().strikeLightning(targetBlock.getLocation());
} }
cooldown(player, ShopItem.LIGHTNING_ROD, 10);
boolean superior = FUtil.random(1, 100) == 50;
Player rplayer = FUtil.getRandomPlayer();
ShopData psd = plugin.sh.getData(rplayer);
if (superior)
{
for (int i = 0; i < 25; i++)
{
rplayer.getWorld().strikeLightning(rplayer.getLocation());
}
String key = psd.giveItem(ShopItem.SUPERIOR_SWORD);
FUtil.bcastMsg("THOR'S STAR HAS GRANTED " + rplayer.getName().toUpperCase() + " A " + ChatColor.GOLD + "SUPERIOR SWORD" + ChatColor.RED + "!!!!", ChatColor.RED);
FUtil.give(rplayer, ShopItem.SUPERIOR_SWORD, "&7RMB - Shoot fireball", ChatColor.DARK_GRAY + key);
}
else
{
String key = psd.giveItem(ShopItem.ELECTRICAL_DIAMOND_SWORD);
FUtil.bcastMsg("Thor's Star has granted " + rplayer.getName() + " an " + ChatColor.YELLOW + "Electrical Diamond Sword" + ChatColor.RED + "!", ChatColor.RED);
FUtil.give(rplayer, ShopItem.ELECTRICAL_DIAMOND_SWORD, "&7RMB - Strike lightning", ChatColor.DARK_GRAY + key);
}
plugin.sh.save(psd);
cooldown(player, "nether_star", 600);
break; break;
} }
case DIAMOND_SWORD: case FIRE_CHARGE:
{ {
if (onCooldown(player, "eds")) if (!plugin.sh.isRealItem(plugin.sh.getData(player), ShopItem.FIRE_BALL, player.getInventory().getItemInMainHand(), plugin.sh.getFireBall()))
{ {
FUtil.playerMsg(player, COOLDOWN_MESSAGE);
break; break;
} }
ShopData sd = plugin.sh.getData(player); if (onCooldown(player, ShopItem.FIRE_BALL))
ItemStack stack = player.getInventory().getItemInMainHand();
if (sd.validate(stack, "Electrical Diamond Sword"))
{ {
player.getWorld().strikeLightning(player.getTargetBlock(null, 20).getLocation()); player.sendMessage(ChatColor.RED + "You're are currently on a cooldown for 5 seconds.");
cooldown(player, "eds", 15); break;
} }
event.setCancelled(true);
Entity fireball = player.getWorld().spawnEntity(player.getLocation(), EntityType.FIREBALL);
FIRE_BALL_UUIDS.add(fireball.getUniqueId());
fireball.setVelocity(player.getLocation().getDirection().multiply(2));
cooldown(player, ShopItem.FIRE_BALL, 5);
break; break;
} }
}
}
case GOLDEN_SWORD: @EventHandler
public void onProjectileLaunch(ProjectileLaunchEvent event)
{
Projectile entity = event.getEntity();
if (entity instanceof EnderPearl && entity.getShooter() instanceof Player)
{
Player player = (Player)entity.getShooter();
if (plugin.sh.isRealItem(plugin.sh.getData(player), ShopItem.RIDEABLE_PEARL, player.getInventory().getItemInMainHand(), plugin.sh.getRideablePearl()))
{ {
if (onCooldown(player, "ss")) entity.addPassenger(player);
{
FUtil.playerMsg(player, COOLDOWN_MESSAGE);
break;
}
ShopData sd = plugin.sh.getData(player);
ItemStack stack = player.getInventory().getItemInMainHand();
if (sd.validate(stack, "Superior Sword"))
{
Entity fireball = player.getWorld().spawnEntity(player.getLocation(), EntityType.FIREBALL);
fireball.setVelocity(player.getLocation().getDirection());
cooldown(player, "ss", 3);
}
} }
} }
} }
@ -434,6 +373,24 @@ public class ItemFun extends FreedomService
arrow.remove(); arrow.remove();
} }
} }
if (entity instanceof Fireball)
{
if (FIRE_BALL_UUIDS.contains(entity.getUniqueId()))
{
FIRE_BALL_UUIDS.remove(entity.getUniqueId());
Firework firework = (Firework)entity.getWorld().spawnEntity(entity.getLocation(), EntityType.FIREWORK);
firework.setSilent(true);
FireworkMeta meta = firework.getFireworkMeta();
FireworkEffect explosionEffect = FireworkEffect.builder().withColor(Color.ORANGE).withFade(Color.YELLOW).with(FireworkEffect.Type.BALL_LARGE).trail(true).build();
meta.addEffect(explosionEffect);
meta.setPower(0);
firework.setFireworkMeta(meta);
entity.remove();
firework.detonate();
entity.getWorld().playSound(firework.getLocation(), Sound.ENTITY_GENERIC_EXPLODE, SoundCategory.PLAYERS, 10f, 1f);
}
}
} }
private Location randomOffset(Location a, double magnitude) private Location randomOffset(Location a, double magnitude)
@ -453,7 +410,7 @@ public class ItemFun extends FreedomService
ShopData sd = plugin.sh.getData(player); ShopData sd = plugin.sh.getData(player);
PlayerInventory inv = event.getPlayer().getInventory(); PlayerInventory inv = event.getPlayer().getInventory();
ItemStack rod = inv.getItemInMainHand(); ItemStack rod = inv.getItemInMainHand();
if (sd.validate(rod, ShopItem.GRAPPLING_HOOK)) if (plugin.sh.isRealItem(plugin.sh.getData(player), ShopItem.GRAPPLING_HOOK, player.getInventory().getItemInMainHand(), plugin.sh.getGrapplingHook()))
{ {
if (event.getState() == PlayerFishEvent.State.REEL_IN || event.getState() == PlayerFishEvent.State.IN_GROUND) if (event.getState() == PlayerFishEvent.State.REEL_IN || event.getState() == PlayerFishEvent.State.IN_GROUND)
{ {

View File

@ -24,6 +24,7 @@ import me.totalfreedom.totalfreedommod.httpd.module.Module_permbans;
import me.totalfreedom.totalfreedommod.httpd.module.Module_players; import me.totalfreedom.totalfreedommod.httpd.module.Module_players;
import me.totalfreedom.totalfreedommod.httpd.module.Module_punishments; import me.totalfreedom.totalfreedommod.httpd.module.Module_punishments;
import me.totalfreedom.totalfreedommod.httpd.module.Module_schematic; import me.totalfreedom.totalfreedommod.httpd.module.Module_schematic;
import me.totalfreedom.totalfreedommod.httpd.module.Module_vpnbans;
import me.totalfreedom.totalfreedommod.util.FLog; import me.totalfreedom.totalfreedommod.util.FLog;
import org.apache.commons.io.FilenameUtils; import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
@ -69,6 +70,7 @@ public class HTTPDaemon extends FreedomService
module("players", Module_players.class, false); module("players", Module_players.class, false);
module("punishments", Module_punishments.class, true); module("punishments", Module_punishments.class, true);
module("schematic", Module_schematic.class, true); module("schematic", Module_schematic.class, true);
module("vpnbans", Module_vpnbans.class, true);
try try
{ {

View File

@ -0,0 +1,32 @@
package me.totalfreedom.totalfreedommod.httpd.module;
import java.io.File;
import me.totalfreedom.totalfreedommod.TotalFreedomMod;
import me.totalfreedom.totalfreedommod.banning.VPNBanList;
import me.totalfreedom.totalfreedommod.httpd.HTTPDaemon;
import me.totalfreedom.totalfreedommod.httpd.NanoHTTPD;
public class Module_vpnbans extends HTTPDModule
{
public Module_vpnbans(TotalFreedomMod plugin, NanoHTTPD.HTTPSession session)
{
super(plugin, session);
}
@Override
public NanoHTTPD.Response getResponse()
{
File vpnbanFile = new File(plugin.getDataFolder(), VPNBanList.CONFIG_FILENAME);
if (vpnbanFile.exists())
{
return HTTPDaemon.serveFileBasic(new File(plugin.getDataFolder(), VPNBanList.CONFIG_FILENAME));
}
else
{
return new NanoHTTPD.Response(NanoHTTPD.Response.Status.NOT_FOUND, NanoHTTPD.MIME_PLAINTEXT,
"Error 404: Not Found - The requested resource was not found on this server.");
}
}
}

View File

@ -62,12 +62,6 @@ public class RankManager extends FreedomService
return Title.DEVELOPER; return Title.DEVELOPER;
} }
// Contributors always show up
if (FUtil.CONTRIBUTORS.contains(player.getName()))
{
return Title.CONTRIBUTOR;
}
if (ConfigEntry.SERVER_EXECUTIVES.getList().contains(player.getName()) && plugin.al.isAdmin(player)) if (ConfigEntry.SERVER_EXECUTIVES.getList().contains(player.getName()) && plugin.al.isAdmin(player))
{ {
return Title.EXECUTIVE; return Title.EXECUTIVE;

View File

@ -11,7 +11,6 @@ public enum Title implements Displayable
ASSISTANT_EXECUTIVE("an", "Assistant Executive", ChatColor.RED, "Asst Exec"), ASSISTANT_EXECUTIVE("an", "Assistant Executive", ChatColor.RED, "Asst Exec"),
EXECUTIVE("an", "Executive", ChatColor.RED, "Exec"), EXECUTIVE("an", "Executive", ChatColor.RED, "Exec"),
DEVELOPER("a", "Developer", ChatColor.DARK_PURPLE, "Dev"), DEVELOPER("a", "Developer", ChatColor.DARK_PURPLE, "Dev"),
CONTRIBUTOR("a", "TotalFreedom Contributor", ChatColor.DARK_PURPLE, "Contributor"),
OWNER("the", "Owner", ChatColor.DARK_RED, "Owner"); OWNER("the", "Owner", ChatColor.DARK_RED, "Owner");
private final String determiner; private final String determiner;

View File

@ -1,9 +1,15 @@
package me.totalfreedom.totalfreedommod.shop; package me.totalfreedom.totalfreedommod.shop;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import com.vexsoftware.votifier.model.Vote;
import com.vexsoftware.votifier.model.VotifierEvent;
import java.io.File; import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.UUID;
import lombok.Getter; import lombok.Getter;
import me.totalfreedom.totalfreedommod.FreedomService; import me.totalfreedom.totalfreedommod.FreedomService;
import me.totalfreedom.totalfreedommod.TotalFreedomMod; import me.totalfreedom.totalfreedommod.TotalFreedomMod;
@ -12,18 +18,22 @@ import me.totalfreedom.totalfreedommod.util.FLog;
import me.totalfreedom.totalfreedommod.util.FUtil; import me.totalfreedom.totalfreedommod.util.FUtil;
import net.pravian.aero.config.YamlConfig; import net.pravian.aero.config.YamlConfig;
import net.pravian.aero.util.Ips; import net.pravian.aero.util.Ips;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.OfflinePlayer; import org.bukkit.Material;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
public class Shop extends FreedomService public class Shop extends FreedomService
{ {
@Getter @Getter
public final Map<String, ShopData> dataMap = Maps.newHashMap(); // ip,dataMap public final Map<UUID, ShopData> dataMap = Maps.newHashMap(); // uuid, dataMap
@Getter @Getter
private final File configFolder; private final File configFolder;
@ -54,37 +64,32 @@ public class Shop extends FreedomService
YamlConfig config = getConfig(data); YamlConfig config = getConfig(data);
data.saveTo(config); data.saveTo(config);
config.save(); config.save();
} dataMap.remove(data.getUUID());
dataMap.put(data.getUUID(), data);
public String getIp(OfflinePlayer player)
{
if (player.isOnline())
{
return Ips.getIp(player.getPlayer());
}
final ShopData entry = getData(player.getName());
return (entry == null ? null : entry.getIps().iterator().next());
} }
public String getShopPrefix() public String getShopPrefix()
{ {
return FUtil.colorize(ConfigEntry.SHOP_PREFIX.getString() + " "); return FUtil.colorize(ConfigEntry.SHOP_PREFIX.getString());
}
public String getShopTitle()
{
return FUtil.colorize(ConfigEntry.SHOP_TITLE.getString());
} }
// May not return null // May not return null
public ShopData getData(Player player) public ShopData getData(Player player)
{ {
// Check already loaded // Check already loaded
ShopData data = dataMap.get(Ips.getIp(player)); ShopData data = dataMap.get(player.getUniqueId());
if (data != null) if (data != null)
{ {
return data; return data;
} }
// Load data // Load data
data = getData(player.getName()); data = getData(player.getUniqueId());
// Create data if nonexistent // Create data if nonexistent
if (data == null) if (data == null)
@ -92,15 +97,14 @@ public class Shop extends FreedomService
FLog.info("Creating new shop data entry for " + player.getName()); FLog.info("Creating new shop data entry for " + player.getName());
// Create new player // Create new player
final long unix = FUtil.getUnixTime();
data = new ShopData(player); data = new ShopData(player);
data.addIp(Ips.getIp(player)); data.setUsername(player.getName());
// Set defaults // Set defaults
data.setCoins(0); data.setCoins(0);
// Store player // Store player
dataMap.put(player.getName().toLowerCase(), data); dataMap.put(player.getUniqueId(), data);
// Save player // Save player
YamlConfig config = getConfig(data); YamlConfig config = getConfig(data);
@ -108,46 +112,231 @@ public class Shop extends FreedomService
config.save(); config.save();
} }
dataMap.put(player.getUniqueId(), data);
return data; return data;
} }
// May return null
public ShopData getData(String username) public ShopData getData(String username)
{ {
username = username.toLowerCase(); UUID uuid = FUtil.nameToUUID(username);
if (uuid != null)
{
return getData(uuid);
}
return null;
}
public ShopData getData(UUID uuid)
{
// Check if the player is a known player // Check if the player is a known player
final File configFile = getConfigFile(username); final File configFile = getConfigFile(uuid);
if (!configFile.exists()) if (!configFile.exists())
{ {
return null; return null;
} }
// Create and load entry // Load entry
final ShopData data = new ShopData(username); final ShopData data = new ShopData(uuid);
data.loadFrom(getConfig(data)); data.loadFrom(getConfig(data));
return data;
}
if (!data.isValid()) public Inventory generateShopGUI(ShopData shopData)
{
Inventory gui = server.createInventory(null, 36, getShopTitle());
for (int slot = 0; slot < 36; slot++)
{ {
FLog.warning("Could not load shop data entry: " + username + ". Entry is not valid!"); ItemStack blank = new ItemStack(Material.WHITE_STAINED_GLASS_PANE);
configFile.delete(); ItemMeta meta = blank.getItemMeta();
return null; meta.setDisplayName(" ");
blank.setItemMeta(meta);
gui.setItem(slot, blank);
}
for (ShopItem shopItem : ShopItem.values())
{
ItemStack item = shopGUIItem(shopItem, shopData);
gui.setItem(shopItem.getSlot(), item);
}
// Coins
ItemStack coins = new ItemStack(Material.GOLD_NUGGET);
ItemMeta meta = coins.getItemMeta();
meta.setDisplayName(FUtil.colorize("&c&lYou have &e&l" + shopData.getCoins() + "&c&l coins"));
coins.setItemMeta(meta);
gui.setItem(35, coins);
return gui;
}
public boolean isRealItem(ShopData data, ShopItem shopItem, ItemStack givenItem, ItemStack realItem)
{
if (!data.hasItem(shopItem) || !givenItem.getType().equals(realItem.getType()))
{
return false;
} }
// Only store data if the player is online ItemMeta givenMeta = givenItem.getItemMeta();
for (String ip : data.getIps()) ItemMeta realMeta = realItem.getItemMeta();
if (givenMeta.getDisplayName().equals(realMeta.getDisplayName()) && givenMeta.getLore().equals(realMeta.getLore()))
{ {
for (Player onlinePlayer : Bukkit.getOnlinePlayers()) return true;
}
return false;
}
public ItemStack getLightningRod()
{
ItemStack itemStack = new ItemStack(Material.BLAZE_ROD);
ItemMeta itemMeta = itemStack.getItemMeta();
itemMeta.setDisplayName(FUtil.colorize("&bL&3i&bg&3h&bt&3i&bn&3g &b&bR&3o&bd"));
itemMeta.setLore(Arrays.asList(ChatColor.AQUA + "Strike others down with the power of lightning.", ChatColor.RED + ChatColor.ITALIC.toString() + "The classic way to exterminate annoyances."));
itemMeta.addEnchant(Enchantment.CHANNELING, 1, false);
itemStack.setItemMeta(itemMeta);
return itemStack;
}
public ItemStack getGrapplingHook()
{
ItemStack itemStack = new ItemStack(Material.FISHING_ROD);
ItemMeta itemMeta = itemStack.getItemMeta();
itemMeta.setDisplayName(ChatColor.YELLOW + "Grappling Hook");
itemMeta.setLore(Arrays.asList(ChatColor.GREEN + "be spider-man but ghetto"));
itemStack.setItemMeta(itemMeta);
return itemStack;
}
public ItemStack getFireBall()
{
ItemStack itemStack = new ItemStack(Material.FIRE_CHARGE);
ItemMeta itemMeta = itemStack.getItemMeta();
itemMeta.setDisplayName(ChatColor.RED + "Fire Ball");
itemMeta.setLore(Arrays.asList(ChatColor.GOLD+ "Yeet this at people"));
itemStack.setItemMeta(itemMeta);
return itemStack;
}
public ItemStack getRideablePearl()
{
ItemStack itemStack = new ItemStack(Material.ENDER_PEARL);
ItemMeta itemMeta = itemStack.getItemMeta();
itemMeta.setDisplayName(ChatColor.DARK_PURPLE + "Rideable Ender Pearl");
itemMeta.setLore(Arrays.asList(ChatColor.LIGHT_PURPLE + "What the title says.", "", ChatColor.WHITE + ChatColor.ITALIC.toString() + "TotalFreedom is not responsible for any injuries", ChatColor.WHITE + ChatColor.ITALIC.toString() + "sustained while using this item."));
itemMeta.addEnchant(Enchantment.BINDING_CURSE, 1, false);
itemStack.setItemMeta(itemMeta);
return itemStack;
}
public boolean canAfford(int price, int coins)
{
if (coins >= price)
{
return true;
}
return false;
}
public int amountNeeded(int price, int coins)
{
return price - coins;
}
public ItemStack shopGUIItem(ShopItem item, ShopData data)
{
ItemStack itemStack = new ItemStack(item.getIcon());
ItemMeta itemMeta = itemStack.getItemMeta();
itemMeta.setDisplayName(item.getColoredName());
int price = item.getCost();
int coins = data.getCoins();
Boolean canAfford = canAfford(price, coins);
List<String> lore = new ArrayList();
if (!data.hasItem(item))
{
lore.add(ChatColor.GOLD + "Price: " + (canAfford ? ChatColor.DARK_GREEN : ChatColor.RED) + price);
if (!canAfford)
{ {
if (Ips.getIp(onlinePlayer).equals(ip)) lore.add(ChatColor.RED + "You can not afford this item!");
{ lore.add(ChatColor.RED + "You need " + amountNeeded(price, coins) + " more coins to buy this item.");
dataMap.put(ip, data);
return data;
}
} }
} }
else
{
lore.add(ChatColor.RED + "You already purchased this item.");
}
itemMeta.setLore(lore);
itemStack.setItemMeta(itemMeta);
return itemStack;
}
return data; @EventHandler(priority = EventPriority.HIGH)
public void onInventoryClick(InventoryClickEvent event)
{
if (!(event.getWhoClicked() instanceof Player))
{
return;
}
Inventory inventory = event.getInventory();
if (inventory.getSize() != 36 || !event.getView().getTitle().equals(plugin.sh.getShopTitle()))
{
return;
}
event.setCancelled(true);
ShopItem shopItem = getShopItem(event.getSlot());
if (shopItem == null)
{
return;
}
Player player = (Player) event.getWhoClicked();
ShopData shopData = plugin.sh.getData(player);
int price = shopItem.getCost();
int coins = shopData.getCoins();
if (shopData.hasItem(shopItem) || !plugin.sh.canAfford(price, coins))
{
return;
}
shopData.giveItem(shopItem);
shopData.setCoins(coins - price);
save(shopData);
player.closeInventory();
player.sendMessage(plugin.sh.getShopPrefix() + " " + ChatColor.GREEN + "Successfully purchased the \"" + shopItem.getColoredName() + ChatColor.GREEN + "\" for " + ChatColor.GOLD + price + ChatColor.GREEN + "!");
if (shopItem.equals(ShopItem.GRAPPLING_HOOK))
{
player.sendMessage(ChatColor.GREEN + "Run /grapplinghook to get one!");
}
else if (shopItem.equals(ShopItem.LIGHTNING_ROD))
{
player.sendMessage(ChatColor.GREEN + "Run /lightningrod to get one!");
}
else if (shopItem.equals(ShopItem.FIRE_BALL))
{
player.sendMessage(ChatColor.GREEN + "Run /fireball to get one!");
}
else if (shopItem.equals(ShopItem.RIDEABLE_PEARL))
{
player.sendMessage(ChatColor.GREEN + "Run /rideablepearl to get one!");
}
}
public ShopItem getShopItem(int slot)
{
for (ShopItem shopItem : ShopItem.values())
{
if (shopItem.getSlot() == slot)
{
return shopItem;
}
}
return null;
} }
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
@ -157,19 +346,50 @@ public class Shop extends FreedomService
dataMap.remove(ip); dataMap.remove(ip);
} }
@EventHandler(priority = EventPriority.NORMAL)
public void onPlayerVote(VotifierEvent event)
{
Vote vote = event.getVote();
String name = vote.getUsername();
int coinsPerVote = ConfigEntry.SHOP_COINS_PER_VOTE.getInteger();
Player player = server.getPlayer(name);
ShopData data = null;
if (player != null)
{
data = plugin.sh.getData(player);
}
else
{
data = plugin.sh.getData(name);
}
if (data != null)
{
data.setCoins(data.getCoins() + coinsPerVote);
data.setTotalVotes(data.getTotalVotes() + 1);
save(data);
FUtil.bcastMsg(ChatColor.GREEN + name + ChatColor.AQUA + " has voted for us on " + ChatColor.GREEN + vote.getServiceName() + ChatColor.AQUA + "!");
}
if (player != null)
{
player.sendMessage(ChatColor.GREEN + "Thank you for voting for us! Here are " + coinsPerVote + " coins!");
}
}
public Collection<ShopData> getLoadedData() public Collection<ShopData> getLoadedData()
{ {
return dataMap.values(); return dataMap.values();
} }
protected File getConfigFile(String name) protected File getConfigFile(UUID uuid)
{ {
return new File(getConfigFolder(), name + ".yml"); return new File(getConfigFolder(), uuid + ".yml");
} }
protected YamlConfig getConfig(ShopData data) protected YamlConfig getConfig(ShopData data)
{ {
final YamlConfig config = new YamlConfig(plugin, getConfigFile(data.getUsername().toLowerCase()), false); final YamlConfig config = new YamlConfig(plugin, getConfigFile(data.getUUID()), false);
config.load(); config.load();
return config; return config;
} }

View File

@ -1,22 +1,17 @@
package me.totalfreedom.totalfreedommod.shop; package me.totalfreedom.totalfreedommod.shop;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.UUID;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import me.totalfreedom.totalfreedommod.util.FUtil;
import net.pravian.aero.base.ConfigLoadable; import net.pravian.aero.base.ConfigLoadable;
import net.pravian.aero.base.ConfigSavable; import net.pravian.aero.base.ConfigSavable;
import net.pravian.aero.base.Validatable; import net.pravian.aero.base.Validatable;
import org.apache.commons.lang3.Validate; import org.apache.commons.lang.Validate;
import org.bukkit.ChatColor;
import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
public class ShopData implements ConfigLoadable, ConfigSavable, Validatable public class ShopData implements ConfigLoadable, ConfigSavable, Validatable
{ {
@ -24,30 +19,33 @@ public class ShopData implements ConfigLoadable, ConfigSavable, Validatable
@Getter @Getter
@Setter @Setter
private String username; private String username;
private final List<String> ips = Lists.newArrayList(); private String uuid;
@Getter @Getter
@Setter @Setter
private int coins; private int coins;
private List<String> items = Lists.newArrayList(); private List<String> items = Lists.newArrayList();
@Getter
@Setter
private int totalVotes;
public ShopData(Player player) public ShopData(Player player)
{ {
this(player.getName()); this(player.getUniqueId());
} }
public ShopData(String username) public ShopData(UUID uuid)
{ {
this.username = username; this.uuid = uuid.toString();
} }
@Override @Override
public void loadFrom(ConfigurationSection cs) public void loadFrom(ConfigurationSection cs)
{ {
this.username = cs.getString("username", username); this.username = cs.getString("username", username);
this.ips.clear(); this.uuid = cs.getString("uuid", uuid);
this.ips.addAll(cs.getStringList("ips"));
this.coins = cs.getInt("coins", coins); this.coins = cs.getInt("coins", coins);
this.items.addAll(cs.getStringList("items")); this.items.addAll(cs.getStringList("items"));
this.totalVotes = cs.getInt("totalVotes");
} }
@Override @Override
@ -55,25 +53,10 @@ public class ShopData implements ConfigLoadable, ConfigSavable, Validatable
{ {
Validate.isTrue(isValid(), "Could not save shop entry: " + username + ". Entry not valid!"); Validate.isTrue(isValid(), "Could not save shop entry: " + username + ". Entry not valid!");
cs.set("username", username); cs.set("username", username);
cs.set("ips", ips); cs.set("uuid", uuid);
cs.set("coins", coins); cs.set("coins", coins);
cs.set("items", items); cs.set("items", items);
} cs.set("totalVotes", totalVotes);
public List<String> getIps()
{
return Collections.unmodifiableList(ips);
}
// IP utils
public boolean addIp(String ip)
{
return ips.contains(ip) ? false : ips.add(ip);
}
public boolean removeIp(String ip)
{
return ips.remove(ip);
} }
public List<String> getItems() public List<String> getItems()
@ -81,165 +64,38 @@ public class ShopData implements ConfigLoadable, ConfigSavable, Validatable
return Collections.unmodifiableList(items); return Collections.unmodifiableList(items);
} }
public String giveItem(ShopItem item) public void setUUID(UUID id)
{ {
String signature = FUtil.generateSignature(item); uuid = id.toString();
items.add(signature);
return signature;
} }
public void giveRawItem(String signature) public UUID getUUID()
{ {
items.add(signature); return UUID.fromString(uuid);
}
public void giveItem(ShopItem item)
{
items.add(item.getDataName());
} }
public boolean hasItem(ShopItem item) public boolean hasItem(ShopItem item)
{ {
for (String i : items) if (items.contains(item.getDataName()))
{ {
int id; return true;
try
{
id = Integer.valueOf(i.substring(0, i.indexOf("A")));
}
catch (NumberFormatException ex)
{
continue;
}
if (item.ordinal() == id)
{
return true;
}
} }
return false; return false;
} }
public ItemStack getItem(ShopItem item) public void removeItem(ShopItem item)
{ {
String signature = ""; items.remove(item.getDataName());
for (String i : items)
{
int id;
try
{
id = Integer.valueOf(i.substring(0, i.indexOf("A")));
}
catch (NumberFormatException ex)
{
continue;
}
if (item.ordinal() == id)
{
signature = i;
}
}
ItemStack stack = new ItemStack(item.getMaterial(), 1);
ItemMeta meta = stack.getItemMeta();
meta.setDisplayName(item.getColoredName());
List<String> lore = new ArrayList<>();
lore.add(ChatColor.DARK_GRAY + signature);
meta.setLore(lore);
stack.setItemMeta(meta);
return stack;
}
public boolean validate(ItemStack stack, String nameSegment)
{
if (!stack.hasItemMeta())
{
return false;
}
if (!stack.getItemMeta().hasDisplayName())
{
return false;
}
if (!stack.getItemMeta().getDisplayName().contains(nameSegment))
{
return false;
}
if (!stack.getItemMeta().hasLore())
{
return false;
}
boolean loreValid = false;
for (String i : items)
{
if (stack.getItemMeta().getLore().contains(ChatColor.DARK_GRAY + i))
{
loreValid = true;
}
}
if (!loreValid)
{
return false;
}
return true;
}
public boolean validate(ItemStack stack, ShopItem item)
{
if (!stack.hasItemMeta())
{
return false;
}
if (!stack.getItemMeta().hasDisplayName())
{
return false;
}
if (!stack.getItemMeta().getDisplayName().contains(item.getName()))
{
return false;
}
if (!stack.getItemMeta().hasLore())
{
return false;
}
boolean loreValid = false;
for (String i : items)
{
if (stack.getItemMeta().getLore().contains(ChatColor.DARK_GRAY + i))
{
loreValid = true;
}
}
if (!loreValid)
{
return false;
}
return true;
}
public void takeItem(ShopItem item)
{
Iterator<String> it = items.iterator();
while (it.hasNext())
{
String i = it.next();
if (i.startsWith(item.ordinal() + ""))
{
it.remove();
}
}
} }
@Override @Override
public boolean isValid() public boolean isValid()
{ {
return username != null return username != null;
&& !ips.isEmpty();
} }
} }

View File

@ -1,34 +1,49 @@
package me.totalfreedom.totalfreedommod.shop; package me.totalfreedom.totalfreedommod.shop;
import lombok.Getter; import lombok.Getter;
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.Material; import org.bukkit.Material;
public enum ShopItem public enum ShopItem
{ {
GRAPPLING_HOOK("Grappling Hook", Material.FISHING_ROD, 100, ChatColor.GREEN, true), GRAPPLING_HOOK("Grappling Hook", Material.FISHING_ROD, 10, ConfigEntry.SHOP_PRICES_GRAPPLING_HOOK, ChatColor.GREEN, "grapplingHook"),
THOR_STAR("Thor's Star", Material.NETHER_STAR, 10000, ChatColor.LIGHT_PURPLE, true), LIGHTNING_ROD("Lightning Rod", Material.BLAZE_ROD, 12, ConfigEntry.SHOP_PRICES_LIGHTNING_ROD, ChatColor.LIGHT_PURPLE, "lightningRod"),
ELECTRICAL_DIAMOND_SWORD("Electrical Diamond Sword", Material.DIAMOND_SWORD, 0, ChatColor.YELLOW, false), FIRE_BALL("Fire Ball", Material.FIRE_CHARGE, 14, ConfigEntry.SHOP_PRICES_FIRE_BALL, ChatColor.RED, "fireBall"),
SUPERIOR_SWORD("Superior Sword", Material.GOLDEN_SWORD, 0, ChatColor.GOLD, false); RIDEABLE_PEARL("Rideable Ender Pearl", Material.ENDER_PEARL, 16, ConfigEntry.SHOP_PRICES_RIDEABLE_PEARL, ChatColor.DARK_PURPLE, "rideablePearl");
/*
Shop GUI Layout:
Dimensions: 9x4 = 36
Key: g = Grappling Hook, l = Lightning Rod, f = Fire Ball, r = Rideable Ender Pearl, $ = Coins}
---------
-g-l-f-r-
---------
--------$
*/
@Getter @Getter
private final String name; private final String name;
@Getter @Getter
private final Material material; private final Material icon;
@Getter @Getter
private final int cost; private final int slot;
private final ConfigEntry cost;
@Getter @Getter
private final ChatColor color; private final ChatColor color;
@Getter @Getter
private final boolean purchaseable; private final String dataName;
ShopItem(String name, Material material, int cost, ChatColor color, boolean purchaseable) ShopItem(String name, Material icon, int slot, ConfigEntry cost, ChatColor color, String dataName)
{ {
this.name = name; this.name = name;
this.material = material; this.icon = icon;
this.slot = slot;
this.cost = cost; this.cost = cost;
this.color = color; this.color = color;
this.purchaseable = purchaseable; this.dataName = dataName;
} }
public String getColoredName() public String getColoredName()
@ -36,6 +51,11 @@ public enum ShopItem
return color + name; return color + name;
} }
public int getCost()
{
return cost.getInteger();
}
public static ShopItem findItem(String string) public static ShopItem findItem(String string)
{ {
try try

View File

@ -1,10 +1,13 @@
package me.totalfreedom.totalfreedommod.util; package me.totalfreedom.totalfreedommod.util;
import com.comphenix.protocol.PacketType; import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File; import java.io.File;
import java.io.FileFilter; import java.io.FileFilter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.security.SecureRandom; import java.net.URL;
import java.text.ParseException; import java.text.ParseException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
@ -20,10 +23,11 @@ import java.util.Map;
import java.util.Random; import java.util.Random;
import java.util.Set; import java.util.Set;
import java.util.TimeZone; import java.util.TimeZone;
import java.util.UUID;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import javax.net.ssl.HttpsURLConnection;
import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.config.ConfigEntry;
import me.totalfreedom.totalfreedommod.shop.ShopItem;
import org.apache.commons.io.FileUtils; import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.WordUtils; import org.apache.commons.lang.WordUtils;
@ -31,8 +35,6 @@ import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Entity; import org.bukkit.entity.Entity;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -40,6 +42,7 @@ import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.scheduler.BukkitTask; import org.bukkit.scheduler.BukkitTask;
import org.bukkit.Material; import org.bukkit.Material;
import org.json.simple.JSONArray;
public class FUtil public class FUtil
{ {
@ -48,8 +51,7 @@ public class FUtil
// //
public static final String SAVED_FLAGS_FILENAME = "savedflags.dat"; public static final String SAVED_FLAGS_FILENAME = "savedflags.dat";
// See https://github.com/TotalFreedom/License - None of the listed names may be removed. // See https://github.com/TotalFreedom/License - None of the listed names may be removed.
public static final List<String> DEVELOPERS = Arrays.asList("Madgeek1450", "Prozza", "WickedGamingUK", "Wild1145", "Catholic_Mario", "Arcaknight", "smartnt"); public static final List<String> DEVELOPERS = Arrays.asList("Madgeek1450", "Prozza", "WickedGamingUK", "Wild1145", "Demonic_Mario", "RobinGall2910", "smartnt");
public static final List<String> CONTRIBUTORS = Arrays.asList("supernt", "OxLemonxO", "AcidicCyanide", "aggelosQQ");
public static String DATE_STORAGE_FORMAT = "EEE, d MMM yyyy HH:mm:ss Z"; public static String DATE_STORAGE_FORMAT = "EEE, d MMM yyyy HH:mm:ss Z";
public static final Map<String, ChatColor> CHAT_COLOR_NAMES = new HashMap<>(); public static final Map<String, ChatColor> CHAT_COLOR_NAMES = new HashMap<>();
public static final List<ChatColor> CHAT_COLOR_POOL = Arrays.asList( public static final List<ChatColor> CHAT_COLOR_POOL = Arrays.asList(
@ -160,6 +162,54 @@ public class FUtil
return names; return names;
} }
public static UUID nameToUUID(String name)
{
try
{
JSONArray json = new JSONArray();
json.add(name);
String response = postRequestToEndpoint("https://api.mojang.com/profiles/minecraft", json.toString());
// Don't care how stupid this looks, couldn't find anything to parse a json string to something readable in java with something not horrendously huge, maybe im just retarded
Pattern pattern = Pattern.compile("(?<=\"id\":\")[a-f0-9].{31}");
Matcher matcher = pattern.matcher(response);
if (matcher.find())
{
String rawUUID = matcher.group(0).replaceFirst("([a-f0-9]{8})([a-f0-9]{4})([a-f0-9]{4})([a-f0-9]{4})([a-f0-9]+)", "$1-$2-$3-$4-$5");
return UUID.fromString(rawUUID);
}
}
catch (Exception e)
{
FLog.severe("Failed to convert name to UUID:\n" + e.toString());
}
return null;
}
public static String postRequestToEndpoint(String endpoint, String body) throws IOException
{
URL url = new URL(endpoint);
HttpsURLConnection connection = (HttpsURLConnection)url.openConnection();
connection.setRequestMethod("POST");
connection.setRequestProperty("Accept", "application/json");
connection.setRequestProperty("Content-Type", "application/json");
connection.setDoOutput(true);
DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream());
outputStream.writeBytes(body);
outputStream.flush();
outputStream.close();
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null)
{
response.append(inputLine);
}
in.close();
return response.toString();
}
public static void bcastMsg(String message, ChatColor color) public static void bcastMsg(String message, ChatColor color)
{ {
FLog.info(message, true); FLog.info(message, true);
@ -553,27 +603,6 @@ public class FUtil
player.getInventory().setItem(player.getInventory().firstEmpty(), stack); player.getInventory().setItem(player.getInventory().firstEmpty(), stack);
} }
public static void give(Player player, ShopItem item, String... lore)
{
give(player, item.getMaterial(), item.getColoredName(), 1, lore);
}
public static String generateSignature(ShopItem item)
{
String signature = String.valueOf(item.ordinal());
signature += "A"; // mark the ending
for (int i = 0; i < 8; i++)
{
char c = FUtil.getRandomCharacter();
while (c == 'A')
{
c = FUtil.getRandomCharacter();
}
signature += FUtil.getRandomCharacter();
}
return signature;
}
public static Player getRandomPlayer() public static Player getRandomPlayer()
{ {
List<Player> players = new ArrayList<>(Bukkit.getOnlinePlayers()); List<Player> players = new ArrayList<>(Bukkit.getOnlinePlayers());
@ -612,4 +641,10 @@ public class FUtil
{ {
return tz < -12 || tz > 12; return tz < -12 || tz > 12;
} }
private static class MojangResponse
{
String id;
String name;
}
} }

View File

@ -32,7 +32,7 @@ server:
# All players who show up as owner # All players who show up as owner
owners: owners:
- Catholic_Mario - Demonic_Mario
# All players who show up as executive # All players who show up as executive
executives: [] executives: []
@ -89,8 +89,21 @@ shop:
# Enable the shop # Enable the shop
enabled: true enabled: true
# Shop title
title: '&e&lTotalFreedom Shop'
# Shop prefix # Shop prefix
prefix: '&7&l[&8&lTF Shop&7&l]' prefix: '&8[&eTF Shop&8]'
# How many coins to voters get per vote?
coins_per_vote: 20
# Item prices
prices:
grappling_hook: 100
lightning_rod: 1000
fire_ball: 500
rideable_pearl: 700
# Admin list # Admin list
adminlist: adminlist: