BACK FROM THE DEAD
This commit is contained in:
parent
de08456093
commit
50a2bcda66
12
Plugins/Nautilus.Game.MineKart/.classpath
Normal file
12
Plugins/Nautilus.Game.MineKart/.classpath
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<classpath>
|
||||||
|
<classpathentry kind="src" path="src"/>
|
||||||
|
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
|
||||||
|
<classpathentry combineaccessrules="false" kind="src" path="/Nautilus.Core"/>
|
||||||
|
<classpathentry combineaccessrules="false" kind="src" path="/Nautilus.Core.CraftBukkit"/>
|
||||||
|
<classpathentry kind="var" path="REPO_DIR/Plugins/Libraries/craftbukkit.jar" sourcepath="/REPO_DIR/GitHubLibraries/CraftBukkit/src"/>
|
||||||
|
<classpathentry combineaccessrules="false" kind="src" path="/Mineplex.Core"/>
|
||||||
|
<classpathentry combineaccessrules="false" kind="src" path="/Mineplex.Core.Common"/>
|
||||||
|
<classpathentry combineaccessrules="false" kind="src" path="/Mineplex.Minecraft.Game.Core"/>
|
||||||
|
<classpathentry kind="output" path="bin"/>
|
||||||
|
</classpath>
|
@ -0,0 +1,18 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<launchConfiguration type="org.eclipse.ant.AntBuilderLaunchConfigurationType">
|
||||||
|
<stringAttribute key="org.eclipse.ant.ui.ATTR_ANT_AFTER_CLEAN_TARGETS" value="MineKart,"/>
|
||||||
|
<stringAttribute key="org.eclipse.ant.ui.ATTR_ANT_AUTO_TARGETS" value="MineKart,"/>
|
||||||
|
<stringAttribute key="org.eclipse.ant.ui.ATTR_ANT_CLEAN_TARGETS" value="MineKart,"/>
|
||||||
|
<stringAttribute key="org.eclipse.ant.ui.ATTR_ANT_MANUAL_TARGETS" value="MineKart,"/>
|
||||||
|
<booleanAttribute key="org.eclipse.ant.ui.ATTR_TARGETS_UPDATED" value="true"/>
|
||||||
|
<booleanAttribute key="org.eclipse.ant.ui.DEFAULT_VM_INSTALL" value="false"/>
|
||||||
|
<stringAttribute key="org.eclipse.debug.core.ATTR_REFRESH_SCOPE" value="${project}"/>
|
||||||
|
<booleanAttribute key="org.eclipse.debug.ui.ATTR_LAUNCH_IN_BACKGROUND" value="false"/>
|
||||||
|
<stringAttribute key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER" value="org.eclipse.ant.ui.AntClasspathProvider"/>
|
||||||
|
<booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="true"/>
|
||||||
|
<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value=""/>
|
||||||
|
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LOCATION" value="${BUILD_FILES}\common.xml"/>
|
||||||
|
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_RUN_BUILD_KINDS" value="full,incremental,auto,clean"/>
|
||||||
|
<booleanAttribute key="org.eclipse.ui.externaltools.ATTR_TRIGGERS_CONFIGURED" value="true"/>
|
||||||
|
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_WORKING_DIRECTORY" value="${workspace_loc:/Nautilus.Game.MineKart}"/>
|
||||||
|
</launchConfiguration>
|
26
Plugins/Nautilus.Game.MineKart/.project
Normal file
26
Plugins/Nautilus.Game.MineKart/.project
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<projectDescription>
|
||||||
|
<name>Nautilus.Game.MineKart</name>
|
||||||
|
<comment></comment>
|
||||||
|
<projects>
|
||||||
|
</projects>
|
||||||
|
<buildSpec>
|
||||||
|
<buildCommand>
|
||||||
|
<name>org.eclipse.jdt.core.javabuilder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
<buildCommand>
|
||||||
|
<name>org.eclipse.ui.externaltools.ExternalToolBuilder</name>
|
||||||
|
<arguments>
|
||||||
|
<dictionary>
|
||||||
|
<key>LaunchConfigHandle</key>
|
||||||
|
<value><project>/.externalToolBuilders/MineKart Builder.launch</value>
|
||||||
|
</dictionary>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
</buildSpec>
|
||||||
|
<natures>
|
||||||
|
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||||
|
</natures>
|
||||||
|
</projectDescription>
|
@ -0,0 +1,11 @@
|
|||||||
|
eclipse.preferences.version=1
|
||||||
|
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
|
||||||
|
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
|
||||||
|
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
|
||||||
|
org.eclipse.jdt.core.compiler.compliance=1.7
|
||||||
|
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
|
||||||
|
org.eclipse.jdt.core.compiler.debug.localVariable=generate
|
||||||
|
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
|
||||||
|
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
|
||||||
|
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
|
||||||
|
org.eclipse.jdt.core.compiler.source=1.7
|
3
Plugins/Nautilus.Game.MineKart/plugin.yml
Normal file
3
Plugins/Nautilus.Game.MineKart/plugin.yml
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
name: MineKart
|
||||||
|
main: nautilus.game.minekart.MineKart
|
||||||
|
version: 1.0
|
@ -0,0 +1,92 @@
|
|||||||
|
package nautilus.game.minekart;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Comparator;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import nautilus.game.minekart.kart.KartType;
|
||||||
|
import nautilus.game.minekart.repository.KartItemToken;
|
||||||
|
import nautilus.game.minekart.repository.KartRepository;
|
||||||
|
import nautilus.game.minekart.shop.KartItem;
|
||||||
|
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
|
|
||||||
|
import mineplex.core.MiniPlugin;
|
||||||
|
import mineplex.core.common.util.NautHashMap;
|
||||||
|
import mineplex.core.donation.repository.GameSalesPackageToken;
|
||||||
|
|
||||||
|
public class KartFactory extends MiniPlugin
|
||||||
|
{
|
||||||
|
private KartRepository _repository;
|
||||||
|
private NautHashMap<String, KartItem> _karts;
|
||||||
|
private List<KartItem> _sortedKarts;
|
||||||
|
|
||||||
|
public KartFactory(JavaPlugin plugin, KartRepository repository)
|
||||||
|
{
|
||||||
|
super("Kart Factory", plugin);
|
||||||
|
|
||||||
|
_repository = repository;
|
||||||
|
_karts = new NautHashMap<String, KartItem>();
|
||||||
|
|
||||||
|
PopulateKarts();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Collection<KartItem> GetKarts()
|
||||||
|
{
|
||||||
|
return _sortedKarts;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void PopulateKarts()
|
||||||
|
{
|
||||||
|
_karts.put("Chicken", new KartItem(Material.FEATHER, KartType.Chicken));
|
||||||
|
_karts.put("Sheep", new KartItem(Material.WHEAT, KartType.Sheep));
|
||||||
|
_karts.put("Cow", new KartItem(Material.MILK_BUCKET, KartType.Cow));
|
||||||
|
_karts.put("Pig", new KartItem(Material.GRILLED_PORK, KartType.Pig));
|
||||||
|
_karts.put("Spider", new KartItem(Material.STRING, KartType.Spider));
|
||||||
|
_karts.put("Wolf", new KartItem(Material.SUGAR, KartType.Wolf));
|
||||||
|
_karts.put("Enderman", new KartItem(Material.FIREBALL, KartType.Enderman));
|
||||||
|
_karts.put("Blaze", new KartItem(Material.BLAZE_ROD, KartType.Blaze));
|
||||||
|
_karts.put("Golem", new KartItem(Material.IRON_INGOT, KartType.Golem));
|
||||||
|
|
||||||
|
List<KartItemToken> itemTokens = new ArrayList<KartItemToken>();
|
||||||
|
|
||||||
|
for (KartItem item : _karts.values())
|
||||||
|
{
|
||||||
|
KartItemToken itemToken = new KartItemToken();
|
||||||
|
itemToken.Name = item.GetName();
|
||||||
|
itemToken.Material = item.GetDisplayMaterial().toString();
|
||||||
|
itemToken.Data = item.GetDisplayData() + "";
|
||||||
|
itemToken.SalesPackage = new GameSalesPackageToken();
|
||||||
|
|
||||||
|
itemTokens.add(itemToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (KartItemToken itemToken : _repository.GetKartItems(itemTokens))
|
||||||
|
{
|
||||||
|
if (_karts.containsKey(itemToken.Name))
|
||||||
|
{
|
||||||
|
_karts.get(itemToken.Name).Update(itemToken.SalesPackage);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_sortedKarts = new ArrayList<KartItem>(_karts.values());
|
||||||
|
|
||||||
|
Collections.sort(_sortedKarts, new Comparator<KartItem>()
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public int compare(KartItem kartItem1, KartItem kartItem2)
|
||||||
|
{
|
||||||
|
if (kartItem1.GetKartType().GetStability() < kartItem2.GetKartType().GetStability())
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (kartItem1.GetKartType().GetStability() == kartItem2.GetKartType().GetStability())
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,309 @@
|
|||||||
|
package nautilus.game.minekart;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileFilter;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import mineplex.core.account.CoreClientManager;
|
||||||
|
import mineplex.core.antistack.AntiStack;
|
||||||
|
import mineplex.core.blockrestore.BlockRestore;
|
||||||
|
import mineplex.core.command.CommandCenter;
|
||||||
|
import mineplex.core.common.CurrencyType;
|
||||||
|
import mineplex.core.creature.Creature;
|
||||||
|
import mineplex.core.donation.DonationManager;
|
||||||
|
import mineplex.core.explosion.Explosion;
|
||||||
|
import mineplex.core.fakeEntity.FakeEntity;
|
||||||
|
import mineplex.core.fakeEntity.FakeEntityManager;
|
||||||
|
import mineplex.core.itemstack.ItemStackFactory;
|
||||||
|
import mineplex.core.join.JoinQuit;
|
||||||
|
import mineplex.core.memory.MemoryFix;
|
||||||
|
import mineplex.core.monitor.LagMeter;
|
||||||
|
import mineplex.core.npc.NpcManager;
|
||||||
|
import mineplex.core.packethandler.PacketHandler;
|
||||||
|
import mineplex.core.punish.Punish;
|
||||||
|
import mineplex.core.recharge.Recharge;
|
||||||
|
import mineplex.core.server.ServerListener;
|
||||||
|
import mineplex.core.spawn.Spawn;
|
||||||
|
import mineplex.core.status.ServerStatusManager;
|
||||||
|
import mineplex.core.teleport.Teleport;
|
||||||
|
import mineplex.core.updater.Updater;
|
||||||
|
import nautilus.game.minekart.gp.GPManager;
|
||||||
|
import nautilus.game.minekart.kart.KartManager;
|
||||||
|
import nautilus.game.minekart.menu.KartMenu;
|
||||||
|
import nautilus.game.minekart.repository.KartRepository;
|
||||||
|
import nautilus.game.minekart.shop.KartShop;
|
||||||
|
import nautilus.game.minekart.track.TrackManager;
|
||||||
|
import nautilus.game.minekart.track.TrackProcessor;
|
||||||
|
import nautilus.minecraft.core.INautilusPlugin;
|
||||||
|
import net.minecraft.server.v1_7_R1.EntityPlayer;
|
||||||
|
|
||||||
|
import org.apache.commons.io.FileDeleteStrategy;
|
||||||
|
import org.bukkit.GameMode;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.Server;
|
||||||
|
import org.bukkit.craftbukkit.v1_7_R1.entity.CraftPlayer;
|
||||||
|
import org.bukkit.entity.EntityType;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
import org.bukkit.event.block.BlockBreakEvent;
|
||||||
|
import org.bukkit.event.block.BlockBurnEvent;
|
||||||
|
import org.bukkit.event.block.BlockFromToEvent;
|
||||||
|
import org.bukkit.event.block.BlockGrowEvent;
|
||||||
|
import org.bukkit.event.block.BlockPlaceEvent;
|
||||||
|
import org.bukkit.event.entity.FoodLevelChangeEvent;
|
||||||
|
import org.bukkit.event.player.PlayerBucketEmptyEvent;
|
||||||
|
import org.bukkit.event.player.PlayerBucketFillEvent;
|
||||||
|
import org.bukkit.event.player.PlayerDropItemEvent;
|
||||||
|
import org.bukkit.event.player.PlayerJoinEvent;
|
||||||
|
import org.bukkit.plugin.PluginManager;
|
||||||
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
|
|
||||||
|
public class MineKart extends JavaPlugin implements INautilusPlugin, Listener
|
||||||
|
{
|
||||||
|
private String WEB_CONFIG = "webServer";
|
||||||
|
|
||||||
|
//Modules
|
||||||
|
private CoreClientManager _clientManager;
|
||||||
|
private DonationManager _donationManager;
|
||||||
|
private BlockRestore _blockRestore;
|
||||||
|
private Creature _creature;
|
||||||
|
private Spawn _spawn;
|
||||||
|
private Teleport _teleport;
|
||||||
|
|
||||||
|
private GPManager _gpManager;
|
||||||
|
|
||||||
|
private ServerListener _serverListener;
|
||||||
|
|
||||||
|
private Location _spawnLocation;
|
||||||
|
|
||||||
|
private FakeEntity _chicken;
|
||||||
|
private FakeEntity _wolf;
|
||||||
|
private FakeEntity _pig;
|
||||||
|
private FakeEntity _spider;
|
||||||
|
private FakeEntity _sheep;
|
||||||
|
private FakeEntity _cow;
|
||||||
|
private FakeEntity _golem;
|
||||||
|
private FakeEntity _blaze;
|
||||||
|
private FakeEntity _enderman;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onEnable()
|
||||||
|
{
|
||||||
|
ClearRaceFolders();
|
||||||
|
|
||||||
|
getConfig().addDefault(WEB_CONFIG, "http://accounts.mineplex.com/");
|
||||||
|
getConfig().set(WEB_CONFIG, getConfig().getString(WEB_CONFIG));
|
||||||
|
saveConfig();
|
||||||
|
|
||||||
|
_spawnLocation = new Location(this.getServer().getWorlds().get(0), 8.5, 17, -22.5, 0f, 0f);
|
||||||
|
|
||||||
|
_clientManager = CoreClientManager.Initialize(this, GetWebServerAddress());
|
||||||
|
CommandCenter.Initialize(this, _clientManager);
|
||||||
|
FakeEntityManager.Initialize(this);
|
||||||
|
Recharge.Initialize(this);
|
||||||
|
|
||||||
|
_donationManager = new DonationManager(this, GetWebServerAddress());
|
||||||
|
|
||||||
|
_creature = new Creature(this);
|
||||||
|
|
||||||
|
new Punish(this, GetWebServerAddress(), _clientManager);
|
||||||
|
new Explosion(this, _blockRestore);
|
||||||
|
|
||||||
|
_teleport = new Teleport(this, _clientManager, _spawn);
|
||||||
|
|
||||||
|
//Unreferenced Modules
|
||||||
|
new AntiStack(this);
|
||||||
|
//new Chat(this, GetClans(), _repository);
|
||||||
|
new JoinQuit();
|
||||||
|
new ServerStatusManager(this, new LagMeter(this, _clientManager));
|
||||||
|
|
||||||
|
|
||||||
|
PacketHandler packetHandler = new PacketHandler(this);
|
||||||
|
|
||||||
|
ItemStackFactory.Initialize(this, true);
|
||||||
|
|
||||||
|
//Kart
|
||||||
|
_gpManager = new GPManager(this, _donationManager, _teleport, Recharge.Instance, new KartManager(this, Recharge.Instance), new TrackManager(this, _teleport));
|
||||||
|
new TrackProcessor();
|
||||||
|
|
||||||
|
//Updates
|
||||||
|
new Updater(this);
|
||||||
|
|
||||||
|
//_serverListener = new ServerListener(GetWebServerAddress(), getServer().getIp(), getServer().getPort() + 1);
|
||||||
|
|
||||||
|
//new TabLobbyList(this, playerNamer.PacketHandler, _clientManager, _donationManager, true);
|
||||||
|
|
||||||
|
FakeEntityManager.Instance.SetPacketHandler(packetHandler);
|
||||||
|
DonationManager donationManager = new DonationManager(this, GetWebServerAddress());
|
||||||
|
|
||||||
|
new NpcManager(this, _creature);
|
||||||
|
KartFactory _kartFactory = new KartFactory(this, new KartRepository(GetWebServerAddress()));
|
||||||
|
new KartShop(_kartFactory, _clientManager, donationManager, CurrencyType.Gems);
|
||||||
|
new KartMenu(_kartFactory, _clientManager, donationManager, _gpManager);
|
||||||
|
|
||||||
|
new MemoryFix(this);
|
||||||
|
|
||||||
|
getServer().getPluginManager().registerEvents(this, this);
|
||||||
|
|
||||||
|
CreateFakeKarts();
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void OnPlayerJoin(PlayerJoinEvent event)
|
||||||
|
{
|
||||||
|
event.getPlayer().teleport(_spawnLocation);
|
||||||
|
event.getPlayer().setGameMode(GameMode.SURVIVAL);
|
||||||
|
event.getPlayer().setFoodLevel(20);
|
||||||
|
event.getPlayer().setHealth(20d);
|
||||||
|
ShowFakeKarts(event.getPlayer());
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void PreventFoodChange(FoodLevelChangeEvent event)
|
||||||
|
{
|
||||||
|
if (event.getEntity() instanceof Player && !_gpManager.InGame((Player)event.getEntity()))
|
||||||
|
{
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onBlockBreakEvent(BlockBreakEvent event)
|
||||||
|
{
|
||||||
|
if (!event.getPlayer().isOp())
|
||||||
|
{
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onBlockPlaceEvent(BlockPlaceEvent event)
|
||||||
|
{
|
||||||
|
if (!event.getPlayer().isOp())
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onPlayerBucketEmpty(PlayerBucketEmptyEvent event)
|
||||||
|
{
|
||||||
|
if (!event.getPlayer().isOp())
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onPlayerBucketFill(PlayerBucketFillEvent event)
|
||||||
|
{
|
||||||
|
if (!event.getPlayer().isOp())
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void PreventDrop(PlayerDropItemEvent event)
|
||||||
|
{
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void BurnCancel(BlockBurnEvent event)
|
||||||
|
{
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void SpreadCancel(BlockFromToEvent event)
|
||||||
|
{
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void GrowCancel(BlockGrowEvent event)
|
||||||
|
{
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDisable()
|
||||||
|
{
|
||||||
|
_serverListener.Shutdown();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public JavaPlugin GetPlugin()
|
||||||
|
{
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String GetWebServerAddress()
|
||||||
|
{
|
||||||
|
return getConfig().getString(WEB_CONFIG);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Server GetRealServer()
|
||||||
|
{
|
||||||
|
return getServer();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PluginManager GetPluginManager()
|
||||||
|
{
|
||||||
|
return GetRealServer().getPluginManager();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CreateFakeKarts()
|
||||||
|
{
|
||||||
|
_chicken = new FakeEntity(EntityType.CHICKEN, new Location(_spawnLocation.getWorld(), 6.5, 17.5, -39.5, 0f, 0f));
|
||||||
|
_wolf = new FakeEntity(EntityType.WOLF, new Location(_spawnLocation.getWorld(), 8.5, 17.5, -39.5, 0f, 0f));
|
||||||
|
_pig = new FakeEntity(EntityType.PIG, new Location(_spawnLocation.getWorld(), 10.5, 17.5, -39.5, 0f, 0f));
|
||||||
|
_spider = new FakeEntity(EntityType.SPIDER, new Location(_spawnLocation.getWorld(), 6.5, 19.5, -39.5, 0f, 0f));
|
||||||
|
_sheep = new FakeEntity(EntityType.SHEEP, new Location(_spawnLocation.getWorld(), 8.5, 19.5, -39.5, 0f, 0f));
|
||||||
|
_cow = new FakeEntity(EntityType.COW, new Location(_spawnLocation.getWorld(), 10.5, 19.5, -39.5, 0f, 0f));
|
||||||
|
_golem = new FakeEntity(EntityType.IRON_GOLEM, new Location(_spawnLocation.getWorld(), 6.5, 21.5, -39.5, 0f, 0f));
|
||||||
|
_blaze = new FakeEntity(EntityType.BLAZE, new Location(_spawnLocation.getWorld(), 8.5, 21.5, -39.5, 0f, 0f));
|
||||||
|
_enderman = new FakeEntity(EntityType.ENDERMAN, new Location(_spawnLocation.getWorld(), 10.5, 21.5, -39.5, 0f, 0f));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ShowFakeKarts(Player player)
|
||||||
|
{
|
||||||
|
EntityPlayer mcPlayer = ((CraftPlayer)player).getHandle();
|
||||||
|
|
||||||
|
mcPlayer.playerConnection.sendPacket(_chicken.Spawn());
|
||||||
|
mcPlayer.playerConnection.sendPacket(_wolf.Spawn());
|
||||||
|
mcPlayer.playerConnection.sendPacket(_pig.Spawn());
|
||||||
|
mcPlayer.playerConnection.sendPacket(_spider.Spawn());
|
||||||
|
mcPlayer.playerConnection.sendPacket(_sheep.Spawn());
|
||||||
|
mcPlayer.playerConnection.sendPacket(_cow.Spawn());
|
||||||
|
mcPlayer.playerConnection.sendPacket(_golem.Spawn());
|
||||||
|
mcPlayer.playerConnection.sendPacket(_blaze.Spawn());
|
||||||
|
mcPlayer.playerConnection.sendPacket(_enderman.Spawn());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ClearRaceFolders()
|
||||||
|
{
|
||||||
|
File mainDirectory = new File(".");
|
||||||
|
|
||||||
|
FileFilter statsFilter = new FileFilter()
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public boolean accept(File arg0)
|
||||||
|
{
|
||||||
|
return arg0.isDirectory() && arg0.getName().contains("-");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
for (File f : mainDirectory.listFiles(statsFilter))
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
FileDeleteStrategy.FORCE.delete(f);
|
||||||
|
|
||||||
|
}
|
||||||
|
catch (IOException e)
|
||||||
|
{
|
||||||
|
System.out.println("Error deleting " + f.getName() + " on startup.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,416 @@
|
|||||||
|
package nautilus.game.minekart.gp;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.BufferedWriter;
|
||||||
|
import java.io.DataInputStream;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileWriter;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.ChatColor;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.scoreboard.DisplaySlot;
|
||||||
|
import org.bukkit.scoreboard.Objective;
|
||||||
|
import org.bukkit.scoreboard.Score;
|
||||||
|
import org.bukkit.scoreboard.Scoreboard;
|
||||||
|
import org.bukkit.scoreboard.ScoreboardManager;
|
||||||
|
import org.fusesource.jansi.Ansi.Color;
|
||||||
|
|
||||||
|
import mineplex.core.common.util.F;
|
||||||
|
import mineplex.core.common.util.UtilPlayer;
|
||||||
|
import mineplex.core.fakeEntity.FakeEntityManager;
|
||||||
|
import nautilus.game.minekart.kart.Kart;
|
||||||
|
import nautilus.game.minekart.kart.KartType;
|
||||||
|
import nautilus.game.minekart.track.Track;
|
||||||
|
import nautilus.game.minekart.track.Track.TrackState;
|
||||||
|
|
||||||
|
public class GP
|
||||||
|
{
|
||||||
|
public enum GPState
|
||||||
|
{
|
||||||
|
Recruit,
|
||||||
|
Live,
|
||||||
|
Ended
|
||||||
|
}
|
||||||
|
|
||||||
|
public GPManager Manager;
|
||||||
|
|
||||||
|
private GPState _state = GPState.Recruit;
|
||||||
|
|
||||||
|
private int _gpId = 0;
|
||||||
|
|
||||||
|
private HashMap<Player, KartType> _players = new HashMap<Player, KartType>();
|
||||||
|
|
||||||
|
private Scoreboard _scoreScoreboard;
|
||||||
|
private Objective _scoreObjective;
|
||||||
|
|
||||||
|
private Scoreboard _posScoreboard;
|
||||||
|
private Objective _posObjective;
|
||||||
|
|
||||||
|
private boolean _switchScoreboards;
|
||||||
|
|
||||||
|
private GPSet _trackSet;
|
||||||
|
private int _trackIndex = -1;
|
||||||
|
private Track[] _trackArray = null;
|
||||||
|
|
||||||
|
private int _maxKarts = 10;
|
||||||
|
|
||||||
|
public GP(GPManager manager, GPSet trackSet)
|
||||||
|
{
|
||||||
|
Manager = manager;
|
||||||
|
_trackSet = trackSet;
|
||||||
|
|
||||||
|
_gpId = GetNewId();
|
||||||
|
|
||||||
|
//Prepare Tracks
|
||||||
|
_trackArray = new Track[_trackSet.GetMapNames().length];
|
||||||
|
for (int i=0 ; i<_trackArray.length ; i++)
|
||||||
|
{
|
||||||
|
_trackArray[i] = new Track(this, Manager.GetTeleport(), Manager.GetRecharge(), _trackSet.GetMapNames()[i], i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public GPState GetState()
|
||||||
|
{
|
||||||
|
return _state;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int GetId()
|
||||||
|
{
|
||||||
|
return _gpId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public GPSet GetSet()
|
||||||
|
{
|
||||||
|
return _trackSet;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Track GetTrack()
|
||||||
|
{
|
||||||
|
if (_trackIndex == -1)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
if (_trackIndex >= _trackArray.length)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
return _trackArray[_trackIndex];
|
||||||
|
}
|
||||||
|
|
||||||
|
public Track GetTrack(int id)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return _trackArray[id];
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Track[] GetTracks()
|
||||||
|
{
|
||||||
|
return _trackArray;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int GetMaxKarts()
|
||||||
|
{
|
||||||
|
return _maxKarts;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Collection<Player> GetPlayers()
|
||||||
|
{
|
||||||
|
return _players.keySet();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Collection<Kart> GetKarts()
|
||||||
|
{
|
||||||
|
HashSet<Kart> _karts = new HashSet<Kart>();
|
||||||
|
|
||||||
|
for (Player player : GetPlayers())
|
||||||
|
{
|
||||||
|
Kart kart = Manager.KartManager.GetKart(player);
|
||||||
|
|
||||||
|
if (kart != null)
|
||||||
|
_karts.add(kart);
|
||||||
|
}
|
||||||
|
|
||||||
|
return _karts;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetState(GPState state)
|
||||||
|
{
|
||||||
|
_state = state;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void NextTrack()
|
||||||
|
{
|
||||||
|
_trackIndex++;
|
||||||
|
|
||||||
|
for (Kart kart : GetKarts())
|
||||||
|
{
|
||||||
|
kart.ClearTrackData();
|
||||||
|
|
||||||
|
kart.SetItemCycles(0);
|
||||||
|
kart.SetItemStored(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_trackIndex < _trackArray.length)
|
||||||
|
{
|
||||||
|
for (Kart kart : GetKarts())
|
||||||
|
{
|
||||||
|
kart.SetItemStored(null);
|
||||||
|
kart.SetItemActive(null);
|
||||||
|
|
||||||
|
kart.GetDriver().eject();
|
||||||
|
kart.GetDriver().leaveVehicle();
|
||||||
|
}
|
||||||
|
|
||||||
|
GetTrack().Initialize();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_trackIndex--;
|
||||||
|
//Load Castle
|
||||||
|
Manager.CreateResult(this);
|
||||||
|
|
||||||
|
_trackIndex++;
|
||||||
|
|
||||||
|
for (Kart kart : GetKarts())
|
||||||
|
{
|
||||||
|
Manager.KartManager.RemoveKart(kart.GetDriver());
|
||||||
|
FakeEntityManager.Instance.RemoveForward(kart.GetDriver());
|
||||||
|
FakeEntityManager.Instance.RemoveFakeVehicle(kart.GetDriver(), kart.GetEntity().GetEntityId());
|
||||||
|
}
|
||||||
|
|
||||||
|
Announce(F.main("MK", "Ended Set: " + F.elem(_trackSet.GetName())));
|
||||||
|
|
||||||
|
SetState(GPState.Ended);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddPlayer(Player player, KartType type)
|
||||||
|
{
|
||||||
|
_players.put(player, type);
|
||||||
|
|
||||||
|
Manager.KartManager.AddKart(player, type, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RemovePlayer(Player player, Kart kart)
|
||||||
|
{
|
||||||
|
_players.remove(player);
|
||||||
|
|
||||||
|
if (_scoreScoreboard != null)
|
||||||
|
{
|
||||||
|
_scoreScoreboard.resetScores(Bukkit.getOfflinePlayer(Color.WHITE + player.getName()));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_posScoreboard != null)
|
||||||
|
{
|
||||||
|
ChatColor col = ChatColor.YELLOW;
|
||||||
|
if (kart != null && kart.GetLap() > 3)
|
||||||
|
col = ChatColor.GREEN;
|
||||||
|
|
||||||
|
_posScoreboard.resetScores(Bukkit.getOfflinePlayer(col + player.getName()));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (kart != null)
|
||||||
|
for (Track track : _trackArray)
|
||||||
|
track.RemoveKart(kart);
|
||||||
|
|
||||||
|
if (this instanceof GPBattle)
|
||||||
|
Announce(F.main("MK", player.getName() + " has left the Battle."));
|
||||||
|
else
|
||||||
|
Announce(F.main("MK", player.getName() + " has left the Grand Prix."));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void UpdateScoreBoard()
|
||||||
|
{
|
||||||
|
if (GetTrack() == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (GetTrack().GetState() == TrackState.Ended)
|
||||||
|
{
|
||||||
|
if (_scoreScoreboard == null)
|
||||||
|
{
|
||||||
|
ScoreboardManager manager = Bukkit.getScoreboardManager();
|
||||||
|
_scoreScoreboard = manager.getNewScoreboard();
|
||||||
|
|
||||||
|
_scoreObjective = _scoreScoreboard.registerNewObjective("showposition", "dummy");
|
||||||
|
_scoreObjective.setDisplaySlot(DisplaySlot.SIDEBAR);
|
||||||
|
_scoreObjective.setDisplayName(ChatColor.AQUA + "Total Score");
|
||||||
|
|
||||||
|
_switchScoreboards = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_switchScoreboards)
|
||||||
|
{
|
||||||
|
for (Kart kart : GetTrack().GetPositions())
|
||||||
|
{
|
||||||
|
if (kart.GetDriver() == null || !kart.GetDriver().isOnline())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
kart.GetDriver().setScoreboard(_scoreScoreboard);
|
||||||
|
}
|
||||||
|
|
||||||
|
_switchScoreboards = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Kart kart : GetTrack().GetPositions())
|
||||||
|
{
|
||||||
|
if (kart.GetDriver() == null || !kart.GetDriver().isOnline())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
Score score = _scoreObjective.getScore(Bukkit.getOfflinePlayer(UtilPlayer.safeNameLength(ChatColor.WHITE + kart.GetDriver().getName())));
|
||||||
|
score.setScore(GetScore(kart));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (_posScoreboard == null)
|
||||||
|
{
|
||||||
|
ScoreboardManager manager = Bukkit.getScoreboardManager();
|
||||||
|
_posScoreboard = manager.getNewScoreboard();
|
||||||
|
|
||||||
|
_posObjective = _posScoreboard.registerNewObjective("showposition", "dummy");
|
||||||
|
_posObjective.setDisplaySlot(DisplaySlot.SIDEBAR);
|
||||||
|
_posObjective.setDisplayName(ChatColor.AQUA + "Kart Positions");
|
||||||
|
|
||||||
|
_switchScoreboards = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Kart kart : GetTrack().GetPositions())
|
||||||
|
{
|
||||||
|
if (kart.GetDriver() == null || !kart.GetDriver().isOnline())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
ChatColor col = ChatColor.YELLOW;
|
||||||
|
|
||||||
|
if (kart.GetLap() > 3)
|
||||||
|
{
|
||||||
|
col = ChatColor.GREEN;
|
||||||
|
_posScoreboard.resetScores(Bukkit.getOfflinePlayer(UtilPlayer.safeNameLength(ChatColor.YELLOW + kart.GetDriver().getName())));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_posScoreboard.resetScores(Bukkit.getOfflinePlayer(UtilPlayer.safeNameLength(ChatColor.GREEN + kart.GetDriver().getName())));
|
||||||
|
}
|
||||||
|
|
||||||
|
Score score = _posObjective.getScore(Bukkit.getOfflinePlayer(UtilPlayer.safeNameLength(col + kart.GetDriver().getName())));
|
||||||
|
score.setScore(kart.GetLapPlace() + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_switchScoreboards)
|
||||||
|
{
|
||||||
|
for (Kart kart : GetTrack().GetPositions())
|
||||||
|
{
|
||||||
|
if (kart.GetDriver() == null || !kart.GetDriver().isOnline())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
|
||||||
|
kart.GetDriver().setScoreboard(_posScoreboard);
|
||||||
|
}
|
||||||
|
|
||||||
|
_switchScoreboards = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public int GetScore(Kart kart)
|
||||||
|
{
|
||||||
|
int score = 0;
|
||||||
|
|
||||||
|
for (Track track : _trackArray)
|
||||||
|
for (int i=0 ; i<track.GetPositions().size() ; i++)
|
||||||
|
if (track.GetPositions().get(i).equals(kart))
|
||||||
|
{
|
||||||
|
score += Math.max(1, 10 - (i*2));
|
||||||
|
}
|
||||||
|
|
||||||
|
return score;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int GetNewId()
|
||||||
|
{
|
||||||
|
File file = new File("TrackId.dat");
|
||||||
|
|
||||||
|
//Write If Blank
|
||||||
|
if (!file.exists())
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
FileWriter fstream = new FileWriter(file);
|
||||||
|
BufferedWriter out = new BufferedWriter(fstream);
|
||||||
|
|
||||||
|
out.write("0");
|
||||||
|
|
||||||
|
out.close();
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
System.out.println("Error: Track GetId Write Exception");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int id = 0;
|
||||||
|
|
||||||
|
//Read
|
||||||
|
try
|
||||||
|
{
|
||||||
|
FileInputStream fstream = new FileInputStream(file);
|
||||||
|
DataInputStream in = new DataInputStream(fstream);
|
||||||
|
BufferedReader br = new BufferedReader(new InputStreamReader(in));
|
||||||
|
String line = br.readLine();
|
||||||
|
|
||||||
|
id = Integer.parseInt(line);
|
||||||
|
|
||||||
|
in.close();
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
System.out.println("Error: Track GetId Read Exception");
|
||||||
|
id = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
FileWriter fstream = new FileWriter(file);
|
||||||
|
BufferedWriter out = new BufferedWriter(fstream);
|
||||||
|
|
||||||
|
out.write("" + (id + 1));
|
||||||
|
|
||||||
|
out.close();
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
System.out.println("Error: Track GetId Re-Write Exception");
|
||||||
|
}
|
||||||
|
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Announce(String string)
|
||||||
|
{
|
||||||
|
for (Player player : GetPlayers())
|
||||||
|
UtilPlayer.message(player, string);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Unload()
|
||||||
|
{
|
||||||
|
for (Track track : _trackArray)
|
||||||
|
{
|
||||||
|
track.GetPositions().clear();
|
||||||
|
track.GetScores().clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SwitchScoreboards()
|
||||||
|
{
|
||||||
|
_switchScoreboards = true;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,124 @@
|
|||||||
|
package nautilus.game.minekart.gp;
|
||||||
|
|
||||||
|
import nautilus.game.minekart.kart.Kart;
|
||||||
|
import nautilus.game.minekart.track.Track.TrackState;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.ChatColor;
|
||||||
|
import org.bukkit.scoreboard.DisplaySlot;
|
||||||
|
import org.bukkit.scoreboard.Objective;
|
||||||
|
import org.bukkit.scoreboard.Score;
|
||||||
|
import org.bukkit.scoreboard.Scoreboard;
|
||||||
|
import org.bukkit.scoreboard.ScoreboardManager;
|
||||||
|
|
||||||
|
public class GPBattle extends GP
|
||||||
|
{
|
||||||
|
public GPBattle(GPManager manager, GPSet trackSet)
|
||||||
|
{
|
||||||
|
super(manager, trackSet);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void UpdateScoreBoard()
|
||||||
|
{
|
||||||
|
if (GetTrack() == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (GetTrack().GetState() == TrackState.Ended)
|
||||||
|
{
|
||||||
|
ScoreboardManager manager = Bukkit.getScoreboardManager();
|
||||||
|
Scoreboard board = manager.getNewScoreboard();
|
||||||
|
|
||||||
|
Objective objective = board.registerNewObjective("showposition", "dummy");
|
||||||
|
objective.setDisplaySlot(DisplaySlot.SIDEBAR);
|
||||||
|
objective.setDisplayName(ChatColor.AQUA + "Total Score");
|
||||||
|
|
||||||
|
for (Kart kart : GetKarts())
|
||||||
|
{
|
||||||
|
if (kart.GetDriver() == null || !kart.GetDriver().isOnline())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
ChatColor col = ChatColor.GRAY;
|
||||||
|
if (kart.GetLives() == 3) col = ChatColor.GREEN;
|
||||||
|
else if (kart.GetLives() == 2) col = ChatColor.YELLOW;
|
||||||
|
else if (kart.GetLives() == 1) col = ChatColor.RED;
|
||||||
|
|
||||||
|
String name = col + kart.GetDriver().getName();
|
||||||
|
if (name.length() > 16)
|
||||||
|
name = name.substring(0, 16);
|
||||||
|
|
||||||
|
Score score = objective.getScore(Bukkit.getOfflinePlayer(name));
|
||||||
|
score.setScore(GetScore(kart));
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Kart kart : GetKarts())
|
||||||
|
{
|
||||||
|
if (kart.GetDriver() == null || !kart.GetDriver().isOnline())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
kart.GetDriver().setScoreboard(board);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ScoreboardManager manager = Bukkit.getScoreboardManager();
|
||||||
|
Scoreboard board = manager.getNewScoreboard();
|
||||||
|
|
||||||
|
Objective objective = board.registerNewObjective("showposition", "dummy");
|
||||||
|
objective.setDisplaySlot(DisplaySlot.SIDEBAR);
|
||||||
|
objective.setDisplayName(ChatColor.AQUA + "Kart Balloons");
|
||||||
|
|
||||||
|
for (Kart kart : GetKarts())
|
||||||
|
{
|
||||||
|
if (kart.GetDriver() == null || !kart.GetDriver().isOnline())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
ChatColor col = ChatColor.GRAY;
|
||||||
|
if (kart.GetLives() == 3) col = ChatColor.GREEN;
|
||||||
|
else if (kart.GetLives() == 2) col = ChatColor.YELLOW;
|
||||||
|
else if (kart.GetLives() == 1) col = ChatColor.RED;
|
||||||
|
|
||||||
|
String name = col + kart.GetDriver().getName();
|
||||||
|
if (name.length() > 16)
|
||||||
|
name = name.substring(0, 16);
|
||||||
|
|
||||||
|
Score score = objective.getScore(Bukkit.getOfflinePlayer(name));
|
||||||
|
score.setScore(kart.GetLives());
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Kart kart : GetKarts())
|
||||||
|
{
|
||||||
|
if (kart.GetDriver() == null || !kart.GetDriver().isOnline())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
kart.GetDriver().setScoreboard(board);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void CheckBattleEnd()
|
||||||
|
{
|
||||||
|
if (GetTrack().GetState() == TrackState.Loading || GetTrack().GetState() == TrackState.Countdown)
|
||||||
|
return;
|
||||||
|
|
||||||
|
int alive = 0;
|
||||||
|
Kart winner = null;
|
||||||
|
for (Kart kart : GetKarts())
|
||||||
|
{
|
||||||
|
if (kart.GetLives() > 0)
|
||||||
|
{
|
||||||
|
alive++;
|
||||||
|
winner = kart;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (alive > 1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (GetTrack().GetState() != TrackState.Ended)
|
||||||
|
{
|
||||||
|
this.GetTrack().GetPositions().add(0, winner);
|
||||||
|
GetTrack().SetState(TrackState.Ended);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,532 @@
|
|||||||
|
package nautilus.game.minekart.gp;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.BufferedWriter;
|
||||||
|
import java.io.DataInputStream;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileWriter;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
|
|
||||||
|
import nautilus.game.minekart.gp.GP.GPState;
|
||||||
|
import nautilus.game.minekart.gp.command.GpCommand;
|
||||||
|
import nautilus.game.minekart.gp.command.ItemCommand;
|
||||||
|
import nautilus.game.minekart.gp.command.KartCommand;
|
||||||
|
import nautilus.game.minekart.gp.command.VoteCommand;
|
||||||
|
import nautilus.game.minekart.kart.Kart;
|
||||||
|
import nautilus.game.minekart.kart.KartType;
|
||||||
|
import nautilus.game.minekart.kart.KartManager;
|
||||||
|
import nautilus.game.minekart.track.Track.TrackState;
|
||||||
|
import nautilus.game.minekart.track.TrackManager;
|
||||||
|
|
||||||
|
import org.bukkit.ChatColor;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.EventPriority;
|
||||||
|
import org.bukkit.event.block.BlockSpreadEvent;
|
||||||
|
import org.bukkit.event.entity.CreatureSpawnEvent;
|
||||||
|
import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason;
|
||||||
|
import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
|
||||||
|
import org.bukkit.event.entity.EntityDamageEvent;
|
||||||
|
import org.bukkit.event.player.AsyncPlayerChatEvent;
|
||||||
|
import org.bukkit.event.player.PlayerJoinEvent;
|
||||||
|
import org.bukkit.event.player.PlayerLoginEvent;
|
||||||
|
import org.bukkit.event.player.PlayerLoginEvent.Result;
|
||||||
|
import org.bukkit.event.player.PlayerQuitEvent;
|
||||||
|
import org.bukkit.event.server.ServerListPingEvent;
|
||||||
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
|
|
||||||
|
import mineplex.core.MiniPlugin;
|
||||||
|
import mineplex.core.portal.Portal;
|
||||||
|
import mineplex.core.recharge.Recharge;
|
||||||
|
import mineplex.core.teleport.Teleport;
|
||||||
|
import mineplex.core.updater.event.RestartServerEvent;
|
||||||
|
import mineplex.core.updater.event.UpdateEvent;
|
||||||
|
import mineplex.core.updater.UpdateType;
|
||||||
|
import mineplex.core.common.util.C;
|
||||||
|
import mineplex.core.common.util.F;
|
||||||
|
import mineplex.core.common.util.UtilPlayer;
|
||||||
|
import mineplex.core.common.util.UtilServer;
|
||||||
|
import mineplex.core.common.util.UtilTime;
|
||||||
|
import mineplex.core.common.util.UtilWorld;
|
||||||
|
import mineplex.core.donation.DonationManager;
|
||||||
|
|
||||||
|
public class GPManager extends MiniPlugin
|
||||||
|
{
|
||||||
|
private DonationManager _donationManager;
|
||||||
|
private Teleport _teleport;
|
||||||
|
private Recharge _recharge;
|
||||||
|
|
||||||
|
public KartManager KartManager;
|
||||||
|
public TrackManager TrackManager;
|
||||||
|
public Portal Portal;
|
||||||
|
|
||||||
|
//Queue Data
|
||||||
|
private GPSet _set;
|
||||||
|
private Location _spawn;
|
||||||
|
|
||||||
|
private ArrayList<Player> _players = new ArrayList<Player>();
|
||||||
|
private HashMap<Player, Boolean> _playerVote = new HashMap<Player, Boolean>();
|
||||||
|
private HashMap<Player, KartType> _kartSelect = new HashMap<Player, KartType>();
|
||||||
|
|
||||||
|
private long _voteTimer = 0;
|
||||||
|
private int _startTimer = 0;
|
||||||
|
|
||||||
|
//Live Sets
|
||||||
|
private HashSet<GP> _live = new HashSet<GP>();
|
||||||
|
|
||||||
|
//Result Maps
|
||||||
|
private HashSet<GPResult> _results = new HashSet<GPResult>();
|
||||||
|
|
||||||
|
public GPManager(JavaPlugin plugin, DonationManager donationManager, Teleport teleport, Recharge recharge, KartManager kartManager, TrackManager trackManager)
|
||||||
|
{
|
||||||
|
super("Race Manager", plugin);
|
||||||
|
|
||||||
|
_donationManager = donationManager;
|
||||||
|
_teleport = teleport;
|
||||||
|
_recharge = recharge;
|
||||||
|
KartManager = kartManager;
|
||||||
|
TrackManager = trackManager;
|
||||||
|
Portal = new Portal(plugin);
|
||||||
|
|
||||||
|
_spawn = new Location(UtilWorld.getWorld("world"), 8.5, 18, -22.5);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void AddCommands()
|
||||||
|
{
|
||||||
|
AddCommand(new GpCommand(this));
|
||||||
|
AddCommand(new ItemCommand(this));
|
||||||
|
AddCommand(new KartCommand(this));
|
||||||
|
AddCommand(new VoteCommand(this));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SelectKart(Player player, KartType kart)
|
||||||
|
{
|
||||||
|
_kartSelect.put(player, kart);
|
||||||
|
UtilPlayer.message(player, F.main("MK", "You selected " + F.elem(kart.GetName() + " Kart") + "."));
|
||||||
|
}
|
||||||
|
|
||||||
|
public KartType GetSelectedKart(Player player)
|
||||||
|
{
|
||||||
|
if (!_kartSelect.containsKey(player))
|
||||||
|
_kartSelect.put(player, KartType.Sheep);
|
||||||
|
|
||||||
|
return _kartSelect.get(player);
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void restartServerCheck(RestartServerEvent event)
|
||||||
|
{
|
||||||
|
if (_live.size() > 0 || _results.size() > 0)
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.MONITOR)
|
||||||
|
public void Motd(ServerListPingEvent event)
|
||||||
|
{
|
||||||
|
if (_live.size() > 0)
|
||||||
|
{
|
||||||
|
if (_live.iterator().next() instanceof GPBattle)
|
||||||
|
{
|
||||||
|
event.setMotd(ChatColor.AQUA + "In Battle...");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
event.setMotd(ChatColor.AQUA + "In Race...");
|
||||||
|
}
|
||||||
|
|
||||||
|
event.setMaxPlayers(_plugin.getServer().getOnlinePlayers().length);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
event.setMotd(ChatColor.GREEN + GetSet().GetName());
|
||||||
|
event.setMaxPlayers(10);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void CheckStart(UpdateEvent event)
|
||||||
|
{
|
||||||
|
if (event.getType() != UpdateType.SEC)
|
||||||
|
return;
|
||||||
|
|
||||||
|
//Full
|
||||||
|
if (_players.size() >= 10)
|
||||||
|
{
|
||||||
|
StartGP(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Votes
|
||||||
|
int votes = 0;
|
||||||
|
for (boolean vote : _playerVote.values())
|
||||||
|
{
|
||||||
|
if (vote)
|
||||||
|
votes++;
|
||||||
|
}
|
||||||
|
|
||||||
|
int needed = (_players.size() / 2) + (_players.size()%2);
|
||||||
|
|
||||||
|
if (votes >= needed && _players.size() >= 4)
|
||||||
|
{
|
||||||
|
StartGP(false);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (UtilTime.elapsed(_voteTimer, 30000))
|
||||||
|
{
|
||||||
|
if (_players.size() >= 4)
|
||||||
|
{
|
||||||
|
Announce(F.main("MK", "Type " + F.elem(C.cGreen + "/vote") + " to start the game with less players."));
|
||||||
|
Announce(F.main("MK", F.elem((needed - votes)+"") + " more votes needed..."));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Announce(F.main("MK", "Waiting for players..."));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
_voteTimer = System.currentTimeMillis();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void StartGP(boolean force)
|
||||||
|
{
|
||||||
|
if (!force && _startTimer > 0)
|
||||||
|
{
|
||||||
|
Announce(F.main("MK", "Starting in " + F.time(UtilTime.MakeStr(_startTimer * 1000)) + "."));
|
||||||
|
_startTimer--;
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
GP gp;
|
||||||
|
if (GetSet() != GPSet.Battle) gp = new GP(this, GetSet());
|
||||||
|
else gp = new GPBattle(this, GetSet());
|
||||||
|
|
||||||
|
//Add Players
|
||||||
|
int added = 0;
|
||||||
|
while (added < 10)
|
||||||
|
{
|
||||||
|
if (_players.isEmpty())
|
||||||
|
break;
|
||||||
|
|
||||||
|
Player player = _players.remove(0);
|
||||||
|
gp.AddPlayer(player, GetSelectedKart(player));
|
||||||
|
|
||||||
|
//Clean Player
|
||||||
|
_playerVote.remove(player);
|
||||||
|
_kartSelect.remove(player);
|
||||||
|
|
||||||
|
added++;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Set Live
|
||||||
|
gp.SetState(GPState.Live);
|
||||||
|
gp.NextTrack();
|
||||||
|
_live.add(gp);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Vote(Player caller)
|
||||||
|
{
|
||||||
|
if (!_playerVote.containsKey(caller))
|
||||||
|
return;
|
||||||
|
|
||||||
|
boolean vote = _playerVote.get(caller);
|
||||||
|
|
||||||
|
_playerVote.put(caller, !vote);
|
||||||
|
|
||||||
|
if (!vote) Announce(F.main("MK", F.elem(caller.getName()) + " has " + F.elem(C.cGreen + "voted") + " to start the game."));
|
||||||
|
else Announce(F.main("MK", F.elem(caller.getName()) + " has " + F.elem(C.cRed + "unvoted") + " to start the game."));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Announce(String string)
|
||||||
|
{
|
||||||
|
for (Player player : _players)
|
||||||
|
UtilPlayer.message(player, string);
|
||||||
|
}
|
||||||
|
|
||||||
|
public GP GetGP(Player player)
|
||||||
|
{
|
||||||
|
for (GP race : _live)
|
||||||
|
if (race.GetPlayers().contains(player))
|
||||||
|
return race;
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void PlayerLogin(PlayerLoginEvent event)
|
||||||
|
{
|
||||||
|
if (_live.size() > 0)
|
||||||
|
{
|
||||||
|
event.disallow(Result.KICK_FULL, ChatColor.AQUA + "A race is already in progress.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void PlayerJoin(PlayerJoinEvent event)
|
||||||
|
{
|
||||||
|
Player player = event.getPlayer();
|
||||||
|
_players.add(player);
|
||||||
|
_playerVote.put(player, false);
|
||||||
|
_startTimer = 20;
|
||||||
|
|
||||||
|
player.teleport(_spawn);
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void PlayerQuit(PlayerQuitEvent event)
|
||||||
|
{
|
||||||
|
Player player = event.getPlayer();
|
||||||
|
|
||||||
|
//Remove Kart Choice
|
||||||
|
_kartSelect.remove(player);
|
||||||
|
|
||||||
|
//Remove Kart
|
||||||
|
Kart kart = KartManager.GetKart(player);
|
||||||
|
if (kart != null)
|
||||||
|
KartManager.RemoveKart(kart.GetDriver());
|
||||||
|
|
||||||
|
//Leave Queue
|
||||||
|
_players.remove(player);
|
||||||
|
_playerVote.remove(player);
|
||||||
|
_kartSelect.remove(player);
|
||||||
|
|
||||||
|
//Leave GP
|
||||||
|
GP gp = GetGP(player);
|
||||||
|
if (gp != null)
|
||||||
|
gp.RemovePlayer(player, kart);
|
||||||
|
|
||||||
|
//Leave Result
|
||||||
|
for (GPResult result : _results)
|
||||||
|
result.RemovePlayer(player);
|
||||||
|
|
||||||
|
if (gp != null && gp.GetPlayers().size() == 0)
|
||||||
|
_plugin.getServer().shutdown();
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void TeleportSpawn(EntityDamageEvent event)
|
||||||
|
{
|
||||||
|
if (event.getCause() != DamageCause.VOID)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!_players.contains(event.getEntity()))
|
||||||
|
return;
|
||||||
|
|
||||||
|
event.getEntity().teleport(_spawn);
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void UpdateGPScoreboard(UpdateEvent event)
|
||||||
|
{
|
||||||
|
if (event.getType() != UpdateType.FASTEST)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (GP gp : _live)
|
||||||
|
{
|
||||||
|
if (gp.GetState() != GPState.Ended && gp.GetTrack().GetState() != TrackState.Countdown)
|
||||||
|
{
|
||||||
|
gp.UpdateScoreBoard();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void UpdateGP(UpdateEvent event)
|
||||||
|
{
|
||||||
|
if (event.getType() != UpdateType.TICK)
|
||||||
|
return;
|
||||||
|
|
||||||
|
HashSet<GP> remove = new HashSet<GP>();
|
||||||
|
|
||||||
|
for (GP gp : _live)
|
||||||
|
{
|
||||||
|
if (gp.GetState() == GPState.Ended)
|
||||||
|
{
|
||||||
|
remove.add(gp);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gp.GetTrack().GetState() == TrackState.Countdown)
|
||||||
|
{
|
||||||
|
gp.GetTrack().SpawnTeleport();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gp instanceof GPBattle)
|
||||||
|
((GPBattle)gp).CheckBattleEnd();
|
||||||
|
|
||||||
|
gp.GetTrack().Update();
|
||||||
|
}
|
||||||
|
|
||||||
|
for (GP gp : remove)
|
||||||
|
{
|
||||||
|
gp.Unload();
|
||||||
|
_live.remove(gp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void UpdateGPResult(UpdateEvent event)
|
||||||
|
{
|
||||||
|
if (event.getType() != UpdateType.SEC)
|
||||||
|
return;
|
||||||
|
|
||||||
|
HashSet<GPResult> remove = new HashSet<GPResult>();
|
||||||
|
|
||||||
|
for (GPResult result : _results)
|
||||||
|
{
|
||||||
|
if (result.End())
|
||||||
|
remove.add(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (GPResult result : remove)
|
||||||
|
{
|
||||||
|
_results.remove(result);
|
||||||
|
_plugin.getServer().getScheduler().scheduleSyncDelayedTask(_plugin, new Runnable()
|
||||||
|
{
|
||||||
|
public void run()
|
||||||
|
{
|
||||||
|
_plugin.getServer().shutdown();
|
||||||
|
}
|
||||||
|
}, 100L);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void CreatureSpawn(CreatureSpawnEvent event)
|
||||||
|
{
|
||||||
|
if (event.getSpawnReason() == SpawnReason.NATURAL || event.getSpawnReason() == SpawnReason.DEFAULT || event.getSpawnReason() == SpawnReason.EGG)
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void BlockSpread(BlockSpreadEvent event)
|
||||||
|
{
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public GPResult CreateResult(GP gp)
|
||||||
|
{
|
||||||
|
GPResult result = new GPResult(gp, _donationManager);
|
||||||
|
_results.add(result);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void DeleteResult(GPResult result)
|
||||||
|
{
|
||||||
|
_results.remove(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void HandleChat(AsyncPlayerChatEvent event)
|
||||||
|
{
|
||||||
|
event.setCancelled(true);
|
||||||
|
|
||||||
|
final String message = event.getMessage();
|
||||||
|
final Player sender = event.getPlayer();
|
||||||
|
final GP senderGP = GetGP(event.getPlayer());
|
||||||
|
|
||||||
|
//Talk to GP
|
||||||
|
if (senderGP != null)
|
||||||
|
{
|
||||||
|
_plugin.getServer().getScheduler().scheduleSyncDelayedTask(_plugin, new Runnable()
|
||||||
|
{
|
||||||
|
public void run()
|
||||||
|
{
|
||||||
|
senderGP.Announce(C.cYellow + sender.getName() + " " + C.cWhite + message);
|
||||||
|
}
|
||||||
|
}, 0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (Player player : UtilServer.getPlayers())
|
||||||
|
{
|
||||||
|
if (GetGP(player) != null)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
final Player recipient = player;
|
||||||
|
|
||||||
|
_plugin.getServer().getScheduler().scheduleSyncDelayedTask(_plugin, new Runnable()
|
||||||
|
{
|
||||||
|
public void run()
|
||||||
|
{
|
||||||
|
UtilPlayer.message(recipient, C.cYellow + sender.getName() + " " + C.cWhite + message);
|
||||||
|
}
|
||||||
|
}, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean InGame(Player player)
|
||||||
|
{
|
||||||
|
return GetGP(player) != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public GPSet GetSet()
|
||||||
|
{
|
||||||
|
if (_set == null)
|
||||||
|
{
|
||||||
|
File file = new File("GPSet.dat");
|
||||||
|
|
||||||
|
//Write If Blank
|
||||||
|
if (!file.exists())
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
FileWriter fstream = new FileWriter(file);
|
||||||
|
BufferedWriter out = new BufferedWriter(fstream);
|
||||||
|
|
||||||
|
out.write("MushroomCup");
|
||||||
|
|
||||||
|
out.close();
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
System.out.println("Error: GP Set Write Exception");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Read
|
||||||
|
try
|
||||||
|
{
|
||||||
|
FileInputStream fstream = new FileInputStream(file);
|
||||||
|
DataInputStream in = new DataInputStream(fstream);
|
||||||
|
BufferedReader br = new BufferedReader(new InputStreamReader(in));
|
||||||
|
String line = br.readLine();
|
||||||
|
|
||||||
|
_set = GPSet.valueOf(line);
|
||||||
|
|
||||||
|
in.close();
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
System.out.println("Error: GP Set Read Exception");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_set == null)
|
||||||
|
{
|
||||||
|
return GPSet.MushroomCup;
|
||||||
|
}
|
||||||
|
|
||||||
|
return _set;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Teleport GetTeleport()
|
||||||
|
{
|
||||||
|
return _teleport;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Recharge GetRecharge()
|
||||||
|
{
|
||||||
|
return _recharge;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,258 @@
|
|||||||
|
package nautilus.game.minekart.gp;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import mineplex.core.common.util.FileUtil;
|
||||||
|
import mineplex.core.common.util.FireworkUtil;
|
||||||
|
import mineplex.core.common.util.MapUtil;
|
||||||
|
import mineplex.core.common.util.UtilServer;
|
||||||
|
import mineplex.core.common.util.UtilTime;
|
||||||
|
import mineplex.core.common.util.WorldChunkLoader;
|
||||||
|
import mineplex.core.common.util.WorldLoadInfo;
|
||||||
|
import mineplex.core.common.util.WorldUtil;
|
||||||
|
import mineplex.core.donation.DonationManager;
|
||||||
|
import mineplex.core.fakeEntity.FakeEntity;
|
||||||
|
import mineplex.core.fakeEntity.FakePlayer;
|
||||||
|
import nautilus.game.minekart.kart.Kart;
|
||||||
|
import nautilus.minecraft.core.utils.ZipUtil;
|
||||||
|
import net.minecraft.server.v1_7_R1.EntityPlayer;
|
||||||
|
|
||||||
|
import org.apache.commons.lang.math.RandomUtils;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.World;
|
||||||
|
import org.bukkit.WorldCreator;
|
||||||
|
import org.bukkit.craftbukkit.v1_7_R1.entity.CraftPlayer;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
public class GPResult
|
||||||
|
{
|
||||||
|
private GPManager Manager;
|
||||||
|
|
||||||
|
private String _file = "Result";
|
||||||
|
|
||||||
|
private World _world;
|
||||||
|
private GP _gp;
|
||||||
|
|
||||||
|
private boolean _initialized = false;
|
||||||
|
|
||||||
|
private long _time;
|
||||||
|
|
||||||
|
private Kart _first;
|
||||||
|
private Kart _second;
|
||||||
|
private Kart _third;
|
||||||
|
|
||||||
|
private List<Location> _fireworkLocations;
|
||||||
|
|
||||||
|
public GPResult(GP gp, DonationManager manager)
|
||||||
|
{
|
||||||
|
Manager = gp.Manager;
|
||||||
|
|
||||||
|
_gp = gp;
|
||||||
|
|
||||||
|
_time = System.currentTimeMillis();
|
||||||
|
|
||||||
|
List<Kart> sortedScores = new ArrayList<Kart>(_gp.GetKarts());
|
||||||
|
Collections.sort(sortedScores, new ScoreComparator(_gp));
|
||||||
|
|
||||||
|
int buffer = (_gp instanceof GPBattle ? 9 : 14);
|
||||||
|
|
||||||
|
if (_gp.GetTrack().GetPositions().size() > 0 && sortedScores.size() > 0)
|
||||||
|
{
|
||||||
|
_first = sortedScores.get(0);
|
||||||
|
manager.RewardGems(null, "Earned Minekart", _first.GetDriver().getName(), 8 * _gp.GetPlayers().size() + buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
buffer += 2;
|
||||||
|
|
||||||
|
if (_gp.GetTrack().GetPositions().size() > 1 && sortedScores.size() > 1)
|
||||||
|
{
|
||||||
|
_second = sortedScores.get(1);
|
||||||
|
manager.RewardGems(null, "Earned Minekart", _second.GetDriver().getName(), 5 * _gp.GetPlayers().size() + buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
buffer += 2;
|
||||||
|
|
||||||
|
if (_gp.GetTrack().GetPositions().size() > 2 && sortedScores.size() > 2)
|
||||||
|
{
|
||||||
|
_third = sortedScores.get(2);
|
||||||
|
manager.RewardGems(null, "Earned Minekart", _third.GetDriver().getName(), 2 * _gp.GetPlayers().size() + buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
buffer += 2;
|
||||||
|
|
||||||
|
for (int i = 3; i < sortedScores.size(); i++)
|
||||||
|
{
|
||||||
|
manager.RewardGems(null, "Earned Minekart", sortedScores.get(i).GetDriver().getName(), buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
_fireworkLocations = new ArrayList<Location>(5);
|
||||||
|
|
||||||
|
Initialise();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void TeleportPlayers()
|
||||||
|
{
|
||||||
|
Location loc = new Location(_world, 10, 23, -22);
|
||||||
|
loc.setYaw(180);
|
||||||
|
|
||||||
|
FakePlayer firstPlayer = null;
|
||||||
|
FakePlayer secondPlayer = null;
|
||||||
|
FakePlayer thirdPlayer = null;
|
||||||
|
|
||||||
|
FakeEntity firstKart = null;
|
||||||
|
FakeEntity secondKart = null;
|
||||||
|
FakeEntity thirdKart = null;
|
||||||
|
|
||||||
|
if (_first != null)
|
||||||
|
{
|
||||||
|
Location location = new Location(_world, 10, 25, -29);
|
||||||
|
firstPlayer = new FakePlayer(_first.GetDriver().getName(), location);
|
||||||
|
firstKart = new FakeEntity(_first.GetEntity().GetEntityType(), location);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_second != null)
|
||||||
|
{
|
||||||
|
Location location = new Location(_world, 6, 24, -29);
|
||||||
|
secondPlayer = new FakePlayer(_second.GetDriver().getName(), location);
|
||||||
|
secondKart = new FakeEntity(_second.GetEntity().GetEntityType(), location);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_third != null)
|
||||||
|
{
|
||||||
|
Location location = new Location(_world, 14, 23, -29);
|
||||||
|
thirdPlayer = new FakePlayer(_third.GetDriver().getName(), location);
|
||||||
|
thirdKart = new FakeEntity(_third.GetEntity().GetEntityType(), location);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Player player : _gp.GetPlayers())
|
||||||
|
{
|
||||||
|
if (!player.isOnline())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
Manager.GetTeleport().TP(player, loc);
|
||||||
|
|
||||||
|
EntityPlayer entityPlayer = ((CraftPlayer)player).getHandle();
|
||||||
|
|
||||||
|
if (_first != null)
|
||||||
|
{
|
||||||
|
entityPlayer.playerConnection.sendPacket(firstPlayer.Spawn());
|
||||||
|
entityPlayer.playerConnection.sendPacket(firstKart.Spawn());
|
||||||
|
entityPlayer.playerConnection.sendPacket(firstKart.SetPassenger(firstPlayer.GetEntityId()));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_second != null)
|
||||||
|
{
|
||||||
|
entityPlayer.playerConnection.sendPacket(secondPlayer.Spawn());
|
||||||
|
entityPlayer.playerConnection.sendPacket(secondKart.Spawn());
|
||||||
|
entityPlayer.playerConnection.sendPacket(secondKart.SetPassenger(secondPlayer.GetEntityId()));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_third != null)
|
||||||
|
{
|
||||||
|
entityPlayer.playerConnection.sendPacket(thirdPlayer.Spawn());
|
||||||
|
entityPlayer.playerConnection.sendPacket(thirdKart.Spawn());
|
||||||
|
entityPlayer.playerConnection.sendPacket(thirdKart.SetPassenger(thirdPlayer.GetEntityId()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Initialise()
|
||||||
|
{
|
||||||
|
UtilServer.getServer().getScheduler().runTaskAsynchronously(Manager.GetPlugin(), new Runnable()
|
||||||
|
{
|
||||||
|
public void run()
|
||||||
|
{
|
||||||
|
//Unzip
|
||||||
|
UnzipWorld();
|
||||||
|
|
||||||
|
SetLocations();
|
||||||
|
|
||||||
|
//Load Track Data Sync
|
||||||
|
UtilServer.getServer().getScheduler().runTask(Manager.GetPlugin(), new Runnable()
|
||||||
|
{
|
||||||
|
public void run()
|
||||||
|
{
|
||||||
|
WorldChunkLoader.AddWorld(new WorldLoadInfo(_world, -5, -6, 5, 2), new Runnable()
|
||||||
|
{
|
||||||
|
public void run()
|
||||||
|
{
|
||||||
|
_initialized = true;
|
||||||
|
TeleportPlayers();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void SetLocations()
|
||||||
|
{
|
||||||
|
_fireworkLocations.add(new Location(_world, -9.5, 42, -54.5));
|
||||||
|
_fireworkLocations.add(new Location(_world, 29.5, 42, -54.5));
|
||||||
|
_fireworkLocations.add(new Location(_world, 32.5, 43, -77.5));
|
||||||
|
_fireworkLocations.add(new Location(_world, -12.5, 43, -77.5));
|
||||||
|
_fireworkLocations.add(new Location(_world, 10, 61, -61));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void UnzipWorld()
|
||||||
|
{
|
||||||
|
//Unzip
|
||||||
|
String folder = _gp.GetId() + "-" + _gp.GetSet().GetName() + "-" + _file;
|
||||||
|
new File(folder).mkdir();
|
||||||
|
new File(folder + File.separatorChar + "region").mkdir();
|
||||||
|
new File(folder + File.separatorChar + "data").mkdir();
|
||||||
|
ZipUtil.UnzipToDirectory(_file + ".zip", folder);
|
||||||
|
|
||||||
|
//Start World
|
||||||
|
_world = WorldUtil.LoadWorld(new WorldCreator(folder));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Uninitialise()
|
||||||
|
{
|
||||||
|
MapUtil.UnloadWorld(Manager.GetPlugin(), _world);
|
||||||
|
MapUtil.ClearWorldReferences(_world.getName());
|
||||||
|
FileUtil.DeleteFolder(new File(_world.getName()));
|
||||||
|
|
||||||
|
_first = null;
|
||||||
|
_second = null;
|
||||||
|
_third = null;
|
||||||
|
|
||||||
|
_fireworkLocations.clear();
|
||||||
|
|
||||||
|
_world = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean End()
|
||||||
|
{
|
||||||
|
if (!_initialized)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (!UtilTime.elapsed(_time, 30000))
|
||||||
|
{
|
||||||
|
FireworkUtil.LaunchRandomFirework(_fireworkLocations.get(RandomUtils.nextInt(5)));
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Player player : _gp.GetPlayers())
|
||||||
|
{
|
||||||
|
Manager.Portal.SendPlayerToServer(player, "Lobby");
|
||||||
|
}
|
||||||
|
|
||||||
|
//Clean
|
||||||
|
_gp.GetPlayers().clear();
|
||||||
|
_gp = null;
|
||||||
|
Uninitialise();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RemovePlayer(Player player)
|
||||||
|
{
|
||||||
|
_gp.RemovePlayer(player, null);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,47 @@
|
|||||||
|
package nautilus.game.minekart.gp;
|
||||||
|
|
||||||
|
import org.bukkit.Material;
|
||||||
|
|
||||||
|
public enum GPSet
|
||||||
|
{
|
||||||
|
MushroomCup("Mushroom Cup", new String[] {"MushroomA", "MushroomB", "MushroomC", "MushroomD"}, Material.RAW_CHICKEN, false),
|
||||||
|
FlowerCup( "Flower Cup", new String[] {"MushroomA", "MushroomB", "MushroomC", "MushroomD"}, Material.COOKED_CHICKEN, false),
|
||||||
|
StarCup( "Star Cup", new String[] {"MushroomA", "MushroomB", "MushroomC", "MushroomD"}, Material.CARROT_ITEM, false),
|
||||||
|
SpecialCup( "Special Cup", new String[] {"MushroomA", "MushroomB", "MushroomC", "MushroomD"}, Material.GOLDEN_CARROT, false),
|
||||||
|
|
||||||
|
Battle("Battle", new String[] {"BattleA", "BattleB", "BattleC"}, Material.RAW_BEEF, true);
|
||||||
|
|
||||||
|
|
||||||
|
private String _name;
|
||||||
|
private String[] _mapNames;
|
||||||
|
private Material _displayMat;
|
||||||
|
private boolean _battle;
|
||||||
|
|
||||||
|
GPSet(String name, String[] mapNames, Material mat, boolean battle)
|
||||||
|
{
|
||||||
|
_name = name;
|
||||||
|
_mapNames = mapNames;
|
||||||
|
_displayMat = mat;
|
||||||
|
_battle = battle;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String GetName()
|
||||||
|
{
|
||||||
|
return _name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String[] GetMapNames()
|
||||||
|
{
|
||||||
|
return _mapNames;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Material GetDisplayMaterial()
|
||||||
|
{
|
||||||
|
return _displayMat;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean IsBattle()
|
||||||
|
{
|
||||||
|
return _battle;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,27 @@
|
|||||||
|
package nautilus.game.minekart.gp;
|
||||||
|
|
||||||
|
import java.util.Comparator;
|
||||||
|
|
||||||
|
import nautilus.game.minekart.kart.Kart;
|
||||||
|
|
||||||
|
public class ScoreComparator implements Comparator<Kart>
|
||||||
|
{
|
||||||
|
private GP _gp;
|
||||||
|
|
||||||
|
public ScoreComparator(GP gp)
|
||||||
|
{
|
||||||
|
_gp = gp;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int compare(Kart kart1, Kart kart2)
|
||||||
|
{
|
||||||
|
if (_gp.GetScore(kart1) > _gp.GetScore(kart2))
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (_gp.GetScore(kart1) == _gp.GetScore(kart2))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,26 @@
|
|||||||
|
package nautilus.game.minekart.gp.command;
|
||||||
|
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
import nautilus.game.minekart.gp.GPManager;
|
||||||
|
import nautilus.game.minekart.gp.command.gp.FinishCommand;
|
||||||
|
import nautilus.game.minekart.gp.command.gp.StartCommand;
|
||||||
|
import mineplex.core.command.MultiCommandBase;
|
||||||
|
import mineplex.core.common.Rank;
|
||||||
|
|
||||||
|
public class GpCommand extends MultiCommandBase<GPManager>
|
||||||
|
{
|
||||||
|
public GpCommand(GPManager plugin)
|
||||||
|
{
|
||||||
|
super(plugin, Rank.MODERATOR, "gp");
|
||||||
|
|
||||||
|
AddCommand(new StartCommand(plugin));
|
||||||
|
AddCommand(new FinishCommand(plugin));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void Help(Player caller, String[] args)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,32 @@
|
|||||||
|
package nautilus.game.minekart.gp.command;
|
||||||
|
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
import nautilus.game.minekart.gp.GPManager;
|
||||||
|
import nautilus.game.minekart.item.KartItemType;
|
||||||
|
import nautilus.game.minekart.kart.Kart;
|
||||||
|
import mineplex.core.command.CommandBase;
|
||||||
|
import mineplex.core.common.Rank;
|
||||||
|
import mineplex.core.common.util.UtilEnum;
|
||||||
|
|
||||||
|
public class ItemCommand extends CommandBase<GPManager>
|
||||||
|
{
|
||||||
|
public ItemCommand(GPManager plugin)
|
||||||
|
{
|
||||||
|
super(plugin, Rank.MODERATOR, "item");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void Execute(Player caller, String[] args)
|
||||||
|
{
|
||||||
|
if (args.length < 1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
Kart kart = Plugin.KartManager.GetKart(caller);
|
||||||
|
|
||||||
|
KartItemType kartItem = UtilEnum.fromString(KartItemType.class, args[0]);
|
||||||
|
|
||||||
|
if (kart != null)
|
||||||
|
kart.SetItemStored(kartItem);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,31 @@
|
|||||||
|
package nautilus.game.minekart.gp.command;
|
||||||
|
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
import nautilus.game.minekart.gp.GPManager;
|
||||||
|
import nautilus.game.minekart.kart.KartType;
|
||||||
|
import mineplex.core.command.CommandBase;
|
||||||
|
import mineplex.core.common.Rank;
|
||||||
|
|
||||||
|
public class KartCommand extends CommandBase<GPManager>
|
||||||
|
{
|
||||||
|
public KartCommand(GPManager plugin)
|
||||||
|
{
|
||||||
|
super(plugin, Rank.ADMIN, "kart");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void Execute(Player caller, String[] args)
|
||||||
|
{
|
||||||
|
if (args.length < 1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (KartType type : KartType.values())
|
||||||
|
{
|
||||||
|
if (args[0].equalsIgnoreCase(type.GetName()))
|
||||||
|
{
|
||||||
|
Plugin.SelectKart(caller, type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,21 @@
|
|||||||
|
package nautilus.game.minekart.gp.command;
|
||||||
|
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
import nautilus.game.minekart.gp.GPManager;
|
||||||
|
import mineplex.core.command.CommandBase;
|
||||||
|
import mineplex.core.common.Rank;
|
||||||
|
|
||||||
|
public class VoteCommand extends CommandBase<GPManager>
|
||||||
|
{
|
||||||
|
public VoteCommand(GPManager plugin)
|
||||||
|
{
|
||||||
|
super(plugin, Rank.ALL, "vote");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void Execute(Player caller, String[] args)
|
||||||
|
{
|
||||||
|
Plugin.Vote(caller);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,38 @@
|
|||||||
|
package nautilus.game.minekart.gp.command.gp;
|
||||||
|
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
import nautilus.game.minekart.gp.GP;
|
||||||
|
import nautilus.game.minekart.gp.GP.GPState;
|
||||||
|
import nautilus.game.minekart.gp.GPManager;
|
||||||
|
import nautilus.game.minekart.kart.Kart;
|
||||||
|
import mineplex.core.command.CommandBase;
|
||||||
|
import mineplex.core.common.Rank;
|
||||||
|
|
||||||
|
public class FinishCommand extends CommandBase<GPManager>
|
||||||
|
{
|
||||||
|
public FinishCommand(GPManager plugin)
|
||||||
|
{
|
||||||
|
super(plugin, Rank.MODERATOR, "finish");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void Execute(Player caller, String[] args)
|
||||||
|
{
|
||||||
|
GP race = Plugin.GetGP(caller);
|
||||||
|
if (race == null)
|
||||||
|
{
|
||||||
|
caller.sendMessage("You are not in a race");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (race.GetState() != GPState.Live)
|
||||||
|
{
|
||||||
|
caller.sendMessage("Your race is not live...");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Kart kart : race.GetKarts())
|
||||||
|
kart.SetLap(4);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,21 @@
|
|||||||
|
package nautilus.game.minekart.gp.command.gp;
|
||||||
|
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
import nautilus.game.minekart.gp.GPManager;
|
||||||
|
import mineplex.core.command.CommandBase;
|
||||||
|
import mineplex.core.common.Rank;
|
||||||
|
|
||||||
|
public class StartCommand extends CommandBase<GPManager>
|
||||||
|
{
|
||||||
|
public StartCommand(GPManager plugin)
|
||||||
|
{
|
||||||
|
super(plugin, Rank.MODERATOR, "start");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void Execute(Player caller, String[] args)
|
||||||
|
{
|
||||||
|
Plugin.StartGP(true);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,49 @@
|
|||||||
|
package nautilus.game.minekart.item;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import nautilus.game.minekart.kart.Kart;
|
||||||
|
|
||||||
|
public abstract class KartItemActive
|
||||||
|
{
|
||||||
|
public enum ActiveType
|
||||||
|
{
|
||||||
|
Behind,
|
||||||
|
Orbit,
|
||||||
|
Trail
|
||||||
|
}
|
||||||
|
|
||||||
|
private Kart _kart;
|
||||||
|
private ActiveType _type;
|
||||||
|
private List<KartItemEntity> _ents;
|
||||||
|
|
||||||
|
public KartItemActive(KartItemManager manager, Kart kart, ActiveType type, List<KartItemEntity> ents)
|
||||||
|
{
|
||||||
|
_kart = kart;
|
||||||
|
_type = type;
|
||||||
|
_ents = ents;
|
||||||
|
|
||||||
|
for (KartItemEntity item : ents)
|
||||||
|
item.SetHost(this);
|
||||||
|
|
||||||
|
kart.SetItemActive(this);
|
||||||
|
manager.RegisterKartItem(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Kart GetKart()
|
||||||
|
{
|
||||||
|
return _kart;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ActiveType GetType()
|
||||||
|
{
|
||||||
|
return _type;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<KartItemEntity> GetEntities()
|
||||||
|
{
|
||||||
|
return _ents;
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract boolean Use();
|
||||||
|
}
|
@ -0,0 +1,164 @@
|
|||||||
|
package nautilus.game.minekart.item;
|
||||||
|
|
||||||
|
import nautilus.game.minekart.item.control.Movement;
|
||||||
|
import nautilus.game.minekart.kart.Kart;
|
||||||
|
import nautilus.game.minekart.track.Track;
|
||||||
|
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.entity.Entity;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
import org.bukkit.util.Vector;
|
||||||
|
|
||||||
|
public abstract class KartItemEntity
|
||||||
|
{
|
||||||
|
public KartItemManager Manager;
|
||||||
|
|
||||||
|
private Track _track;
|
||||||
|
|
||||||
|
private Material _mat;
|
||||||
|
private byte _data;
|
||||||
|
|
||||||
|
private KartItemActive _host;
|
||||||
|
|
||||||
|
private Entity _entity;
|
||||||
|
private Vector _velocity;
|
||||||
|
private long _fireTime;
|
||||||
|
|
||||||
|
private Kart _owner;
|
||||||
|
private Kart _target;
|
||||||
|
|
||||||
|
private double _radius = 2;
|
||||||
|
|
||||||
|
public KartItemEntity(KartItemManager manager, Kart owner, Location loc, Material mat, byte data)
|
||||||
|
{
|
||||||
|
Manager = manager;
|
||||||
|
|
||||||
|
_owner = owner;
|
||||||
|
_track = owner.GetGP().GetTrack();
|
||||||
|
|
||||||
|
_mat = mat;
|
||||||
|
_data = data;
|
||||||
|
|
||||||
|
_host = null;
|
||||||
|
|
||||||
|
Spawn(loc);
|
||||||
|
|
||||||
|
manager.RegisterWorldItem(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
public void Spawn(Location loc)
|
||||||
|
{
|
||||||
|
SetEntity(loc.getWorld().dropItem(loc.add(0, 0.5, 0), new ItemStack(_mat, 1, (short)0, _data)));
|
||||||
|
SetFired();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetEntity(Entity ent)
|
||||||
|
{
|
||||||
|
_entity = ent;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Entity GetEntity()
|
||||||
|
{
|
||||||
|
return _entity;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Material GetMaterial()
|
||||||
|
{
|
||||||
|
return _mat;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetRadius(double rad)
|
||||||
|
{
|
||||||
|
_radius = rad;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetVelocity(Vector vel)
|
||||||
|
{
|
||||||
|
_velocity = vel;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Vector GetVelocity()
|
||||||
|
{
|
||||||
|
return _velocity;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Vector GetVelocityClone()
|
||||||
|
{
|
||||||
|
return new Vector(_velocity.getX(), _velocity.getY(), _velocity.getZ());
|
||||||
|
}
|
||||||
|
|
||||||
|
public Kart GetOwner()
|
||||||
|
{
|
||||||
|
return _owner;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetTarget(Kart kart)
|
||||||
|
{
|
||||||
|
_target = kart;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Kart GetTarget()
|
||||||
|
{
|
||||||
|
return _target;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long GetFireTime()
|
||||||
|
{
|
||||||
|
return _fireTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetFired()
|
||||||
|
{
|
||||||
|
_fireTime = System.currentTimeMillis();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetFiredAdd(long time)
|
||||||
|
{
|
||||||
|
_fireTime = System.currentTimeMillis() + time;
|
||||||
|
}
|
||||||
|
|
||||||
|
public KartItemActive GetHost()
|
||||||
|
{
|
||||||
|
return _host;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetHost(KartItemActive host)
|
||||||
|
{
|
||||||
|
_host = host;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double GetRadius()
|
||||||
|
{
|
||||||
|
return _radius;
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract void CollideHandle(Kart kart);
|
||||||
|
|
||||||
|
public boolean TickUpdate()
|
||||||
|
{
|
||||||
|
if (GetHost() != null)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
Movement.Move(this);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Clean()
|
||||||
|
{
|
||||||
|
if (_entity == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (_entity.getPassenger() != null)
|
||||||
|
_entity.getPassenger().remove();
|
||||||
|
|
||||||
|
_entity.remove();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Track GetTrack()
|
||||||
|
{
|
||||||
|
return _track;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,375 @@
|
|||||||
|
package nautilus.game.minekart.item;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
|
|
||||||
|
import org.bukkit.Sound;
|
||||||
|
import org.bukkit.entity.Egg;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.entity.EntityDamageByEntityEvent;
|
||||||
|
import org.bukkit.event.entity.EntityDamageEvent;
|
||||||
|
import org.bukkit.event.entity.EntityTargetEvent;
|
||||||
|
import org.bukkit.event.player.PlayerDropItemEvent;
|
||||||
|
import org.bukkit.event.player.PlayerPickupItemEvent;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
|
|
||||||
|
import mineplex.core.MiniPlugin;
|
||||||
|
import mineplex.core.updater.event.UpdateEvent;
|
||||||
|
import mineplex.core.updater.UpdateType;
|
||||||
|
import mineplex.core.common.util.F;
|
||||||
|
import mineplex.core.common.util.UtilMath;
|
||||||
|
import mineplex.core.common.util.UtilPlayer;
|
||||||
|
import nautilus.game.minekart.gp.GPBattle;
|
||||||
|
import nautilus.game.minekart.item.KartItemActive.ActiveType;
|
||||||
|
import nautilus.game.minekart.item.control.Collision;
|
||||||
|
import nautilus.game.minekart.item.control.Movement;
|
||||||
|
import nautilus.game.minekart.kart.Kart;
|
||||||
|
import nautilus.game.minekart.kart.KartManager;
|
||||||
|
import nautilus.game.minekart.kart.crash.Crash_Explode;
|
||||||
|
|
||||||
|
public class KartItemManager extends MiniPlugin
|
||||||
|
{
|
||||||
|
public KartManager KartManager;
|
||||||
|
|
||||||
|
private HashMap<Integer, ArrayList<KartItemType>> _itemSelection = new HashMap<Integer, ArrayList<KartItemType>>();
|
||||||
|
|
||||||
|
private HashSet<KartItemActive> _kartItems = new HashSet<KartItemActive>();
|
||||||
|
private HashSet<KartItemEntity> _worldItems = new HashSet<KartItemEntity>();
|
||||||
|
|
||||||
|
public KartItemManager(JavaPlugin plugin, KartManager kartManager)
|
||||||
|
{
|
||||||
|
super("Kart Item Manager", plugin);
|
||||||
|
|
||||||
|
KartManager = kartManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void UseItem(PlayerDropItemEvent event)
|
||||||
|
{
|
||||||
|
Kart kart = KartManager.GetKart(event.getPlayer());
|
||||||
|
if (kart == null) return;
|
||||||
|
|
||||||
|
event.setCancelled(true);
|
||||||
|
|
||||||
|
KartItemActive active = kart.GetItemActive();
|
||||||
|
if (active != null)
|
||||||
|
{
|
||||||
|
if (active.Use())
|
||||||
|
{
|
||||||
|
//Depleted
|
||||||
|
kart.SetItemActive(null);
|
||||||
|
|
||||||
|
//Due to Auto-Activate
|
||||||
|
ItemDecrement(kart);
|
||||||
|
|
||||||
|
GetKartItems().remove(active);
|
||||||
|
|
||||||
|
//Sound
|
||||||
|
kart.GetDriver().playSound(kart.GetDriver().getLocation(), kart.GetKartType().GetSoundMain(), 2f, 1f);
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
KartItemType type = kart.GetItemStored();
|
||||||
|
if (type != null)
|
||||||
|
{
|
||||||
|
if (kart.GetItemCycles() > 10)
|
||||||
|
{
|
||||||
|
kart.SetItemCycles(kart.GetItemCycles() - 3);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if (kart.GetItemCycles() <= 0)
|
||||||
|
{
|
||||||
|
type.GetAction().Use(this, kart);
|
||||||
|
|
||||||
|
//Sound
|
||||||
|
kart.GetDriver().playSound(kart.GetDriver().getLocation(), kart.GetKartType().GetSoundMain(), 2f, 1f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void CancelPickup(PlayerPickupItemEvent event)
|
||||||
|
{
|
||||||
|
for (KartItemEntity item : GetWorldItems())
|
||||||
|
if (item.GetEntity() != null && item.GetEntity().equals(event.getItem()))
|
||||||
|
{
|
||||||
|
event.setCancelled(true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Not Map Item
|
||||||
|
event.setCancelled(true);
|
||||||
|
event.getItem().remove();
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void CancelTarget(EntityTargetEvent event)
|
||||||
|
{
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void EggHit(EntityDamageEvent event)
|
||||||
|
{
|
||||||
|
if (!(event instanceof EntityDamageByEntityEvent))
|
||||||
|
return;
|
||||||
|
|
||||||
|
EntityDamageByEntityEvent eventEE = (EntityDamageByEntityEvent)event;
|
||||||
|
|
||||||
|
if (!(eventEE.getDamager() instanceof Egg))
|
||||||
|
return;
|
||||||
|
|
||||||
|
Egg egg = (Egg)eventEE.getDamager();
|
||||||
|
|
||||||
|
if (egg.getShooter() == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!(egg.getShooter() instanceof Player))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!(event.getEntity() instanceof Player))
|
||||||
|
return;
|
||||||
|
|
||||||
|
Player damager = (Player)egg.getShooter();
|
||||||
|
Player damagee = (Player)event.getEntity();
|
||||||
|
|
||||||
|
Kart kart = KartManager.GetKart(damagee);
|
||||||
|
if (kart == null) return;
|
||||||
|
|
||||||
|
new Crash_Explode(kart, 0.3f, false);
|
||||||
|
|
||||||
|
//Inform
|
||||||
|
if (damager.equals(damagee))
|
||||||
|
{
|
||||||
|
UtilPlayer.message(damagee, F.main("MK", "You hit yourself with " + F.item("Egg Blaster") + "."));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
UtilPlayer.message(damagee, F.main("MK", F.elem(damager.getName()) + " hit you with " + F.item("Egg Blaster") + "."));
|
||||||
|
UtilPlayer.message(damager, F.main("MK", "You hit " + F.elem(damagee.getName()) + " with " + F.item("Egg Blaster") + "."));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void KartItemCycle(UpdateEvent event)
|
||||||
|
{
|
||||||
|
if (event.getType() != UpdateType.FASTEST)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (Kart kart : KartManager.GetKarts().values())
|
||||||
|
{
|
||||||
|
if (kart.GetItemCycles() > 0)
|
||||||
|
{
|
||||||
|
//Selected
|
||||||
|
if (kart.GetItemCycles() < 10)
|
||||||
|
{
|
||||||
|
//End Sound
|
||||||
|
if (kart.GetItemCycles()%3 == 0)
|
||||||
|
kart.GetDriver().playSound(kart.GetDriver().getLocation(), Sound.NOTE_PLING, 0.4f, 2f);
|
||||||
|
}
|
||||||
|
//Random
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//Sound
|
||||||
|
kart.GetDriver().playSound(kart.GetDriver().getLocation(), Sound.NOTE_PLING, 0.2f, 1f + (10 - (kart.GetItemCycles()%10)) *0.05f);
|
||||||
|
|
||||||
|
KartItemType next = GetNewItem(kart);
|
||||||
|
|
||||||
|
//Ensure it doesnt cycle item twice in a row
|
||||||
|
while (next.equals(kart.GetItemStored()))
|
||||||
|
next = GetNewItem(kart);
|
||||||
|
|
||||||
|
kart.SetItemStored(next);
|
||||||
|
}
|
||||||
|
|
||||||
|
kart.SetItemCycles(kart.GetItemCycles() - 1);
|
||||||
|
|
||||||
|
//Auto Activate
|
||||||
|
if (kart.GetItemCycles() == 0)
|
||||||
|
{
|
||||||
|
if (kart.GetItemStored() == KartItemType.Banana ||
|
||||||
|
kart.GetItemStored() == KartItemType.BananaBunch ||
|
||||||
|
kart.GetItemStored() == KartItemType.SingleGreenShell ||
|
||||||
|
kart.GetItemStored() == KartItemType.DoubleGreenShell ||
|
||||||
|
kart.GetItemStored() == KartItemType.TripleGreenShell ||
|
||||||
|
kart.GetItemStored() == KartItemType.SingleRedShell ||
|
||||||
|
kart.GetItemStored() == KartItemType.DoubleRedShell ||
|
||||||
|
kart.GetItemStored() == KartItemType.TripleRedShell)
|
||||||
|
{
|
||||||
|
kart.GetItemStored().GetAction().Use(this, kart);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//Remove Stored, if active is gone
|
||||||
|
else if (kart.GetItemActive() == null && kart.GetItemStored() != null)
|
||||||
|
{
|
||||||
|
ItemDecrement(kart);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ItemDecrement(Kart kart)
|
||||||
|
{
|
||||||
|
if (kart.GetItemStored() == KartItemType.Banana ||
|
||||||
|
kart.GetItemStored() == KartItemType.SingleGreenShell ||
|
||||||
|
kart.GetItemStored() == KartItemType.SingleRedShell)
|
||||||
|
{
|
||||||
|
kart.SetItemStored(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (kart.GetItemStored() == KartItemType.BananaBunch)
|
||||||
|
{
|
||||||
|
ItemStack item = kart.GetDriver().getInventory().getItem(3);
|
||||||
|
|
||||||
|
if (item == null || item.getAmount() == 1)
|
||||||
|
{
|
||||||
|
kart.SetItemStored(null);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
item.setAmount(item.getAmount() - 1);
|
||||||
|
kart.GetItemStored().GetAction().Use(this, kart);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (kart.GetItemStored() == KartItemType.DoubleGreenShell)
|
||||||
|
{
|
||||||
|
kart.SetItemStored(KartItemType.SingleGreenShell);
|
||||||
|
kart.GetItemStored().GetAction().Use(this, kart);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (kart.GetItemStored() == KartItemType.TripleGreenShell)
|
||||||
|
{
|
||||||
|
kart.SetItemStored(KartItemType.DoubleGreenShell);
|
||||||
|
kart.GetItemStored().GetAction().Use(this, kart);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (kart.GetItemStored() == KartItemType.DoubleRedShell)
|
||||||
|
{
|
||||||
|
kart.SetItemStored(KartItemType.SingleRedShell);
|
||||||
|
kart.GetItemStored().GetAction().Use(this, kart);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (kart.GetItemStored() == KartItemType.TripleRedShell)
|
||||||
|
{
|
||||||
|
kart.SetItemStored(KartItemType.DoubleRedShell);
|
||||||
|
kart.GetItemStored().GetAction().Use(this, kart);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void KartItemUpdate(UpdateEvent event)
|
||||||
|
{
|
||||||
|
if (event.getType() != UpdateType.TICK)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (KartItemActive active : GetKartItems())
|
||||||
|
{
|
||||||
|
if (active.GetType() == ActiveType.Behind)
|
||||||
|
Movement.Behind(active.GetKart(), active.GetEntities());
|
||||||
|
|
||||||
|
if (active.GetType() == ActiveType.Orbit)
|
||||||
|
Movement.Orbit(active.GetKart(), active.GetEntities());
|
||||||
|
|
||||||
|
if (active.GetType() == ActiveType.Trail)
|
||||||
|
Movement.Trail(active.GetKart(), active.GetEntities());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void WorldItemUpdate(UpdateEvent event)
|
||||||
|
{
|
||||||
|
if (event.getType() != UpdateType.TICK)
|
||||||
|
return;
|
||||||
|
|
||||||
|
HashSet<KartItemEntity> remove = new HashSet<KartItemEntity>();
|
||||||
|
|
||||||
|
for (KartItemEntity item : GetWorldItems())
|
||||||
|
{
|
||||||
|
if (item.GetTrack() == null || item.GetTrack().GetWorld() == null)
|
||||||
|
{
|
||||||
|
remove.add(item);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (remove.contains(item))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (item.TickUpdate())
|
||||||
|
remove.add(item);
|
||||||
|
|
||||||
|
//Collide with Items
|
||||||
|
KartItemEntity other = Collision.CollideItem(item, GetWorldItems());
|
||||||
|
if (other != null)
|
||||||
|
{
|
||||||
|
remove.add(item);
|
||||||
|
remove.add(other);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Collide with Players
|
||||||
|
if (Collision.CollidePlayer(item, KartManager.GetKarts().values()))
|
||||||
|
remove.add(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (KartItemEntity item : remove)
|
||||||
|
{
|
||||||
|
if (item.GetHost() != null)
|
||||||
|
{
|
||||||
|
item.GetHost().GetEntities().remove(item);
|
||||||
|
|
||||||
|
if (item.GetHost().GetEntities().isEmpty())
|
||||||
|
{
|
||||||
|
item.GetHost().GetKart().SetItemActive(null);
|
||||||
|
GetKartItems().remove(item.GetHost());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
item.Clean();
|
||||||
|
|
||||||
|
_worldItems.remove(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RegisterKartItem(KartItemActive item)
|
||||||
|
{
|
||||||
|
_kartItems.add(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RegisterWorldItem(KartItemEntity item)
|
||||||
|
{
|
||||||
|
_worldItems.add(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
public HashSet<KartItemActive> GetKartItems()
|
||||||
|
{
|
||||||
|
return _kartItems;
|
||||||
|
}
|
||||||
|
|
||||||
|
public HashSet<KartItemEntity> GetWorldItems()
|
||||||
|
{
|
||||||
|
return _worldItems;
|
||||||
|
}
|
||||||
|
|
||||||
|
public KartItemType GetNewItem(Kart kart)
|
||||||
|
{
|
||||||
|
if (Math.random() > 1 - kart.GetKartType().GetKartItem().GetChance())
|
||||||
|
return kart.GetKartType().GetKartItem();
|
||||||
|
|
||||||
|
int pos = kart.GetLapPlace();
|
||||||
|
|
||||||
|
if (kart.GetGP() instanceof GPBattle)
|
||||||
|
pos = -1;
|
||||||
|
|
||||||
|
if (!_itemSelection.containsKey(pos))
|
||||||
|
_itemSelection.put(pos, KartItemType.GetItem(pos));
|
||||||
|
|
||||||
|
ArrayList<KartItemType> itemBag = _itemSelection.get(pos);
|
||||||
|
|
||||||
|
return itemBag.get(UtilMath.r(itemBag.size()));
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,239 @@
|
|||||||
|
package nautilus.game.minekart.item;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
import org.bukkit.ChatColor;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
|
||||||
|
import mineplex.core.common.util.C;
|
||||||
|
import nautilus.game.minekart.item.use_custom.*;
|
||||||
|
import nautilus.game.minekart.item.use_default.*;
|
||||||
|
|
||||||
|
public enum KartItemType
|
||||||
|
{
|
||||||
|
//Default
|
||||||
|
Banana( "Banana", Material.GOLD_INGOT, 1, new UseBanana()),
|
||||||
|
BananaBunch( "Banana Bunch", Material.GOLD_SPADE, 6, new UseBanana()),
|
||||||
|
FakeItem( "Fake Item", Material.FLINT, 1, new UseFakeItem()),
|
||||||
|
|
||||||
|
SingleGreenShell( "Green Shell", Material.SLIME_BALL, 1, new UseGreenShell()),
|
||||||
|
DoubleGreenShell( "2x Green Shell", Material.MELON_SEEDS, 1, new UseGreenShell()),
|
||||||
|
TripleGreenShell( "3x Green Shell", Material.PUMPKIN_SEEDS, 1, new UseGreenShell()),
|
||||||
|
|
||||||
|
SingleRedShell( "Red Shell", Material.MAGMA_CREAM, 1, new UseRedShell()),
|
||||||
|
DoubleRedShell( "2x Red Shell", Material.RAW_FISH, 1, new UseRedShell()),
|
||||||
|
TripleRedShell( "3x Red Shell", Material.COOKED_FISH, 1, new UseRedShell()),
|
||||||
|
|
||||||
|
Ghost( "Ghost", Material.GHAST_TEAR, 1, new UseGhost()),
|
||||||
|
Star( "Star", Material.NETHER_STAR, 1, new UseStar()),
|
||||||
|
Lightning( "Lightning", Material.GLOWSTONE_DUST, 1, new UseLightning()),
|
||||||
|
|
||||||
|
SingleMushroom( "1x Mushroom", Material.BREAD, 1, new UseMushroom()),
|
||||||
|
DoubleMushroom( "2x Mushroom", Material.BOWL, 1, new UseMushroom()),
|
||||||
|
TripleMushroom( "3x Mushroom", Material.MUSHROOM_SOUP, 1, new UseMushroom()),
|
||||||
|
SuperMushroom( "Super Mushroom", Material.GOLDEN_APPLE, 1, new UseMushroom()),
|
||||||
|
|
||||||
|
//Custom
|
||||||
|
Chicken("Egg Blaster", Material.EGG, 16, 0.16, new UseChicken(), new String[]
|
||||||
|
{
|
||||||
|
"",
|
||||||
|
ChatColor.RESET + C.cWhite + "16-Round Egg Blaster.",
|
||||||
|
}),
|
||||||
|
|
||||||
|
Pig("Pig Stink", Material.PORK, 1, 0.12, new UsePig(), new String[]
|
||||||
|
{
|
||||||
|
"",
|
||||||
|
ChatColor.RESET + C.cWhite + "Confuses all players.",
|
||||||
|
ChatColor.RESET + C.cWhite + "Lasts 20 seconds"
|
||||||
|
}),
|
||||||
|
|
||||||
|
Wolf("Heart Barrier", Material.APPLE, 1, 0.16, new UseWolf(), new String[]
|
||||||
|
{
|
||||||
|
"",
|
||||||
|
ChatColor.RESET + C.cWhite + "Blocks 1 Shell/Banana/Fake Item",
|
||||||
|
ChatColor.RESET + C.cWhite + "Lasts 60 Seconds"
|
||||||
|
}),
|
||||||
|
|
||||||
|
Spider("Spiderlings", Material.SEEDS, 1, 0.16, new UseSpider(), new String[]
|
||||||
|
{
|
||||||
|
"",
|
||||||
|
ChatColor.RESET + C.cWhite + "Release 1 Spiderling at each player.",
|
||||||
|
ChatColor.RESET + C.cWhite + "Spiderlings hunt players, causing a crash.",
|
||||||
|
ChatColor.RESET + C.cWhite + "Lasts 15 seconds."
|
||||||
|
}),
|
||||||
|
|
||||||
|
Blaze("Infernal Kart", Material.BLAZE_POWDER, 1, 0.16, new UseBlaze(), new String[]
|
||||||
|
{
|
||||||
|
"",
|
||||||
|
ChatColor.RESET + C.cWhite + "Boost forwards with amazing handling.",
|
||||||
|
ChatColor.RESET + C.cWhite + "Leaves a trail of flames, slowing players."
|
||||||
|
}),
|
||||||
|
|
||||||
|
Sheep("Super Sheep", Material.IRON_SPADE, 1, 0.08, new UseSheep(), new String[]
|
||||||
|
{
|
||||||
|
"",
|
||||||
|
ChatColor.RESET + C.cWhite + "Super Sheep flies around the track.",
|
||||||
|
ChatColor.RESET + C.cWhite + "Hunts down other nearby players.",
|
||||||
|
ChatColor.RESET + C.cWhite + "Lasts 15 seconds"
|
||||||
|
}),
|
||||||
|
|
||||||
|
Enderman("Blink", Material.ENDER_PEARL, 1, 0.16, new UseEnderman(), new String[]
|
||||||
|
{
|
||||||
|
"",
|
||||||
|
ChatColor.RESET + C.cWhite + "Instantly teleport forward 20 blocks.",
|
||||||
|
ChatColor.RESET + C.cWhite + "Converts velocity into new direction.",
|
||||||
|
ChatColor.RESET + C.cWhite + "3 Uses."
|
||||||
|
}),
|
||||||
|
|
||||||
|
Cow("Stampede", Material.DIAMOND_SPADE, 1, 0.16, new UseCow(), new String[]
|
||||||
|
{
|
||||||
|
"",
|
||||||
|
ChatColor.RESET + C.cWhite + "Angry cows charge foward at players."
|
||||||
|
}),
|
||||||
|
|
||||||
|
Golem("Earthquake", Material.COAL, 1, 0.08, new UseGolem(), new String[]
|
||||||
|
{
|
||||||
|
"",
|
||||||
|
ChatColor.RESET + C.cWhite + "Halves all players velocity.",
|
||||||
|
ChatColor.RESET + C.cWhite + "Enemies are propelled upwards.",
|
||||||
|
ChatColor.RESET + C.cWhite + "More powerful at close range."
|
||||||
|
});
|
||||||
|
|
||||||
|
private String _name;
|
||||||
|
private Material _mat;
|
||||||
|
private int _amount;
|
||||||
|
|
||||||
|
private ItemUse _action;
|
||||||
|
|
||||||
|
private double _chance = 0;
|
||||||
|
private String[] _customDesc = new String[] {"Default"};
|
||||||
|
|
||||||
|
KartItemType(String name, Material mat, int amount, ItemUse action)
|
||||||
|
{
|
||||||
|
_name = name;
|
||||||
|
_mat = mat;
|
||||||
|
_amount = amount;
|
||||||
|
_action = action;
|
||||||
|
}
|
||||||
|
|
||||||
|
KartItemType(String name, Material mat, int amount, double customChance, ItemUse action, String[] customString)
|
||||||
|
{
|
||||||
|
_name = name;
|
||||||
|
_mat = mat;
|
||||||
|
_amount = amount;
|
||||||
|
|
||||||
|
_action = action;
|
||||||
|
|
||||||
|
_chance = customChance;
|
||||||
|
_customDesc = customString;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String GetName()
|
||||||
|
{
|
||||||
|
return _name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ItemUse GetAction()
|
||||||
|
{
|
||||||
|
return _action;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Material GetMaterial()
|
||||||
|
{
|
||||||
|
return _mat;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int GetAmount()
|
||||||
|
{
|
||||||
|
return _amount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double GetChance()
|
||||||
|
{
|
||||||
|
return _chance;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String[] GetDesc()
|
||||||
|
{
|
||||||
|
return _customDesc;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ArrayList<KartItemType> GetItem(int pos)
|
||||||
|
{
|
||||||
|
ArrayList<KartItemType> itemBag = new ArrayList<KartItemType>();
|
||||||
|
|
||||||
|
if (pos == -1)
|
||||||
|
{
|
||||||
|
for (int i=1 ; i>0 ; i--)
|
||||||
|
itemBag.add(KartItemType.Star);
|
||||||
|
|
||||||
|
for (int i=1 ; i>0 ; i--)
|
||||||
|
itemBag.add(KartItemType.Ghost);
|
||||||
|
|
||||||
|
for (int i=1 ; i>0 ; i--)
|
||||||
|
itemBag.add(KartItemType.TripleRedShell);
|
||||||
|
|
||||||
|
for (int i=2 ; i>0 ; i--)
|
||||||
|
itemBag.add(KartItemType.TripleGreenShell);
|
||||||
|
|
||||||
|
for (int i=2 ; i>0 ; i--)
|
||||||
|
itemBag.add(KartItemType.BananaBunch);
|
||||||
|
|
||||||
|
for (int i=2 ; i>0 ; i--)
|
||||||
|
itemBag.add(KartItemType.FakeItem);
|
||||||
|
|
||||||
|
for (int i=3 ; i>0 ; i--)
|
||||||
|
itemBag.add(KartItemType.SingleRedShell);
|
||||||
|
|
||||||
|
for (int i=3 ; i>0 ; i--)
|
||||||
|
itemBag.add(KartItemType.Banana);
|
||||||
|
|
||||||
|
for (int i=4 ; i>0 ; i--)
|
||||||
|
itemBag.add(KartItemType.SingleGreenShell);
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (int i=20 - (3 * 9-pos) ; i>0 ; i--)
|
||||||
|
itemBag.add(KartItemType.Lightning);
|
||||||
|
|
||||||
|
for (int i=20 - (2 * 9-pos) ; i>0 ; i--)
|
||||||
|
itemBag.add(KartItemType.Star);
|
||||||
|
|
||||||
|
for (int i=20 - (2 * 9-pos) ; i>0 ; i--)
|
||||||
|
itemBag.add(KartItemType.SuperMushroom);
|
||||||
|
|
||||||
|
for (int i=20 - (2 * 9-pos) ; i>0 ; i--)
|
||||||
|
itemBag.add(KartItemType.Ghost);
|
||||||
|
|
||||||
|
for (int i=20 - (2 * 9-pos) ; i>0 ; i--)
|
||||||
|
itemBag.add(KartItemType.TripleRedShell);
|
||||||
|
|
||||||
|
for (int i=20 - (1 * 9-pos) ; i>0 ; i--)
|
||||||
|
itemBag.add(KartItemType.TripleGreenShell);
|
||||||
|
|
||||||
|
for (int i=20 - (1 * 9-pos) ; i>0 ; i--)
|
||||||
|
itemBag.add(KartItemType.TripleMushroom);
|
||||||
|
|
||||||
|
for (int i=20 - (1 * 9-pos) ; i>0 ; i--)
|
||||||
|
itemBag.add(KartItemType.BananaBunch);
|
||||||
|
|
||||||
|
for (int i=5 + (2 * 9-pos) ; i>0 ; i--)
|
||||||
|
itemBag.add(KartItemType.SingleRedShell);
|
||||||
|
|
||||||
|
for (int i=10 + (2 * 9-pos) ; i>0 ; i--)
|
||||||
|
itemBag.add(KartItemType.SingleMushroom);
|
||||||
|
|
||||||
|
for (int i=10 + (2 * 9-pos) ; i>0 ; i--)
|
||||||
|
itemBag.add(KartItemType.SingleGreenShell);
|
||||||
|
|
||||||
|
for (int i=0 + (2 * 9-pos) ; i>0 ; i--)
|
||||||
|
itemBag.add(KartItemType.FakeItem);
|
||||||
|
|
||||||
|
for (int i=0 + (2 * 9-pos) ; i>0 ; i--)
|
||||||
|
itemBag.add(KartItemType.Banana);
|
||||||
|
}
|
||||||
|
|
||||||
|
return itemBag;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,144 @@
|
|||||||
|
package nautilus.game.minekart.item.control;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.HashSet;
|
||||||
|
|
||||||
|
import mineplex.core.common.util.UtilBlock;
|
||||||
|
import mineplex.core.common.util.UtilMath;
|
||||||
|
import mineplex.core.common.util.UtilTime;
|
||||||
|
import nautilus.game.minekart.item.KartItemEntity;
|
||||||
|
import nautilus.game.minekart.item.world_items_default.RedShell;
|
||||||
|
import nautilus.game.minekart.kart.Kart;
|
||||||
|
import nautilus.game.minekart.kart.KartState;
|
||||||
|
import nautilus.game.minekart.kart.condition.ConditionType;
|
||||||
|
|
||||||
|
import org.bukkit.block.Block;
|
||||||
|
import org.bukkit.entity.Entity;
|
||||||
|
import org.bukkit.util.Vector;
|
||||||
|
|
||||||
|
public class Collision
|
||||||
|
{
|
||||||
|
public static boolean CollideBlock(KartItemEntity item)
|
||||||
|
{
|
||||||
|
Entity ent = item.GetEntity();
|
||||||
|
if (ent == null) return true;
|
||||||
|
|
||||||
|
//Current Velocity
|
||||||
|
Vector vel = item.GetVelocity();
|
||||||
|
if (vel == null) return true;
|
||||||
|
|
||||||
|
if (vel.length() <= 0)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
boolean collided = false;
|
||||||
|
double range = 0.31;
|
||||||
|
|
||||||
|
Block block;
|
||||||
|
|
||||||
|
block = ent.getLocation().add(range, 0, 0).getBlock();
|
||||||
|
if (vel.getX() > 0 && UtilBlock.solid(block)) {vel.setX(-vel.getX()); collided = true;}
|
||||||
|
|
||||||
|
block = ent.getLocation().add(-range, 0, 0).getBlock();
|
||||||
|
if (vel.getX() < 0 && UtilBlock.solid(block)) {vel.setX(-vel.getX()); collided = true;}
|
||||||
|
|
||||||
|
block = ent.getLocation().add(0, 0, range).getBlock();
|
||||||
|
if (vel.getZ() > 0 && UtilBlock.solid(block)) {vel.setZ(-vel.getZ()); collided = true;}
|
||||||
|
|
||||||
|
block = ent.getLocation().add(0, 0, -range).getBlock();
|
||||||
|
if (vel.getZ() < 0 && UtilBlock.solid(block)) {vel.setZ(-vel.getZ()); collided = true;}
|
||||||
|
|
||||||
|
return collided;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean CollidePlayer(KartItemEntity item, Collection<Kart> allKarts)
|
||||||
|
{
|
||||||
|
if (item.GetEntity() == null)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
for (Kart kart : allKarts)
|
||||||
|
{
|
||||||
|
if (kart.GetKartState() == KartState.Lakitu)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (kart.HasCondition(ConditionType.Ghost))
|
||||||
|
{
|
||||||
|
if (item instanceof RedShell)
|
||||||
|
if (item.GetTarget() != null && item.GetTarget().equals(kart))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Don't hit owner
|
||||||
|
if (item.GetOwner() != null && kart.equals(item.GetOwner()))
|
||||||
|
{
|
||||||
|
if (item.GetHost() != null)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (!UtilTime.elapsed(item.GetFireTime(), 1000))
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (UtilMath.offset(kart.GetDriver(), item.GetEntity()) < item.GetRadius() && kart.GetDriver().getWorld() == item.GetEntity().getWorld())
|
||||||
|
{
|
||||||
|
item.CollideHandle(kart);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static KartItemEntity CollideItem(KartItemEntity item, HashSet<KartItemEntity> allItems)
|
||||||
|
{
|
||||||
|
if (item.GetEntity() == null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
for (KartItemEntity other : allItems)
|
||||||
|
{
|
||||||
|
if (item.equals(other))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
//Both Arent Moving
|
||||||
|
if (item.GetVelocity() == null && other.GetVelocity() == null)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
//Both Arent Moving
|
||||||
|
if ((item.GetVelocity() != null && item.GetVelocity().length() <= 0) && (item.GetVelocity() != null && item.GetVelocity().length() <= 0))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
//Dont collide with friends on orbit!
|
||||||
|
if (item.GetHost() != null && other.GetHost() != null)
|
||||||
|
if (item.GetHost().equals(other.GetHost()))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
//Don't collide with friends after shot (same owner)
|
||||||
|
if (item.GetOwner() != null && other.GetOwner() != null && item.GetOwner().equals(other.GetOwner()))
|
||||||
|
{
|
||||||
|
//Item is trailing
|
||||||
|
if (item.GetHost() != null && other.GetHost() == null)
|
||||||
|
{
|
||||||
|
if (!UtilTime.elapsed(other.GetFireTime(), 1000))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//Other is trailing
|
||||||
|
else if (item.GetHost() == null && other.GetHost() != null)
|
||||||
|
{
|
||||||
|
if (!UtilTime.elapsed(item.GetFireTime(), 1000))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (UtilMath.offset(other.GetEntity(), item.GetEntity()) < item.GetRadius())
|
||||||
|
{
|
||||||
|
return other;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,181 @@
|
|||||||
|
package nautilus.game.minekart.item.control;
|
||||||
|
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.craftbukkit.v1_7_R1.CraftWorld;
|
||||||
|
import org.bukkit.craftbukkit.v1_7_R1.entity.CraftLivingEntity;
|
||||||
|
import org.bukkit.entity.Entity;
|
||||||
|
import org.bukkit.entity.LivingEntity;
|
||||||
|
import org.bukkit.util.Vector;
|
||||||
|
|
||||||
|
import mineplex.core.common.util.UtilAction;
|
||||||
|
import mineplex.core.common.util.UtilAlg;
|
||||||
|
import mineplex.core.common.util.UtilMath;
|
||||||
|
import mineplex.core.common.util.UtilTime;
|
||||||
|
import nautilus.game.minekart.item.KartItemEntity;
|
||||||
|
import nautilus.game.minekart.kart.Kart;
|
||||||
|
import nautilus.game.minekart.kart.KartUtil;
|
||||||
|
import nautilus.game.minekart.kart.condition.ConditionType;
|
||||||
|
import net.minecraft.server.v1_7_R1.EntityInsentient;
|
||||||
|
import net.minecraft.server.v1_7_R1.EntityLiving;
|
||||||
|
import net.minecraft.server.v1_7_R1.PathfinderGoalSelector;
|
||||||
|
|
||||||
|
public class Movement
|
||||||
|
{
|
||||||
|
public static void Move(KartItemEntity item)
|
||||||
|
{
|
||||||
|
if (item.GetEntity() == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (item.GetVelocity() == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (item.GetVelocity().length() <= 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
//Attempt to fix glitch
|
||||||
|
item.GetEntity().teleport(item.GetEntity().getLocation());
|
||||||
|
|
||||||
|
//Apply Velocity
|
||||||
|
item.GetEntity().setVelocity(item.GetVelocity());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Behind(Kart kart, List<KartItemEntity> moons)
|
||||||
|
{
|
||||||
|
for (int i=0 ; i<moons.size() ; i++)
|
||||||
|
{
|
||||||
|
Entity cur = moons.get(i).GetEntity();
|
||||||
|
|
||||||
|
Location target = KartUtil.GetBehind(kart);
|
||||||
|
|
||||||
|
double offset = UtilMath.offset(cur.getLocation(), target);
|
||||||
|
|
||||||
|
Vector vel = UtilAlg.getTrajectory(cur.getLocation(), target);
|
||||||
|
|
||||||
|
UtilAction.velocity(cur, vel, offset, false, 0, 0, 10, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Orbit(Kart kart, List<KartItemEntity> moons)
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
for (KartItemEntity item : moons)
|
||||||
|
{
|
||||||
|
if (item.GetEntity() instanceof LivingEntity)
|
||||||
|
ClearGoals((LivingEntity)item.GetEntity());
|
||||||
|
|
||||||
|
double radialLead = i * ((2d * Math.PI)/moons.size());
|
||||||
|
i++;
|
||||||
|
|
||||||
|
Location desiredA = GetTarget(kart.GetDriver().getLocation(), kart.GetDriver().getTicksLived(), radialLead);
|
||||||
|
Location desiredB = GetTarget(kart.GetDriver().getLocation(), kart.GetDriver().getTicksLived() + 1, radialLead);
|
||||||
|
|
||||||
|
double distA = UtilMath.offset(item.GetEntity().getLocation(), desiredA);
|
||||||
|
double distB = UtilMath.offset(item.GetEntity().getLocation(), desiredB);
|
||||||
|
double distAB = UtilMath.offset(desiredA, desiredB);
|
||||||
|
|
||||||
|
if (distA > distB)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (distA < distAB / 2)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
Vector vel = UtilAlg.getTrajectory(item.GetEntity().getLocation(), desiredA);
|
||||||
|
|
||||||
|
//Kart velocity
|
||||||
|
Vector kartVel = kart.GetVelocity();
|
||||||
|
if (kart.GetCrash() != null && kart.GetCrash().GetVelocity() != null)
|
||||||
|
kartVel = kart.GetCrash().GetVelocity();
|
||||||
|
kartVel.setY(0);
|
||||||
|
|
||||||
|
vel.add(kartVel);
|
||||||
|
|
||||||
|
UtilAction.velocity(item.GetEntity(), vel, 0.2 + kartVel.length(), false, 0, 0, 10, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void ClearGoals(LivingEntity ent)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Field _goalSelector = EntityInsentient.class.getDeclaredField("goalSelector");
|
||||||
|
_goalSelector.setAccessible(true);
|
||||||
|
Field _targetSelector = EntityInsentient.class.getDeclaredField("targetSelector");
|
||||||
|
_targetSelector.setAccessible(true);
|
||||||
|
|
||||||
|
EntityLiving creature = ((CraftLivingEntity)ent).getHandle();
|
||||||
|
|
||||||
|
PathfinderGoalSelector goalSelector = new PathfinderGoalSelector(((CraftWorld)ent.getWorld()).getHandle().methodProfiler);
|
||||||
|
|
||||||
|
_goalSelector.set(creature, goalSelector);
|
||||||
|
_targetSelector.set(creature, new PathfinderGoalSelector(((CraftWorld)ent.getWorld()).getHandle().methodProfiler));
|
||||||
|
}
|
||||||
|
catch (IllegalArgumentException e)
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
catch (IllegalAccessException e)
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
catch (NoSuchFieldException e)
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
catch (SecurityException e)
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Location GetTarget(Location origin, int ticks, double radialLead)
|
||||||
|
{
|
||||||
|
//Orbit
|
||||||
|
double speed = 10d;
|
||||||
|
|
||||||
|
double oX = Math.sin(ticks/speed + radialLead) * 1.5;
|
||||||
|
double oY = 0.5;
|
||||||
|
double oZ = Math.cos(ticks/speed + radialLead) * 1.5;
|
||||||
|
|
||||||
|
return new Location(origin.getWorld(), origin.getX() + oX, origin.getY() + oY, origin.getZ() + oZ);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Trail(Kart kart, List<KartItemEntity> moons)
|
||||||
|
{
|
||||||
|
for (int i=0 ; i<moons.size() ; i++)
|
||||||
|
{
|
||||||
|
Entity cur = moons.get(i).GetEntity();
|
||||||
|
|
||||||
|
Entity target = kart.GetDriver();
|
||||||
|
if (i > 0)
|
||||||
|
target = moons.get(i-1).GetEntity();
|
||||||
|
|
||||||
|
double offset = UtilMath.offset(cur, target);
|
||||||
|
|
||||||
|
Vector vel = UtilAlg.getTrajectory(cur, target);
|
||||||
|
|
||||||
|
UtilAction.velocity(cur, vel, offset, false, 0, 0, 10, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Home(KartItemEntity item)
|
||||||
|
{
|
||||||
|
if (!UtilTime.elapsed(item.GetFireTime(), 800))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (item.GetEntity() == null || item.GetTarget() == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (item.GetTarget().HasCondition(ConditionType.Ghost))
|
||||||
|
return;
|
||||||
|
|
||||||
|
Vector vec = UtilAlg.getTrajectory2d(item.GetEntity(), item.GetTarget().GetDriver());
|
||||||
|
UtilAlg.Normalize(vec);
|
||||||
|
vec.multiply(1.2);
|
||||||
|
vec.setY(-0.4);
|
||||||
|
|
||||||
|
item.SetVelocity(vec);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,36 @@
|
|||||||
|
package nautilus.game.minekart.item.use_active;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import nautilus.game.minekart.item.KartItemActive;
|
||||||
|
import nautilus.game.minekart.item.KartItemEntity;
|
||||||
|
import nautilus.game.minekart.item.KartItemManager;
|
||||||
|
import nautilus.game.minekart.kart.Kart;
|
||||||
|
|
||||||
|
public class ActiveBananas extends KartItemActive
|
||||||
|
{
|
||||||
|
public ActiveBananas(KartItemManager manager, Kart kart, List<KartItemEntity> ents)
|
||||||
|
{
|
||||||
|
super(manager, kart, ActiveType.Trail, ents);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean Use()
|
||||||
|
{
|
||||||
|
if (GetEntities().isEmpty())
|
||||||
|
return true;
|
||||||
|
|
||||||
|
//Find Closest to firing trajectory
|
||||||
|
KartItemEntity back = GetEntities().get(GetEntities().size() - 1);
|
||||||
|
|
||||||
|
//Fire Shell
|
||||||
|
back.SetHost(null);
|
||||||
|
back.SetVelocity(null);
|
||||||
|
GetEntities().remove(back);
|
||||||
|
|
||||||
|
//Counter Collision with driver
|
||||||
|
back.SetFired();
|
||||||
|
|
||||||
|
return GetEntities().isEmpty();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,77 @@
|
|||||||
|
package nautilus.game.minekart.item.use_active;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.bukkit.Location;
|
||||||
|
|
||||||
|
import mineplex.core.common.util.UtilAlg;
|
||||||
|
import mineplex.core.common.util.UtilMath;
|
||||||
|
import nautilus.game.minekart.item.KartItemActive;
|
||||||
|
import nautilus.game.minekart.item.KartItemEntity;
|
||||||
|
import nautilus.game.minekart.item.KartItemManager;
|
||||||
|
import nautilus.game.minekart.item.world_items_default.RedShell;
|
||||||
|
import nautilus.game.minekart.kart.Kart;
|
||||||
|
import nautilus.game.minekart.kart.KartUtil;
|
||||||
|
|
||||||
|
public class ActiveShells extends KartItemActive
|
||||||
|
{
|
||||||
|
public ActiveShells(KartItemManager manager, Kart kart, List<KartItemEntity> ents)
|
||||||
|
{
|
||||||
|
super(manager, kart, ActiveType.Orbit, ents);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean Use()
|
||||||
|
{
|
||||||
|
if (GetEntities().isEmpty())
|
||||||
|
return true;
|
||||||
|
|
||||||
|
//Find Closest to firing trajectory
|
||||||
|
Location loc = KartUtil.GetLook(GetKart());
|
||||||
|
|
||||||
|
KartItemEntity closest = null;
|
||||||
|
double closestDist = 10;
|
||||||
|
|
||||||
|
for (KartItemEntity item : GetEntities())
|
||||||
|
{
|
||||||
|
double dist = UtilMath.offset(item.GetEntity().getLocation(), loc);
|
||||||
|
|
||||||
|
if (closest == null)
|
||||||
|
{
|
||||||
|
closest = item;
|
||||||
|
closestDist = dist;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dist < closestDist)
|
||||||
|
{
|
||||||
|
closest = item;
|
||||||
|
closestDist = dist;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Fire Shell
|
||||||
|
closest.SetHost(null);
|
||||||
|
closest.SetVelocity(UtilAlg.Normalize(GetKart().GetDriver().getLocation().getDirection().setY(0)));
|
||||||
|
GetEntities().remove(closest);
|
||||||
|
|
||||||
|
//Counter Collision with driver
|
||||||
|
closest.SetFired();
|
||||||
|
|
||||||
|
//Red Shell Chase
|
||||||
|
if (closest instanceof RedShell)
|
||||||
|
{
|
||||||
|
Kart target = null;
|
||||||
|
|
||||||
|
for (Kart other : GetKart().GetGP().GetKarts())
|
||||||
|
{
|
||||||
|
if (other.GetLapPlace() + 1 == GetKart().GetLapPlace())
|
||||||
|
target = other;
|
||||||
|
}
|
||||||
|
|
||||||
|
closest.SetTarget(target);
|
||||||
|
}
|
||||||
|
|
||||||
|
return GetEntities().isEmpty();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,99 @@
|
|||||||
|
package nautilus.game.minekart.item.use_active;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.bukkit.util.Vector;
|
||||||
|
|
||||||
|
import mineplex.core.common.util.UtilAlg;
|
||||||
|
import mineplex.core.common.util.UtilMath;
|
||||||
|
import nautilus.game.minekart.gp.GPBattle;
|
||||||
|
import nautilus.game.minekart.item.KartItemActive;
|
||||||
|
import nautilus.game.minekart.item.KartItemEntity;
|
||||||
|
import nautilus.game.minekart.item.KartItemManager;
|
||||||
|
import nautilus.game.minekart.item.world_items_default.GreenShell;
|
||||||
|
import nautilus.game.minekart.item.world_items_default.RedShell;
|
||||||
|
import nautilus.game.minekart.kart.Kart;
|
||||||
|
import nautilus.game.minekart.kart.KartUtil;
|
||||||
|
|
||||||
|
public class ActiveStandard extends KartItemActive
|
||||||
|
{
|
||||||
|
public ActiveStandard(KartItemManager manager, Kart kart, List<KartItemEntity> ents)
|
||||||
|
{
|
||||||
|
super(manager, kart, ActiveType.Behind, ents);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean Use()
|
||||||
|
{
|
||||||
|
if (GetEntities().isEmpty())
|
||||||
|
return true;
|
||||||
|
|
||||||
|
KartItemEntity item = GetEntities().get(0);
|
||||||
|
|
||||||
|
//Fire Item
|
||||||
|
item.SetVelocity(null);
|
||||||
|
item.SetFired();
|
||||||
|
|
||||||
|
//Green/Red Shell Velocity & Teleport
|
||||||
|
if (item instanceof RedShell || item instanceof GreenShell)
|
||||||
|
{
|
||||||
|
item.GetEntity().teleport(KartUtil.GetInfront(item.GetHost().GetKart()));
|
||||||
|
|
||||||
|
Vector vel = UtilAlg.Normalize(GetKart().GetDriver().getLocation().getDirection().setY(0));
|
||||||
|
vel.multiply(1.4);
|
||||||
|
vel.setY(-0.4);
|
||||||
|
item.SetVelocity(vel);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Remove References
|
||||||
|
item.SetHost(null);
|
||||||
|
GetEntities().remove(item);
|
||||||
|
|
||||||
|
//Red Shell Home
|
||||||
|
if (item instanceof RedShell)
|
||||||
|
{
|
||||||
|
Kart target = null;
|
||||||
|
|
||||||
|
if (GetKart().GetGP() instanceof GPBattle)
|
||||||
|
{
|
||||||
|
double closest = 9999;
|
||||||
|
|
||||||
|
for (Kart other : GetKart().GetGP().GetKarts())
|
||||||
|
{
|
||||||
|
if (GetKart().equals(other))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (GetKart().GetLives() <= 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
double dist = UtilMath.offset(GetKart().GetDriver(), other.GetDriver());
|
||||||
|
|
||||||
|
if (target == null)
|
||||||
|
{
|
||||||
|
target = other;
|
||||||
|
closest = dist;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (dist < closest)
|
||||||
|
{
|
||||||
|
target = other;
|
||||||
|
closest = dist;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (Kart other : GetKart().GetGP().GetKarts())
|
||||||
|
{
|
||||||
|
if (other.GetLapPlace() + 1 == GetKart().GetLapPlace())
|
||||||
|
target = other;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
item.SetTarget(target);
|
||||||
|
}
|
||||||
|
|
||||||
|
return GetEntities().isEmpty();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,18 @@
|
|||||||
|
package nautilus.game.minekart.item.use_custom;
|
||||||
|
|
||||||
|
import nautilus.game.minekart.item.KartItemManager;
|
||||||
|
import nautilus.game.minekart.item.use_default.ItemUse;
|
||||||
|
import nautilus.game.minekart.kart.Kart;
|
||||||
|
import nautilus.game.minekart.kart.condition.ConditionData;
|
||||||
|
import nautilus.game.minekart.kart.condition.ConditionType;
|
||||||
|
|
||||||
|
public class UseBlaze extends ItemUse
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public void Use(KartItemManager manager, Kart kart)
|
||||||
|
{
|
||||||
|
kart.SetItemStored(null);
|
||||||
|
|
||||||
|
kart.AddCondition(new ConditionData(ConditionType.BlazeFire, 3000));
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,38 @@
|
|||||||
|
package nautilus.game.minekart.item.use_custom;
|
||||||
|
|
||||||
|
import org.bukkit.Sound;
|
||||||
|
import org.bukkit.entity.Egg;
|
||||||
|
import org.bukkit.util.Vector;
|
||||||
|
|
||||||
|
import nautilus.game.minekart.item.KartItemManager;
|
||||||
|
import nautilus.game.minekart.item.use_default.ItemUse;
|
||||||
|
import nautilus.game.minekart.kart.Kart;
|
||||||
|
|
||||||
|
public class UseChicken extends ItemUse
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public void Use(KartItemManager manager, Kart kart)
|
||||||
|
{
|
||||||
|
if (kart.GetDriver().getInventory().getItem(3) == null)
|
||||||
|
{
|
||||||
|
kart.SetItemStored(null);
|
||||||
|
}
|
||||||
|
else if (kart.GetDriver().getInventory().getItem(3).getAmount() > 1)
|
||||||
|
{
|
||||||
|
kart.GetDriver().getInventory().getItem(3).setAmount(kart.GetDriver().getInventory().getItem(3).getAmount() - 1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
kart.SetItemStored(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
Egg egg = kart.GetDriver().launchProjectile(Egg.class);
|
||||||
|
|
||||||
|
Vector vel = kart.GetDriver().getLocation().getDirection();
|
||||||
|
vel.setY(0.1);
|
||||||
|
vel.multiply(2);
|
||||||
|
egg.setVelocity(vel);
|
||||||
|
|
||||||
|
kart.GetDriver().getWorld().playSound(kart.GetDriver().getLocation(), Sound.CHICKEN_EGG_POP, 2f, 1f);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,39 @@
|
|||||||
|
package nautilus.game.minekart.item.use_custom;
|
||||||
|
|
||||||
|
import org.bukkit.Location;
|
||||||
|
|
||||||
|
import nautilus.game.minekart.item.KartItemManager;
|
||||||
|
import nautilus.game.minekart.item.use_default.ItemUse;
|
||||||
|
import nautilus.game.minekart.kart.Kart;
|
||||||
|
import nautilus.game.minekart.kart.KartUtil;
|
||||||
|
import nautilus.game.minekart.track.ents.Cow;
|
||||||
|
|
||||||
|
public class UseCow extends ItemUse
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public void Use(KartItemManager manager, Kart kart)
|
||||||
|
{
|
||||||
|
kart.SetItemStored(null);
|
||||||
|
|
||||||
|
//Mid
|
||||||
|
kart.GetGP().GetTrack().GetCreatures().add(new Cow(kart.GetGP().GetTrack(), KartUtil.GetLook(kart), kart, kart.GetDriver().getLocation().getDirection()));
|
||||||
|
|
||||||
|
Location left1 = KartUtil.GetLook(kart).add(KartUtil.GetSide(kart).multiply(1.5));
|
||||||
|
kart.GetGP().GetTrack().GetCreatures().add(new Cow(kart.GetGP().GetTrack(), left1, kart, kart.GetDriver().getLocation().getDirection()));
|
||||||
|
|
||||||
|
Location left2 = KartUtil.GetLook(kart).add(KartUtil.GetSide(kart).multiply(3));
|
||||||
|
kart.GetGP().GetTrack().GetCreatures().add(new Cow(kart.GetGP().GetTrack(), left2, kart, kart.GetDriver().getLocation().getDirection()));
|
||||||
|
|
||||||
|
Location left3 = KartUtil.GetLook(kart).add(KartUtil.GetSide(kart).multiply(4.5));
|
||||||
|
kart.GetGP().GetTrack().GetCreatures().add(new Cow(kart.GetGP().GetTrack(), left3, kart, kart.GetDriver().getLocation().getDirection()));
|
||||||
|
|
||||||
|
Location right1 = KartUtil.GetLook(kart).subtract(KartUtil.GetSide(kart).multiply(1.5));
|
||||||
|
kart.GetGP().GetTrack().GetCreatures().add(new Cow(kart.GetGP().GetTrack(), right1, kart, kart.GetDriver().getLocation().getDirection()));
|
||||||
|
|
||||||
|
Location right2 = KartUtil.GetLook(kart).subtract(KartUtil.GetSide(kart).multiply(3));
|
||||||
|
kart.GetGP().GetTrack().GetCreatures().add(new Cow(kart.GetGP().GetTrack(), right2, kart, kart.GetDriver().getLocation().getDirection()));
|
||||||
|
|
||||||
|
Location right3 = KartUtil.GetLook(kart).subtract(KartUtil.GetSide(kart).multiply(4.5));
|
||||||
|
kart.GetGP().GetTrack().GetCreatures().add(new Cow(kart.GetGP().GetTrack(), right3, kart, kart.GetDriver().getLocation().getDirection()));
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,105 @@
|
|||||||
|
package nautilus.game.minekart.item.use_custom;
|
||||||
|
|
||||||
|
import org.bukkit.Effect;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.Sound;
|
||||||
|
import org.bukkit.block.Block;
|
||||||
|
import org.bukkit.entity.Entity;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.util.Vector;
|
||||||
|
|
||||||
|
import mineplex.core.common.util.UtilBlock;
|
||||||
|
import nautilus.game.minekart.item.KartItemManager;
|
||||||
|
import nautilus.game.minekart.item.use_default.ItemUse;
|
||||||
|
import nautilus.game.minekart.kart.Kart;
|
||||||
|
|
||||||
|
public class UseEnderman extends ItemUse
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public void Use(KartItemManager manager, Kart kart)
|
||||||
|
{
|
||||||
|
if (kart.GetDriver().getInventory().getItem(3) == null)
|
||||||
|
{
|
||||||
|
kart.SetItemStored(null);
|
||||||
|
}
|
||||||
|
else if (kart.GetDriver().getInventory().getItem(3).getAmount() > 1)
|
||||||
|
{
|
||||||
|
kart.GetDriver().getInventory().getItem(3).setAmount(kart.GetDriver().getInventory().getItem(3).getAmount() - 1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
kart.SetItemStored(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
Player player = kart.GetDriver();
|
||||||
|
|
||||||
|
//Trail
|
||||||
|
Block lastEffect = player.getLocation().getBlock();
|
||||||
|
|
||||||
|
double maxRange = 20;
|
||||||
|
double curRange = 0;
|
||||||
|
while (curRange <= maxRange)
|
||||||
|
{
|
||||||
|
Vector look = player.getLocation().getDirection();
|
||||||
|
look.setY(0);
|
||||||
|
look.normalize();
|
||||||
|
look.multiply(curRange);
|
||||||
|
|
||||||
|
Location newTarget = player.getLocation().add(0, 0.1, 0).add(look);
|
||||||
|
|
||||||
|
if (UtilBlock.solid(newTarget.getBlock()))
|
||||||
|
break;
|
||||||
|
|
||||||
|
//Progress Forwards
|
||||||
|
curRange += 0.2;
|
||||||
|
|
||||||
|
//Trail
|
||||||
|
if (!lastEffect.equals(newTarget.getBlock()))
|
||||||
|
lastEffect.getWorld().playEffect(lastEffect.getLocation(), Effect.STEP_SOUND, 49);
|
||||||
|
|
||||||
|
lastEffect = newTarget.getBlock();
|
||||||
|
}
|
||||||
|
|
||||||
|
//Modify Range
|
||||||
|
curRange -= 0.4;
|
||||||
|
if (curRange < 0)
|
||||||
|
curRange = 0;
|
||||||
|
|
||||||
|
//Destination
|
||||||
|
Vector look = player.getLocation().getDirection();
|
||||||
|
look.setY(0);
|
||||||
|
look.normalize();
|
||||||
|
look.multiply(curRange);
|
||||||
|
|
||||||
|
Location loc = player.getLocation().add(look).add(new Vector(0, 0.4, 0));
|
||||||
|
|
||||||
|
//Sound
|
||||||
|
kart.GetDriver().getWorld().playSound(kart.GetDriver().getLocation(), Sound.ZOMBIE_UNFECT, 2f, 2f);
|
||||||
|
|
||||||
|
Entity item = player.getPassenger();
|
||||||
|
if (item != null) item.leaveVehicle();
|
||||||
|
player.eject();
|
||||||
|
|
||||||
|
//Action
|
||||||
|
if (curRange > 0)
|
||||||
|
{
|
||||||
|
player.leaveVehicle();
|
||||||
|
player.teleport(loc);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Re-Attach Item
|
||||||
|
if (item != null)
|
||||||
|
{
|
||||||
|
item.teleport(loc.add(0, 1.5, 0));
|
||||||
|
player.setPassenger(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Adjust Velocity
|
||||||
|
double length = kart.GetVelocity().length();
|
||||||
|
Vector vel = player.getLocation().getDirection();
|
||||||
|
vel.setY(0);
|
||||||
|
vel.normalize();
|
||||||
|
vel.multiply(length);
|
||||||
|
kart.SetVelocity(vel);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,61 @@
|
|||||||
|
package nautilus.game.minekart.item.use_custom;
|
||||||
|
|
||||||
|
import org.bukkit.Effect;
|
||||||
|
import org.bukkit.Sound;
|
||||||
|
import org.bukkit.block.Block;
|
||||||
|
import org.bukkit.block.BlockFace;
|
||||||
|
|
||||||
|
import mineplex.core.common.util.F;
|
||||||
|
import mineplex.core.common.util.UtilBlock;
|
||||||
|
import mineplex.core.common.util.UtilEnt;
|
||||||
|
import mineplex.core.common.util.UtilMath;
|
||||||
|
import nautilus.game.minekart.item.KartItemManager;
|
||||||
|
import nautilus.game.minekart.item.use_default.ItemUse;
|
||||||
|
import nautilus.game.minekart.kart.Kart;
|
||||||
|
import nautilus.game.minekart.kart.KartUtil;
|
||||||
|
import nautilus.game.minekart.kart.condition.ConditionType;
|
||||||
|
import nautilus.game.minekart.kart.crash.Crash_Explode;
|
||||||
|
|
||||||
|
public class UseGolem extends ItemUse
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public void Use(KartItemManager manager, Kart kart)
|
||||||
|
{
|
||||||
|
kart.SetItemStored(null);
|
||||||
|
|
||||||
|
kart.GetGP().Announce(F.main("MK", F.elem(UtilEnt.getName(kart.GetDriver())) + " used " + F.item("Earthquake") + "."));
|
||||||
|
|
||||||
|
for (Kart other : manager.KartManager.GetKarts().values())
|
||||||
|
{
|
||||||
|
if (other.equals(kart))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (!KartUtil.IsGrounded(other))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (other.HasCondition(ConditionType.Star) || other.HasCondition(ConditionType.Ghost))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
double offset = UtilMath.offset(kart.GetDriver(), other.GetDriver());
|
||||||
|
|
||||||
|
//MiniBump Crash
|
||||||
|
if (offset < 100)
|
||||||
|
new Crash_Explode(other, 0.4 + ((100 - offset)/100), false);
|
||||||
|
|
||||||
|
//Half Velocity
|
||||||
|
other.GetVelocity().multiply(0.50);
|
||||||
|
|
||||||
|
//Sound
|
||||||
|
other.GetDriver().getWorld().playSound(other.GetDriver().getLocation(), Sound.IRONGOLEM_THROW, 2f, 0.5f);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Sound
|
||||||
|
kart.GetDriver().getWorld().playSound(kart.GetDriver().getLocation(), Sound.IRONGOLEM_THROW, 2f, 0.5f);
|
||||||
|
kart.GetDriver().getWorld().playSound(kart.GetDriver().getLocation(), Sound.IRONGOLEM_THROW, 2f, 0.5f);
|
||||||
|
|
||||||
|
//Effect
|
||||||
|
for (Block cur : UtilBlock.getInRadius(kart.GetDriver().getLocation(), 4d).keySet())
|
||||||
|
if (UtilBlock.airFoliage(cur.getRelative(BlockFace.UP)) && !UtilBlock.airFoliage(cur))
|
||||||
|
cur.getWorld().playEffect(cur.getLocation(), Effect.STEP_SOUND, cur.getTypeId());
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,42 @@
|
|||||||
|
package nautilus.game.minekart.item.use_custom;
|
||||||
|
|
||||||
|
import org.bukkit.Sound;
|
||||||
|
import org.bukkit.potion.PotionEffect;
|
||||||
|
import org.bukkit.potion.PotionEffectType;
|
||||||
|
|
||||||
|
import mineplex.core.common.util.F;
|
||||||
|
import mineplex.core.common.util.UtilEnt;
|
||||||
|
import nautilus.game.minekart.item.KartItemManager;
|
||||||
|
import nautilus.game.minekart.item.use_default.ItemUse;
|
||||||
|
import nautilus.game.minekart.kart.Kart;
|
||||||
|
import nautilus.game.minekart.kart.condition.ConditionType;
|
||||||
|
|
||||||
|
public class UsePig extends ItemUse
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public void Use(KartItemManager manager, Kart kart)
|
||||||
|
{
|
||||||
|
kart.SetItemStored(null);
|
||||||
|
|
||||||
|
kart.GetGP().Announce(F.main("MK", F.elem(UtilEnt.getName(kart.GetDriver())) + " used " + F.item("Pig Stink") + "."));
|
||||||
|
|
||||||
|
for (Kart other : manager.KartManager.GetKarts().values())
|
||||||
|
{
|
||||||
|
if (other.equals(kart))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (other.HasCondition(ConditionType.Star) || other.HasCondition(ConditionType.Ghost))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
PotionEffect effect = new PotionEffect(PotionEffectType.CONFUSION, 400, 0, false);
|
||||||
|
effect.apply(other.GetDriver());
|
||||||
|
|
||||||
|
//Sound
|
||||||
|
other.GetDriver().getWorld().playSound(other.GetDriver().getLocation(), Sound.PIG_IDLE, 2f, 0.5f);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Sound
|
||||||
|
kart.GetDriver().getWorld().playSound(kart.GetDriver().getLocation(), Sound.PIG_IDLE, 2f, 0.5f);
|
||||||
|
kart.GetDriver().getWorld().playSound(kart.GetDriver().getLocation(), Sound.PIG_IDLE, 2f, 0.5f);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,29 @@
|
|||||||
|
package nautilus.game.minekart.item.use_custom;
|
||||||
|
|
||||||
|
import org.bukkit.Sound;
|
||||||
|
|
||||||
|
import mineplex.core.common.util.F;
|
||||||
|
import mineplex.core.common.util.UtilEnt;
|
||||||
|
import nautilus.game.minekart.item.KartItemManager;
|
||||||
|
import nautilus.game.minekart.item.use_default.ItemUse;
|
||||||
|
import nautilus.game.minekart.kart.Kart;
|
||||||
|
import nautilus.game.minekart.track.ents.Sheepile;
|
||||||
|
|
||||||
|
public class UseSheep extends ItemUse
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public void Use(KartItemManager manager, Kart kart)
|
||||||
|
{
|
||||||
|
kart.SetItemStored(null);
|
||||||
|
|
||||||
|
kart.GetGP().Announce(F.main("MK", F.elem(UtilEnt.getName(kart.GetDriver())) + " used " + F.item("Super Sheep") + "."));
|
||||||
|
|
||||||
|
//Spider
|
||||||
|
kart.GetGP().GetTrack().GetCreatures().add(
|
||||||
|
new Sheepile(kart.GetGP().GetTrack(), kart.GetDriver().getLocation(), kart));
|
||||||
|
|
||||||
|
//Sound
|
||||||
|
kart.GetDriver().getWorld().playSound(kart.GetDriver().getLocation(), Sound.SHEEP_IDLE, 2f, 2f);
|
||||||
|
kart.GetDriver().getWorld().playSound(kart.GetDriver().getLocation(), Sound.SHEEP_IDLE, 2f, 2f);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,47 @@
|
|||||||
|
package nautilus.game.minekart.item.use_custom;
|
||||||
|
|
||||||
|
import org.bukkit.Sound;
|
||||||
|
|
||||||
|
import mineplex.core.common.util.F;
|
||||||
|
import mineplex.core.common.util.UtilEnt;
|
||||||
|
import nautilus.game.minekart.item.KartItemManager;
|
||||||
|
import nautilus.game.minekart.item.use_default.ItemUse;
|
||||||
|
import nautilus.game.minekart.kart.Kart;
|
||||||
|
import nautilus.game.minekart.track.ents.Spiderling;
|
||||||
|
|
||||||
|
public class UseSpider extends ItemUse
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public void Use(KartItemManager manager, Kart kart)
|
||||||
|
{
|
||||||
|
kart.SetItemStored(null);
|
||||||
|
|
||||||
|
kart.GetGP().Announce(F.main("MK", F.elem(UtilEnt.getName(kart.GetDriver())) + " used " + F.item("Spiderlings") + "."));
|
||||||
|
|
||||||
|
final Kart fKart = kart;
|
||||||
|
|
||||||
|
int i = 0;
|
||||||
|
for (Kart other : kart.GetGP().GetKarts())
|
||||||
|
{
|
||||||
|
if (other.equals(kart))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
final Kart fOther = other;
|
||||||
|
|
||||||
|
manager.GetPlugin().getServer().getScheduler().scheduleSyncDelayedTask(manager.GetPlugin(), new Runnable()
|
||||||
|
{
|
||||||
|
public void run()
|
||||||
|
{
|
||||||
|
//Spider
|
||||||
|
fKart.GetGP().GetTrack().GetCreatures().add(
|
||||||
|
new Spiderling(fKart.GetGP().GetTrack(), fKart.GetDriver().getLocation(), fKart, fOther));
|
||||||
|
|
||||||
|
//Sound
|
||||||
|
fKart.GetDriver().getWorld().playSound(fKart.GetDriver().getLocation(), Sound.SPIDER_IDLE, 2f, 2f);
|
||||||
|
}
|
||||||
|
}, i * 3);
|
||||||
|
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,18 @@
|
|||||||
|
package nautilus.game.minekart.item.use_custom;
|
||||||
|
|
||||||
|
import nautilus.game.minekart.item.KartItemManager;
|
||||||
|
import nautilus.game.minekart.item.use_default.ItemUse;
|
||||||
|
import nautilus.game.minekart.kart.Kart;
|
||||||
|
import nautilus.game.minekart.kart.condition.ConditionData;
|
||||||
|
import nautilus.game.minekart.kart.condition.ConditionType;
|
||||||
|
|
||||||
|
public class UseWolf extends ItemUse
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public void Use(KartItemManager manager, Kart kart)
|
||||||
|
{
|
||||||
|
kart.SetItemStored(null);
|
||||||
|
|
||||||
|
kart.AddCondition(new ConditionData(ConditionType.WolfHeart, 60000));
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,9 @@
|
|||||||
|
package nautilus.game.minekart.item.use_default;
|
||||||
|
|
||||||
|
import nautilus.game.minekart.item.KartItemManager;
|
||||||
|
import nautilus.game.minekart.kart.Kart;
|
||||||
|
|
||||||
|
public abstract class ItemUse
|
||||||
|
{
|
||||||
|
public abstract void Use(KartItemManager Manager, Kart kart);
|
||||||
|
}
|
@ -0,0 +1,26 @@
|
|||||||
|
package nautilus.game.minekart.item.use_default;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
import nautilus.game.minekart.item.KartItemEntity;
|
||||||
|
import nautilus.game.minekart.item.KartItemManager;
|
||||||
|
import nautilus.game.minekart.item.use_active.ActiveStandard;
|
||||||
|
import nautilus.game.minekart.item.world_items_default.Banana;
|
||||||
|
import nautilus.game.minekart.kart.Kart;
|
||||||
|
import nautilus.game.minekart.kart.KartUtil;
|
||||||
|
|
||||||
|
public class UseBanana extends ItemUse
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public void Use(KartItemManager manager, Kart kart)
|
||||||
|
{
|
||||||
|
//Auto-Trail = Dont do this
|
||||||
|
//kart.SetItemStored(null);
|
||||||
|
|
||||||
|
ArrayList<KartItemEntity> ents = new ArrayList<KartItemEntity>();
|
||||||
|
|
||||||
|
ents.add(new Banana(manager, kart, KartUtil.GetBehind(kart)));
|
||||||
|
|
||||||
|
new ActiveStandard(manager, kart, ents);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,31 @@
|
|||||||
|
package nautilus.game.minekart.item.use_default;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
import nautilus.game.minekart.item.KartItemEntity;
|
||||||
|
import nautilus.game.minekart.item.KartItemManager;
|
||||||
|
import nautilus.game.minekart.item.use_active.ActiveBananas;
|
||||||
|
import nautilus.game.minekart.item.world_items_default.Banana;
|
||||||
|
import nautilus.game.minekart.kart.Kart;
|
||||||
|
import nautilus.game.minekart.kart.KartUtil;
|
||||||
|
|
||||||
|
public class UseBananas extends ItemUse
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public void Use(KartItemManager manager, Kart kart)
|
||||||
|
{
|
||||||
|
kart.SetItemStored(null);
|
||||||
|
|
||||||
|
ArrayList<KartItemEntity> ents = new ArrayList<KartItemEntity>();
|
||||||
|
|
||||||
|
ents.add(new Banana(manager, kart, KartUtil.GetLook(kart)));
|
||||||
|
ents.add(new Banana(manager, kart, KartUtil.GetLook(kart)));
|
||||||
|
ents.add(new Banana(manager, kart, KartUtil.GetLook(kart)));
|
||||||
|
ents.add(new Banana(manager, kart, KartUtil.GetLook(kart)));
|
||||||
|
ents.add(new Banana(manager, kart, KartUtil.GetLook(kart)));
|
||||||
|
ents.add(new Banana(manager, kart, KartUtil.GetLook(kart)));
|
||||||
|
ents.add(new Banana(manager, kart, KartUtil.GetLook(kart)));
|
||||||
|
|
||||||
|
new ActiveBananas(manager, kart, ents);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,17 @@
|
|||||||
|
package nautilus.game.minekart.item.use_default;
|
||||||
|
|
||||||
|
import nautilus.game.minekart.item.KartItemManager;
|
||||||
|
import nautilus.game.minekart.item.world_items_default.FakeItem;
|
||||||
|
import nautilus.game.minekart.kart.Kart;
|
||||||
|
import nautilus.game.minekart.kart.KartUtil;
|
||||||
|
|
||||||
|
public class UseFakeItem extends ItemUse
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public void Use(KartItemManager manager, Kart kart)
|
||||||
|
{
|
||||||
|
kart.SetItemStored(null);
|
||||||
|
|
||||||
|
new FakeItem(manager, kart, KartUtil.GetBehind(kart));
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,79 @@
|
|||||||
|
package nautilus.game.minekart.item.use_default;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
import org.bukkit.Color;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.Sound;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
import org.bukkit.inventory.meta.LeatherArmorMeta;
|
||||||
|
|
||||||
|
import mineplex.core.common.util.UtilMath;
|
||||||
|
import nautilus.game.minekart.item.KartItemManager;
|
||||||
|
import nautilus.game.minekart.kart.Kart;
|
||||||
|
import nautilus.game.minekart.kart.condition.ConditionData;
|
||||||
|
import nautilus.game.minekart.kart.condition.ConditionType;
|
||||||
|
|
||||||
|
public class UseGhost extends ItemUse
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public void Use(KartItemManager manager, Kart kart)
|
||||||
|
{
|
||||||
|
if (kart.HasCondition(ConditionType.Star) || kart.HasCondition(ConditionType.Ghost) || kart.HasCondition(ConditionType.Lightning))
|
||||||
|
return;
|
||||||
|
|
||||||
|
kart.SetItemStored(null);
|
||||||
|
|
||||||
|
kart.GetDriver().getWorld().playSound(kart.GetDriver().getLocation(), Sound.GHAST_MOAN, 2f, 1f);
|
||||||
|
|
||||||
|
kart.AddCondition(new ConditionData(ConditionType.Ghost, 8000));
|
||||||
|
|
||||||
|
ArrayList<Kart> steal = new ArrayList<Kart>();
|
||||||
|
|
||||||
|
for (Kart other : kart.GetGP().GetKarts())
|
||||||
|
{
|
||||||
|
if (kart.equals(other))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (other.GetItemStored() != null)
|
||||||
|
steal.add(other);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!steal.isEmpty())
|
||||||
|
{
|
||||||
|
Kart target = steal.get(UtilMath.r(steal.size()));
|
||||||
|
kart.SetItemStored(target.GetItemStored());
|
||||||
|
target.SetItemStored(null);
|
||||||
|
|
||||||
|
target.GetDriver().getWorld().playSound(target.GetDriver().getLocation(), Sound.GHAST_MOAN, 2f, 1f);
|
||||||
|
}
|
||||||
|
|
||||||
|
Color color = Color.WHITE;
|
||||||
|
LeatherArmorMeta meta;
|
||||||
|
|
||||||
|
ItemStack head = new ItemStack(Material.LEATHER_HELMET);
|
||||||
|
meta = (LeatherArmorMeta)head.getItemMeta();
|
||||||
|
meta.setColor(color);
|
||||||
|
head.setItemMeta(meta);
|
||||||
|
|
||||||
|
ItemStack chest = new ItemStack(Material.LEATHER_CHESTPLATE);
|
||||||
|
meta = (LeatherArmorMeta)chest.getItemMeta();
|
||||||
|
meta.setColor(color);
|
||||||
|
chest.setItemMeta(meta);
|
||||||
|
|
||||||
|
ItemStack legs = new ItemStack(Material.LEATHER_LEGGINGS);
|
||||||
|
meta = (LeatherArmorMeta)legs.getItemMeta();
|
||||||
|
meta.setColor(color);
|
||||||
|
legs.setItemMeta(meta);
|
||||||
|
|
||||||
|
ItemStack boots = new ItemStack(Material.LEATHER_BOOTS);
|
||||||
|
meta = (LeatherArmorMeta)boots.getItemMeta();
|
||||||
|
meta.setColor(color);
|
||||||
|
boots.setItemMeta(meta);
|
||||||
|
|
||||||
|
kart.GetDriver().getInventory().setHelmet(head);
|
||||||
|
kart.GetDriver().getInventory().setChestplate(chest);
|
||||||
|
kart.GetDriver().getInventory().setLeggings(legs);
|
||||||
|
kart.GetDriver().getInventory().setBoots(boots);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,42 @@
|
|||||||
|
package nautilus.game.minekart.item.use_default;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
import org.bukkit.Sound;
|
||||||
|
|
||||||
|
import me.chiss.Core.Utility.UtilMath;
|
||||||
|
import nautilus.game.minekart.item.KartItemManager;
|
||||||
|
import nautilus.game.minekart.kart.Kart;
|
||||||
|
import nautilus.game.minekart.kart.condition.ConditionData;
|
||||||
|
import nautilus.game.minekart.kart.condition.ConditionType;
|
||||||
|
|
||||||
|
public class UseGhost extends ItemUse
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public void Use(KartItemManager manager, Kart kart)
|
||||||
|
{
|
||||||
|
kart.SetItemStored(null);
|
||||||
|
|
||||||
|
kart.GetDriver().getWorld().playSound(kart.GetDriver().getLocation(), Sound.GHAST_MOAN, 2f, 1f);
|
||||||
|
|
||||||
|
kart.AddCondition(new ConditionData(ConditionType.Ghost, 8000));
|
||||||
|
|
||||||
|
ArrayList<Kart> steal = new ArrayList<Kart>();
|
||||||
|
|
||||||
|
for (Kart other : kart.GetGP().GetKarts())
|
||||||
|
{
|
||||||
|
if (kart.equals(other))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (kart.GetItemStored() != null)
|
||||||
|
steal.add(other);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!steal.isEmpty())
|
||||||
|
{
|
||||||
|
Kart target = steal.get(UtilMath.r(steal.size()));
|
||||||
|
kart.SetItemStored(target.GetItemStored());
|
||||||
|
target.SetItemStored(null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,26 @@
|
|||||||
|
package nautilus.game.minekart.item.use_default;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
import nautilus.game.minekart.item.KartItemEntity;
|
||||||
|
import nautilus.game.minekart.item.KartItemManager;
|
||||||
|
import nautilus.game.minekart.item.use_active.ActiveStandard;
|
||||||
|
import nautilus.game.minekart.item.world_items_default.GreenShell;
|
||||||
|
import nautilus.game.minekart.kart.Kart;
|
||||||
|
import nautilus.game.minekart.kart.KartUtil;
|
||||||
|
|
||||||
|
public class UseGreenShell extends ItemUse
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public void Use(KartItemManager manager, Kart kart)
|
||||||
|
{
|
||||||
|
//Auto-Trail = Dont do this
|
||||||
|
//kart.SetItemStored(null);
|
||||||
|
|
||||||
|
ArrayList<KartItemEntity> ents = new ArrayList<KartItemEntity>();
|
||||||
|
|
||||||
|
ents.add(new GreenShell(manager, kart, KartUtil.GetLook(kart)));
|
||||||
|
|
||||||
|
new ActiveStandard(manager, kart, ents);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,37 @@
|
|||||||
|
package nautilus.game.minekart.item.use_default;
|
||||||
|
|
||||||
|
import mineplex.core.common.util.F;
|
||||||
|
import mineplex.core.common.util.UtilEnt;
|
||||||
|
import nautilus.game.minekart.item.KartItemManager;
|
||||||
|
import nautilus.game.minekart.kart.Kart;
|
||||||
|
import nautilus.game.minekart.kart.condition.ConditionData;
|
||||||
|
import nautilus.game.minekart.kart.condition.ConditionType;
|
||||||
|
import nautilus.game.minekart.kart.crash.Crash_Spin;
|
||||||
|
|
||||||
|
public class UseLightning extends ItemUse
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public void Use(KartItemManager manager, Kart kart)
|
||||||
|
{
|
||||||
|
if (kart.HasCondition(ConditionType.Star) || kart.HasCondition(ConditionType.Ghost) || kart.HasCondition(ConditionType.Lightning))
|
||||||
|
return;
|
||||||
|
|
||||||
|
kart.SetItemStored(null);
|
||||||
|
|
||||||
|
kart.GetGP().Announce(F.main("MK", F.elem(UtilEnt.getName(kart.GetDriver())) + " used " + F.item("Lightning") + "."));
|
||||||
|
|
||||||
|
for (Kart other : kart.GetGP().GetKarts())
|
||||||
|
{
|
||||||
|
if (kart.equals(other))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (other.HasCondition(ConditionType.Star) || other.HasCondition(ConditionType.Ghost))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
new Crash_Spin(other, 0.8f);
|
||||||
|
|
||||||
|
other.GetDriver().getWorld().strikeLightningEffect(other.GetDriver().getLocation());
|
||||||
|
other.AddCondition(new ConditionData(ConditionType.Lightning, 10000));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,33 @@
|
|||||||
|
package nautilus.game.minekart.item.use_default;
|
||||||
|
|
||||||
|
import nautilus.game.minekart.item.KartItemManager;
|
||||||
|
import nautilus.game.minekart.kart.Kart;
|
||||||
|
import nautilus.game.minekart.kart.condition.ConditionData;
|
||||||
|
import nautilus.game.minekart.kart.condition.ConditionType;
|
||||||
|
import nautilus.game.minekart.kart.crash.Crash_Spin;
|
||||||
|
|
||||||
|
public class UseLightning extends ItemUse
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public void Use(KartItemManager manager, Kart kart)
|
||||||
|
{
|
||||||
|
kart.SetItemStored(null);
|
||||||
|
|
||||||
|
if (kart.GetGP() == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (Kart other : kart.GetGP().GetKarts())
|
||||||
|
{
|
||||||
|
if (kart.equals(other))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (other.HasCondition(ConditionType.Star) || other.HasCondition(ConditionType.Ghost))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
new Crash_Spin(kart, 0.8f);
|
||||||
|
|
||||||
|
other.GetDriver().getWorld().strikeLightningEffect(other.GetDriver().getLocation());
|
||||||
|
other.AddCondition(new ConditionData(ConditionType.Lightning, 10000));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,35 @@
|
|||||||
|
package nautilus.game.minekart.item.use_default;
|
||||||
|
|
||||||
|
import nautilus.game.minekart.item.KartItemManager;
|
||||||
|
import nautilus.game.minekart.item.KartItemType;
|
||||||
|
import nautilus.game.minekart.kart.Kart;
|
||||||
|
import nautilus.game.minekart.kart.condition.ConditionData;
|
||||||
|
import nautilus.game.minekart.kart.condition.ConditionType;
|
||||||
|
|
||||||
|
public class UseMushroom extends ItemUse
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public void Use(KartItemManager manager, final Kart kart)
|
||||||
|
{
|
||||||
|
//Super
|
||||||
|
if (kart.GetItemStored() == KartItemType.SuperMushroom)
|
||||||
|
{
|
||||||
|
if (!kart.HasCondition(ConditionType.SuperMushroom))
|
||||||
|
kart.AddCondition(new ConditionData(ConditionType.SuperMushroom, 8000));
|
||||||
|
}
|
||||||
|
|
||||||
|
//Triple
|
||||||
|
else if (kart.GetItemStored() == KartItemType.TripleMushroom)
|
||||||
|
kart.SetItemStored(KartItemType.DoubleMushroom);
|
||||||
|
|
||||||
|
//Double
|
||||||
|
else if (kart.GetItemStored() == KartItemType.DoubleMushroom)
|
||||||
|
kart.SetItemStored(KartItemType.SingleMushroom);
|
||||||
|
|
||||||
|
//Single
|
||||||
|
else
|
||||||
|
kart.SetItemStored(null);
|
||||||
|
|
||||||
|
kart.AddCondition(new ConditionData(ConditionType.Boost, 2000));
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,26 @@
|
|||||||
|
package nautilus.game.minekart.item.use_default;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
import nautilus.game.minekart.item.KartItemEntity;
|
||||||
|
import nautilus.game.minekart.item.KartItemManager;
|
||||||
|
import nautilus.game.minekart.item.use_active.ActiveStandard;
|
||||||
|
import nautilus.game.minekart.item.world_items_default.RedShell;
|
||||||
|
import nautilus.game.minekart.kart.Kart;
|
||||||
|
import nautilus.game.minekart.kart.KartUtil;
|
||||||
|
|
||||||
|
public class UseRedShell extends ItemUse
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public void Use(KartItemManager manager, Kart kart)
|
||||||
|
{
|
||||||
|
//Auto-Trail = Dont do this
|
||||||
|
//kart.SetItemStored(null);
|
||||||
|
|
||||||
|
ArrayList<KartItemEntity> ents = new ArrayList<KartItemEntity>();
|
||||||
|
|
||||||
|
ents.add(new RedShell(manager, kart, KartUtil.GetLook(kart)));
|
||||||
|
|
||||||
|
new ActiveStandard(manager, kart, ents);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,20 @@
|
|||||||
|
package nautilus.game.minekart.item.use_default;
|
||||||
|
|
||||||
|
import nautilus.game.minekart.item.KartItemManager;
|
||||||
|
import nautilus.game.minekart.kart.Kart;
|
||||||
|
import nautilus.game.minekart.kart.condition.ConditionData;
|
||||||
|
import nautilus.game.minekart.kart.condition.ConditionType;
|
||||||
|
|
||||||
|
public class UseStar extends ItemUse
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public void Use(KartItemManager manager, Kart kart)
|
||||||
|
{
|
||||||
|
if (kart.HasCondition(ConditionType.Star) || kart.HasCondition(ConditionType.Ghost) || kart.HasCondition(ConditionType.Lightning))
|
||||||
|
return;
|
||||||
|
|
||||||
|
kart.SetItemStored(null);
|
||||||
|
|
||||||
|
kart.AddCondition(new ConditionData(ConditionType.Star, 10000));
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,27 @@
|
|||||||
|
package nautilus.game.minekart.item.use_default;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
import nautilus.game.minekart.item.KartItemEntity;
|
||||||
|
import nautilus.game.minekart.item.KartItemManager;
|
||||||
|
import nautilus.game.minekart.item.use_active.ActiveShells;
|
||||||
|
import nautilus.game.minekart.item.world_items_default.GreenShell;
|
||||||
|
import nautilus.game.minekart.kart.Kart;
|
||||||
|
import nautilus.game.minekart.kart.KartUtil;
|
||||||
|
|
||||||
|
public class UseTripleGreenShell extends ItemUse
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public void Use(KartItemManager manager, Kart kart)
|
||||||
|
{
|
||||||
|
kart.SetItemStored(null);
|
||||||
|
|
||||||
|
ArrayList<KartItemEntity> ents = new ArrayList<KartItemEntity>();
|
||||||
|
|
||||||
|
ents.add(new GreenShell(manager, kart, KartUtil.GetLook(kart)));
|
||||||
|
ents.add(new GreenShell(manager, kart, KartUtil.GetLook(kart)));
|
||||||
|
ents.add(new GreenShell(manager, kart, KartUtil.GetLook(kart)));
|
||||||
|
|
||||||
|
new ActiveShells(manager, kart, ents);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,27 @@
|
|||||||
|
package nautilus.game.minekart.item.use_default;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
import nautilus.game.minekart.item.KartItemEntity;
|
||||||
|
import nautilus.game.minekart.item.KartItemManager;
|
||||||
|
import nautilus.game.minekart.item.use_active.ActiveShells;
|
||||||
|
import nautilus.game.minekart.item.world_items_default.RedShell;
|
||||||
|
import nautilus.game.minekart.kart.Kart;
|
||||||
|
import nautilus.game.minekart.kart.KartUtil;
|
||||||
|
|
||||||
|
public class UseTripleRedShell extends ItemUse
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public void Use(KartItemManager manager, Kart kart)
|
||||||
|
{
|
||||||
|
kart.SetItemStored(null);
|
||||||
|
|
||||||
|
ArrayList<KartItemEntity> ents = new ArrayList<KartItemEntity>();
|
||||||
|
|
||||||
|
ents.add(new RedShell(manager, kart, KartUtil.GetLook(kart)));
|
||||||
|
ents.add(new RedShell(manager, kart, KartUtil.GetLook(kart)));
|
||||||
|
ents.add(new RedShell(manager, kart, KartUtil.GetLook(kart)));
|
||||||
|
|
||||||
|
new ActiveShells(manager, kart, ents);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,36 @@
|
|||||||
|
package nautilus.game.minekart.item.world_items_custom;
|
||||||
|
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
|
||||||
|
import nautilus.game.minekart.item.KartItemEntity;
|
||||||
|
import nautilus.game.minekart.item.KartItemManager;
|
||||||
|
import nautilus.game.minekart.kart.Kart;
|
||||||
|
|
||||||
|
public class Flame extends KartItemEntity
|
||||||
|
{
|
||||||
|
public Flame(KartItemManager manager, Kart kart, Location loc)
|
||||||
|
{
|
||||||
|
super(manager, kart, loc, Material.FIRE, (byte)0);
|
||||||
|
|
||||||
|
SetRadius(1);
|
||||||
|
|
||||||
|
this.SetFired();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void CollideHandle(Kart kart)
|
||||||
|
{
|
||||||
|
if (!kart.IsInvulnerable(false))
|
||||||
|
{
|
||||||
|
int ticks = Math.min(100, kart.GetDriver().getFireTicks() + 20);
|
||||||
|
kart.GetDriver().setFireTicks(ticks);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean TickUpdate()
|
||||||
|
{
|
||||||
|
return System.currentTimeMillis() - this.GetFireTime() > 6000;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,53 @@
|
|||||||
|
package nautilus.game.minekart.item.world_items_default;
|
||||||
|
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.Sound;
|
||||||
|
|
||||||
|
import mineplex.core.common.util.F;
|
||||||
|
import mineplex.core.common.util.UtilAlg;
|
||||||
|
import mineplex.core.common.util.UtilEnt;
|
||||||
|
import mineplex.core.common.util.UtilPlayer;
|
||||||
|
import nautilus.game.minekart.item.KartItemEntity;
|
||||||
|
import nautilus.game.minekart.item.KartItemManager;
|
||||||
|
import nautilus.game.minekart.kart.Kart;
|
||||||
|
import nautilus.game.minekart.kart.crash.Crash_Spin;
|
||||||
|
|
||||||
|
public class Banana extends KartItemEntity
|
||||||
|
{
|
||||||
|
public Banana(KartItemManager manager, Kart kart, Location loc)
|
||||||
|
{
|
||||||
|
super(manager, kart, loc, Material.INK_SACK, (byte)11);
|
||||||
|
|
||||||
|
SetRadius(1.5);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void CollideHandle(Kart kart)
|
||||||
|
{
|
||||||
|
if (!kart.IsInvulnerable(true))
|
||||||
|
{
|
||||||
|
//Inform
|
||||||
|
if (kart.equals(GetOwner()))
|
||||||
|
{
|
||||||
|
UtilPlayer.message(kart.GetDriver(), F.main("MK", "You hit yourself with " + F.item("Banana") + "."));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
UtilPlayer.message(kart.GetDriver(), F.main("MK", F.elem(UtilEnt.getName(GetOwner().GetDriver())) + " hit you with " + F.item("Banana") + "."));
|
||||||
|
UtilPlayer.message(GetOwner().GetDriver(), F.main("MK", "You hit " + F.elem(UtilEnt.getName(kart.GetDriver())) + " with " + F.item("Banana") + "."));
|
||||||
|
}
|
||||||
|
|
||||||
|
//Crash
|
||||||
|
if (kart.GetVelocity().length() == 0)
|
||||||
|
kart.SetVelocity(kart.GetDriver().getLocation().getDirection().setY(0));
|
||||||
|
|
||||||
|
kart.SetVelocity(UtilAlg.Normalize(kart.GetVelocityClone().setY(0)).multiply(0.6));
|
||||||
|
new Crash_Spin(kart, 0.6f);
|
||||||
|
kart.SetStability(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Effect
|
||||||
|
GetEntity().getWorld().playSound(GetEntity().getLocation(), Sound.BAT_HURT, 1f, 1f);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,58 @@
|
|||||||
|
package nautilus.game.minekart.item.world_items_default;
|
||||||
|
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.Sound;
|
||||||
|
import org.bukkit.entity.EnderCrystal;
|
||||||
|
import org.bukkit.entity.Entity;
|
||||||
|
|
||||||
|
import mineplex.core.common.util.F;
|
||||||
|
import mineplex.core.common.util.UtilEnt;
|
||||||
|
import mineplex.core.common.util.UtilPlayer;
|
||||||
|
import nautilus.game.minekart.item.KartItemEntity;
|
||||||
|
import nautilus.game.minekart.item.KartItemManager;
|
||||||
|
import nautilus.game.minekart.kart.Kart;
|
||||||
|
import nautilus.game.minekart.kart.crash.Crash_Explode;
|
||||||
|
|
||||||
|
public class FakeItem extends KartItemEntity
|
||||||
|
{
|
||||||
|
public FakeItem(KartItemManager manager, Kart kart, Location loc)
|
||||||
|
{
|
||||||
|
super(manager, kart, loc, Material.TRAPPED_CHEST, (byte)0);
|
||||||
|
|
||||||
|
SetRadius(1.5);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void CollideHandle(Kart kart)
|
||||||
|
{
|
||||||
|
if (!kart.IsInvulnerable(true))
|
||||||
|
{
|
||||||
|
//Inform
|
||||||
|
if (kart.equals(GetOwner()))
|
||||||
|
{
|
||||||
|
UtilPlayer.message(kart.GetDriver(), F.main("MK", "You hit yourself with " + F.item("Fake Item") + "."));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
UtilPlayer.message(kart.GetDriver(), F.main("MK", F.elem(UtilEnt.getName(GetOwner().GetDriver())) + " hit you with " + F.item("Fake Item") + "."));
|
||||||
|
UtilPlayer.message(GetOwner().GetDriver(), F.main("MK", "You hit " + F.elem(UtilEnt.getName(kart.GetDriver())) + " with " + F.item("Fake Item") + "."));
|
||||||
|
}
|
||||||
|
|
||||||
|
//Crash
|
||||||
|
kart.CrashStop();
|
||||||
|
new Crash_Explode(kart, 1.2f, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Effect
|
||||||
|
GetEntity().getWorld().playSound(GetEntity().getLocation(), Sound.EXPLODE, 2f, 0.2f);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void Spawn(Location loc)
|
||||||
|
{
|
||||||
|
Entity ent = loc.getWorld().spawn(loc, EnderCrystal.class);
|
||||||
|
SetEntity(ent);
|
||||||
|
SetFired();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,81 @@
|
|||||||
|
package nautilus.game.minekart.item.world_items_default;
|
||||||
|
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.Sound;
|
||||||
|
import org.bukkit.entity.EntityType;
|
||||||
|
import org.bukkit.entity.Slime;
|
||||||
|
import org.bukkit.util.Vector;
|
||||||
|
|
||||||
|
import mineplex.core.common.util.F;
|
||||||
|
import mineplex.core.common.util.UtilAlg;
|
||||||
|
import mineplex.core.common.util.UtilEnt;
|
||||||
|
import mineplex.core.common.util.UtilPlayer;
|
||||||
|
import nautilus.game.minekart.item.KartItemEntity;
|
||||||
|
import nautilus.game.minekart.item.KartItemManager;
|
||||||
|
import nautilus.game.minekart.item.control.Collision;
|
||||||
|
import nautilus.game.minekart.item.control.Movement;
|
||||||
|
import nautilus.game.minekart.kart.Kart;
|
||||||
|
import nautilus.game.minekart.kart.crash.Crash_Explode;
|
||||||
|
|
||||||
|
public class GreenShell extends KartItemEntity
|
||||||
|
{
|
||||||
|
public GreenShell(KartItemManager manager, Kart kart, Location loc)
|
||||||
|
{
|
||||||
|
super(manager, kart, loc, Material.EMERALD_BLOCK, (byte)0);
|
||||||
|
|
||||||
|
Vector vel = UtilAlg.Normalize(kart.GetDriver().getLocation().getDirection().setY(0));
|
||||||
|
vel.multiply(1.4);
|
||||||
|
vel.setY(-0.5);
|
||||||
|
|
||||||
|
SetVelocity(vel);
|
||||||
|
|
||||||
|
SetRadius(1.5);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void CollideHandle(Kart kart)
|
||||||
|
{
|
||||||
|
if (!kart.IsInvulnerable(true))
|
||||||
|
{
|
||||||
|
//Inform
|
||||||
|
if (kart.equals(GetOwner()))
|
||||||
|
{
|
||||||
|
UtilPlayer.message(kart.GetDriver(), F.main("MK", "You hit yourself with " + F.item("Green Shell") + "."));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
UtilPlayer.message(kart.GetDriver(), F.main("MK", F.elem(UtilEnt.getName(GetOwner().GetDriver())) + " hit you with " + F.item("Green Shell") + "."));
|
||||||
|
UtilPlayer.message(GetOwner().GetDriver(), F.main("MK", "You hit " + F.elem(UtilEnt.getName(kart.GetDriver())) + " with " + F.item("Green Shell") + "."));
|
||||||
|
}
|
||||||
|
|
||||||
|
//Crash
|
||||||
|
new Crash_Explode(kart, 1f, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Effect
|
||||||
|
GetEntity().getWorld().playSound(GetEntity().getLocation(), Sound.EXPLODE, 2f, 1.5f);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void Spawn(Location loc)
|
||||||
|
{
|
||||||
|
Slime slime = (Slime) loc.getWorld().spawnEntity(loc.add(0, 0.5, 0), EntityType.SLIME);
|
||||||
|
slime.setSize(1);
|
||||||
|
SetEntity(slime);
|
||||||
|
SetFired();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean TickUpdate()
|
||||||
|
{
|
||||||
|
if (GetHost() != null)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
Movement.Move(this);
|
||||||
|
|
||||||
|
if (Collision.CollideBlock(this))
|
||||||
|
GetEntity().getWorld().playSound(GetEntity().getLocation(), Sound.CHICKEN_EGG_POP, 2f, 1f);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,84 @@
|
|||||||
|
package nautilus.game.minekart.item.world_items_default;
|
||||||
|
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.Sound;
|
||||||
|
import org.bukkit.entity.EntityType;
|
||||||
|
import org.bukkit.entity.Slime;
|
||||||
|
import org.bukkit.util.Vector;
|
||||||
|
|
||||||
|
import mineplex.core.common.util.F;
|
||||||
|
import mineplex.core.common.util.UtilAlg;
|
||||||
|
import mineplex.core.common.util.UtilEnt;
|
||||||
|
import mineplex.core.common.util.UtilPlayer;
|
||||||
|
import nautilus.game.minekart.item.KartItemEntity;
|
||||||
|
import nautilus.game.minekart.item.KartItemManager;
|
||||||
|
import nautilus.game.minekart.item.control.Collision;
|
||||||
|
import nautilus.game.minekart.item.control.Movement;
|
||||||
|
import nautilus.game.minekart.kart.Kart;
|
||||||
|
import nautilus.game.minekart.kart.crash.Crash_Explode;
|
||||||
|
|
||||||
|
public class RedShell extends KartItemEntity
|
||||||
|
{
|
||||||
|
public RedShell(KartItemManager manager, Kart kart, Location loc)
|
||||||
|
{
|
||||||
|
super(manager, kart, loc, Material.REDSTONE_BLOCK, (byte)0);
|
||||||
|
|
||||||
|
Vector vel = UtilAlg.Normalize(kart.GetDriver().getLocation().getDirection().setY(0));
|
||||||
|
vel.multiply(1.2);
|
||||||
|
vel.setY(-0.5);
|
||||||
|
|
||||||
|
SetVelocity(vel);
|
||||||
|
|
||||||
|
SetTarget(null);
|
||||||
|
|
||||||
|
SetRadius(1.5);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void CollideHandle(Kart kart)
|
||||||
|
{
|
||||||
|
if (!kart.IsInvulnerable(true))
|
||||||
|
{
|
||||||
|
//Inform
|
||||||
|
if (kart.equals(GetOwner()))
|
||||||
|
{
|
||||||
|
UtilPlayer.message(kart.GetDriver(), F.main("MK", "You hit yourself with " + F.item("Red Shell") + "."));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
UtilPlayer.message(kart.GetDriver(), F.main("MK", F.elem(UtilEnt.getName(GetOwner().GetDriver())) + " hit you with " + F.item("Red Shell") + "."));
|
||||||
|
UtilPlayer.message(GetOwner().GetDriver(), F.main("MK", "You hit " + F.elem(UtilEnt.getName(kart.GetDriver())) + " with " + F.item("Red Shell") + "."));
|
||||||
|
}
|
||||||
|
|
||||||
|
//Crash
|
||||||
|
new Crash_Explode(kart, 1f, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Effect
|
||||||
|
GetEntity().getWorld().playSound(GetEntity().getLocation(), Sound.EXPLODE, 2f, 1.5f);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void Spawn(Location loc)
|
||||||
|
{
|
||||||
|
Slime slime = (Slime) loc.getWorld().spawnEntity(loc.add(0, 0.5, 0), EntityType.MAGMA_CUBE);
|
||||||
|
slime.setSize(1);
|
||||||
|
SetEntity(slime);
|
||||||
|
SetFired();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean TickUpdate()
|
||||||
|
{
|
||||||
|
if (GetHost() != null)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (GetTarget() != null)
|
||||||
|
GetTarget().GetDriver().playSound(this.GetEntity().getLocation(), Sound.NOTE_BASS, 0.2f, 1f);
|
||||||
|
|
||||||
|
Movement.Home(this);
|
||||||
|
Movement.Move(this);
|
||||||
|
|
||||||
|
return Collision.CollideBlock(this);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,660 @@
|
|||||||
|
package nautilus.game.minekart.kart;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
import mineplex.core.common.util.F;
|
||||||
|
import mineplex.core.common.util.UtilMath;
|
||||||
|
import mineplex.core.common.util.UtilPlayer;
|
||||||
|
import mineplex.core.fakeEntity.FakeEntity;
|
||||||
|
import mineplex.core.fakeEntity.FakeEntityManager;
|
||||||
|
import mineplex.core.fakeEntity.FakeItemDrop;
|
||||||
|
import mineplex.core.fakeEntity.FakePlayer;
|
||||||
|
import mineplex.core.itemstack.ItemStackFactory;
|
||||||
|
import nautilus.game.minekart.gp.GP;
|
||||||
|
import nautilus.game.minekart.gp.GP.GPState;
|
||||||
|
import nautilus.game.minekart.gp.GPBattle;
|
||||||
|
import nautilus.game.minekart.item.KartItemActive;
|
||||||
|
import nautilus.game.minekart.item.KartItemType;
|
||||||
|
import nautilus.game.minekart.kart.condition.ConditionData;
|
||||||
|
import nautilus.game.minekart.kart.condition.ConditionType;
|
||||||
|
import nautilus.game.minekart.kart.crash.Crash;
|
||||||
|
import nautilus.game.minekart.track.Track.TrackState;
|
||||||
|
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
import org.bukkit.util.Vector;
|
||||||
|
|
||||||
|
public class Kart
|
||||||
|
{
|
||||||
|
public enum DriftDirection
|
||||||
|
{
|
||||||
|
Left,
|
||||||
|
Right,
|
||||||
|
None
|
||||||
|
}
|
||||||
|
|
||||||
|
private Player _driver = null;
|
||||||
|
private FakeEntity _entity = null;
|
||||||
|
private FakeItemDrop _fakeItem = null;
|
||||||
|
private FakePlayer _fakePlayer = null;
|
||||||
|
|
||||||
|
private GP _gp;
|
||||||
|
|
||||||
|
//Kart
|
||||||
|
private KartType _kartType;
|
||||||
|
private KartState _kartState = KartState.Drive;
|
||||||
|
private long _kartStateTime = System.currentTimeMillis();
|
||||||
|
private Vector _yaw;
|
||||||
|
|
||||||
|
//Drift Data
|
||||||
|
private DriftDirection _drift = DriftDirection.None;
|
||||||
|
private long _driftStart = 0;
|
||||||
|
|
||||||
|
//Crash Data
|
||||||
|
private Crash _crash;
|
||||||
|
|
||||||
|
//Items
|
||||||
|
private int _itemCycles = 0;
|
||||||
|
private KartItemActive _itemActive = null;
|
||||||
|
private KartItemType _itemStored = null;
|
||||||
|
|
||||||
|
//Conditions
|
||||||
|
private ArrayList<ConditionData> _conditions = new ArrayList<ConditionData>();
|
||||||
|
|
||||||
|
//Battle
|
||||||
|
private int _lives = 3;
|
||||||
|
|
||||||
|
//Lap
|
||||||
|
private int _lap = 0;
|
||||||
|
private int _lapNode = 0;
|
||||||
|
private double _lapScore = 0;
|
||||||
|
private int _lapMomentum = 10000;
|
||||||
|
|
||||||
|
private int _lapPlace = 0;
|
||||||
|
|
||||||
|
private int _lakituTick = 0;
|
||||||
|
|
||||||
|
//Music
|
||||||
|
private int _songStarTick = 0;
|
||||||
|
|
||||||
|
//Physics
|
||||||
|
private Vector _velocity = new Vector(0,0,0);
|
||||||
|
|
||||||
|
public Kart(Player player, KartType kartType, GP gp)
|
||||||
|
{
|
||||||
|
_gp = gp;
|
||||||
|
|
||||||
|
_driver = player;
|
||||||
|
_kartType = kartType;
|
||||||
|
_entity = new FakeEntity(kartType.GetType(), player.getLocation());
|
||||||
|
|
||||||
|
Equip();
|
||||||
|
}
|
||||||
|
|
||||||
|
public GP GetGP()
|
||||||
|
{
|
||||||
|
return _gp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public FakeEntity GetEntity()
|
||||||
|
{
|
||||||
|
return _entity;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Player GetDriver()
|
||||||
|
{
|
||||||
|
return _driver;
|
||||||
|
}
|
||||||
|
|
||||||
|
public KartType GetKartType()
|
||||||
|
{
|
||||||
|
return _kartType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetKartType(KartType type)
|
||||||
|
{
|
||||||
|
_kartType = type;
|
||||||
|
Equip();
|
||||||
|
}
|
||||||
|
|
||||||
|
public KartState GetKartState()
|
||||||
|
{
|
||||||
|
return _kartState;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long GetKartStateTime()
|
||||||
|
{
|
||||||
|
return _kartStateTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetKartState(KartState state)
|
||||||
|
{
|
||||||
|
_kartState = state;
|
||||||
|
_kartStateTime = System.currentTimeMillis();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Vector GetKartDirection()
|
||||||
|
{
|
||||||
|
return _velocity;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int GetLakituTick()
|
||||||
|
{
|
||||||
|
return _lakituTick;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetLakituTick(int tick)
|
||||||
|
{
|
||||||
|
_lakituTick += tick;
|
||||||
|
|
||||||
|
if (_lakituTick <= 0)
|
||||||
|
_lakituTick = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ArrayList<ConditionData> GetConditions()
|
||||||
|
{
|
||||||
|
return _conditions;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddCondition(ConditionData data)
|
||||||
|
{
|
||||||
|
_conditions.add(data);
|
||||||
|
|
||||||
|
if (data.IsCondition(ConditionType.Star))
|
||||||
|
SetStarSongTick(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean HasCondition(ConditionType type)
|
||||||
|
{
|
||||||
|
for (ConditionData data : _conditions)
|
||||||
|
{
|
||||||
|
if (data.IsCondition(type))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ExpireCondition(ConditionType type)
|
||||||
|
{
|
||||||
|
for (ConditionData data : GetConditions())
|
||||||
|
if (data.IsCondition(type))
|
||||||
|
data.Expire();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ExpireConditions()
|
||||||
|
{
|
||||||
|
for (ConditionData data : GetConditions())
|
||||||
|
data.Expire();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Equip()
|
||||||
|
{
|
||||||
|
_driver.getInventory().clear();
|
||||||
|
|
||||||
|
//Driving
|
||||||
|
GetDriver().getInventory().setItem(0, ItemStackFactory.Instance.CreateStack(Material.STONE_SWORD, (byte)0, 1, "§a§lAccelerate"));
|
||||||
|
GetDriver().getInventory().setItem(1, ItemStackFactory.Instance.CreateStack(Material.WOOD_SWORD, (byte)0, 1, "§a§lHand Brake"));
|
||||||
|
|
||||||
|
//Item Slot
|
||||||
|
GetDriver().getInventory().setItem(2, null);
|
||||||
|
GetDriver().getInventory().setItem(3, null);
|
||||||
|
GetDriver().getInventory().setItem(4, null);
|
||||||
|
|
||||||
|
//State
|
||||||
|
ItemStack a = ItemStackFactory.Instance.CreateStack(Material.WOOD_HOE, (byte)0, (int)(GetKartType().GetTopSpeed() * 100), "§e§lTop Speed");
|
||||||
|
ItemStack b = ItemStackFactory.Instance.CreateStack(Material.STONE_HOE, (byte)0, (int)GetKartType().GetAcceleration() - 10, "§e§lAcceleration");
|
||||||
|
ItemStack c = ItemStackFactory.Instance.CreateStack(Material.IRON_HOE, (byte)0, (int)GetKartType().GetHandling() - 10, "§e§lHandling");
|
||||||
|
ItemStack d = ItemStackFactory.Instance.CreateStack(GetKartType().GetAvatar(), (byte)0, 1, "§e§l" + GetKartType().GetName() + " Kart");
|
||||||
|
|
||||||
|
GetDriver().getInventory().setItem(5, d);
|
||||||
|
GetDriver().getInventory().setItem(6, a);
|
||||||
|
GetDriver().getInventory().setItem(7, b);
|
||||||
|
GetDriver().getInventory().setItem(8, c);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public Vector GetVelocity()
|
||||||
|
{
|
||||||
|
return _velocity;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Vector GetVelocityClone()
|
||||||
|
{
|
||||||
|
return new Vector(_velocity.getX(), _velocity.getY(), _velocity.getZ());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetVelocity(Vector vec)
|
||||||
|
{
|
||||||
|
_velocity = vec;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Vector GetYaw()
|
||||||
|
{
|
||||||
|
return _yaw;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void CrashStop()
|
||||||
|
{
|
||||||
|
_velocity = new Vector(0,0,0);
|
||||||
|
ExpireCondition(ConditionType.Boost);
|
||||||
|
|
||||||
|
if (GetKartState() == KartState.Drive)
|
||||||
|
LoseLife();
|
||||||
|
}
|
||||||
|
|
||||||
|
public double GetSpeed()
|
||||||
|
{
|
||||||
|
Vector vec = new Vector(_velocity.getX(), 0, _velocity.getZ());
|
||||||
|
return vec.length();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetDrift()
|
||||||
|
{
|
||||||
|
ClearDrift();
|
||||||
|
|
||||||
|
//Check Speed Requirement
|
||||||
|
if (GetSpeed() < 0.4)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Check Turn Requirement
|
||||||
|
Vector look = GetDriver().getLocation().getDirection();
|
||||||
|
look.setY(0);
|
||||||
|
look.normalize();
|
||||||
|
|
||||||
|
Vector vel = new Vector(GetVelocity().getX(), 0, GetVelocity().getZ());
|
||||||
|
vel.normalize();
|
||||||
|
|
||||||
|
look.subtract(vel);
|
||||||
|
|
||||||
|
if (look.length() < 0.2)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//Get Drift Direction
|
||||||
|
Vector kartVec = new Vector(_velocity.getX(), 0, _velocity.getZ());
|
||||||
|
kartVec.normalize();
|
||||||
|
|
||||||
|
Vector lookVec = GetDriver().getLocation().getDirection();
|
||||||
|
lookVec.setY(0);
|
||||||
|
lookVec.normalize();
|
||||||
|
|
||||||
|
Vector left = new Vector(kartVec.getZ(), 0, kartVec.getX() * -1);
|
||||||
|
Vector right = new Vector(kartVec.getZ() * -1, 0, kartVec.getX());
|
||||||
|
|
||||||
|
double distLeft = UtilMath.offset(left, lookVec);
|
||||||
|
double distRight = UtilMath.offset(right, lookVec);
|
||||||
|
|
||||||
|
if (distLeft < distRight) _drift = DriftDirection.Left;
|
||||||
|
else _drift = DriftDirection.Right;
|
||||||
|
|
||||||
|
_driftStart = System.currentTimeMillis();
|
||||||
|
}
|
||||||
|
|
||||||
|
public DriftDirection GetDrift()
|
||||||
|
{
|
||||||
|
return _drift;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Vector GetDriftVector()
|
||||||
|
{
|
||||||
|
if (_drift == DriftDirection.None)
|
||||||
|
return new Vector(0,0,0);
|
||||||
|
|
||||||
|
//Get Drift Direction
|
||||||
|
Vector kartVec = new Vector(_velocity.getX(), 0, _velocity.getZ());
|
||||||
|
kartVec.normalize();
|
||||||
|
|
||||||
|
Vector lookVec = GetDriver().getLocation().getDirection();
|
||||||
|
lookVec.setY(0);
|
||||||
|
lookVec.normalize();
|
||||||
|
|
||||||
|
if (_drift == DriftDirection.Left)
|
||||||
|
{
|
||||||
|
Vector drift = new Vector(kartVec.getZ(), 0, kartVec.getX() * -1);
|
||||||
|
return drift.subtract(kartVec);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Vector drift = new Vector(kartVec.getZ() * -1, 0, kartVec.getX());
|
||||||
|
return drift.subtract(kartVec);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public long GetDriftTime()
|
||||||
|
{
|
||||||
|
return System.currentTimeMillis() - _driftStart;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ClearDrift()
|
||||||
|
{
|
||||||
|
_driftStart = System.currentTimeMillis();
|
||||||
|
_drift = DriftDirection.None;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Crash GetCrash()
|
||||||
|
{
|
||||||
|
if (GetKartState() != KartState.Crash)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
return _crash;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetCrash(Crash crash)
|
||||||
|
{
|
||||||
|
_crash = crash;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void PickupItem()
|
||||||
|
{
|
||||||
|
if (GetItemStored() == null && GetItemCycles() == 0)
|
||||||
|
SetItemCycles(40);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetItemCycles(int cycles)
|
||||||
|
{
|
||||||
|
_itemCycles = cycles;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int GetItemCycles()
|
||||||
|
{
|
||||||
|
return _itemCycles;
|
||||||
|
}
|
||||||
|
|
||||||
|
public KartItemType GetItemStored()
|
||||||
|
{
|
||||||
|
return _itemStored;
|
||||||
|
}
|
||||||
|
|
||||||
|
public KartItemActive GetItemActive()
|
||||||
|
{
|
||||||
|
return _itemActive;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetItemStored(KartItemType item)
|
||||||
|
{
|
||||||
|
_itemStored = item;
|
||||||
|
|
||||||
|
if (item == null)
|
||||||
|
{
|
||||||
|
if (_fakeItem != null)
|
||||||
|
RemoveFakeKartItemInfo();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SetFakeKartItemInfo(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SetFakeKartItemInfo(KartItemType item)
|
||||||
|
{
|
||||||
|
boolean showPlayer = false;
|
||||||
|
boolean spawnItem = false;
|
||||||
|
|
||||||
|
if (_fakeItem == null)
|
||||||
|
{
|
||||||
|
_fakeItem = new FakeItemDrop(new ItemStack(item.GetMaterial()), GetDriver().getLocation());
|
||||||
|
spawnItem = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
_fakeItem.SetItemStack(new ItemStack(item.GetMaterial()));
|
||||||
|
|
||||||
|
if (_fakePlayer == null)
|
||||||
|
{
|
||||||
|
showPlayer = true;
|
||||||
|
_fakePlayer = new FakePlayer("Buffer", GetDriver().getLocation().subtract(0, 10, 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
//Set Item
|
||||||
|
GetDriver().getInventory().setItem(3, ItemStackFactory.Instance.CreateStack(item.GetMaterial(), (byte)0, item.GetAmount(), "§a§l"+item.GetName()));
|
||||||
|
|
||||||
|
for (Kart kart : GetGP().GetKarts())
|
||||||
|
{
|
||||||
|
if (kart == this)
|
||||||
|
{
|
||||||
|
if (spawnItem)
|
||||||
|
{
|
||||||
|
FakeEntityManager.Instance.SendPacketTo(_fakeItem.Spawn(), kart.GetDriver());
|
||||||
|
FakeEntityManager.Instance.SendPacketTo(_fakeItem.SetVehicle(kart.GetDriver().getEntityId()), kart.GetDriver());
|
||||||
|
}
|
||||||
|
|
||||||
|
FakeEntityManager.Instance.SendPacketTo(_fakeItem.Show(), kart.GetDriver());
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (showPlayer)
|
||||||
|
{
|
||||||
|
FakeEntityManager.Instance.SendPacketTo(_fakePlayer.Spawn(), kart.GetDriver());
|
||||||
|
FakeEntityManager.Instance.SendPacketTo(_fakePlayer.Hide(), kart.GetDriver());
|
||||||
|
FakeEntityManager.Instance.SendPacketTo(_fakePlayer.SetVehicle(GetDriver().getEntityId()), kart.GetDriver());
|
||||||
|
|
||||||
|
FakeEntityManager.Instance.FakePassenger(kart.GetDriver(), GetDriver().getEntityId(), _fakePlayer.SetVehicle(GetDriver().getEntityId()));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (spawnItem)
|
||||||
|
{
|
||||||
|
FakeEntityManager.Instance.SendPacketTo(_fakeItem.Spawn(), kart.GetDriver());
|
||||||
|
FakeEntityManager.Instance.SendPacketTo(_fakeItem.SetVehicle(_fakePlayer.GetEntityId()), kart.GetDriver());
|
||||||
|
|
||||||
|
FakeEntityManager.Instance.FakePassenger(kart.GetDriver(), _fakePlayer.GetEntityId(), _fakeItem.SetVehicle(_fakePlayer.GetEntityId()));
|
||||||
|
}
|
||||||
|
|
||||||
|
FakeEntityManager.Instance.SendPacketTo(_fakeItem.Show(), kart.GetDriver());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void RemoveFakeKartItemInfo()
|
||||||
|
{
|
||||||
|
GetDriver().getInventory().setItem(3, null);
|
||||||
|
|
||||||
|
for (Kart kart : GetGP().GetKarts())
|
||||||
|
{
|
||||||
|
if (_fakeItem != null)
|
||||||
|
{
|
||||||
|
FakeEntityManager.Instance.SendPacketTo(_fakeItem.Destroy(), kart.GetDriver());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (kart != this)
|
||||||
|
{
|
||||||
|
if (_fakeItem != null && _fakePlayer != null)
|
||||||
|
{
|
||||||
|
FakeEntityManager.Instance.RemoveFakePassenger(kart.GetDriver(), _fakePlayer.GetEntityId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_fakeItem = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetItemActive(KartItemActive item)
|
||||||
|
{
|
||||||
|
_itemActive = item;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetStability(int i)
|
||||||
|
{
|
||||||
|
GetDriver().setFoodLevel(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean CanControl()
|
||||||
|
{
|
||||||
|
if (GetGP() == null)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if (GetGP().GetState() != GPState.Live)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (GetGP().GetTrack().GetState() != TrackState.Live && GetGP().GetTrack().GetState() != TrackState.Ending)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (HasFinishedTrack())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int GetLives()
|
||||||
|
{
|
||||||
|
return _lives;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void LoseLife()
|
||||||
|
{
|
||||||
|
if (_lives < 1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (GetGP() == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!(GetGP() instanceof GPBattle))
|
||||||
|
return;
|
||||||
|
|
||||||
|
GPBattle battle = (GPBattle)GetGP();
|
||||||
|
_lives = _lives - 1;
|
||||||
|
|
||||||
|
if (_lives == 0)
|
||||||
|
{
|
||||||
|
battle.GetTrack().GetPositions().add(0, this);
|
||||||
|
battle.CheckBattleEnd();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public int GetLap()
|
||||||
|
{
|
||||||
|
return _lap;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetLap(int lap)
|
||||||
|
{
|
||||||
|
_lap = lap;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int GetLapNode()
|
||||||
|
{
|
||||||
|
return _lapNode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetLapNode(int lapNode)
|
||||||
|
{
|
||||||
|
if ((lapNode > _lapNode && !(_lapNode <= GetGP().GetTrack().GetProgress().size() / 5 && lapNode >= GetGP().GetTrack().GetProgress().size() * 4 / 5)) || (lapNode <= GetGP().GetTrack().GetProgress().size() / 5 && _lapNode >= GetGP().GetTrack().GetProgress().size() * 4 / 5))
|
||||||
|
SetLapMomentum(GetLapMomentum() + 1);
|
||||||
|
else if (lapNode < _lapNode || (_lapNode <= GetGP().GetTrack().GetProgress().size() / 5 && lapNode >= GetGP().GetTrack().GetProgress().size() * 4 / 5))
|
||||||
|
SetLapMomentum(GetLapMomentum() - 1);
|
||||||
|
|
||||||
|
_lapNode = lapNode;
|
||||||
|
|
||||||
|
//Next Lap
|
||||||
|
if (lapNode <= GetGP().GetTrack().GetProgress().size() / 5)
|
||||||
|
{
|
||||||
|
if (_lapMomentum > GetGP().GetTrack().GetProgress().size() / 4)
|
||||||
|
{
|
||||||
|
SetLap(GetLap() + 1);
|
||||||
|
SetLapMomentum(0);
|
||||||
|
|
||||||
|
GetDriver().getWorld().playSound(GetDriver().getLocation(), GetKartType().GetSoundMain(), 0.5f, 1f);
|
||||||
|
|
||||||
|
if (GetLap() > 3)
|
||||||
|
{
|
||||||
|
int place = GetLapPlace() + 1;
|
||||||
|
|
||||||
|
String placeString = "st";
|
||||||
|
if (place == 2) placeString = "nd";
|
||||||
|
else if (place == 3) placeString = "rd";
|
||||||
|
else if (place >= 4) placeString = "th";
|
||||||
|
|
||||||
|
GetGP().Announce(F.main("MK", F.name(GetDriver().getName()) + " finished in " + F.elem(place + placeString) + " place."));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
UtilPlayer.message(GetDriver(), F.main("MK", "Lap " + GetLap()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public double GetLapScore()
|
||||||
|
{
|
||||||
|
return _lapScore;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetLapScore(double lapScore)
|
||||||
|
{
|
||||||
|
_lapScore = lapScore + (1000000 * (_lap - (GetLapMomentum() < 0 ? 1 : 0)));
|
||||||
|
}
|
||||||
|
|
||||||
|
public int GetLapMomentum()
|
||||||
|
{
|
||||||
|
return _lapMomentum;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetLapMomentum(int lapMomentum)
|
||||||
|
{
|
||||||
|
_lapMomentum = lapMomentum;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int GetLapPlace()
|
||||||
|
{
|
||||||
|
return _lapPlace;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetLapPlace(int place)
|
||||||
|
{
|
||||||
|
//Roar with joy!
|
||||||
|
if (place < _lapPlace)
|
||||||
|
GetDriver().getWorld().playSound(GetDriver().getLocation(), GetKartType().GetSoundMain(), 0.5f, 1f);
|
||||||
|
|
||||||
|
_lapPlace = place;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean HasFinishedTrack()
|
||||||
|
{
|
||||||
|
return GetLap() > 3 || GetLives() <= 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ClearTrackData()
|
||||||
|
{
|
||||||
|
//Battle
|
||||||
|
_lives = 3;
|
||||||
|
|
||||||
|
//Lap
|
||||||
|
_lap = 0;
|
||||||
|
_lapNode = 0;
|
||||||
|
_lapScore = 0;
|
||||||
|
_lapMomentum = 10000;
|
||||||
|
|
||||||
|
_lapPlace = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int GetStarSongTick()
|
||||||
|
{
|
||||||
|
return _songStarTick;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetStarSongTick(int tick)
|
||||||
|
{
|
||||||
|
_songStarTick = tick;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetPlayerArmor()
|
||||||
|
{
|
||||||
|
GetDriver().getInventory().setHelmet(null);
|
||||||
|
GetDriver().getInventory().setChestplate(null);
|
||||||
|
GetDriver().getInventory().setLeggings(null);
|
||||||
|
GetDriver().getInventory().setBoots(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean IsInvulnerable(boolean useHeart)
|
||||||
|
{
|
||||||
|
if (useHeart && HasCondition(ConditionType.WolfHeart))
|
||||||
|
{
|
||||||
|
ExpireCondition(ConditionType.WolfHeart);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return HasCondition(ConditionType.Star) || HasCondition(ConditionType.Ghost);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,273 @@
|
|||||||
|
package nautilus.game.minekart.kart;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
|
|
||||||
|
import nautilus.game.minekart.gp.GP;
|
||||||
|
import nautilus.game.minekart.item.KartItemManager;
|
||||||
|
import nautilus.game.minekart.kart.Kart.DriftDirection;
|
||||||
|
import nautilus.game.minekart.kart.condition.Condition;
|
||||||
|
import nautilus.game.minekart.kart.condition.ConditionData;
|
||||||
|
import nautilus.game.minekart.kart.condition.ConditionType;
|
||||||
|
import nautilus.game.minekart.kart.control.*;
|
||||||
|
import nautilus.game.minekart.kart.crash.Crash;
|
||||||
|
import nautilus.game.minekart.track.Track.TrackState;
|
||||||
|
|
||||||
|
import net.minecraft.server.v1_7_R1.EntityPlayer;
|
||||||
|
import net.minecraft.server.v1_7_R1.MathHelper;
|
||||||
|
import net.minecraft.server.v1_7_R1.Packet;
|
||||||
|
import net.minecraft.server.v1_7_R1.Packet34EntityTeleport;
|
||||||
|
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.Sound;
|
||||||
|
|
||||||
|
import org.bukkit.craftbukkit.v1_7_R1.entity.CraftPlayer;
|
||||||
|
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.EventPriority;
|
||||||
|
import org.bukkit.event.entity.EntityDamageEvent;
|
||||||
|
import org.bukkit.event.entity.EntityRegainHealthEvent;
|
||||||
|
import org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason;
|
||||||
|
import org.bukkit.event.player.PlayerToggleSneakEvent;
|
||||||
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
|
|
||||||
|
import mineplex.core.MiniPlugin;
|
||||||
|
import mineplex.core.recharge.Recharge;
|
||||||
|
import mineplex.core.updater.event.UpdateEvent;
|
||||||
|
import mineplex.core.updater.UpdateType;
|
||||||
|
import mineplex.core.common.util.UtilInv;
|
||||||
|
import mineplex.core.common.util.UtilPlayer;
|
||||||
|
import mineplex.core.common.util.UtilTime;
|
||||||
|
|
||||||
|
public class KartManager extends MiniPlugin
|
||||||
|
{
|
||||||
|
private Recharge _recharge;
|
||||||
|
|
||||||
|
public KartItemManager ItemManager;
|
||||||
|
|
||||||
|
private HashMap<Player, Kart> _karts = new HashMap<Player, Kart>();
|
||||||
|
|
||||||
|
public KartManager(JavaPlugin plugin, Recharge recharge)
|
||||||
|
{
|
||||||
|
super("Kart Manager", plugin);
|
||||||
|
|
||||||
|
_recharge = recharge;
|
||||||
|
ItemManager = new KartItemManager(plugin, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void KartUpdate(UpdateEvent event)
|
||||||
|
{
|
||||||
|
if (event.getType() == UpdateType.FASTER)
|
||||||
|
{
|
||||||
|
for (Kart kart : GetKarts().values())
|
||||||
|
{
|
||||||
|
Condition.WolfHeart(kart);
|
||||||
|
Condition.SuperMushroom(kart);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (event.getType() == UpdateType.FAST)
|
||||||
|
{
|
||||||
|
for (Kart kart : GetKarts().values())
|
||||||
|
{
|
||||||
|
Location location = kart.GetDriver().getLocation();
|
||||||
|
Packet teleportPacket = new Packet34EntityTeleport(
|
||||||
|
kart.GetDriver().getEntityId(),
|
||||||
|
MathHelper.floor(location.getX() * 32.0D),
|
||||||
|
MathHelper.floor(location.getY() * 32.0D),
|
||||||
|
MathHelper.floor(location.getZ() * 32.0D),
|
||||||
|
(byte) ((int) (MathHelper.d(location.getYaw() * 256.0F / 360.0F))),
|
||||||
|
(byte) ((int) (MathHelper.d(location.getPitch() * 256.0F / 360.0F))));
|
||||||
|
|
||||||
|
for (Kart otherPlayer : kart.GetGP().GetKarts())
|
||||||
|
{
|
||||||
|
if (kart.GetGP().GetTrack().GetState() != TrackState.Live)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (otherPlayer.GetDriver() == kart.GetDriver())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
EntityPlayer entityPlayer = ((CraftPlayer) otherPlayer
|
||||||
|
.GetDriver()).getHandle();
|
||||||
|
|
||||||
|
entityPlayer.playerConnection.sendPacket(teleportPacket);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (event.getType() == UpdateType.TICK)
|
||||||
|
{
|
||||||
|
for (Kart kart : GetKarts().values())
|
||||||
|
{
|
||||||
|
// Physics
|
||||||
|
World.Gravity(kart);
|
||||||
|
|
||||||
|
// Drag
|
||||||
|
World.AirDrag(kart);
|
||||||
|
World.FireDrag(kart);
|
||||||
|
World.RoadDrag(kart);
|
||||||
|
World.BlockDrag(kart);
|
||||||
|
|
||||||
|
// Conditions
|
||||||
|
Condition.Boost(kart);
|
||||||
|
Condition.LightningSlow(kart);
|
||||||
|
Condition.StarEffect(kart);
|
||||||
|
Condition.StarCollide(kart);
|
||||||
|
Condition.BlazeFire(kart);
|
||||||
|
|
||||||
|
// Collision
|
||||||
|
Collision.CollideBlock(kart);
|
||||||
|
Collision.CollidePlayer(kart);
|
||||||
|
|
||||||
|
// Movement
|
||||||
|
if (kart.GetKartState() == KartState.Drive)
|
||||||
|
{
|
||||||
|
// Start/Stop
|
||||||
|
Drive.Accelerate(kart);
|
||||||
|
Drive.Brake(kart);
|
||||||
|
|
||||||
|
// Turn
|
||||||
|
if (kart.GetDrift() == DriftDirection.None)
|
||||||
|
Drive.Turn(kart);
|
||||||
|
else
|
||||||
|
DriveDrift.Drift(kart);
|
||||||
|
|
||||||
|
// Speed Limit
|
||||||
|
Drive.TopSpeed(kart);
|
||||||
|
|
||||||
|
// Move Player
|
||||||
|
Drive.Move(kart);
|
||||||
|
|
||||||
|
kart.GetDriver()
|
||||||
|
.getWorld()
|
||||||
|
.playSound(kart.GetDriver().getLocation(),
|
||||||
|
Sound.PIG_IDLE, .15f - (float)kart.GetSpeed() / 10,
|
||||||
|
.5f + (float)kart.GetSpeed());
|
||||||
|
}
|
||||||
|
if (kart.GetKartState() == KartState.Crash)
|
||||||
|
{
|
||||||
|
Crash crash = kart.GetCrash();
|
||||||
|
|
||||||
|
if (crash == null
|
||||||
|
|| (crash.CrashEnd() && KartUtil.IsGrounded(kart)))
|
||||||
|
{
|
||||||
|
// State Return
|
||||||
|
kart.SetKartState(KartState.Drive);
|
||||||
|
|
||||||
|
// Restore Stability
|
||||||
|
if (crash == null || crash.StabilityRestore())
|
||||||
|
kart.GetDriver().setFoodLevel(20);
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
crash.Move(kart);
|
||||||
|
}
|
||||||
|
if (kart.GetKartState() == KartState.Lakitu)
|
||||||
|
{
|
||||||
|
if (UtilTime.elapsed(kart.GetKartStateTime(), 8000))
|
||||||
|
{
|
||||||
|
kart.SetKartState(KartState.Drive);
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
kart.GetDriver().playSound(
|
||||||
|
kart.GetDriver().getLocation(),
|
||||||
|
Sound.NOTE_BASS, 0.3f, 0.1f);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Move Player
|
||||||
|
Drive.Move(kart);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void ConditionExpire(UpdateEvent event)
|
||||||
|
{
|
||||||
|
if (event.getType() != UpdateType.TICK)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (Kart kart : GetKarts().values())
|
||||||
|
{
|
||||||
|
HashSet<ConditionData> remove = new HashSet<ConditionData>();
|
||||||
|
|
||||||
|
for (ConditionData data : kart.GetConditions())
|
||||||
|
{
|
||||||
|
if (data.IsExpired())
|
||||||
|
remove.add(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (ConditionData data : remove)
|
||||||
|
{
|
||||||
|
kart.GetConditions().remove(data);
|
||||||
|
|
||||||
|
if (data.IsCondition(ConditionType.Star)
|
||||||
|
|| data.IsCondition(ConditionType.Ghost))
|
||||||
|
{
|
||||||
|
kart.SetPlayerArmor();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data.IsCondition(ConditionType.SuperMushroom))
|
||||||
|
{
|
||||||
|
kart.SetItemStored(null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void StabilityRecover(UpdateEvent event)
|
||||||
|
{
|
||||||
|
if (event.getType() != UpdateType.SEC)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (Kart kart : GetKarts().values())
|
||||||
|
UtilPlayer.hunger(kart.GetDriver(), 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void DriftHop(PlayerToggleSneakEvent event)
|
||||||
|
{
|
||||||
|
if (_recharge.use(event.getPlayer(), "Drift Hop", 250, false))
|
||||||
|
DriveDrift.Hop(GetKart(event.getPlayer()), event);
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.LOWEST)
|
||||||
|
public void Damage(EntityDamageEvent event)
|
||||||
|
{
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.LOWEST)
|
||||||
|
public void Damage(EntityRegainHealthEvent event)
|
||||||
|
{
|
||||||
|
if (event.getRegainReason() != RegainReason.CUSTOM)
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public HashMap<Player, Kart> GetKarts()
|
||||||
|
{
|
||||||
|
return _karts;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Kart GetKart(Player player)
|
||||||
|
{
|
||||||
|
return _karts.get(player);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddKart(Player player, KartType type, GP gp)
|
||||||
|
{
|
||||||
|
RemoveKart(player);
|
||||||
|
|
||||||
|
_karts.put(player, new Kart(player, type, gp));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RemoveKart(Player player)
|
||||||
|
{
|
||||||
|
_karts.remove(player);
|
||||||
|
UtilInv.Clear(player);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,14 @@
|
|||||||
|
package nautilus.game.minekart.kart;
|
||||||
|
|
||||||
|
|
||||||
|
public enum KartState
|
||||||
|
{
|
||||||
|
Drive(),
|
||||||
|
Lakitu(),
|
||||||
|
Crash(),
|
||||||
|
|
||||||
|
KartState()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,176 @@
|
|||||||
|
package nautilus.game.minekart.kart;
|
||||||
|
|
||||||
|
import mineplex.core.common.util.NautHashMap;
|
||||||
|
import nautilus.game.minekart.item.KartItemType;
|
||||||
|
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.Sound;
|
||||||
|
import org.bukkit.entity.EntityType;
|
||||||
|
|
||||||
|
public enum KartType
|
||||||
|
{
|
||||||
|
//Light
|
||||||
|
Pig("Pig", EntityType.PIG, Material.GRILLED_PORK, Material.GRILLED_PORK,
|
||||||
|
0.9, 6, 5, 3,
|
||||||
|
Sound.PIG_IDLE, Sound.PIG_DEATH, Sound.PIG_WALK,
|
||||||
|
KartItemType.Pig),
|
||||||
|
|
||||||
|
Chicken("Chicken", EntityType.CHICKEN, Material.FEATHER, Material.POTATO_ITEM,
|
||||||
|
0.85, 8, 6, 1,
|
||||||
|
Sound.CHICKEN_IDLE, Sound.CHICKEN_HURT, Sound.CHICKEN_WALK,
|
||||||
|
KartItemType.Chicken),
|
||||||
|
|
||||||
|
Wolf("Wolf", EntityType.WOLF, Material.SUGAR, Material.BAKED_POTATO,
|
||||||
|
1.00, 5, 3, 2,
|
||||||
|
Sound.WOLF_BARK, Sound.WOLF_HURT, Sound.WOLF_WALK,
|
||||||
|
KartItemType.Wolf),
|
||||||
|
|
||||||
|
//Med
|
||||||
|
Sheep("Sheep", EntityType.SHEEP, Material.WHEAT, Material.WHEAT,
|
||||||
|
0.95, 4, 6, 5,
|
||||||
|
Sound.SHEEP_IDLE, Sound.SHEEP_SHEAR, Sound.SHEEP_WALK,
|
||||||
|
KartItemType.Sheep),
|
||||||
|
|
||||||
|
Enderman("Enderman", EntityType.ENDERMAN, Material.FIREBALL, Material.ROTTEN_FLESH,
|
||||||
|
0.90, 6, 5, 4,
|
||||||
|
Sound.ENDERMAN_IDLE, Sound.ENDERMAN_SCREAM, Sound.ENDERMAN_TELEPORT,
|
||||||
|
KartItemType.Enderman),
|
||||||
|
|
||||||
|
Spider("Spider", EntityType.SPIDER, Material.STRING, Material.SPIDER_EYE,
|
||||||
|
0.80, 7, 8, 4,
|
||||||
|
Sound.SPIDER_IDLE, Sound.SPIDER_DEATH, Sound.SPIDER_WALK,
|
||||||
|
KartItemType.Spider),
|
||||||
|
|
||||||
|
//Heavy
|
||||||
|
Cow("Cow", EntityType.COW, Material.MILK_BUCKET, Material.MILK_BUCKET,
|
||||||
|
1.0, 3, 5, 7,
|
||||||
|
Sound.COW_IDLE, Sound.COW_HURT, Sound.COW_WALK,
|
||||||
|
KartItemType.Cow),
|
||||||
|
|
||||||
|
Blaze("Blaze", EntityType.BLAZE, Material.BLAZE_ROD, Material.COOKED_BEEF,
|
||||||
|
1.0, 7, 1, 6,
|
||||||
|
Sound.BLAZE_BREATH, Sound.BLAZE_BREATH, Sound.BLAZE_BREATH,
|
||||||
|
KartItemType.Blaze),
|
||||||
|
|
||||||
|
Golem("Golem", EntityType.IRON_GOLEM, Material.IRON_INGOT, Material.NETHER_BRICK_ITEM,
|
||||||
|
1.05, 1, 7, 8,
|
||||||
|
Sound.IRONGOLEM_THROW, Sound.IRONGOLEM_HIT, Sound.IRONGOLEM_WALK,
|
||||||
|
KartItemType.Golem);
|
||||||
|
|
||||||
|
private static NautHashMap<EntityType, KartType> _kartTypes;
|
||||||
|
|
||||||
|
private String _name;
|
||||||
|
private EntityType _type;
|
||||||
|
private Material _kartAvatar;
|
||||||
|
private Material _grayAvatar;
|
||||||
|
|
||||||
|
private double _topSpeed;
|
||||||
|
private double _acceleration;
|
||||||
|
private double _handling;
|
||||||
|
private double _stability;
|
||||||
|
|
||||||
|
private Sound _soundUse;
|
||||||
|
private Sound _soundCrash;
|
||||||
|
private Sound _soundEngine;
|
||||||
|
|
||||||
|
private KartItemType _kartItem;
|
||||||
|
|
||||||
|
KartType(String name, EntityType type, Material kartAvatar, Material grayAvatar, double topSpeed, double acceleration, double handling, double stability, Sound use, Sound crash, Sound engine, KartItemType item)
|
||||||
|
{
|
||||||
|
_name = name;
|
||||||
|
_type = type;
|
||||||
|
_kartAvatar = kartAvatar;
|
||||||
|
_grayAvatar = grayAvatar;
|
||||||
|
|
||||||
|
_topSpeed = topSpeed;
|
||||||
|
_acceleration = acceleration;
|
||||||
|
_handling = handling;
|
||||||
|
_stability = stability;
|
||||||
|
|
||||||
|
_soundUse = use;
|
||||||
|
_soundCrash = crash;
|
||||||
|
_soundEngine = engine;
|
||||||
|
|
||||||
|
_kartItem = item;
|
||||||
|
|
||||||
|
GetMap().put(type, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static NautHashMap<EntityType, KartType> GetMap()
|
||||||
|
{
|
||||||
|
if (_kartTypes == null)
|
||||||
|
_kartTypes = new NautHashMap<EntityType, KartType>();
|
||||||
|
|
||||||
|
return _kartTypes;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static KartType GetByEntityType(EntityType entityType)
|
||||||
|
{
|
||||||
|
return _kartTypes.get(entityType);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String GetName()
|
||||||
|
{
|
||||||
|
return _name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public EntityType GetType()
|
||||||
|
{
|
||||||
|
return _type;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double GetTopSpeed()
|
||||||
|
{
|
||||||
|
return _topSpeed;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double GetAcceleration()
|
||||||
|
{
|
||||||
|
return 10 + _acceleration;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double GetHandling()
|
||||||
|
{
|
||||||
|
return 10 + _handling;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double GetStability()
|
||||||
|
{
|
||||||
|
return 10 + _stability;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Sound GetSoundMain()
|
||||||
|
{
|
||||||
|
return _soundUse;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Sound GetSoundCrash()
|
||||||
|
{
|
||||||
|
return _soundCrash;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Sound GetSoundEngine()
|
||||||
|
{
|
||||||
|
return _soundEngine;
|
||||||
|
}
|
||||||
|
|
||||||
|
public KartItemType GetKartItem()
|
||||||
|
{
|
||||||
|
return _kartItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String[] GetDescription()
|
||||||
|
{
|
||||||
|
return new String[] {};
|
||||||
|
}
|
||||||
|
|
||||||
|
public Material GetAvatar()
|
||||||
|
{
|
||||||
|
return _kartAvatar;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Material GetAvatarGray()
|
||||||
|
{
|
||||||
|
return _grayAvatar;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,67 @@
|
|||||||
|
package nautilus.game.minekart.kart;
|
||||||
|
|
||||||
|
import mineplex.core.common.util.UtilAlg;
|
||||||
|
import mineplex.core.common.util.UtilEnt;
|
||||||
|
import mineplex.core.common.util.UtilPlayer;
|
||||||
|
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.util.Vector;
|
||||||
|
|
||||||
|
public class KartUtil
|
||||||
|
{
|
||||||
|
public static boolean IsGrounded(Kart kart)
|
||||||
|
{
|
||||||
|
if (UtilEnt.isGrounded(kart.GetDriver()))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
//Standing on Air
|
||||||
|
int ground = kart.GetDriver().getLocation().subtract(0, 0.1, 0).getBlock().getTypeId() ;
|
||||||
|
if (ground == 0 ||
|
||||||
|
ground == 8 ||
|
||||||
|
ground == 9 ||
|
||||||
|
ground == 10 ||
|
||||||
|
ground == 11)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return kart.GetDriver().getLocation().getY() % 0.5 == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean Stability(Kart kart, int amount)
|
||||||
|
{
|
||||||
|
UtilPlayer.hunger(kart.GetDriver(), -amount);
|
||||||
|
|
||||||
|
return (kart.GetDriver().getFoodLevel() <= 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Location GetBehind(Kart kart)
|
||||||
|
{
|
||||||
|
Location loc = kart.GetDriver().getLocation();
|
||||||
|
loc.subtract(UtilAlg.Normalize(kart.GetVelocityClone().setY(0)));
|
||||||
|
|
||||||
|
return loc;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Location GetInfront(Kart kart)
|
||||||
|
{
|
||||||
|
Location loc = kart.GetDriver().getLocation();
|
||||||
|
loc.add(UtilAlg.Normalize(kart.GetVelocityClone().setY(0)));
|
||||||
|
|
||||||
|
return loc;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Location GetLook(Kart kart)
|
||||||
|
{
|
||||||
|
Location loc = kart.GetDriver().getLocation();
|
||||||
|
loc.add(UtilAlg.Normalize(kart.GetDriver().getLocation().getDirection().setY(0)));
|
||||||
|
|
||||||
|
return loc;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Vector GetSide(Kart kart)
|
||||||
|
{
|
||||||
|
Vector look = kart.GetDriver().getLocation().getDirection();
|
||||||
|
return new Vector(look.getZ() * -1, 0, look.getX());
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,293 @@
|
|||||||
|
package nautilus.game.minekart.kart.condition;
|
||||||
|
|
||||||
|
import org.bukkit.Color;
|
||||||
|
import org.bukkit.Effect;
|
||||||
|
import org.bukkit.EntityEffect;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.Note;
|
||||||
|
import org.bukkit.Sound;
|
||||||
|
import org.bukkit.Note.Tone;
|
||||||
|
import org.bukkit.entity.Entity;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
import org.bukkit.inventory.meta.LeatherArmorMeta;
|
||||||
|
import org.bukkit.util.Vector;
|
||||||
|
|
||||||
|
import mineplex.core.common.util.F;
|
||||||
|
import mineplex.core.common.util.UtilAlg;
|
||||||
|
import mineplex.core.common.util.UtilEnt;
|
||||||
|
import mineplex.core.common.util.UtilMath;
|
||||||
|
import mineplex.core.common.util.UtilPlayer;
|
||||||
|
import mineplex.core.common.util.UtilSound;
|
||||||
|
import nautilus.game.minekart.item.KartItemType;
|
||||||
|
import nautilus.game.minekart.item.world_items_custom.Flame;
|
||||||
|
import nautilus.game.minekart.kart.Kart;
|
||||||
|
import nautilus.game.minekart.kart.KartState;
|
||||||
|
import nautilus.game.minekart.kart.KartUtil;
|
||||||
|
import nautilus.game.minekart.kart.crash.Crash_Knockback;
|
||||||
|
|
||||||
|
public class Condition
|
||||||
|
{
|
||||||
|
public static Tone[] starSong = new Tone[]
|
||||||
|
{
|
||||||
|
Tone.C,
|
||||||
|
null,
|
||||||
|
Tone.C,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
Tone.C,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
Tone.C,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
Tone.C,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
Tone.C,
|
||||||
|
null,
|
||||||
|
Tone.C,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
Tone.C,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
Tone.B,
|
||||||
|
null,
|
||||||
|
Tone.B,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
Tone.B,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
Tone.B,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
Tone.B,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
Tone.B,
|
||||||
|
null,
|
||||||
|
Tone.B,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
Tone.B,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
};
|
||||||
|
|
||||||
|
public static void Boost(Kart kart)
|
||||||
|
{
|
||||||
|
if (!kart.HasCondition(ConditionType.Boost))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!kart.CanControl())
|
||||||
|
return;
|
||||||
|
|
||||||
|
//Initial Velocity (if not moving)
|
||||||
|
if (kart.GetVelocity().length() <= 0)
|
||||||
|
kart.SetVelocity(kart.GetDriver().getLocation().getDirection().setY(0));
|
||||||
|
|
||||||
|
UtilAlg.Normalize(kart.GetVelocity());
|
||||||
|
kart.GetVelocity().multiply(1.2);
|
||||||
|
kart.GetDriver().getWorld().playSound(kart.GetDriver().getLocation(), Sound.FIZZ, 0.2f, 0.5f);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void LightningSlow(Kart kart)
|
||||||
|
{
|
||||||
|
if (!kart.HasCondition(ConditionType.Lightning))
|
||||||
|
return;
|
||||||
|
|
||||||
|
//Effect
|
||||||
|
Entity ent = kart.GetDriver();
|
||||||
|
|
||||||
|
ent.getWorld().playEffect(ent.getLocation(), Effect.SMOKE, 1);
|
||||||
|
ent.getWorld().playEffect(ent.getLocation(), Effect.SMOKE, 3);
|
||||||
|
ent.getWorld().playEffect(ent.getLocation(), Effect.SMOKE, 5);
|
||||||
|
ent.getWorld().playEffect(ent.getLocation(), Effect.SMOKE, 7);
|
||||||
|
|
||||||
|
|
||||||
|
//Current Velocity
|
||||||
|
Vector vel = kart.GetVelocity();
|
||||||
|
if (kart.GetCrash() != null)
|
||||||
|
vel = kart.GetCrash().GetVelocity();
|
||||||
|
|
||||||
|
if (vel.length() <= 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
//Drag Horizontal
|
||||||
|
if (KartUtil.IsGrounded(kart))
|
||||||
|
{
|
||||||
|
double drag = 0.008;
|
||||||
|
|
||||||
|
//Variable Drag
|
||||||
|
vel.multiply(1 - drag);
|
||||||
|
|
||||||
|
//Constant Drag
|
||||||
|
Vector dragVec = new Vector(vel.getX(), 0, vel.getZ());
|
||||||
|
UtilAlg.Normalize(dragVec);
|
||||||
|
dragVec.multiply(0.0016);
|
||||||
|
vel.subtract(dragVec);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void StarEffect(Kart kart)
|
||||||
|
{
|
||||||
|
if (!kart.HasCondition(ConditionType.Star))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!kart.GetDriver().isOnline())
|
||||||
|
return;
|
||||||
|
|
||||||
|
//Song
|
||||||
|
if (starSong[kart.GetStarSongTick() % starSong.length] != null)
|
||||||
|
{
|
||||||
|
kart.GetDriver().getWorld().playSound(kart.GetDriver().getLocation(), Sound.NOTE_PIANO, 1f,
|
||||||
|
UtilSound.GetPitch(new Note(1, starSong[kart.GetStarSongTick() % starSong.length], false)));
|
||||||
|
}
|
||||||
|
|
||||||
|
//Effect
|
||||||
|
if (kart.GetStarSongTick() % 3 == 0)
|
||||||
|
{
|
||||||
|
Color color = Color.RED;
|
||||||
|
|
||||||
|
if (kart.GetStarSongTick() % 12 == 0) color = Color.BLUE;
|
||||||
|
else if (kart.GetStarSongTick() % 9 == 0) color = Color.GREEN;
|
||||||
|
else if (kart.GetStarSongTick() % 6 == 0) color = Color.YELLOW;
|
||||||
|
|
||||||
|
LeatherArmorMeta meta;
|
||||||
|
|
||||||
|
ItemStack head = new ItemStack(Material.LEATHER_HELMET);
|
||||||
|
meta = (LeatherArmorMeta)head.getItemMeta();
|
||||||
|
meta.setColor(color);
|
||||||
|
head.setItemMeta(meta);
|
||||||
|
|
||||||
|
ItemStack chest = new ItemStack(Material.LEATHER_CHESTPLATE);
|
||||||
|
meta = (LeatherArmorMeta)chest.getItemMeta();
|
||||||
|
meta.setColor(color);
|
||||||
|
chest.setItemMeta(meta);
|
||||||
|
|
||||||
|
ItemStack legs = new ItemStack(Material.LEATHER_LEGGINGS);
|
||||||
|
meta = (LeatherArmorMeta)legs.getItemMeta();
|
||||||
|
meta.setColor(color);
|
||||||
|
legs.setItemMeta(meta);
|
||||||
|
|
||||||
|
ItemStack boots = new ItemStack(Material.LEATHER_BOOTS);
|
||||||
|
meta = (LeatherArmorMeta)boots.getItemMeta();
|
||||||
|
meta.setColor(color);
|
||||||
|
boots.setItemMeta(meta);
|
||||||
|
|
||||||
|
kart.GetDriver().getInventory().setHelmet(head);
|
||||||
|
kart.GetDriver().getInventory().setChestplate(chest);
|
||||||
|
kart.GetDriver().getInventory().setLeggings(legs);
|
||||||
|
kart.GetDriver().getInventory().setBoots(boots);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Tick
|
||||||
|
kart.SetStarSongTick(kart.GetStarSongTick() + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void StarCollide(Kart kart)
|
||||||
|
{
|
||||||
|
if (!kart.HasCondition(ConditionType.Star))
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (Kart other : kart.GetGP().GetKarts())
|
||||||
|
{
|
||||||
|
if (other.equals(kart))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (other.HasCondition(ConditionType.Ghost) || other.HasCondition(ConditionType.Star))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (other.GetKartState() != KartState.Drive)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (!kart.GetDriver().getWorld().equals(other.GetDriver().getWorld()))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (UtilMath.offset(kart.GetDriver(), other.GetDriver()) > 1)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
//Effects
|
||||||
|
kart.GetDriver().getWorld().playSound(kart.GetDriver().getLocation(), Sound.EXPLODE, (float)0.5f, 0.5f);
|
||||||
|
|
||||||
|
//Inform
|
||||||
|
UtilPlayer.message(other.GetDriver(), F.main("MK", F.elem(UtilEnt.getName(kart.GetDriver())) + " rammed you with " + F.item("Star") + "."));
|
||||||
|
UtilPlayer.message(kart.GetDriver(), F.main("MK", "You rammed " + F.elem(UtilEnt.getName(other.GetDriver())) + " with " + F.item("Star") + "."));
|
||||||
|
|
||||||
|
//Hit Kart
|
||||||
|
new Crash_Knockback(other, kart.GetDriver().getLocation(), 1.5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void SuperMushroom(Kart kart)
|
||||||
|
{
|
||||||
|
if (!kart.HasCondition(ConditionType.SuperMushroom))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (kart.GetItemStored() != KartItemType.SuperMushroom)
|
||||||
|
return;
|
||||||
|
|
||||||
|
ItemStack item = kart.GetDriver().getInventory().getItem(3);
|
||||||
|
|
||||||
|
if (item == null)
|
||||||
|
{
|
||||||
|
kart.SetItemStored(KartItemType.SuperMushroom);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
kart.SetItemStored(null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void WolfHeart(Kart kart)
|
||||||
|
{
|
||||||
|
if (!kart.HasCondition(ConditionType.WolfHeart))
|
||||||
|
return;
|
||||||
|
|
||||||
|
kart.GetDriver().playEffect(EntityEffect.WOLF_HEARTS);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void BlazeFire(Kart kart)
|
||||||
|
{
|
||||||
|
if (!kart.HasCondition(ConditionType.BlazeFire))
|
||||||
|
return;
|
||||||
|
|
||||||
|
//Speed Boost
|
||||||
|
Vector vel = kart.GetDriver().getLocation().getDirection();
|
||||||
|
vel.setY(0);
|
||||||
|
vel.normalize();
|
||||||
|
kart.GetVelocity().setX(vel.getX());
|
||||||
|
kart.GetVelocity().setZ(vel.getZ());
|
||||||
|
|
||||||
|
if (kart.GetVelocity().length() <= 0)
|
||||||
|
kart.SetVelocity(kart.GetDriver().getLocation().getDirection().setY(0));
|
||||||
|
|
||||||
|
UtilAlg.Normalize(kart.GetVelocity());
|
||||||
|
kart.GetVelocity().multiply(1.1);
|
||||||
|
|
||||||
|
//Drop Fire
|
||||||
|
new Flame(kart.GetGP().Manager.KartManager.ItemManager, kart, KartUtil.GetBehind(kart));
|
||||||
|
kart.GetDriver().getWorld().playSound(kart.GetDriver().getLocation(), Sound.FIRE, 2f, 2f);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,30 @@
|
|||||||
|
package nautilus.game.minekart.kart.condition;
|
||||||
|
|
||||||
|
public class ConditionData
|
||||||
|
{
|
||||||
|
private ConditionType _type;
|
||||||
|
private long _start;
|
||||||
|
private long _duration;
|
||||||
|
|
||||||
|
public ConditionData(ConditionType type, long duration)
|
||||||
|
{
|
||||||
|
_type = type;
|
||||||
|
_start = System.currentTimeMillis();
|
||||||
|
_duration = duration;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean IsExpired()
|
||||||
|
{
|
||||||
|
return System.currentTimeMillis() > _start + _duration;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean IsCondition(ConditionType type)
|
||||||
|
{
|
||||||
|
return _type == type;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Expire()
|
||||||
|
{
|
||||||
|
_start = 0;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,14 @@
|
|||||||
|
package nautilus.game.minekart.kart.condition;
|
||||||
|
|
||||||
|
public enum ConditionType
|
||||||
|
{
|
||||||
|
Ghost,
|
||||||
|
Boost,
|
||||||
|
Star,
|
||||||
|
Lightning,
|
||||||
|
SuperMushroom,
|
||||||
|
|
||||||
|
WolfHeart,
|
||||||
|
BlazeFire,
|
||||||
|
CowSuper
|
||||||
|
}
|
@ -0,0 +1,201 @@
|
|||||||
|
package nautilus.game.minekart.kart.control;
|
||||||
|
|
||||||
|
import mineplex.core.common.util.F;
|
||||||
|
import mineplex.core.common.util.UtilBlock;
|
||||||
|
import mineplex.core.common.util.UtilEnt;
|
||||||
|
import mineplex.core.common.util.UtilMath;
|
||||||
|
import mineplex.core.common.util.UtilPlayer;
|
||||||
|
import nautilus.game.minekart.kart.Kart;
|
||||||
|
import nautilus.game.minekart.kart.KartState;
|
||||||
|
import nautilus.game.minekart.kart.KartUtil;
|
||||||
|
import nautilus.game.minekart.kart.condition.ConditionType;
|
||||||
|
import nautilus.game.minekart.kart.crash.Crash_Bump;
|
||||||
|
import nautilus.game.minekart.kart.crash.Crash_Knockback;
|
||||||
|
import nautilus.game.minekart.kart.crash.Crash_Spin;
|
||||||
|
|
||||||
|
import org.bukkit.Effect;
|
||||||
|
import org.bukkit.Sound;
|
||||||
|
import org.bukkit.block.Block;
|
||||||
|
import org.bukkit.util.Vector;
|
||||||
|
|
||||||
|
public class Collision
|
||||||
|
{
|
||||||
|
public static void CollideBlock(Kart kart)
|
||||||
|
{
|
||||||
|
//Current Velocity
|
||||||
|
Vector vel = kart.GetVelocity();
|
||||||
|
if (kart.GetCrash() != null)
|
||||||
|
if (kart.GetCrash().GetVelocity() != null)
|
||||||
|
vel = kart.GetCrash().GetVelocity();
|
||||||
|
|
||||||
|
Block block;
|
||||||
|
|
||||||
|
double dist = 0.5;
|
||||||
|
|
||||||
|
boolean done = false;
|
||||||
|
|
||||||
|
block = kart.GetDriver().getLocation().add(dist, 0, 0).getBlock();
|
||||||
|
if (vel.getX() > 0 && UtilBlock.solid(block)) {CollideBlock(kart, block, vel, true); done = true;}
|
||||||
|
|
||||||
|
block = kart.GetDriver().getLocation().add(-dist, 0, 0).getBlock();
|
||||||
|
if (vel.getX() < 0 && UtilBlock.solid(block)) {CollideBlock(kart, block, vel, true); done = true;}
|
||||||
|
|
||||||
|
block = kart.GetDriver().getLocation().add(0, 0, dist).getBlock();
|
||||||
|
if (vel.getZ() > 0 && UtilBlock.solid(block)) {CollideBlock(kart, block, vel, false); done = true;}
|
||||||
|
|
||||||
|
block = kart.GetDriver().getLocation().add(0, 0, -dist).getBlock();
|
||||||
|
if (vel.getZ() < 0 && UtilBlock.solid(block)) {CollideBlock(kart, block, vel, false); done = true;}
|
||||||
|
|
||||||
|
if (done)
|
||||||
|
return;
|
||||||
|
|
||||||
|
block = kart.GetDriver().getLocation().add(dist, 1, 0).getBlock();
|
||||||
|
if (vel.getX() > 0 && UtilBlock.solid(block)) CollideBlock(kart, block, vel, true);
|
||||||
|
|
||||||
|
block = kart.GetDriver().getLocation().add(-dist, 1, 0).getBlock();
|
||||||
|
if (vel.getX() < 0 && UtilBlock.solid(block)) CollideBlock(kart, block, vel, true);
|
||||||
|
|
||||||
|
block = kart.GetDriver().getLocation().add(0, 1, dist).getBlock();
|
||||||
|
if (vel.getZ() > 0 && UtilBlock.solid(block)) CollideBlock(kart, block, vel, false);
|
||||||
|
|
||||||
|
block = kart.GetDriver().getLocation().add(0, 1, -dist).getBlock();
|
||||||
|
if (vel.getZ() < 0 && UtilBlock.solid(block)) CollideBlock(kart, block, vel, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void CollideBlock(Kart kart, Block block, Vector vel, boolean X)
|
||||||
|
{
|
||||||
|
//Get Collision Power
|
||||||
|
double power = vel.getX();
|
||||||
|
if (!X) power = vel.getZ();
|
||||||
|
|
||||||
|
power = Math.abs(power);
|
||||||
|
|
||||||
|
//Set Velocity
|
||||||
|
if (X) vel.setX(0);
|
||||||
|
else vel.setZ(0);
|
||||||
|
|
||||||
|
if (power < 0.4)
|
||||||
|
return;
|
||||||
|
|
||||||
|
//Effects
|
||||||
|
block.getWorld().playSound(kart.GetDriver().getLocation(), Sound.IRONGOLEM_WALK, (float)power * 3, 1f);
|
||||||
|
block.getWorld().playEffect(block.getLocation(), Effect.STEP_SOUND, block.getTypeId());
|
||||||
|
|
||||||
|
//Effect Stability
|
||||||
|
if (KartUtil.Stability(kart, (int) (power * 20)))
|
||||||
|
{
|
||||||
|
new Crash_Knockback(kart, block.getLocation().add(0.5, 0.5, 0.5), power);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
new Crash_Bump(kart, block.getLocation().add(0.5, 0.5, 0.5), power);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void CollidePlayer(Kart kart)
|
||||||
|
{
|
||||||
|
if (kart.HasCondition(ConditionType.Ghost) || kart.HasCondition(ConditionType.Star))
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (Kart other : kart.GetGP().GetKarts())
|
||||||
|
{
|
||||||
|
if (other.equals(kart))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (other.HasCondition(ConditionType.Ghost) || other.HasCondition(ConditionType.Star))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (kart.GetKartState() != KartState.Drive && other.GetKartState() != KartState.Drive)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (!kart.GetDriver().getWorld().equals(other.GetDriver().getWorld()))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (UtilMath.offset(kart.GetDriver(), other.GetDriver()) > 1)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
double collisionVel = 0;
|
||||||
|
|
||||||
|
//Collisions
|
||||||
|
{
|
||||||
|
//X-Pos
|
||||||
|
if (kart.GetVelocity().getX() > 0 && other.GetDriver().getLocation().getX() > kart.GetDriver().getLocation().getX())
|
||||||
|
{
|
||||||
|
double vel = kart.GetVelocity().getX() - other.GetVelocity().getX();
|
||||||
|
|
||||||
|
if (vel > 0)
|
||||||
|
collisionVel += vel;
|
||||||
|
}
|
||||||
|
//X-Neg
|
||||||
|
else if (kart.GetVelocity().getX() < 0 && other.GetDriver().getLocation().getX() < kart.GetDriver().getLocation().getX())
|
||||||
|
{
|
||||||
|
double vel = kart.GetVelocity().getX() - other.GetVelocity().getX();
|
||||||
|
|
||||||
|
if (vel < 0)
|
||||||
|
collisionVel -= vel;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Z-Pos
|
||||||
|
if (kart.GetVelocity().getZ() > 0 && other.GetDriver().getLocation().getZ() > kart.GetDriver().getLocation().getZ())
|
||||||
|
{
|
||||||
|
double vel = kart.GetVelocity().getZ() - other.GetVelocity().getZ();
|
||||||
|
|
||||||
|
if (vel > 0)
|
||||||
|
collisionVel += vel;
|
||||||
|
}
|
||||||
|
//Z-Neg
|
||||||
|
else if (kart.GetVelocity().getZ() < 0 && other.GetDriver().getLocation().getZ() < kart.GetDriver().getLocation().getZ())
|
||||||
|
{
|
||||||
|
double vel = kart.GetVelocity().getZ() - other.GetVelocity().getZ();
|
||||||
|
|
||||||
|
if (vel < 0)
|
||||||
|
collisionVel -= vel;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (collisionVel <= 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
collisionVel *= 2;
|
||||||
|
|
||||||
|
//Effects
|
||||||
|
kart.GetDriver().getWorld().playSound(kart.GetDriver().getLocation(), Sound.IRONGOLEM_HIT, (float)collisionVel, 1f);
|
||||||
|
|
||||||
|
double powScale = 0.05;
|
||||||
|
|
||||||
|
//Hit Kart
|
||||||
|
double relPower = ((collisionVel * other.GetKartType().GetStability()) / (kart.GetKartType().GetStability() / 10));
|
||||||
|
if (KartUtil.Stability(kart, (int)relPower))
|
||||||
|
{
|
||||||
|
//Inform
|
||||||
|
UtilPlayer.message(kart.GetDriver(), F.main("MK", F.elem(UtilEnt.getName(other.GetDriver())) + " knocked you out."));
|
||||||
|
UtilPlayer.message(other.GetDriver(), F.main("MK", "You knocked out " + F.elem(UtilEnt.getName(kart.GetDriver())) + "."));
|
||||||
|
|
||||||
|
//Crash
|
||||||
|
if (collisionVel > 2) new Crash_Knockback(kart, other.GetDriver().getLocation(), relPower * powScale);
|
||||||
|
else new Crash_Spin(kart, other.GetDriver().getLocation(), relPower * powScale);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
new Crash_Bump(kart, other.GetDriver().getLocation(), relPower * powScale);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Hit Other
|
||||||
|
relPower = ((collisionVel * kart.GetKartType().GetStability()) / (other.GetKartType().GetStability() / 10));
|
||||||
|
if (KartUtil.Stability(other, (int)relPower))
|
||||||
|
{
|
||||||
|
//Inform
|
||||||
|
UtilPlayer.message(other.GetDriver(), F.main("MK", F.elem(UtilEnt.getName(kart.GetDriver())) + " knocked you out."));
|
||||||
|
UtilPlayer.message(kart.GetDriver(), F.main("MK", "You knocked out " + F.elem(UtilEnt.getName(other.GetDriver())) + "."));
|
||||||
|
|
||||||
|
//Crash
|
||||||
|
if (collisionVel > 2) new Crash_Knockback(other, kart.GetDriver().getLocation(), relPower * powScale);
|
||||||
|
else new Crash_Spin(other, kart.GetDriver().getLocation(), relPower * powScale);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
new Crash_Bump(other, kart.GetDriver().getLocation(), relPower * powScale);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,159 @@
|
|||||||
|
package nautilus.game.minekart.kart.control;
|
||||||
|
|
||||||
|
import mineplex.core.common.util.UtilAlg;
|
||||||
|
import nautilus.game.minekart.kart.Kart;
|
||||||
|
import nautilus.game.minekart.kart.KartUtil;
|
||||||
|
import nautilus.game.minekart.kart.condition.ConditionType;
|
||||||
|
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
import org.bukkit.util.Vector;
|
||||||
|
|
||||||
|
public class Drive
|
||||||
|
{
|
||||||
|
public static void TopSpeed(Kart kart)
|
||||||
|
{
|
||||||
|
if (!kart.CanControl())
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!KartUtil.IsGrounded(kart))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (kart.HasCondition(ConditionType.Boost))
|
||||||
|
return;
|
||||||
|
|
||||||
|
double topSpeed = kart.GetKartType().GetTopSpeed();
|
||||||
|
|
||||||
|
if (kart.HasCondition(ConditionType.Star))
|
||||||
|
topSpeed *= 1.2;
|
||||||
|
|
||||||
|
if (kart.GetSpeed() > topSpeed)
|
||||||
|
{
|
||||||
|
Vector vel = kart.GetVelocityClone();
|
||||||
|
vel.setY(0);
|
||||||
|
vel.normalize();
|
||||||
|
vel.multiply(topSpeed);
|
||||||
|
|
||||||
|
kart.SetVelocity(vel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Accelerate(Kart kart)
|
||||||
|
{
|
||||||
|
if (!kart.CanControl())
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!KartUtil.IsGrounded(kart))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!kart.GetDriver().isBlocking())
|
||||||
|
return;
|
||||||
|
|
||||||
|
ItemStack item = kart.GetDriver().getItemInHand();
|
||||||
|
if (item == null || item.getType() != Material.STONE_SWORD)
|
||||||
|
return;
|
||||||
|
|
||||||
|
//Current Velocity
|
||||||
|
Vector vel = kart.GetVelocity();
|
||||||
|
|
||||||
|
//Initial Velocity
|
||||||
|
if (vel.length() == 0)
|
||||||
|
{
|
||||||
|
vel = kart.GetDriver().getLocation().getDirection().setY(0);
|
||||||
|
|
||||||
|
//Looking directly Up/Down
|
||||||
|
if (vel.length() == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
vel.normalize();
|
||||||
|
vel.multiply(0.001);
|
||||||
|
|
||||||
|
kart.SetVelocity(vel);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Kart Acceleration
|
||||||
|
Vector acc = new Vector(vel.getX(), 0, vel.getZ());
|
||||||
|
UtilAlg.Normalize(acc);
|
||||||
|
|
||||||
|
double acceleration = kart.GetKartType().GetAcceleration();
|
||||||
|
if (kart.HasCondition(ConditionType.Star))
|
||||||
|
acceleration *= 1.2;
|
||||||
|
|
||||||
|
acc.multiply(0.001 * acceleration);
|
||||||
|
vel.add(acc);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Brake(Kart kart)
|
||||||
|
{
|
||||||
|
if (!kart.CanControl())
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!KartUtil.IsGrounded(kart))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!kart.GetDriver().isBlocking())
|
||||||
|
return;
|
||||||
|
|
||||||
|
ItemStack item = kart.GetDriver().getItemInHand();
|
||||||
|
if (item == null || item.getType() != Material.WOOD_SWORD)
|
||||||
|
return;
|
||||||
|
|
||||||
|
//Current Velocity
|
||||||
|
Vector vel = kart.GetVelocity();
|
||||||
|
|
||||||
|
//Drag %
|
||||||
|
vel.multiply(0.95);
|
||||||
|
|
||||||
|
if (vel.length() < 0.05)
|
||||||
|
vel.multiply(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Turn(Kart kart)
|
||||||
|
{
|
||||||
|
if (!kart.CanControl())
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!KartUtil.IsGrounded(kart))
|
||||||
|
return;
|
||||||
|
|
||||||
|
//Current Velocity
|
||||||
|
Vector vel = kart.GetVelocity();
|
||||||
|
|
||||||
|
if (vel.length() <= 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
double speed = vel.length();
|
||||||
|
|
||||||
|
double handling = kart.GetKartType().GetHandling();
|
||||||
|
if (kart.HasCondition(ConditionType.Star))
|
||||||
|
handling *= 1.2;
|
||||||
|
|
||||||
|
//Turn
|
||||||
|
Vector turn = kart.GetDriver().getLocation().getDirection();
|
||||||
|
turn.setY(0);
|
||||||
|
UtilAlg.Normalize(turn);
|
||||||
|
|
||||||
|
turn.subtract(UtilAlg.Normalize(new Vector(vel.getX(), 0, vel.getZ())));
|
||||||
|
|
||||||
|
turn.multiply(0.003 * handling);
|
||||||
|
|
||||||
|
vel.add(turn);
|
||||||
|
|
||||||
|
//Reapply Speed
|
||||||
|
speed = (speed + (vel.length()*3)) / 4;
|
||||||
|
UtilAlg.Normalize(vel);
|
||||||
|
vel.multiply(speed);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Move(Kart kart)
|
||||||
|
{
|
||||||
|
//Current Velocity
|
||||||
|
Vector vel = kart.GetVelocity();
|
||||||
|
|
||||||
|
kart.GetDriver().setVelocity(vel);
|
||||||
|
|
||||||
|
//Display Velocity as Exp
|
||||||
|
kart.GetDriver().setExp(Math.min(0.999f, ((float)kart.GetSpeed()/(float)kart.GetKartType().GetTopSpeed())));
|
||||||
|
kart.GetDriver().setLevel((int) (kart.GetSpeed() * 100));
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,140 @@
|
|||||||
|
package nautilus.game.minekart.kart.control;
|
||||||
|
|
||||||
|
import mineplex.core.common.util.UtilAlg;
|
||||||
|
import nautilus.game.minekart.kart.Kart;
|
||||||
|
import nautilus.game.minekart.kart.Kart.DriftDirection;
|
||||||
|
import nautilus.game.minekart.kart.condition.ConditionData;
|
||||||
|
import nautilus.game.minekart.kart.condition.ConditionType;
|
||||||
|
import nautilus.game.minekart.kart.KartUtil;
|
||||||
|
|
||||||
|
import org.bukkit.Effect;
|
||||||
|
import org.bukkit.event.player.PlayerToggleSneakEvent;
|
||||||
|
import org.bukkit.util.Vector;
|
||||||
|
|
||||||
|
public class DriveDrift
|
||||||
|
{
|
||||||
|
public static void Hop(Kart kart, PlayerToggleSneakEvent event)
|
||||||
|
{
|
||||||
|
if (kart == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!kart.CanControl())
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (event.getPlayer().isSneaking())
|
||||||
|
{
|
||||||
|
Boost(kart);
|
||||||
|
kart.ClearDrift();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!KartUtil.IsGrounded(kart))
|
||||||
|
return;
|
||||||
|
|
||||||
|
//Save Drift Values
|
||||||
|
kart.SetDrift();
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
//Current Velocity
|
||||||
|
Vector vel = kart.GetVelocity();
|
||||||
|
double speed = vel.length();
|
||||||
|
|
||||||
|
//Turn
|
||||||
|
if (vel.length() > 0)
|
||||||
|
{
|
||||||
|
Vector turn = kart.GetDriver().getLocation().getDirection();
|
||||||
|
turn.setY(0);
|
||||||
|
UtilAlg.Normalize(turn);
|
||||||
|
|
||||||
|
turn.subtract(UtilAlg.Normalize(new Vector(vel.getX(), 0, vel.getZ())));
|
||||||
|
|
||||||
|
turn.multiply(0.1);
|
||||||
|
|
||||||
|
vel.add(turn);
|
||||||
|
|
||||||
|
UtilAlg.Normalize(vel);
|
||||||
|
vel.multiply(speed);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Hop
|
||||||
|
Vector hop = kart.GetDriver().getLocation().getDirection();
|
||||||
|
hop.setY(0);
|
||||||
|
UtilAlg.Normalize(hop);
|
||||||
|
hop.multiply(0.03);
|
||||||
|
hop.setY(0.12);
|
||||||
|
|
||||||
|
if (hop.length() > 0)
|
||||||
|
vel.add(hop);
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Drift(Kart kart)
|
||||||
|
{
|
||||||
|
if (!kart.CanControl())
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!kart.GetDriver().isSneaking())
|
||||||
|
{
|
||||||
|
kart.ClearDrift();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!KartUtil.IsGrounded(kart))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (kart.GetDrift() == DriftDirection.None)
|
||||||
|
return;
|
||||||
|
|
||||||
|
//Current Velocity
|
||||||
|
Vector vel = kart.GetVelocity();
|
||||||
|
double speed = kart.GetVelocity().length();
|
||||||
|
|
||||||
|
if (speed < 0.5)
|
||||||
|
{
|
||||||
|
kart.ClearDrift();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Drift
|
||||||
|
vel.add(kart.GetDriftVector().multiply(0.030));
|
||||||
|
|
||||||
|
//Turn
|
||||||
|
Vector turn = kart.GetDriver().getLocation().getDirection();
|
||||||
|
turn.setY(0);
|
||||||
|
UtilAlg.Normalize(turn);
|
||||||
|
|
||||||
|
turn.subtract(UtilAlg.Normalize(new Vector(vel.getX(), 0, vel.getZ())));
|
||||||
|
|
||||||
|
turn.multiply(0.0015 * kart.GetKartType().GetHandling());
|
||||||
|
|
||||||
|
vel.add(turn);
|
||||||
|
|
||||||
|
//Reapply Speed
|
||||||
|
UtilAlg.Normalize(vel);
|
||||||
|
vel.multiply(speed);
|
||||||
|
|
||||||
|
//Effect
|
||||||
|
long driftTime = kart.GetDriftTime();
|
||||||
|
int effectId = 42;
|
||||||
|
if (driftTime > 4000) effectId = 57;
|
||||||
|
else if (driftTime > 2500) effectId = 41;
|
||||||
|
|
||||||
|
kart.GetDriver().getWorld().playEffect(kart.GetDriver().getLocation().add(0, -1, 0), Effect.STEP_SOUND, effectId);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Boost(Kart kart)
|
||||||
|
{
|
||||||
|
if (kart.GetDrift() == DriftDirection.None)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (kart.GetDriftTime() < 4000)
|
||||||
|
return;
|
||||||
|
|
||||||
|
kart.AddCondition(new ConditionData(ConditionType.Boost, 2000));
|
||||||
|
|
||||||
|
//Effect
|
||||||
|
kart.GetDriver().getWorld().playEffect(kart.GetDriver().getLocation(), Effect.STEP_SOUND, 57);
|
||||||
|
kart.GetDriver().getWorld().playSound(kart.GetDriver().getLocation(), kart.GetKartType().GetSoundMain(), 2f, 1f);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,163 @@
|
|||||||
|
package nautilus.game.minekart.kart.control;
|
||||||
|
|
||||||
|
import mineplex.core.common.util.UtilAlg;
|
||||||
|
import nautilus.game.minekart.kart.Kart;
|
||||||
|
import nautilus.game.minekart.kart.KartUtil;
|
||||||
|
|
||||||
|
import org.bukkit.Effect;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.block.Block;
|
||||||
|
import org.bukkit.block.BlockFace;
|
||||||
|
import org.bukkit.util.Vector;
|
||||||
|
|
||||||
|
public class World
|
||||||
|
{
|
||||||
|
public static void Gravity(Kart kart)
|
||||||
|
{
|
||||||
|
//Current Velocity
|
||||||
|
Vector vel = kart.GetVelocity();
|
||||||
|
if (kart.GetCrash() != null)
|
||||||
|
vel = kart.GetCrash().GetVelocity();
|
||||||
|
|
||||||
|
//Landed
|
||||||
|
if (KartUtil.IsGrounded(kart))
|
||||||
|
{
|
||||||
|
if (vel.getY() < 0)
|
||||||
|
vel.setY(0);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Downward Gravity
|
||||||
|
double down = Math.max(-1.0, vel.getY() - 0.1);
|
||||||
|
vel.setY(down);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void AirDrag(Kart kart)
|
||||||
|
{
|
||||||
|
//Current Velocity
|
||||||
|
Vector vel = kart.GetVelocity();
|
||||||
|
if (kart.GetCrash() != null)
|
||||||
|
vel = kart.GetCrash().GetVelocity();
|
||||||
|
|
||||||
|
if (vel.length() <= 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
//Drag Horizontal
|
||||||
|
if (KartUtil.IsGrounded(kart))
|
||||||
|
{
|
||||||
|
double drag = Math.log(vel.length() + 1) / 50d;
|
||||||
|
drag *= 1 / kart.GetKartType().GetTopSpeed(); //Increase for lower top speed karts
|
||||||
|
drag *= (kart.GetKartType().GetAcceleration() / 21d); //Reduce for lower accel karts
|
||||||
|
|
||||||
|
//Variable Drag
|
||||||
|
vel.multiply(1 - drag);
|
||||||
|
}
|
||||||
|
//Drag Vertical
|
||||||
|
else
|
||||||
|
{
|
||||||
|
vel.setY(vel.getY() * 0.98);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void FireDrag(Kart kart)
|
||||||
|
{
|
||||||
|
if (kart.GetDriver().getFireTicks() <= 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
//Current Velocity
|
||||||
|
Vector vel = kart.GetVelocity();
|
||||||
|
if (kart.GetCrash() != null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (vel.length() <= 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
//Drag Horizontal
|
||||||
|
double drag = 0.008;
|
||||||
|
|
||||||
|
//Variable Drag
|
||||||
|
vel.multiply(1 - drag);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void RoadDrag(Kart kart)
|
||||||
|
{
|
||||||
|
if (!KartUtil.IsGrounded(kart))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (kart.GetGP() == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (kart.GetGP().GetTrack() == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
Block block = kart.GetDriver().getLocation().getBlock().getRelative(BlockFace.DOWN);
|
||||||
|
|
||||||
|
//Current Velocity
|
||||||
|
Vector vel = kart.GetVelocity();
|
||||||
|
if (kart.GetCrash() != null)
|
||||||
|
vel = kart.GetCrash().GetVelocity();
|
||||||
|
|
||||||
|
if (vel.length() <= 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
//Constant Drag
|
||||||
|
Vector dragVec = new Vector(vel.getX(), 0, vel.getZ());
|
||||||
|
UtilAlg.Normalize(dragVec);
|
||||||
|
dragVec.multiply(0.003);
|
||||||
|
vel.subtract(dragVec);
|
||||||
|
|
||||||
|
//Off Road
|
||||||
|
if (!kart.GetGP().GetTrack().GetTrackBlocks().contains(block.getTypeId()))
|
||||||
|
if (block.getType() == Material.GRASS ||
|
||||||
|
block.getType() == Material.SAND)
|
||||||
|
{
|
||||||
|
//Drag Horizontal
|
||||||
|
double drag = 0.025;
|
||||||
|
|
||||||
|
//Variable Drag
|
||||||
|
vel.multiply(1 - drag);
|
||||||
|
|
||||||
|
//Effect
|
||||||
|
if (kart.GetSpeed() > 0.2)
|
||||||
|
block.getWorld().playEffect(block.getLocation(), Effect.STEP_SOUND, block.getTypeId());
|
||||||
|
}
|
||||||
|
|
||||||
|
//Stop Completely
|
||||||
|
if (!kart.GetDriver().isBlocking())
|
||||||
|
if (vel.length() < 0.02)
|
||||||
|
vel.multiply(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void BlockDrag(Kart kart)
|
||||||
|
{
|
||||||
|
if (!KartUtil.IsGrounded(kart))
|
||||||
|
return;
|
||||||
|
|
||||||
|
Block block = kart.GetDriver().getLocation().getBlock();
|
||||||
|
|
||||||
|
//Current Velocity
|
||||||
|
Vector vel = kart.GetVelocity();
|
||||||
|
if (kart.GetCrash() != null)
|
||||||
|
vel = kart.GetCrash().GetVelocity();
|
||||||
|
|
||||||
|
if (vel.length() <= 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
double drag = 0;
|
||||||
|
|
||||||
|
if (block.getType() == Material.LONG_GRASS) drag = 0.02;
|
||||||
|
else if (block.getType() == Material.WATER) drag = 0.03;
|
||||||
|
else if (block.getType() == Material.STATIONARY_WATER) drag = 0.03;
|
||||||
|
|
||||||
|
if (drag <= 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
//Slow
|
||||||
|
vel.multiply(1 - drag);
|
||||||
|
|
||||||
|
//Effect
|
||||||
|
if (vel.length() > 0.2)
|
||||||
|
block.getWorld().playEffect(block.getLocation(), Effect.STEP_SOUND, block.getTypeId());
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,83 @@
|
|||||||
|
package nautilus.game.minekart.kart.crash;
|
||||||
|
|
||||||
|
import mineplex.core.common.util.UtilTime;
|
||||||
|
import nautilus.game.minekart.kart.Kart;
|
||||||
|
|
||||||
|
import org.bukkit.EntityEffect;
|
||||||
|
import org.bukkit.util.Vector;
|
||||||
|
|
||||||
|
public class Crash
|
||||||
|
{
|
||||||
|
private Vector _velocity;
|
||||||
|
private long _crashTime;
|
||||||
|
private long _crashReq;
|
||||||
|
private boolean _canEnd;
|
||||||
|
private boolean _restoreStability;
|
||||||
|
|
||||||
|
public Crash(Kart kart, Vector vel, long timeReq, boolean canEnd, boolean restoreStability)
|
||||||
|
{
|
||||||
|
kart.SetCrash(this);
|
||||||
|
kart.ClearDrift();
|
||||||
|
|
||||||
|
_velocity = vel;
|
||||||
|
_crashTime = System.currentTimeMillis();
|
||||||
|
_crashReq = timeReq;
|
||||||
|
_canEnd = canEnd;
|
||||||
|
_restoreStability = restoreStability;
|
||||||
|
|
||||||
|
kart.GetDriver().playEffect(EntityEffect.HURT);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Update(Kart kart)
|
||||||
|
{
|
||||||
|
Move(kart);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Move(Kart kart)
|
||||||
|
{
|
||||||
|
kart.GetDriver().setVelocity(_velocity);
|
||||||
|
|
||||||
|
//Display Velocity as Exp
|
||||||
|
kart.GetDriver().setExp(Math.min(0.999f, ((float)_velocity.length()/(float)1.8)));
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean CrashEnd()
|
||||||
|
{
|
||||||
|
return _canEnd && UtilTime.elapsed(_crashTime , _crashReq);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Vector GetVelocity()
|
||||||
|
{
|
||||||
|
return _velocity;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetVelocity(Vector vel)
|
||||||
|
{
|
||||||
|
_velocity = vel;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long GetCrashTime()
|
||||||
|
{
|
||||||
|
return _crashTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long GetCrashReq()
|
||||||
|
{
|
||||||
|
return _crashReq;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetCanEnd(boolean end)
|
||||||
|
{
|
||||||
|
_canEnd = end;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetCrashReq(long time)
|
||||||
|
{
|
||||||
|
_crashReq = time;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean StabilityRestore()
|
||||||
|
{
|
||||||
|
return _restoreStability;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,33 @@
|
|||||||
|
package nautilus.game.minekart.kart.crash;
|
||||||
|
|
||||||
|
import mineplex.core.common.util.UtilAlg;
|
||||||
|
import nautilus.game.minekart.kart.Kart;
|
||||||
|
import nautilus.game.minekart.kart.KartState;
|
||||||
|
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.Sound;
|
||||||
|
import org.bukkit.util.Vector;
|
||||||
|
|
||||||
|
public class Crash_Bump extends Crash
|
||||||
|
{
|
||||||
|
public Crash_Bump(Kart kart, Location other, double power)
|
||||||
|
{
|
||||||
|
super(kart, new Vector(0,0,0), (long) (800 * power), true, false);
|
||||||
|
|
||||||
|
//Effect
|
||||||
|
kart.GetDriver().getWorld().playSound(kart.GetDriver().getLocation(), Sound.IRONGOLEM_HIT, (float)power, 1f);
|
||||||
|
|
||||||
|
//Apply Knockback
|
||||||
|
Vector knock = UtilAlg.getTrajectory(other, kart.GetDriver().getLocation());
|
||||||
|
knock.multiply(0.4 * power);
|
||||||
|
knock.add(new Vector(0, 0.4 * power, 0));
|
||||||
|
SetVelocity(knock);
|
||||||
|
|
||||||
|
double powerTrim = Math.min(power, 1) / 2;
|
||||||
|
|
||||||
|
//Lose some velocity
|
||||||
|
kart.GetVelocity().multiply(1 - powerTrim);
|
||||||
|
|
||||||
|
kart.SetKartState(KartState.Crash);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,26 @@
|
|||||||
|
package nautilus.game.minekart.kart.crash;
|
||||||
|
|
||||||
|
import nautilus.game.minekart.kart.Kart;
|
||||||
|
import nautilus.game.minekart.kart.KartState;
|
||||||
|
|
||||||
|
import org.bukkit.util.Vector;
|
||||||
|
|
||||||
|
public class Crash_Explode extends Crash
|
||||||
|
{
|
||||||
|
public Crash_Explode(Kart kart, double power, boolean resetVelocity)
|
||||||
|
{
|
||||||
|
super(kart, new Vector(0,0,0), (long) (1400 * power), true, true);
|
||||||
|
|
||||||
|
//Effect
|
||||||
|
kart.GetDriver().getWorld().playSound(kart.GetDriver().getLocation(), kart.GetKartType().GetSoundCrash(), 2f, 1f);
|
||||||
|
|
||||||
|
//Apply Upwards
|
||||||
|
SetVelocity(kart.GetVelocityClone().add(new Vector(0, power * 1, 0)));
|
||||||
|
|
||||||
|
//Remove Karts Velocity
|
||||||
|
if (resetVelocity)
|
||||||
|
kart.CrashStop();
|
||||||
|
|
||||||
|
kart.SetKartState(KartState.Crash);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,33 @@
|
|||||||
|
package nautilus.game.minekart.kart.crash;
|
||||||
|
|
||||||
|
import mineplex.core.common.util.UtilAlg;
|
||||||
|
import nautilus.game.minekart.kart.Kart;
|
||||||
|
import nautilus.game.minekart.kart.KartState;
|
||||||
|
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.util.Vector;
|
||||||
|
|
||||||
|
public class Crash_Knockback extends Crash
|
||||||
|
{
|
||||||
|
|
||||||
|
public Crash_Knockback(Kart kart, Location other, double power)
|
||||||
|
{
|
||||||
|
super(kart, new Vector(0,0,0), 1000, true, true);
|
||||||
|
|
||||||
|
power = Math.min(power, 1.5);
|
||||||
|
|
||||||
|
//Effect
|
||||||
|
kart.GetDriver().getWorld().playSound(kart.GetDriver().getLocation(), kart.GetKartType().GetSoundCrash(), 2f, 1f);
|
||||||
|
|
||||||
|
//Apply Knockback
|
||||||
|
Vector knock = UtilAlg.getTrajectory(other, kart.GetDriver().getLocation());
|
||||||
|
knock.multiply(0.6 * power);
|
||||||
|
knock.add(new Vector(0, power * 0.8, 0));
|
||||||
|
SetVelocity(knock);
|
||||||
|
|
||||||
|
//Remove Karts Velocity
|
||||||
|
kart.CrashStop();
|
||||||
|
|
||||||
|
kart.SetKartState(KartState.Crash);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,51 @@
|
|||||||
|
package nautilus.game.minekart.kart.crash;
|
||||||
|
|
||||||
|
import mineplex.core.common.util.UtilAlg;
|
||||||
|
import nautilus.game.minekart.kart.Kart;
|
||||||
|
import nautilus.game.minekart.kart.KartState;
|
||||||
|
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.util.Vector;
|
||||||
|
|
||||||
|
public class Crash_Spin extends Crash
|
||||||
|
{
|
||||||
|
public Crash_Spin(Kart kart, Location other, double power)
|
||||||
|
{
|
||||||
|
super(kart, new Vector(0,0,0), (long) (1500 * power), true, true);
|
||||||
|
|
||||||
|
power = Math.min(power, 1.5);
|
||||||
|
|
||||||
|
//Effect
|
||||||
|
kart.GetDriver().getWorld().playSound(kart.GetDriver().getLocation(), kart.GetKartType().GetSoundCrash(), 2f, 1f);
|
||||||
|
|
||||||
|
//Apply Knockback
|
||||||
|
Vector knock = UtilAlg.getTrajectory(other, kart.GetDriver().getLocation());
|
||||||
|
knock.setY(0);
|
||||||
|
UtilAlg.Normalize(knock);
|
||||||
|
knock.multiply(0.6 * power);
|
||||||
|
SetVelocity(knock);
|
||||||
|
|
||||||
|
//Remove Karts Velocity
|
||||||
|
kart.CrashStop();
|
||||||
|
|
||||||
|
kart.SetKartState(KartState.Crash);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Crash_Spin(Kart kart, double power)
|
||||||
|
{
|
||||||
|
super(kart, new Vector(0,0,0), (long) (2000 * power), true, true);
|
||||||
|
|
||||||
|
power = Math.min(power, 1.5);
|
||||||
|
|
||||||
|
//Effect
|
||||||
|
kart.GetDriver().getWorld().playSound(kart.GetDriver().getLocation(), kart.GetKartType().GetSoundCrash(), 2f, 1f);
|
||||||
|
|
||||||
|
//Apply Knockback
|
||||||
|
SetVelocity(kart.GetVelocity());
|
||||||
|
|
||||||
|
//Remove Karts Velocity
|
||||||
|
kart.CrashStop();
|
||||||
|
|
||||||
|
kart.SetKartState(KartState.Crash);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,34 @@
|
|||||||
|
package nautilus.game.minekart.menu;
|
||||||
|
|
||||||
|
import mineplex.core.account.CoreClientManager;
|
||||||
|
import mineplex.core.shop.ShopBase;
|
||||||
|
import mineplex.core.shop.page.ShopPageBase;
|
||||||
|
|
||||||
|
import nautilus.game.minekart.KartFactory;
|
||||||
|
import nautilus.game.minekart.gp.GPManager;
|
||||||
|
import nautilus.game.minekart.shop.KartItem;
|
||||||
|
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
public class KartMenu extends ShopBase<KartFactory>
|
||||||
|
{
|
||||||
|
private GPManager _gpManager;
|
||||||
|
|
||||||
|
public KartMenu(KartFactory plugin, CoreClientManager clientManager, mineplex.core.donation.DonationManager donationManager, GPManager gpManager)
|
||||||
|
{
|
||||||
|
super(plugin, clientManager, donationManager, "Kart Select");
|
||||||
|
|
||||||
|
_gpManager = gpManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected ShopPageBase<KartFactory, ? extends ShopBase<KartFactory>> BuildPagesFor(Player player)
|
||||||
|
{
|
||||||
|
return new KartPage(Plugin, ClientManager, DonationManager, this, _gpManager, player);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SelectKart(Player player, KartItem kartItem)
|
||||||
|
{
|
||||||
|
_gpManager.SelectKart(player, kartItem.GetKartType());
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,213 @@
|
|||||||
|
package nautilus.game.minekart.menu;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import mineplex.core.account.CoreClientManager;
|
||||||
|
import mineplex.core.common.Rank;
|
||||||
|
import mineplex.core.common.util.C;
|
||||||
|
import mineplex.core.itemstack.ItemStackFactory;
|
||||||
|
import mineplex.core.shop.item.ShopItem;
|
||||||
|
import mineplex.core.shop.page.ShopPageBase;
|
||||||
|
|
||||||
|
import nautilus.game.minekart.KartFactory;
|
||||||
|
import nautilus.game.minekart.gp.GPManager;
|
||||||
|
import nautilus.game.minekart.gp.GPSet;
|
||||||
|
import nautilus.game.minekart.item.KartItemType;
|
||||||
|
import nautilus.game.minekart.kart.KartType;
|
||||||
|
import nautilus.game.minekart.shop.KartItem;
|
||||||
|
import net.minecraft.server.v1_7_R1.NBTTagList;
|
||||||
|
|
||||||
|
import org.bukkit.ChatColor;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
import org.bukkit.inventory.PlayerInventory;
|
||||||
|
|
||||||
|
public class KartPage extends ShopPageBase<KartFactory, KartMenu>
|
||||||
|
{
|
||||||
|
private GPManager _gpManager;
|
||||||
|
private ItemStack[] _playerInventoryContents;
|
||||||
|
|
||||||
|
public KartPage(KartFactory plugin, CoreClientManager clientManager, mineplex.core.donation.DonationManager donationManager, KartMenu shop, GPManager gpManager, Player player)
|
||||||
|
{
|
||||||
|
super(plugin, shop, clientManager, donationManager, " ", player);
|
||||||
|
|
||||||
|
_gpManager = gpManager;
|
||||||
|
_playerInventoryContents = player.getInventory().getContents().clone();
|
||||||
|
|
||||||
|
BuildPage();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void PlayerOpened()
|
||||||
|
{
|
||||||
|
UpdateKarts();
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
@Override
|
||||||
|
public void PlayerClosed()
|
||||||
|
{
|
||||||
|
super.PlayerClosed();
|
||||||
|
|
||||||
|
Player.getInventory().setContents(_playerInventoryContents);
|
||||||
|
|
||||||
|
Player.updateInventory();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void BuildPage()
|
||||||
|
{
|
||||||
|
getInventory().setItem(0, new ShopItem(Material.INK_SACK, (byte)1, "", new String[] {}, 1, false, true).getHandle());
|
||||||
|
getInventory().setItem(1, new ShopItem(Material.INK_SACK, (byte)4, "", new String[] {}, 1, false, true).getHandle());
|
||||||
|
getInventory().setItem(2, new ShopItem(Material.INK_SACK, (byte)3, "", new String[] {}, 1, false, true).getHandle());
|
||||||
|
getInventory().setItem(3, new ShopItem(Material.INK_SACK, (byte)6, "", new String[] {}, 1, false, true).getHandle());
|
||||||
|
getInventory().setItem(4, new ShopItem(Material.INK_SACK, (byte)8, "", new String[] {}, 1, false, true).getHandle());
|
||||||
|
getInventory().setItem(5, new ShopItem(Material.INK_SACK, (byte)2, "", new String[] {}, 1, false, true).getHandle());
|
||||||
|
getInventory().setItem(6, new ShopItem(Material.INK_SACK, (byte)12, "", new String[] {}, 1, false, true).getHandle());
|
||||||
|
getInventory().setItem(7, new ShopItem(Material.INK_SACK, (byte)10, "", new String[] {}, 1, false, true).getHandle());
|
||||||
|
getInventory().setItem(8, new ShopItem(Material.INK_SACK, (byte)13, "", new String[] {}, 1, false, true).getHandle());
|
||||||
|
|
||||||
|
UpdateKarts();
|
||||||
|
|
||||||
|
ShowKartStats(_gpManager.GetSelectedKart(Player));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SelectKart(Player player, KartItem kartItem)
|
||||||
|
{
|
||||||
|
if (DonationManager.Get(player.getName()).Owns(kartItem.GetSalesPackageId()) || kartItem.IsFree() || DonationManager.Get(Client.GetPlayerName()).OwnsUnknownPackage("Minekart ULTRA") || Client.GetRank().Has(player, Rank.ULTRA, false))
|
||||||
|
{
|
||||||
|
Shop.SelectKart(player, kartItem);
|
||||||
|
PlayAcceptSound(player);
|
||||||
|
ShowKartStats(_gpManager.GetSelectedKart(Player));
|
||||||
|
UpdateKarts();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
PlayDenySound(player);
|
||||||
|
ShowKartStats(kartItem.GetKartType());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void ShowKartStats(KartType kartType)
|
||||||
|
{
|
||||||
|
for (KartItem item : Plugin.GetKarts())
|
||||||
|
{
|
||||||
|
if (kartType == item.GetKartType())
|
||||||
|
{
|
||||||
|
PlayerInventory inventory = Player.getInventory();
|
||||||
|
inventory.clear();
|
||||||
|
|
||||||
|
double statValue = Math.ceil((kartType.GetTopSpeed() * 100 - 79) / 2.625);
|
||||||
|
Material statMaterial = GetStatMaterial(statValue);
|
||||||
|
int slot = 9;
|
||||||
|
inventory.setItem(slot, ItemStackFactory.Instance.CreateStack(Material.WOOD_HOE, (byte)0, (int)(kartType.GetTopSpeed() * 100), "§e§lTop Speed"));
|
||||||
|
|
||||||
|
slot++;
|
||||||
|
while (statValue >= 1)
|
||||||
|
{
|
||||||
|
inventory.setItem(slot, ItemStackFactory.Instance.CreateStack(statMaterial, (byte)0, 1, "§e§lSpeed Bar"));
|
||||||
|
slot++;
|
||||||
|
statValue -= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
statValue = kartType.GetAcceleration() - 10;
|
||||||
|
statMaterial = GetStatMaterial(statValue);
|
||||||
|
slot = 18;
|
||||||
|
inventory.setItem(slot, ItemStackFactory.Instance.CreateStack(Material.STONE_HOE, (byte)0, (int)statValue, "§e§lAcceleration"));
|
||||||
|
|
||||||
|
slot++;
|
||||||
|
while (statValue >= 1)
|
||||||
|
{
|
||||||
|
inventory.setItem(slot, ItemStackFactory.Instance.CreateStack(statMaterial, (byte)0, 1, "§e§lAcceleration Bar"));
|
||||||
|
slot++;
|
||||||
|
statValue -= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
statValue = kartType.GetHandling() - 10;
|
||||||
|
statMaterial = GetStatMaterial(statValue);
|
||||||
|
slot = 27;
|
||||||
|
inventory.setItem(slot, ItemStackFactory.Instance.CreateStack(Material.IRON_HOE, (byte)0, (int)statValue, "§e§lHandling"));
|
||||||
|
|
||||||
|
slot++;
|
||||||
|
while (statValue >= 1)
|
||||||
|
{
|
||||||
|
inventory.setItem(slot, ItemStackFactory.Instance.CreateStack(statMaterial, (byte)0, 1, "§e§lHandling Bar"));
|
||||||
|
slot++;
|
||||||
|
statValue -= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected boolean IsValidGPSet(GPSet gpSet)
|
||||||
|
{
|
||||||
|
return gpSet == GPSet.MushroomCup || gpSet == GPSet.Battle;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void UpdateKarts()
|
||||||
|
{
|
||||||
|
int slot = 45;
|
||||||
|
boolean locked = true;
|
||||||
|
|
||||||
|
for (KartItem item : Plugin.GetKarts())
|
||||||
|
{
|
||||||
|
if (DonationManager.Get(Client.GetPlayerName()).Owns(item.GetSalesPackageId()) || DonationManager.Get(Client.GetPlayerName()).OwnsUnknownPackage("Minekart ULTRA") || Client.GetRank().Has(Client.GetPlayer(), Rank.ULTRA, false) || item.IsFree())
|
||||||
|
locked = false;
|
||||||
|
else
|
||||||
|
locked = true;
|
||||||
|
|
||||||
|
List<String> itemLore = new ArrayList<String>();
|
||||||
|
|
||||||
|
if (locked)
|
||||||
|
{
|
||||||
|
itemLore.add(C.cGreen + "Purchase at Kart Shop");
|
||||||
|
}
|
||||||
|
|
||||||
|
itemLore.add(C.cBlack);
|
||||||
|
|
||||||
|
itemLore.add(C.cWhite + "Max Speed: " + GetStatColor(Math.ceil((item.GetKartType().GetTopSpeed() * 100 - 79) / 2.625)) + item.GetKartType().GetTopSpeed() * 100);
|
||||||
|
itemLore.add(C.cWhite + "Acceleration: " + GetStatColor(item.GetKartType().GetAcceleration() - 10) + (item.GetKartType().GetAcceleration() - 10));
|
||||||
|
itemLore.add(C.cWhite + "Handling: " + GetStatColor(item.GetKartType().GetHandling() - 10) + (item.GetKartType().GetHandling() - 10));
|
||||||
|
itemLore.add(C.cWhite + "Weight: " + GetStatColor(item.GetKartType().GetStability() - 10) + (item.GetKartType().GetStability() - 10));
|
||||||
|
|
||||||
|
itemLore.add(C.cBlack);
|
||||||
|
|
||||||
|
itemLore.add(C.cWhite + "Special Item: " + C.cYellow + item.GetKartType().GetKartItem().GetName());
|
||||||
|
|
||||||
|
ShopItem shopItem = new ShopItem(item.GetDisplayMaterial(),
|
||||||
|
item.GetDisplayData(), item.GetName(),
|
||||||
|
itemLore.toArray(new String[itemLore.size()]), 1, locked,
|
||||||
|
false);
|
||||||
|
|
||||||
|
if (_gpManager.GetSelectedKart(Player) == item.GetKartType())
|
||||||
|
{
|
||||||
|
shopItem.getHandle().tag.set("ench", new NBTTagList());
|
||||||
|
|
||||||
|
KartItemType kartItemType = item.GetKartType().GetKartItem();
|
||||||
|
|
||||||
|
ShopItem kartItem = new ShopItem(kartItemType.GetMaterial(), kartItemType.GetName(), kartItemType.GetDesc(), kartItemType.GetAmount(), false);
|
||||||
|
kartItem.getHandle().c((locked ? ChatColor.RED : ChatColor.GREEN) + kartItem.GetName() + (locked ? ChatColor.RED + " (Locked)" : ""));
|
||||||
|
|
||||||
|
getInventory().setItem(slot - 9, kartItem.getHandle());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
getInventory().setItem(slot - 9, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
AddButton(slot, shopItem, new KartSelectButton(this, item));
|
||||||
|
slot++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private ChatColor GetStatColor(double statValue)
|
||||||
|
{
|
||||||
|
return statValue >= 3 ? (statValue >= 6 ? ChatColor.GREEN : ChatColor.YELLOW) : ChatColor.RED;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Material GetStatMaterial(double statValue)
|
||||||
|
{
|
||||||
|
return statValue >= 3 ? (statValue >= 6 ? Material.EMERALD : Material.GOLD_NUGGET) : Material.REDSTONE;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,24 @@
|
|||||||
|
package nautilus.game.minekart.menu;
|
||||||
|
|
||||||
|
import mineplex.core.shop.item.IButton;
|
||||||
|
import nautilus.game.minekart.shop.KartItem;
|
||||||
|
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
public class KartSelectButton implements IButton
|
||||||
|
{
|
||||||
|
private KartPage _page;
|
||||||
|
private KartItem _kartItem;
|
||||||
|
|
||||||
|
public KartSelectButton(KartPage shop, KartItem kartItem)
|
||||||
|
{
|
||||||
|
_page = shop;
|
||||||
|
_kartItem = kartItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void Clicked(Player player)
|
||||||
|
{
|
||||||
|
_page.SelectKart(player, _kartItem);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,11 @@
|
|||||||
|
package nautilus.game.minekart.repository;
|
||||||
|
|
||||||
|
import mineplex.core.donation.repository.GameSalesPackageToken;
|
||||||
|
|
||||||
|
public class KartItemToken
|
||||||
|
{
|
||||||
|
public String Name;
|
||||||
|
public String Material;
|
||||||
|
public String Data;
|
||||||
|
public GameSalesPackageToken SalesPackage;
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
package nautilus.game.minekart.repository;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.bukkit.craftbukkit.libs.com.google.gson.reflect.TypeToken;
|
||||||
|
|
||||||
|
import mineplex.core.server.remotecall.JsonWebCall;
|
||||||
|
|
||||||
|
public class KartRepository
|
||||||
|
{
|
||||||
|
private String _webAddress;
|
||||||
|
|
||||||
|
public KartRepository(String webserverAddress)
|
||||||
|
{
|
||||||
|
_webAddress = webserverAddress;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<KartItemToken> GetKartItems(List<KartItemToken> itemTokens)
|
||||||
|
{
|
||||||
|
return new JsonWebCall(_webAddress + "MineKart/GetKartItems").Execute(new TypeToken<List<KartItemToken>>(){}.getType(), itemTokens);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,31 @@
|
|||||||
|
package nautilus.game.minekart.shop;
|
||||||
|
|
||||||
|
import mineplex.core.common.CurrencyType;
|
||||||
|
import mineplex.core.shop.item.SalesPackageBase;
|
||||||
|
import nautilus.game.minekart.kart.KartType;
|
||||||
|
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
public class KartItem extends SalesPackageBase
|
||||||
|
{
|
||||||
|
private KartType _kartType;
|
||||||
|
|
||||||
|
public KartItem(Material monsterEgg, KartType kartType)
|
||||||
|
{
|
||||||
|
super(kartType.GetName(), monsterEgg, (byte)0, kartType.GetDescription());
|
||||||
|
|
||||||
|
_kartType = kartType;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void Sold(Player player, CurrencyType currencyType)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public KartType GetKartType()
|
||||||
|
{
|
||||||
|
return _kartType;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,24 @@
|
|||||||
|
package nautilus.game.minekart.shop;
|
||||||
|
|
||||||
|
import mineplex.core.shop.item.IButton;
|
||||||
|
import nautilus.game.minekart.shop.page.KartPage;
|
||||||
|
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
public class KartItemButton implements IButton
|
||||||
|
{
|
||||||
|
private KartPage _shop;
|
||||||
|
private KartItem _kartItem;
|
||||||
|
|
||||||
|
public KartItemButton(KartPage shop, KartItem kartItem)
|
||||||
|
{
|
||||||
|
_shop = shop;
|
||||||
|
_kartItem = kartItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void Clicked(Player player)
|
||||||
|
{
|
||||||
|
_shop.PurchaseKart(player, _kartItem);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,25 @@
|
|||||||
|
package nautilus.game.minekart.shop;
|
||||||
|
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
import nautilus.game.minekart.KartFactory;
|
||||||
|
import nautilus.game.minekart.shop.page.KartPage;
|
||||||
|
import mineplex.core.account.CoreClientManager;
|
||||||
|
import mineplex.core.common.CurrencyType;
|
||||||
|
import mineplex.core.donation.DonationManager;
|
||||||
|
import mineplex.core.shop.ShopBase;
|
||||||
|
import mineplex.core.shop.page.ShopPageBase;
|
||||||
|
|
||||||
|
public class KartShop extends ShopBase<KartFactory>
|
||||||
|
{
|
||||||
|
public KartShop(KartFactory plugin, CoreClientManager clientManager, DonationManager donationManger, CurrencyType...currencyTypes)
|
||||||
|
{
|
||||||
|
super(plugin, clientManager, donationManger, "Kart Shop", currencyTypes);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected ShopPageBase<KartFactory, ? extends ShopBase<KartFactory>> BuildPagesFor(Player player)
|
||||||
|
{
|
||||||
|
return new KartPage(Plugin, ClientManager, DonationManager, this, player);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,189 @@
|
|||||||
|
package nautilus.game.minekart.shop.page;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import mineplex.core.account.CoreClientManager;
|
||||||
|
import mineplex.core.common.CurrencyType;
|
||||||
|
import mineplex.core.common.Rank;
|
||||||
|
import mineplex.core.common.util.C;
|
||||||
|
import mineplex.core.donation.DonationManager;
|
||||||
|
import mineplex.core.itemstack.ItemStackFactory;
|
||||||
|
import mineplex.core.shop.item.ShopItem;
|
||||||
|
import mineplex.core.shop.page.ConfirmationPage;
|
||||||
|
import mineplex.core.shop.page.ShopPageBase;
|
||||||
|
|
||||||
|
import nautilus.game.minekart.KartFactory;
|
||||||
|
import nautilus.game.minekart.kart.KartType;
|
||||||
|
import nautilus.game.minekart.shop.KartItem;
|
||||||
|
import nautilus.game.minekart.shop.KartItemButton;
|
||||||
|
import nautilus.game.minekart.shop.KartShop;
|
||||||
|
import net.minecraft.server.v1_7_R1.NBTTagList;
|
||||||
|
|
||||||
|
import org.bukkit.ChatColor;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.inventory.PlayerInventory;
|
||||||
|
|
||||||
|
public class KartPage extends ShopPageBase<KartFactory, KartShop>
|
||||||
|
{
|
||||||
|
public KartPage(KartFactory plugin, CoreClientManager clientManager, DonationManager donationManager, KartShop shop, Player player)
|
||||||
|
{
|
||||||
|
super(plugin, shop, clientManager, donationManager, " Kart Shop", player);
|
||||||
|
|
||||||
|
CurrencySlot = 22;
|
||||||
|
|
||||||
|
BuildPage();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void BuildPage()
|
||||||
|
{
|
||||||
|
getInventory().setItem(0, new ShopItem(Material.INK_SACK, (byte)1, "", new String[] {}, 1, false, true).getHandle());
|
||||||
|
getInventory().setItem(1, new ShopItem(Material.INK_SACK, (byte)4, "", new String[] {}, 1, false, true).getHandle());
|
||||||
|
getInventory().setItem(2, new ShopItem(Material.INK_SACK, (byte)3, "", new String[] {}, 1, false, true).getHandle());
|
||||||
|
getInventory().setItem(3, new ShopItem(Material.INK_SACK, (byte)6, "", new String[] {}, 1, false, true).getHandle());
|
||||||
|
getInventory().setItem(4, new ShopItem(Material.INK_SACK, (byte)8, "", new String[] {}, 1, false, true).getHandle());
|
||||||
|
getInventory().setItem(5, new ShopItem(Material.INK_SACK, (byte)2, "", new String[] {}, 1, false, true).getHandle());
|
||||||
|
getInventory().setItem(6, new ShopItem(Material.INK_SACK, (byte)12, "", new String[] {}, 1, false, true).getHandle());
|
||||||
|
getInventory().setItem(7, new ShopItem(Material.INK_SACK, (byte)10, "", new String[] {}, 1, false, true).getHandle());
|
||||||
|
getInventory().setItem(8, new ShopItem(Material.INK_SACK, (byte)13, "", new String[] {}, 1, false, true).getHandle());
|
||||||
|
|
||||||
|
UpdateKarts();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void PlayerOpened()
|
||||||
|
{
|
||||||
|
UpdateKarts();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void ShowKartStats(KartType kartType)
|
||||||
|
{
|
||||||
|
for (KartItem item : Plugin.GetKarts())
|
||||||
|
{
|
||||||
|
if (kartType == item.GetKartType())
|
||||||
|
{
|
||||||
|
PlayerInventory inventory = Player.getInventory();
|
||||||
|
inventory.clear();
|
||||||
|
|
||||||
|
double statValue = Math.ceil((kartType.GetTopSpeed() * 100 - 79) / 2.625);
|
||||||
|
Material statMaterial = GetStatMaterial(statValue);
|
||||||
|
int slot = 9;
|
||||||
|
inventory.setItem(slot, ItemStackFactory.Instance.CreateStack(Material.WOOD_HOE, (byte)0, (int)(kartType.GetTopSpeed() * 100), "§e§lTop Speed"));
|
||||||
|
|
||||||
|
slot++;
|
||||||
|
while (statValue >= 1)
|
||||||
|
{
|
||||||
|
inventory.setItem(slot, ItemStackFactory.Instance.CreateStack(statMaterial, (byte)0, 1, "§e§lSpeed Bar"));
|
||||||
|
slot++;
|
||||||
|
statValue -= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
statValue = kartType.GetAcceleration() - 10;
|
||||||
|
statMaterial = GetStatMaterial(statValue);
|
||||||
|
slot = 18;
|
||||||
|
inventory.setItem(slot, ItemStackFactory.Instance.CreateStack(Material.STONE_HOE, (byte)0, (int)statValue, "§e§lAcceleration"));
|
||||||
|
|
||||||
|
slot++;
|
||||||
|
while (statValue >= 1)
|
||||||
|
{
|
||||||
|
inventory.setItem(slot, ItemStackFactory.Instance.CreateStack(statMaterial, (byte)0, 1, "§e§lAcceleration Bar"));
|
||||||
|
slot++;
|
||||||
|
statValue -= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
statValue = kartType.GetHandling() - 10;
|
||||||
|
statMaterial = GetStatMaterial(statValue);
|
||||||
|
slot = 27;
|
||||||
|
inventory.setItem(slot, ItemStackFactory.Instance.CreateStack(Material.IRON_HOE, (byte)0, (int)statValue, "§e§lHandling"));
|
||||||
|
|
||||||
|
slot++;
|
||||||
|
while (statValue >= 1)
|
||||||
|
{
|
||||||
|
inventory.setItem(slot, ItemStackFactory.Instance.CreateStack(statMaterial, (byte)0, 1, "§e§lHandling Bar"));
|
||||||
|
slot++;
|
||||||
|
statValue -= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void UpdateKarts()
|
||||||
|
{
|
||||||
|
int slot = 45;
|
||||||
|
boolean locked = true;
|
||||||
|
|
||||||
|
for (KartItem item : Plugin.GetKarts())
|
||||||
|
{
|
||||||
|
if (DonationManager.Get(Client.GetPlayerName()).Owns(item.GetSalesPackageId()) || DonationManager.Get(Client.GetPlayerName()).OwnsUnknownPackage("Minekart ULTRA") || Client.GetRank().Has(Client.GetPlayer(), Rank.ULTRA, false) || item.IsFree())
|
||||||
|
locked = false;
|
||||||
|
else
|
||||||
|
locked = true;
|
||||||
|
|
||||||
|
List<String> itemLore = new ArrayList<String>();
|
||||||
|
|
||||||
|
if (locked)
|
||||||
|
{
|
||||||
|
StringBuilder currencyBuilder = new StringBuilder();
|
||||||
|
|
||||||
|
int cost = item.GetCost(CurrencyType.Gems);
|
||||||
|
|
||||||
|
if (cost > 0)
|
||||||
|
{
|
||||||
|
currencyBuilder.append(C.cYellow + cost + " Gems");
|
||||||
|
}
|
||||||
|
|
||||||
|
itemLore.add(currencyBuilder.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
itemLore.add(C.cBlack);
|
||||||
|
|
||||||
|
itemLore.add(C.cWhite + "Max Speed: " + GetStatColor(Math.ceil((item.GetKartType().GetTopSpeed() * 100 - 79) / 2.625)) + item.GetKartType().GetTopSpeed() * 100);
|
||||||
|
itemLore.add(C.cWhite + "Acceleration: " + GetStatColor(item.GetKartType().GetAcceleration() - 10) + (item.GetKartType().GetAcceleration() - 10));
|
||||||
|
itemLore.add(C.cWhite + "Handling: " + GetStatColor(item.GetKartType().GetHandling() - 10) + (item.GetKartType().GetHandling() - 10));
|
||||||
|
itemLore.add(C.cWhite + "Weight: " + GetStatColor(item.GetKartType().GetStability() - 10) + (item.GetKartType().GetStability() - 10));
|
||||||
|
|
||||||
|
itemLore.add(C.cBlack);
|
||||||
|
|
||||||
|
itemLore.add(C.cWhite + "Special Item: " + C.cYellow + item.GetKartType().GetKartItem().GetName());
|
||||||
|
|
||||||
|
ShopItem shopItem = new ShopItem(item.GetDisplayMaterial(),
|
||||||
|
item.GetDisplayData(), item.GetName(),
|
||||||
|
itemLore.toArray(new String[itemLore.size()]), 1, locked,
|
||||||
|
false);
|
||||||
|
|
||||||
|
if (!locked)
|
||||||
|
{
|
||||||
|
shopItem.getHandle().tag.set("ench", new NBTTagList());
|
||||||
|
}
|
||||||
|
|
||||||
|
AddButton(slot, shopItem, new KartItemButton(this, item));
|
||||||
|
slot++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private ChatColor GetStatColor(double statValue)
|
||||||
|
{
|
||||||
|
return statValue >= 3 ? (statValue >= 6 ? ChatColor.GREEN : ChatColor.YELLOW) : ChatColor.RED;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Material GetStatMaterial(double statValue)
|
||||||
|
{
|
||||||
|
return statValue >= 3 ? (statValue >= 6 ? Material.EMERALD : Material.GOLD_NUGGET) : Material.REDSTONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void PurchaseKart(Player player, KartItem kartItem)
|
||||||
|
{
|
||||||
|
if ((DonationManager.Get(Client.GetPlayerName()).GetGems() > kartItem.GetCost(CurrencyType.Gems)) && !DonationManager.Get(Client.GetPlayerName()).Owns(kartItem.GetSalesPackageId()) && !DonationManager.Get(Client.GetPlayerName()).OwnsUnknownPackage("Minekart ULTRA") && !Client.GetRank().Has(Client.GetPlayer(), Rank.ULTRA, false) && !kartItem.IsFree())
|
||||||
|
{
|
||||||
|
PlayAcceptSound(player);
|
||||||
|
Shop.OpenPageForPlayer(player, new ConfirmationPage<KartFactory, KartShop>(Plugin, Shop, ClientManager, DonationManager, null,
|
||||||
|
this, kartItem, SelectedCurrency, player));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
PlayDenySound(player);
|
||||||
|
ShowKartStats(kartItem.GetKartType());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,708 @@
|
|||||||
|
package nautilus.game.minekart.track;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.DataInputStream;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
import mineplex.core.common.util.F;
|
||||||
|
import mineplex.core.common.util.FileUtil;
|
||||||
|
import mineplex.core.common.util.MapUtil;
|
||||||
|
import mineplex.core.common.util.UtilAlg;
|
||||||
|
import mineplex.core.common.util.UtilPlayer;
|
||||||
|
import mineplex.core.common.util.UtilServer;
|
||||||
|
import mineplex.core.common.util.UtilTime;
|
||||||
|
import mineplex.core.common.util.WorldUtil;
|
||||||
|
import mineplex.core.recharge.Recharge;
|
||||||
|
import mineplex.core.teleport.Teleport;
|
||||||
|
import nautilus.game.minekart.gp.GP;
|
||||||
|
import nautilus.game.minekart.gp.GPBattle;
|
||||||
|
import nautilus.game.minekart.kart.Kart;
|
||||||
|
import nautilus.game.minekart.track.ents.*;
|
||||||
|
import nautilus.minecraft.core.utils.ZipUtil;
|
||||||
|
import net.minecraft.server.v1_7_R1.ChunkPreLoadEvent;
|
||||||
|
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.Sound;
|
||||||
|
import org.bukkit.World;
|
||||||
|
import org.bukkit.WorldCreator;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.world.ChunkUnloadEvent;
|
||||||
|
import org.bukkit.util.Vector;
|
||||||
|
|
||||||
|
public class Track
|
||||||
|
{
|
||||||
|
public enum TrackState
|
||||||
|
{
|
||||||
|
Loading,
|
||||||
|
Countdown,
|
||||||
|
Live,
|
||||||
|
Ending,
|
||||||
|
Ended
|
||||||
|
}
|
||||||
|
|
||||||
|
private World World = null;
|
||||||
|
|
||||||
|
private int MinX = 0;
|
||||||
|
private int MinZ = 0;
|
||||||
|
private int MaxX = 0;
|
||||||
|
private int MaxZ = 0;
|
||||||
|
private int CurX = 0;
|
||||||
|
private int CurZ = 0;
|
||||||
|
|
||||||
|
private GP GP;
|
||||||
|
private Teleport _teleport;
|
||||||
|
private Recharge _recharge;
|
||||||
|
private int _trackId;
|
||||||
|
|
||||||
|
private String _name;
|
||||||
|
private String _file;
|
||||||
|
|
||||||
|
//Race Data
|
||||||
|
private TrackState _state = TrackState.Loading;
|
||||||
|
private long _stateTime = System.currentTimeMillis();
|
||||||
|
private int _countdown = 6;
|
||||||
|
private boolean _nextTrack = false;
|
||||||
|
|
||||||
|
private HashMap<Kart, Double> _scores = new HashMap<Kart, Double>();
|
||||||
|
private ArrayList<Kart> _positions = new ArrayList<Kart>();
|
||||||
|
|
||||||
|
//Map Data
|
||||||
|
private float _yaw = 0f;
|
||||||
|
private ArrayList<Location> _kartStart;
|
||||||
|
private ArrayList<Location> _returnPoints;
|
||||||
|
private ArrayList<Location> _trackProgress;
|
||||||
|
private ArrayList<TrackItem> _itemBlocks;
|
||||||
|
|
||||||
|
private HashMap<Location, Double> _jumps;
|
||||||
|
|
||||||
|
private ArrayList<TrackEntity> _creatures;
|
||||||
|
|
||||||
|
private ArrayList<Integer> _trackBlocks;
|
||||||
|
private ArrayList<Integer> _returnBlocks;
|
||||||
|
|
||||||
|
public Track(GP gp, Teleport teleport, Recharge recharge, String file, int id)
|
||||||
|
{
|
||||||
|
GP = gp;
|
||||||
|
_teleport = teleport;
|
||||||
|
_recharge = recharge;
|
||||||
|
|
||||||
|
_trackId = id;
|
||||||
|
|
||||||
|
_file = file;
|
||||||
|
|
||||||
|
_kartStart = new ArrayList<Location>();
|
||||||
|
_returnPoints = new ArrayList<Location>();
|
||||||
|
_trackProgress = new ArrayList<Location>();
|
||||||
|
_itemBlocks = new ArrayList<TrackItem>();
|
||||||
|
|
||||||
|
_jumps = new HashMap<Location, Double>();
|
||||||
|
_creatures = new ArrayList<TrackEntity>();
|
||||||
|
|
||||||
|
_trackBlocks = new ArrayList<Integer>();
|
||||||
|
_returnBlocks = new ArrayList<Integer>();
|
||||||
|
|
||||||
|
//Register Self
|
||||||
|
GP.Manager.TrackManager.RegisterTrack(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public GP GetGP()
|
||||||
|
{
|
||||||
|
return GP;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String GetName()
|
||||||
|
{
|
||||||
|
return _name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String GetFile()
|
||||||
|
{
|
||||||
|
return _file;
|
||||||
|
}
|
||||||
|
|
||||||
|
public World GetWorld()
|
||||||
|
{
|
||||||
|
return World;
|
||||||
|
}
|
||||||
|
|
||||||
|
public float GetYaw()
|
||||||
|
{
|
||||||
|
return _yaw;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ArrayList<Location> GetSpawns()
|
||||||
|
{
|
||||||
|
return _kartStart;
|
||||||
|
}
|
||||||
|
|
||||||
|
public HashMap<Kart, Double> GetScores()
|
||||||
|
{
|
||||||
|
return _scores;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ArrayList<Kart> GetPositions()
|
||||||
|
{
|
||||||
|
return _positions;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ArrayList<Location> GetProgress()
|
||||||
|
{
|
||||||
|
return _trackProgress;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ArrayList<Location> GetReturn()
|
||||||
|
{
|
||||||
|
return _returnPoints;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ArrayList<TrackItem> GetItems()
|
||||||
|
{
|
||||||
|
return _itemBlocks;
|
||||||
|
}
|
||||||
|
|
||||||
|
public HashMap<Location, Double> GetJumps()
|
||||||
|
{
|
||||||
|
return _jumps;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ArrayList<TrackEntity> GetCreatures()
|
||||||
|
{
|
||||||
|
return _creatures;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ArrayList<Integer> GetTrackBlocks()
|
||||||
|
{
|
||||||
|
return _trackBlocks;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ArrayList<Integer> GetReturnBlocks()
|
||||||
|
{
|
||||||
|
return _returnBlocks;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetState(TrackState state)
|
||||||
|
{
|
||||||
|
if (_state != state)
|
||||||
|
{
|
||||||
|
if (state == TrackState.Ended || _state == TrackState.Ended)
|
||||||
|
GP.SwitchScoreboards();
|
||||||
|
else if (state == TrackState.Countdown || _state == TrackState.Countdown)
|
||||||
|
GP.SwitchScoreboards();
|
||||||
|
}
|
||||||
|
|
||||||
|
_state = state;
|
||||||
|
_stateTime = System.currentTimeMillis();
|
||||||
|
_countdown = 31;
|
||||||
|
|
||||||
|
if (state == TrackState.Countdown)
|
||||||
|
_countdown = 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
public TrackState GetState()
|
||||||
|
{
|
||||||
|
return _state;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long GetStateTime()
|
||||||
|
{
|
||||||
|
return _stateTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Update()
|
||||||
|
{
|
||||||
|
String type = "Race";
|
||||||
|
if (GP instanceof GPBattle)
|
||||||
|
type = "Battle";
|
||||||
|
|
||||||
|
if (_state == TrackState.Loading)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
else if (_state == TrackState.Countdown)
|
||||||
|
{
|
||||||
|
if (UtilTime.elapsed(_stateTime, 1000))
|
||||||
|
{
|
||||||
|
_stateTime = System.currentTimeMillis();
|
||||||
|
_countdown--;
|
||||||
|
|
||||||
|
//Inform + Sound
|
||||||
|
for (Player cur : GP.GetPlayers())
|
||||||
|
{
|
||||||
|
if (_countdown > 5)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
else if (_countdown > 0)
|
||||||
|
{
|
||||||
|
UtilPlayer.message(cur, F.main("MK", type + " begins in " + F.time(_countdown + " Seconds") + "..."));
|
||||||
|
cur.playSound(cur.getLocation(), Sound.NOTE_PIANO, 1f, 1f);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
UtilPlayer.message(cur, F.main("MK", type + " has started!"));
|
||||||
|
cur.playSound(cur.getLocation(), Sound.NOTE_PIANO, 2f, 2f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_countdown <= 0)
|
||||||
|
SetState(TrackState.Live);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (_state == TrackState.Live)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
else if (_state == TrackState.Ending)
|
||||||
|
{
|
||||||
|
boolean allFinished = true;
|
||||||
|
|
||||||
|
for (Kart kart : GetGP().GetKarts())
|
||||||
|
if (!kart.HasFinishedTrack())
|
||||||
|
allFinished = false;
|
||||||
|
|
||||||
|
if (allFinished)
|
||||||
|
{
|
||||||
|
GP.Announce(F.main("MK", type + " has ended."));
|
||||||
|
SetState(TrackState.Ended);
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (UtilTime.elapsed(_stateTime, 1000))
|
||||||
|
{
|
||||||
|
_stateTime = System.currentTimeMillis();
|
||||||
|
_countdown--;
|
||||||
|
|
||||||
|
//Inform + Sound
|
||||||
|
if (_countdown%5 == 0)
|
||||||
|
{
|
||||||
|
GP.Announce(F.main("MK", type + " ends in " + F.time(_countdown + " Seconds") + "..."));
|
||||||
|
|
||||||
|
for (Player cur : GP.GetPlayers())
|
||||||
|
{
|
||||||
|
if (_countdown > 0) cur.playSound(cur.getLocation(), Sound.NOTE_PIANO, 1f, 0.5f);
|
||||||
|
else cur.playSound(cur.getLocation(), Sound.NOTE_PIANO, 2f, 0f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_countdown <= 0)
|
||||||
|
{
|
||||||
|
GP.Announce(F.main("MK", type + " has ended."));
|
||||||
|
SetState(TrackState.Ended);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (_nextTrack)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (UtilTime.elapsed(_stateTime, 10000))
|
||||||
|
{
|
||||||
|
GetGP().NextTrack();
|
||||||
|
_nextTrack = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected String GetFolder()
|
||||||
|
{
|
||||||
|
return GetGP().GetId() + "-" + GetGP().GetSet().GetName() + "-" + GetFile();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Initialize()
|
||||||
|
{
|
||||||
|
final Track track = this;
|
||||||
|
|
||||||
|
System.out.println("Initializing....");
|
||||||
|
|
||||||
|
UtilServer.getServer().getScheduler().runTaskAsynchronously(GP.Manager.GetPlugin(), new Runnable()
|
||||||
|
{
|
||||||
|
public void run()
|
||||||
|
{
|
||||||
|
//Unzip
|
||||||
|
track.UnzipWorld();
|
||||||
|
|
||||||
|
//Load Track Data Sync
|
||||||
|
UtilServer.getServer().getScheduler().runTask(GP.Manager.GetPlugin(), new Runnable()
|
||||||
|
{
|
||||||
|
public void run()
|
||||||
|
{
|
||||||
|
//Start World
|
||||||
|
World = WorldUtil.LoadWorld(new WorldCreator(GetFolder()));
|
||||||
|
|
||||||
|
//Load Track Data
|
||||||
|
track.LoadTrackData();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void UnzipWorld()
|
||||||
|
{
|
||||||
|
String folder = GetFolder();
|
||||||
|
new File(folder).mkdir();
|
||||||
|
new File(folder + File.separatorChar + "region").mkdir();
|
||||||
|
new File(folder + File.separatorChar + "data").mkdir();
|
||||||
|
ZipUtil.UnzipToDirectory(GetFile() + ".zip", folder);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void LoadTrackData()
|
||||||
|
{
|
||||||
|
//Load Track Data
|
||||||
|
try
|
||||||
|
{
|
||||||
|
FileInputStream fstream = new FileInputStream(GetFolder() + File.separatorChar + "TrackInfo.dat");
|
||||||
|
DataInputStream in = new DataInputStream(fstream);
|
||||||
|
BufferedReader br = new BufferedReader(new InputStreamReader(in));
|
||||||
|
String line;
|
||||||
|
|
||||||
|
while ((line = br.readLine()) != null)
|
||||||
|
{
|
||||||
|
String[] tokens = line.split(":");
|
||||||
|
|
||||||
|
if (tokens.length < 2)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (tokens[0].length() == 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
//TRACK NAME
|
||||||
|
if (tokens[0].equalsIgnoreCase("TRACK_NAME"))
|
||||||
|
{
|
||||||
|
_name = tokens[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (tokens[0].equalsIgnoreCase("ROAD_TYPES"))
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
_trackBlocks.add(Integer.parseInt(tokens[1]));
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
System.out.println("Track Data Read Error: Invalid Road Type [" + tokens[1] + "]");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (tokens[0].equalsIgnoreCase("RETURN_TYPES"))
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
_returnBlocks.add(Integer.parseInt(tokens[1]));
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
System.out.println("Track Data Read Error: Invalid Return Type [" + tokens[1] + "]");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (tokens[0].equalsIgnoreCase("SPAWN_DIRECTION"))
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
_yaw = Float.valueOf(tokens[1]);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
System.out.println("Track Data Read Error: Invalid Yaw [" + tokens[1] + "]");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (tokens[0].equalsIgnoreCase("SPAWNS"))
|
||||||
|
{
|
||||||
|
for (int i=1 ; i<tokens.length ; i++)
|
||||||
|
{
|
||||||
|
Location loc = StrToLoc(tokens[i]);
|
||||||
|
if (loc == null) continue;
|
||||||
|
|
||||||
|
_kartStart.add(loc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (tokens[0].equalsIgnoreCase("PROGRESS"))
|
||||||
|
{
|
||||||
|
for (int i=1 ; i<tokens.length ; i++)
|
||||||
|
{
|
||||||
|
Location loc = StrToLoc(tokens[i]);
|
||||||
|
if (loc == null) continue;
|
||||||
|
|
||||||
|
_trackProgress.add(loc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (tokens[0].equalsIgnoreCase("RETURNS"))
|
||||||
|
{
|
||||||
|
for (int i=1 ; i<tokens.length ; i++)
|
||||||
|
{
|
||||||
|
Location loc = StrToLoc(tokens[i]);
|
||||||
|
if (loc == null) continue;
|
||||||
|
|
||||||
|
_returnPoints.add(loc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (tokens[0].equalsIgnoreCase("ITEMS"))
|
||||||
|
{
|
||||||
|
for (int i=1 ; i<tokens.length ; i++)
|
||||||
|
{
|
||||||
|
Location loc = StrToLoc(tokens[i]);
|
||||||
|
if (loc == null) continue;
|
||||||
|
|
||||||
|
_itemBlocks.add(new TrackItem(loc));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (tokens[0].equalsIgnoreCase("CREATURES"))
|
||||||
|
{
|
||||||
|
for (int i=1 ; i<tokens.length ; i++)
|
||||||
|
{
|
||||||
|
String[] ents = tokens[i].split("@");
|
||||||
|
|
||||||
|
Location loc = StrToLoc(ents[1]);
|
||||||
|
if (loc == null) continue;
|
||||||
|
|
||||||
|
loc = loc.getBlock().getLocation();
|
||||||
|
loc.subtract(0, 1, 0);
|
||||||
|
|
||||||
|
TrackEntity ent = null;
|
||||||
|
|
||||||
|
if (ents[0].equalsIgnoreCase("BOMB")) ent = new Bomb(this, loc);
|
||||||
|
if (ents[0].equalsIgnoreCase("MOLE")) ent = new Mole(this, loc);
|
||||||
|
if (ents[0].equalsIgnoreCase("FISH")) ent = new Silverfish(this, loc);
|
||||||
|
if (ents[0].equalsIgnoreCase("TRAIN")) ent = new Train(this, loc);
|
||||||
|
|
||||||
|
if (ent != null)
|
||||||
|
{
|
||||||
|
_creatures.add(ent);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
System.out.println("Track Data Read Error: Invalid Track Entity [" + ents[0] + "]");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (tokens[0].equalsIgnoreCase("JUMPS"))
|
||||||
|
{
|
||||||
|
for (int i=1 ; i<tokens.length ; i++)
|
||||||
|
{
|
||||||
|
String[] jumps = tokens[i].split("@");
|
||||||
|
|
||||||
|
Location loc = StrToLoc(jumps[1]);
|
||||||
|
if (loc == null) continue;
|
||||||
|
|
||||||
|
loc = loc.getBlock().getLocation();
|
||||||
|
|
||||||
|
_jumps.put(loc, Double.parseDouble(jumps[0]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (tokens[0].equalsIgnoreCase("MIN_X"))
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
MinX = Integer.parseInt(tokens[1]);
|
||||||
|
CurX = MinX;
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
System.out.println("Track Data Read Error: Invalid MinX [" + tokens[1] + "]");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else if (tokens[0].equalsIgnoreCase("MAX_X"))
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
MaxX = Integer.parseInt(tokens[1]);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
System.out.println("Track Data Read Error: Invalid MaxX [" + tokens[1] + "]");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (tokens[0].equalsIgnoreCase("MIN_Z"))
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
MinZ = Integer.parseInt(tokens[1]);
|
||||||
|
CurZ = MinZ;
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
System.out.println("Track Data Read Error: Invalid MinZ [" + tokens[1] + "]");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (tokens[0].equalsIgnoreCase("MAX_Z"))
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
MaxZ = Integer.parseInt(tokens[1]);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
System.out.println("Track Data Read Error: Invalid MaxZ [" + tokens[1] + "]");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
in.close();
|
||||||
|
|
||||||
|
GP.Manager.TrackManager.LoadTrack(this);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
System.err.println("Error: " + e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean LoadChunks(long maxMilliseconds)
|
||||||
|
{
|
||||||
|
long startTime = System.currentTimeMillis();
|
||||||
|
|
||||||
|
for (; CurX <= MaxX; CurX += 16)
|
||||||
|
{
|
||||||
|
for (; CurZ <= MaxZ; CurZ += 16)
|
||||||
|
{
|
||||||
|
if (System.currentTimeMillis() - startTime >= maxMilliseconds)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
World.getChunkAt(new Location(World, CurX, 0, CurZ));
|
||||||
|
}
|
||||||
|
|
||||||
|
CurZ = MinZ;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Uninitialize()
|
||||||
|
{
|
||||||
|
//Wipe Storage
|
||||||
|
_kartStart.clear();
|
||||||
|
_returnPoints.clear();
|
||||||
|
_trackProgress.clear();
|
||||||
|
_itemBlocks.clear();
|
||||||
|
_jumps.clear();
|
||||||
|
_creatures.clear();
|
||||||
|
_trackBlocks.clear();
|
||||||
|
_returnBlocks.clear();
|
||||||
|
|
||||||
|
//Wipe World
|
||||||
|
MapUtil.UnloadWorld(GetGP().Manager.GetPlugin(), World);
|
||||||
|
MapUtil.ClearWorldReferences(World.getName());
|
||||||
|
FileUtil.DeleteFolder(new File(World.getName()));
|
||||||
|
|
||||||
|
World = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Location StrToLoc(String loc)
|
||||||
|
{
|
||||||
|
String[] coords = loc.split(",");
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return new Location(World, Integer.valueOf(coords[0])+0.5, Integer.valueOf(coords[1]), Integer.valueOf(coords[2])+0.5);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
System.out.println("Track Data Read Error: Invalid Location String [" + loc + "]");
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SpawnTeleport()
|
||||||
|
{
|
||||||
|
Track prevTrack = GP.GetTrack(_trackId - 1);
|
||||||
|
|
||||||
|
//Use Previous Positions
|
||||||
|
if (prevTrack != null)
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
for (Kart kart : prevTrack.GetPositions())
|
||||||
|
{
|
||||||
|
Location loc = GetSpawns().get(i);
|
||||||
|
loc.setYaw(GetYaw());
|
||||||
|
loc.setPitch(30f);
|
||||||
|
|
||||||
|
//Battle
|
||||||
|
if (GetGP() instanceof GPBattle)
|
||||||
|
{
|
||||||
|
Vector dir = UtilAlg.getTrajectory(kart.GetDriver().getLocation(), GetProgress().get(0));
|
||||||
|
loc.setYaw(UtilAlg.GetYaw(dir));
|
||||||
|
loc.setPitch(UtilAlg.GetPitch(dir));
|
||||||
|
}
|
||||||
|
|
||||||
|
_teleport.TP(kart.GetDriver(), loc, false);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//Use Join Positions
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
for (Player player : GetGP().GetPlayers())
|
||||||
|
{
|
||||||
|
Location loc = GetSpawns().get(i);
|
||||||
|
loc.setYaw(GetYaw());
|
||||||
|
loc.setPitch(30f);
|
||||||
|
|
||||||
|
//Battle
|
||||||
|
if (GetGP() instanceof GPBattle)
|
||||||
|
{
|
||||||
|
Vector dir = UtilAlg.getTrajectory(player.getLocation(), GetProgress().get(0));
|
||||||
|
loc.setYaw(UtilAlg.GetYaw(dir));
|
||||||
|
loc.setPitch(UtilAlg.GetPitch(dir));
|
||||||
|
}
|
||||||
|
|
||||||
|
_teleport.TP(player, loc, false);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RemoveKart(Kart kart)
|
||||||
|
{
|
||||||
|
_scores.remove(kart);
|
||||||
|
_positions.remove(kart);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ChunkUnload(ChunkUnloadEvent event)
|
||||||
|
{
|
||||||
|
if (World == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!event.getWorld().equals(World))
|
||||||
|
return;
|
||||||
|
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ChunkLoad(ChunkPreLoadEvent event)
|
||||||
|
{
|
||||||
|
if (World == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!event.GetWorld().equals(World))
|
||||||
|
return;
|
||||||
|
|
||||||
|
int x = event.GetX();
|
||||||
|
int z = event.GetZ();
|
||||||
|
|
||||||
|
if (x >= MinX >> 4 && x <= MaxX >> 4 && z >= MinZ >> 4 && z <= MaxZ >> 4)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Recharge GetRecharge()
|
||||||
|
{
|
||||||
|
return _recharge;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,153 @@
|
|||||||
|
package nautilus.game.minekart.track;
|
||||||
|
|
||||||
|
import mineplex.core.common.util.UtilMath;
|
||||||
|
import mineplex.core.common.util.UtilTime;
|
||||||
|
import nautilus.game.minekart.kart.Kart;
|
||||||
|
import net.minecraft.server.v1_7_R1.EntityCreature;
|
||||||
|
import net.minecraft.server.v1_7_R1.Navigation;
|
||||||
|
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.craftbukkit.v1_7_R1.entity.CraftCreature;
|
||||||
|
import org.bukkit.entity.Creature;
|
||||||
|
import org.bukkit.entity.Entity;
|
||||||
|
import org.bukkit.entity.EntityType;
|
||||||
|
|
||||||
|
public abstract class TrackEntity
|
||||||
|
{
|
||||||
|
public Track Track;
|
||||||
|
|
||||||
|
private String _name;
|
||||||
|
|
||||||
|
private Entity _ent;
|
||||||
|
private EntityType _type;
|
||||||
|
|
||||||
|
private Location _loc;
|
||||||
|
private double _offset = 3;
|
||||||
|
private double _collideRange = 1;
|
||||||
|
|
||||||
|
private long _spawnRate = 30000;
|
||||||
|
private long _spawnTimer = 0;
|
||||||
|
|
||||||
|
public TrackEntity(Track track, EntityType type, String name, double offset, double collideRange, long spawnRate, Location loc)
|
||||||
|
{
|
||||||
|
Track = track;
|
||||||
|
|
||||||
|
_name = name;
|
||||||
|
|
||||||
|
_type = type;
|
||||||
|
|
||||||
|
_spawnRate = spawnRate;
|
||||||
|
|
||||||
|
_offset = offset;
|
||||||
|
_collideRange = collideRange;
|
||||||
|
|
||||||
|
_loc = loc;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String GetName()
|
||||||
|
{
|
||||||
|
return _name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Entity GetEntity()
|
||||||
|
{
|
||||||
|
return _ent;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetEntity(Entity ent)
|
||||||
|
{
|
||||||
|
_ent = ent;
|
||||||
|
}
|
||||||
|
|
||||||
|
public EntityType GetType()
|
||||||
|
{
|
||||||
|
return _type;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Location GetLocation()
|
||||||
|
{
|
||||||
|
return _loc;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long GetSpawnRate()
|
||||||
|
{
|
||||||
|
return _spawnRate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long GetSpawnTimer()
|
||||||
|
{
|
||||||
|
return _spawnTimer;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetSpawnTimer(long time)
|
||||||
|
{
|
||||||
|
_spawnTimer = time;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double GetOffset()
|
||||||
|
{
|
||||||
|
return _offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double GetCollideRange()
|
||||||
|
{
|
||||||
|
return _collideRange;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean Update()
|
||||||
|
{
|
||||||
|
//Respawn
|
||||||
|
if (GetEntity() == null || !GetEntity().isValid())
|
||||||
|
{
|
||||||
|
Respawn();
|
||||||
|
}
|
||||||
|
//Return
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Movement();
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Respawn()
|
||||||
|
{
|
||||||
|
if (GetType() == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (GetEntity() != null)
|
||||||
|
GetEntity().remove();
|
||||||
|
|
||||||
|
if (UtilTime.elapsed(GetSpawnTimer(), GetSpawnRate()))
|
||||||
|
{
|
||||||
|
_ent = GetLocation().getWorld().spawnEntity(GetLocation(), GetType());
|
||||||
|
SetSpawnTimer(System.currentTimeMillis());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Movement()
|
||||||
|
{
|
||||||
|
if (UtilMath.offset(GetLocation(), GetEntity().getLocation()) > GetOffset())
|
||||||
|
{
|
||||||
|
if (GetEntity() instanceof Creature)
|
||||||
|
{
|
||||||
|
EntityCreature ec = ((CraftCreature)GetEntity()).getHandle();
|
||||||
|
Navigation nav = ec.getNavigation();
|
||||||
|
nav.a(GetLocation().getX(), GetLocation().getY(), GetLocation().getZ(), 0.4f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void CheckCollision(Kart kart)
|
||||||
|
{
|
||||||
|
if (GetEntity() == null || !GetEntity().isValid())
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (UtilMath.offset(kart.GetDriver().getLocation(), GetEntity().getLocation()) > GetCollideRange())
|
||||||
|
return;
|
||||||
|
|
||||||
|
Collide(kart);
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract void Collide(Kart kart);
|
||||||
|
}
|
@ -0,0 +1,71 @@
|
|||||||
|
package nautilus.game.minekart.track;
|
||||||
|
|
||||||
|
import nautilus.game.minekart.kart.Kart;
|
||||||
|
|
||||||
|
import org.bukkit.Effect;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.World;
|
||||||
|
import org.bukkit.entity.Entity;
|
||||||
|
import org.bukkit.entity.EntityType;
|
||||||
|
|
||||||
|
public class TrackItem
|
||||||
|
{
|
||||||
|
private Location _loc;
|
||||||
|
private Entity _ent = null;
|
||||||
|
private long _delay = 0;
|
||||||
|
|
||||||
|
public TrackItem(Location loc)
|
||||||
|
{
|
||||||
|
_loc = loc;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Location GetLocation()
|
||||||
|
{
|
||||||
|
return _loc;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Entity GetEntity()
|
||||||
|
{
|
||||||
|
return _ent;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long GetDelay()
|
||||||
|
{
|
||||||
|
return _delay;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetEntity(Entity ent)
|
||||||
|
{
|
||||||
|
_ent = ent;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetDelay(long delay)
|
||||||
|
{
|
||||||
|
_delay = delay;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SpawnEntity(World world)
|
||||||
|
{
|
||||||
|
if (GetEntity() != null)
|
||||||
|
GetEntity().remove();
|
||||||
|
|
||||||
|
SetEntity(world.spawnEntity(_loc.clone().add(0, 0, 0), EntityType.ENDER_CRYSTAL));
|
||||||
|
|
||||||
|
//SetEntity(world.dropItem(new Location(_loc.getWorld(), _loc.getX(), _loc.getY() + 1, _loc.getZ()), new ItemStack(Material.CHEST)));
|
||||||
|
//SetEntity(world.spawnFallingBlock(GetLocation(), Material.LOCKED_CHEST, (byte)0));
|
||||||
|
//GetEntity().setVelocity(new Vector(0,0,0));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Pickup(Kart kart)
|
||||||
|
{
|
||||||
|
if (GetEntity() != null)
|
||||||
|
GetEntity().remove();
|
||||||
|
|
||||||
|
SetEntity(null);
|
||||||
|
SetDelay(System.currentTimeMillis());
|
||||||
|
|
||||||
|
GetLocation().getWorld().playEffect(GetLocation().clone().add(0, 1, 0), Effect.STEP_SOUND, 35);
|
||||||
|
|
||||||
|
kart.PickupItem();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,243 @@
|
|||||||
|
package nautilus.game.minekart.track;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Iterator;
|
||||||
|
|
||||||
|
import mineplex.core.common.util.UtilMath;
|
||||||
|
import mineplex.core.common.util.UtilTime;
|
||||||
|
import nautilus.game.minekart.kart.Kart;
|
||||||
|
import nautilus.game.minekart.track.Track.TrackState;
|
||||||
|
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.block.Block;
|
||||||
|
import org.bukkit.block.BlockFace;
|
||||||
|
import org.bukkit.util.Vector;
|
||||||
|
|
||||||
|
public class TrackLogic
|
||||||
|
{
|
||||||
|
public static void Positions(Track track)
|
||||||
|
{
|
||||||
|
if (track.GetWorld() == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (track.GetState() == TrackState.Loading || track.GetState() == TrackState.Ended)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (Kart kart : track.GetGP().GetKarts())
|
||||||
|
SetKartProgress(track, kart);
|
||||||
|
|
||||||
|
//Store Scores
|
||||||
|
track.GetScores().clear();
|
||||||
|
for (Kart kart : track.GetGP().GetKarts())
|
||||||
|
track.GetScores().put(kart, kart.GetLapScore());
|
||||||
|
|
||||||
|
|
||||||
|
ArrayList<Kart> pos = track.GetPositions();
|
||||||
|
|
||||||
|
//Order Scores
|
||||||
|
pos.clear();
|
||||||
|
for (Kart kart : track.GetScores().keySet())
|
||||||
|
{
|
||||||
|
boolean added = false;
|
||||||
|
|
||||||
|
for (int i=0 ; i<pos.size() ; i++)
|
||||||
|
{
|
||||||
|
//Finished vs Unfinished
|
||||||
|
if (kart.HasFinishedTrack() && !pos.get(i).HasFinishedTrack())
|
||||||
|
{
|
||||||
|
pos.add(i, kart);
|
||||||
|
added = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Unfinished vs Finished
|
||||||
|
if (!kart.HasFinishedTrack() && pos.get(i).HasFinishedTrack())
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Finished vs Finished
|
||||||
|
if (kart.HasFinishedTrack() && pos.get(i).HasFinishedTrack())
|
||||||
|
{
|
||||||
|
if (kart.GetLapPlace() < pos.get(i).GetLapPlace())
|
||||||
|
{
|
||||||
|
pos.add(i, kart);
|
||||||
|
added = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Unfinished vs Unfinished
|
||||||
|
if (track.GetScores().get(kart) > track.GetScores().get(pos.get(i)))
|
||||||
|
{
|
||||||
|
pos.add(i, kart);
|
||||||
|
added = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!added)
|
||||||
|
pos.add(kart);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Set Lap Place
|
||||||
|
for (int i=0 ; i<pos.size() ; i++)
|
||||||
|
pos.get(i).SetLapPlace(i);
|
||||||
|
|
||||||
|
if (track.GetState() == TrackState.Live)
|
||||||
|
{
|
||||||
|
for (Kart kart : track.GetScores().keySet())
|
||||||
|
{
|
||||||
|
if (kart.HasFinishedTrack())
|
||||||
|
track.SetState(TrackState.Ending);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void SetKartProgress(Track track, Kart kart)
|
||||||
|
{
|
||||||
|
if (kart.HasFinishedTrack())
|
||||||
|
return;
|
||||||
|
|
||||||
|
int node = -1;
|
||||||
|
double bestDist = 9999;
|
||||||
|
|
||||||
|
for (int i=0 ; i<track.GetProgress().size() ; i++)
|
||||||
|
{
|
||||||
|
Location cur = track.GetProgress().get(i);
|
||||||
|
double dist = UtilMath.offset(kart.GetDriver().getLocation(), cur);
|
||||||
|
|
||||||
|
if (node == -1)
|
||||||
|
{
|
||||||
|
node = i;
|
||||||
|
bestDist = dist;
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (dist < bestDist)
|
||||||
|
{
|
||||||
|
node = i;
|
||||||
|
bestDist = dist;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (node == -1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
//Score
|
||||||
|
double score = 1000 * (node+1);
|
||||||
|
|
||||||
|
Location next = track.GetProgress().get((node+1)%track.GetProgress().size());
|
||||||
|
score -= UtilMath.offset(kart.GetDriver().getLocation(), next);
|
||||||
|
|
||||||
|
//Save
|
||||||
|
kart.SetLapNode(node);
|
||||||
|
kart.SetLapScore(score);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void UpdateItems(Track track)
|
||||||
|
{
|
||||||
|
if (track.GetWorld() == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (TrackItem item : track.GetItems())
|
||||||
|
{
|
||||||
|
if (item.GetEntity() != null && !item.GetEntity().isValid())
|
||||||
|
item.SetEntity(null);
|
||||||
|
|
||||||
|
if (item.GetEntity() != null)
|
||||||
|
{
|
||||||
|
if (item.GetEntity().getLocation().getY() <= item.GetLocation().getY())
|
||||||
|
item.GetEntity().setVelocity(new Vector(0, 0.2, 0));
|
||||||
|
|
||||||
|
item.GetEntity().setTicksLived(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!UtilTime.elapsed(item.GetDelay(), 6000))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (item.GetEntity() == null)
|
||||||
|
item.SpawnEntity(track.GetWorld());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void PickupItem(Track track)
|
||||||
|
{
|
||||||
|
if (track.GetWorld() == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (Kart kart : track.GetGP().GetKarts())
|
||||||
|
{
|
||||||
|
if (kart.HasFinishedTrack())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
for (TrackItem item : track.GetItems())
|
||||||
|
{
|
||||||
|
if (item.GetEntity() == null)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (UtilMath.offset(item.GetLocation(), kart.GetDriver().getLocation()) < 1)
|
||||||
|
item.Pickup(kart);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Jump(Track track)
|
||||||
|
{
|
||||||
|
for (Kart kart : track.GetGP().GetKarts())
|
||||||
|
{
|
||||||
|
Block block = kart.GetDriver().getLocation().getBlock().getRelative(BlockFace.DOWN);
|
||||||
|
|
||||||
|
if (block.getType() != Material.EMERALD_BLOCK)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (!track.GetJumps().containsKey(block.getLocation()))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (!track.GetRecharge().use(kart.GetDriver(), "Track Jump", 2000, false))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
//Current Velocity
|
||||||
|
Vector vel = kart.GetVelocity();
|
||||||
|
|
||||||
|
//XXX Special Boost Jumps?
|
||||||
|
//vel.setY(0);
|
||||||
|
//vel.normalizerr();
|
||||||
|
//vel.multiply(1.8);
|
||||||
|
|
||||||
|
vel.add(new Vector(0,track.GetJumps().get(block.getLocation()),0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void CollideMob(Track track)
|
||||||
|
{
|
||||||
|
for (Kart kart : track.GetGP().GetKarts())
|
||||||
|
{
|
||||||
|
for (TrackEntity mob : track.GetCreatures())
|
||||||
|
{
|
||||||
|
mob.CheckCollision(kart);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void UpdateEntities(Track track)
|
||||||
|
{
|
||||||
|
Iterator<TrackEntity> iterator = track.GetCreatures().iterator();
|
||||||
|
|
||||||
|
while (iterator.hasNext())
|
||||||
|
{
|
||||||
|
TrackEntity ent = iterator.next();
|
||||||
|
|
||||||
|
if (ent.Update())
|
||||||
|
{
|
||||||
|
if (ent.GetEntity() != null)
|
||||||
|
ent.GetEntity().remove();
|
||||||
|
|
||||||
|
iterator.remove();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,348 @@
|
|||||||
|
package nautilus.game.minekart.track;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import mineplex.core.MiniPlugin;
|
||||||
|
import mineplex.core.common.util.F;
|
||||||
|
import mineplex.core.common.util.UtilAlg;
|
||||||
|
import mineplex.core.common.util.UtilMath;
|
||||||
|
import mineplex.core.common.util.UtilPlayer;
|
||||||
|
import mineplex.core.fakeEntity.FakeEntityManager;
|
||||||
|
import mineplex.core.teleport.Teleport;
|
||||||
|
import mineplex.core.updater.event.UpdateEvent;
|
||||||
|
import mineplex.core.updater.UpdateType;
|
||||||
|
import nautilus.game.minekart.gp.GPBattle;
|
||||||
|
import nautilus.game.minekart.kart.Kart;
|
||||||
|
import nautilus.game.minekart.kart.KartState;
|
||||||
|
import nautilus.game.minekart.track.Track.TrackState;
|
||||||
|
import net.minecraft.server.v1_7_R1.ChunkPreLoadEvent;
|
||||||
|
import net.minecraft.server.v1_7_R1.EntityPlayer;
|
||||||
|
import net.minecraft.server.v1_7_R1.Packet;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.Sound;
|
||||||
|
import org.bukkit.block.Block;
|
||||||
|
import org.bukkit.block.BlockFace;
|
||||||
|
import org.bukkit.craftbukkit.v1_7_R1.entity.CraftPlayer;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.EventPriority;
|
||||||
|
import org.bukkit.event.block.BlockIgniteEvent;
|
||||||
|
import org.bukkit.event.block.BlockIgniteEvent.IgniteCause;
|
||||||
|
import org.bukkit.event.entity.EntityCombustEvent;
|
||||||
|
import org.bukkit.event.world.ChunkUnloadEvent;
|
||||||
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
|
import org.bukkit.util.Vector;
|
||||||
|
|
||||||
|
public class TrackManager extends MiniPlugin
|
||||||
|
{
|
||||||
|
private Teleport _teleport;
|
||||||
|
private HashSet<Track> _tracks = new HashSet<Track>();
|
||||||
|
private HashSet<Track> _trackLoader = new HashSet<Track>();
|
||||||
|
|
||||||
|
public TrackManager(JavaPlugin plugin, Teleport teleport)
|
||||||
|
{
|
||||||
|
super("Track Manager", plugin);
|
||||||
|
|
||||||
|
_teleport = teleport;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Set<Track> GetTracks()
|
||||||
|
{
|
||||||
|
return _tracks;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RegisterTrack(Track track)
|
||||||
|
{
|
||||||
|
_tracks.add(track);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void LoadTrack(Track track)
|
||||||
|
{
|
||||||
|
_trackLoader.add(track);
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void LoadTrackUpdate(UpdateEvent event)
|
||||||
|
{
|
||||||
|
if (event.getType() != UpdateType.TICK)
|
||||||
|
return;
|
||||||
|
|
||||||
|
Iterator<Track> trackIterator = _trackLoader.iterator();
|
||||||
|
|
||||||
|
long endTime = System.currentTimeMillis() + 25;
|
||||||
|
|
||||||
|
while (trackIterator.hasNext())
|
||||||
|
{
|
||||||
|
long timeLeft = endTime - System.currentTimeMillis();
|
||||||
|
if (timeLeft <= 0) continue;
|
||||||
|
|
||||||
|
final Track track = trackIterator.next();
|
||||||
|
|
||||||
|
if (track.GetWorld() == null)
|
||||||
|
{
|
||||||
|
trackIterator.remove();
|
||||||
|
}
|
||||||
|
else if (track.LoadChunks(timeLeft))
|
||||||
|
{
|
||||||
|
trackIterator.remove();
|
||||||
|
track.SetState(TrackState.Countdown);
|
||||||
|
track.GetGP().Announce(F.main("MK", "Starting Track: " + F.elem(track.GetName())));
|
||||||
|
|
||||||
|
track.SpawnTeleport();
|
||||||
|
|
||||||
|
for (final Kart kart : track.GetGP().GetKarts())
|
||||||
|
{
|
||||||
|
kart.GetEntity().SetLocation(kart.GetDriver().getLocation());
|
||||||
|
|
||||||
|
Packet spawnPacket = kart.GetEntity().Spawn();
|
||||||
|
Packet attachPacket = kart.GetEntity().SetPassenger(kart.GetDriver().getEntityId());
|
||||||
|
|
||||||
|
for (final Kart otherPlayer : track.GetGP().GetKarts())
|
||||||
|
{
|
||||||
|
if (kart == otherPlayer)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
kart.GetDriver().hidePlayer(otherPlayer.GetDriver());
|
||||||
|
|
||||||
|
final EntityPlayer entityPlayer = ((CraftPlayer)otherPlayer.GetDriver()).getHandle();
|
||||||
|
|
||||||
|
entityPlayer.playerConnection.sendPacket(spawnPacket);
|
||||||
|
FakeEntityManager.Instance.ForwardMovement(otherPlayer.GetDriver(), kart.GetDriver(), kart.GetEntity().GetEntityId());
|
||||||
|
FakeEntityManager.Instance.FakeVehicle(otherPlayer.GetDriver(), kart.GetDriver().getEntityId(), attachPacket);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(GetPlugin(), new Runnable()
|
||||||
|
{
|
||||||
|
public void run()
|
||||||
|
{
|
||||||
|
for (Kart kart : track.GetGP().GetKarts())
|
||||||
|
{
|
||||||
|
for (Kart player : track.GetGP().GetKarts())
|
||||||
|
{
|
||||||
|
if (kart.GetDriver() == player)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
kart.GetDriver().showPlayer(player.GetDriver());
|
||||||
|
}
|
||||||
|
|
||||||
|
kart.Equip();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, 5L);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void DeleteTrack(UpdateEvent event)
|
||||||
|
{
|
||||||
|
if (event.getType() == UpdateType.TICK)
|
||||||
|
for (Track track : _tracks)
|
||||||
|
if (track.GetWorld() != null)
|
||||||
|
if (track.GetState() == TrackState.Ended)
|
||||||
|
if (track.GetWorld().getPlayers().isEmpty())
|
||||||
|
track.Uninitialize();
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void Update(UpdateEvent event)
|
||||||
|
{
|
||||||
|
if (event.getType() == UpdateType.TICK)
|
||||||
|
for (Track track : _tracks)
|
||||||
|
if (!(track.GetGP() instanceof GPBattle))
|
||||||
|
if (track.GetWorld() != null)
|
||||||
|
TrackLogic.Positions(track);
|
||||||
|
|
||||||
|
if (event.getType() == UpdateType.TICK)
|
||||||
|
for (Track track : _tracks)
|
||||||
|
if (track.GetWorld() != null)
|
||||||
|
TrackLogic.Jump(track);
|
||||||
|
|
||||||
|
if (event.getType() == UpdateType.FAST)
|
||||||
|
for (Track track : _tracks)
|
||||||
|
if (track.GetWorld() != null)
|
||||||
|
TrackLogic.UpdateItems(track);
|
||||||
|
|
||||||
|
if (event.getType() == UpdateType.TICK)
|
||||||
|
for (Track track : _tracks)
|
||||||
|
if (track.GetWorld() != null)
|
||||||
|
TrackLogic.UpdateEntities(track);
|
||||||
|
|
||||||
|
if (event.getType() == UpdateType.TICK)
|
||||||
|
for (Track track : _tracks)
|
||||||
|
if (track.GetWorld() != null)
|
||||||
|
TrackLogic.PickupItem(track);
|
||||||
|
|
||||||
|
if (event.getType() == UpdateType.TICK)
|
||||||
|
for (Track track : _tracks)
|
||||||
|
if (track.GetWorld() != null)
|
||||||
|
TrackLogic.CollideMob(track);
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void BlockIgnite(BlockIgniteEvent event)
|
||||||
|
{
|
||||||
|
if (event.getCause() == IgniteCause.ENDER_CRYSTAL)
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void PlayerIgnite(EntityCombustEvent event)
|
||||||
|
{
|
||||||
|
if (event.getDuration() < 100)
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void ChunkUnload(ChunkUnloadEvent event)
|
||||||
|
{
|
||||||
|
for (Track track : _tracks)
|
||||||
|
track.ChunkUnload(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void ChunkLoad(ChunkPreLoadEvent event)
|
||||||
|
{
|
||||||
|
for (Track track : _tracks)
|
||||||
|
{
|
||||||
|
track.ChunkLoad(event);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.LOWEST)
|
||||||
|
public void Lakitu(UpdateEvent event)
|
||||||
|
{
|
||||||
|
if (event.getType() != UpdateType.FAST)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (Track track : _tracks)
|
||||||
|
{
|
||||||
|
if (track.GetWorld() == null)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (track.GetState() != TrackState.Live)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
for (Kart kart : track.GetGP().GetKarts())
|
||||||
|
{
|
||||||
|
kart.SetLakituTick(-1);
|
||||||
|
|
||||||
|
if (kart.GetKartState() == KartState.Lakitu)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
//Get Return
|
||||||
|
int locId = -1;
|
||||||
|
double bestDist = 9999;
|
||||||
|
|
||||||
|
for (int i=0 ; i<kart.GetGP().GetTrack().GetReturn().size() ; i++)
|
||||||
|
{
|
||||||
|
Location loc = kart.GetGP().GetTrack().GetReturn().get(i);
|
||||||
|
|
||||||
|
double dist = UtilMath.offset(loc, kart.GetDriver().getLocation());
|
||||||
|
|
||||||
|
if (locId == -1)
|
||||||
|
{
|
||||||
|
locId = i;
|
||||||
|
bestDist = dist;
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (dist < bestDist)
|
||||||
|
{
|
||||||
|
locId = i;
|
||||||
|
bestDist = dist;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (locId == -1)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
//Distance
|
||||||
|
if (bestDist > 120)
|
||||||
|
{
|
||||||
|
Lakitu(kart, locId);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
Block block;
|
||||||
|
|
||||||
|
//Void
|
||||||
|
if (kart.GetDriver().getLocation().getY() < 0)
|
||||||
|
{
|
||||||
|
Lakitu(kart, locId);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Drown
|
||||||
|
block = kart.GetDriver().getLocation().getBlock().getRelative(BlockFace.UP);
|
||||||
|
if (block.getTypeId() == 8 || block.getTypeId() == 9)
|
||||||
|
{
|
||||||
|
int neighbours = 0;
|
||||||
|
|
||||||
|
if (block.getRelative( 1, 0, 0).getTypeId() == 8 || block.getRelative(1, 0, 0).getTypeId() == 9) neighbours++;
|
||||||
|
if (block.getRelative(-1, 0, 0).getTypeId() == 8 || block.getRelative(1, 0, 0).getTypeId() == 9) neighbours++;
|
||||||
|
if (block.getRelative(0, 0, 1).getTypeId() == 8 || block.getRelative(1, 0, 0).getTypeId() == 9) neighbours++;
|
||||||
|
if (block.getRelative(0, 0, -1).getTypeId() == 8 || block.getRelative(1, 0, 0).getTypeId() == 9) neighbours++;
|
||||||
|
|
||||||
|
if (neighbours >= 3)
|
||||||
|
{
|
||||||
|
kart.SetLakituTick(2);
|
||||||
|
|
||||||
|
if (kart.GetLakituTick() > 6)
|
||||||
|
{
|
||||||
|
Lakitu(kart, locId);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Negative Blocks
|
||||||
|
block = kart.GetDriver().getLocation().getBlock().getRelative(BlockFace.DOWN);
|
||||||
|
if (kart.GetGP().GetTrack().GetReturnBlocks().contains(block.getTypeId()))
|
||||||
|
{
|
||||||
|
kart.SetLakituTick(2);
|
||||||
|
|
||||||
|
if (kart.GetLakituTick() > 6)
|
||||||
|
{
|
||||||
|
Lakitu(kart, locId);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Lakitu(Kart kart, int locId)
|
||||||
|
{
|
||||||
|
kart.SetVelocity(new Vector(0,0,0));
|
||||||
|
|
||||||
|
kart.SetKartState(KartState.Lakitu);
|
||||||
|
|
||||||
|
kart.ExpireConditions();
|
||||||
|
|
||||||
|
kart.SetLakituTick(-1000);
|
||||||
|
|
||||||
|
kart.LoseLife();
|
||||||
|
|
||||||
|
//Get Locations
|
||||||
|
Location loc;
|
||||||
|
if (locId > 0) loc = kart.GetGP().GetTrack().GetReturn().get(locId-1);
|
||||||
|
else loc = kart.GetGP().GetTrack().GetReturn().get(kart.GetGP().GetTrack().GetReturn().size());
|
||||||
|
|
||||||
|
Location next = kart.GetGP().GetTrack().GetReturn().get(locId);
|
||||||
|
|
||||||
|
Vector dir = UtilAlg.getTrajectory(loc, next);
|
||||||
|
loc.setYaw(UtilAlg.GetYaw(dir));
|
||||||
|
loc.setPitch(0);
|
||||||
|
|
||||||
|
_teleport.TP(kart.GetDriver(), loc);
|
||||||
|
|
||||||
|
UtilPlayer.message(kart.GetDriver(), F.main("MK", "You are being returned to the track."));
|
||||||
|
UtilPlayer.message(kart.GetDriver(), F.main("MK", "You cannot drive for 8 seconds."));
|
||||||
|
|
||||||
|
kart.GetDriver().playSound(kart.GetDriver().getLocation(), Sound.NOTE_BASS_GUITAR, 2f, 1f);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,321 @@
|
|||||||
|
package nautilus.game.minekart.track;
|
||||||
|
|
||||||
|
import java.io.BufferedWriter;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileWriter;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
import org.bukkit.Effect;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.block.Block;
|
||||||
|
import org.bukkit.block.BlockFace;
|
||||||
|
import org.bukkit.block.BlockState;
|
||||||
|
import org.bukkit.block.Sign;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
|
||||||
|
import mineplex.core.common.util.UtilMath;
|
||||||
|
import mineplex.core.updater.UpdateType;
|
||||||
|
import mineplex.core.updater.event.UpdateEvent;
|
||||||
|
|
||||||
|
public class TrackProcessor
|
||||||
|
{
|
||||||
|
private Location progressStart = null;
|
||||||
|
private ArrayList<Location> progress = new ArrayList<Location>();
|
||||||
|
private ArrayList<Location> spawns = new ArrayList<Location>();
|
||||||
|
private ArrayList<Location> returns = new ArrayList<Location>();
|
||||||
|
private ArrayList<Location> items = new ArrayList<Location>();
|
||||||
|
private HashMap<Location, String> mobs = new HashMap<Location, String>();
|
||||||
|
private HashMap<Location, String> jumps = new HashMap<Location, String>();
|
||||||
|
|
||||||
|
private ArrayList<Location> spawnsOrdered = new ArrayList<Location>();
|
||||||
|
private ArrayList<Location> progressOrdered = new ArrayList<Location>();
|
||||||
|
|
||||||
|
private int spawnsDisplayIndex = 0;
|
||||||
|
private int progressDisplayIndex = 0;
|
||||||
|
|
||||||
|
public void ProcessTrack(Player caller)
|
||||||
|
{
|
||||||
|
progressStart = null;
|
||||||
|
progress.clear();
|
||||||
|
spawns.clear();
|
||||||
|
returns.clear();
|
||||||
|
items.clear();
|
||||||
|
|
||||||
|
mobs.clear();
|
||||||
|
jumps.clear();
|
||||||
|
|
||||||
|
progressOrdered.clear();
|
||||||
|
spawnsOrdered.clear();
|
||||||
|
|
||||||
|
int processed = 0;
|
||||||
|
|
||||||
|
caller.sendMessage("Scanning for Blocks...");
|
||||||
|
for (int x=-500 ; x < 500 ; x++)
|
||||||
|
for (int z=-500 ; z < 500 ; z++)
|
||||||
|
for (int y=0 ; y < 256 ; y++)
|
||||||
|
{
|
||||||
|
processed++;
|
||||||
|
if (processed % 10000000 == 0)
|
||||||
|
caller.sendMessage("Processed: " + processed);
|
||||||
|
|
||||||
|
Block block = caller.getWorld().getBlockAt(caller.getLocation().getBlockX()+x, caller.getLocation().getBlockY()+y, caller.getLocation().getBlockZ()+z);
|
||||||
|
|
||||||
|
|
||||||
|
if (block.getType() == Material.SIGN_POST)
|
||||||
|
{
|
||||||
|
Block type = block.getRelative(BlockFace.DOWN);
|
||||||
|
if (type == null)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
BlockState state = block.getState();
|
||||||
|
|
||||||
|
Sign sign = (Sign)state;
|
||||||
|
|
||||||
|
String lineA = sign.getLine(0);
|
||||||
|
String lineB = sign.getLine(1);
|
||||||
|
|
||||||
|
if (type.getType() == Material.WOOL && lineA.equals("MOB"))
|
||||||
|
{
|
||||||
|
if (type.getData() == 14) // red > mob
|
||||||
|
{
|
||||||
|
mobs.put(type.getLocation().add(0.5, 1.5, 0.5), lineB);
|
||||||
|
|
||||||
|
//Remove Blocks
|
||||||
|
block.setTypeId(0);
|
||||||
|
type.setTypeId(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (type.getType() == Material.EMERALD_BLOCK && lineA.equals("JUMP"))
|
||||||
|
{
|
||||||
|
jumps.put(type.getLocation(), lineB);
|
||||||
|
|
||||||
|
//Remove Blocks
|
||||||
|
block.setTypeId(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (block.getTypeId() != 148)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
Block type = block.getRelative(BlockFace.DOWN);
|
||||||
|
if (type == null)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (type.getType() != Material.WOOL)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (type.getData() == 1) // orange > progress start
|
||||||
|
{
|
||||||
|
if (progressStart != null)
|
||||||
|
caller.sendMessage("Error: Duplicate Progress Start");
|
||||||
|
|
||||||
|
progressStart = type.getLocation().add(0.5, 0, 0.5);
|
||||||
|
}
|
||||||
|
else if (type.getData() == 4) // yellow > progress
|
||||||
|
{
|
||||||
|
progress.add(type.getLocation().add(0.5, 0, 0.5));
|
||||||
|
}
|
||||||
|
else if (type.getData() == 5) // green > items
|
||||||
|
{
|
||||||
|
items.add(type.getLocation().add(0.5, 0, 0.5));
|
||||||
|
}
|
||||||
|
else if (type.getData() == 11) // blue > spawns
|
||||||
|
{
|
||||||
|
spawns.add(type.getLocation().add(0.5, 0, 0.5));
|
||||||
|
}
|
||||||
|
else if (type.getData() == 10) // purple > return
|
||||||
|
{
|
||||||
|
returns.add(type.getLocation().add(0.5, 0, 0.5));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Remove Blocks
|
||||||
|
block.setTypeId(0);
|
||||||
|
type.setTypeId(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
caller.sendMessage("Ordering Progress Blocks...");
|
||||||
|
|
||||||
|
if (progressStart == null)
|
||||||
|
{
|
||||||
|
caller.sendMessage("Error: No Progress Start Found (Orange Wool)");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Order Progress
|
||||||
|
progressOrdered.add(progressStart);
|
||||||
|
|
||||||
|
while (!progress.isEmpty())
|
||||||
|
{
|
||||||
|
Location cur = progressOrdered.get(progressOrdered.size() - 1);
|
||||||
|
Location next = null;
|
||||||
|
double dist = 9999;
|
||||||
|
|
||||||
|
for (Location loc : progress)
|
||||||
|
{
|
||||||
|
double newDist = UtilMath.offset(cur, loc);
|
||||||
|
|
||||||
|
if (next == null)
|
||||||
|
{
|
||||||
|
next = loc;
|
||||||
|
dist = newDist;
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (newDist < dist)
|
||||||
|
{
|
||||||
|
next = loc;
|
||||||
|
dist = newDist;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
progress.remove(next);
|
||||||
|
progressOrdered.add(next);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Order Spawns
|
||||||
|
while (!spawns.isEmpty())
|
||||||
|
{
|
||||||
|
Location spawn = null;
|
||||||
|
double dist = 9999;
|
||||||
|
|
||||||
|
for (Location loc : spawns)
|
||||||
|
{
|
||||||
|
double newDist = UtilMath.offset(progressStart, loc);
|
||||||
|
|
||||||
|
if (spawn == null)
|
||||||
|
{
|
||||||
|
spawn = loc;
|
||||||
|
dist = newDist;
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (newDist < dist)
|
||||||
|
{
|
||||||
|
spawn = loc;
|
||||||
|
dist = newDist;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
spawns.remove(spawn);
|
||||||
|
spawnsOrdered.add(spawn);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Lakitu
|
||||||
|
if (returns.isEmpty())
|
||||||
|
returns = progressOrdered;
|
||||||
|
|
||||||
|
//Save
|
||||||
|
try
|
||||||
|
{
|
||||||
|
FileWriter fstream = new FileWriter(caller.getWorld().getName() + File.separatorChar + "TrackInfo.dat");
|
||||||
|
BufferedWriter out = new BufferedWriter(fstream);
|
||||||
|
|
||||||
|
out.write("TRACK_NAME:");
|
||||||
|
out.write("\n");
|
||||||
|
out.write("\n");
|
||||||
|
out.write("MIN_X:");
|
||||||
|
out.write("\n");
|
||||||
|
out.write("MAX_X:");
|
||||||
|
out.write("\n");
|
||||||
|
out.write("MIN_Z:");
|
||||||
|
out.write("\n");
|
||||||
|
out.write("MAX_Z:");
|
||||||
|
out.write("\n");
|
||||||
|
out.write("\n");
|
||||||
|
out.write("ROAD_TYPES:");
|
||||||
|
out.write("\n");
|
||||||
|
out.write("RETURN_TYPES:");
|
||||||
|
out.write("\n");
|
||||||
|
out.write("\n");
|
||||||
|
out.write("SPAWN_DIRECTION:0");
|
||||||
|
out.write("\n");
|
||||||
|
out.write("SPAWNS:" + LocationsToString(spawnsOrdered));
|
||||||
|
out.write("\n");
|
||||||
|
out.write("\n");
|
||||||
|
out.write("PROGRESS:" + LocationsToString(progressOrdered));
|
||||||
|
out.write("\n");
|
||||||
|
out.write("\n");
|
||||||
|
out.write("RETURNS:" + LocationsToString(returns));
|
||||||
|
out.write("\n");
|
||||||
|
out.write("\n");
|
||||||
|
out.write("ITEMS:" + LocationsToString(items));
|
||||||
|
out.write("\n");
|
||||||
|
out.write("\n");
|
||||||
|
out.write("CREATURES:" + LocationSignsToString(mobs));
|
||||||
|
out.write("\n");
|
||||||
|
out.write("\n");
|
||||||
|
out.write("JUMPS:" + LocationSignsToString(jumps));
|
||||||
|
|
||||||
|
out.close();
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
caller.sendMessage("Error: File Write Error");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
caller.sendMessage("Track Data Saved.");
|
||||||
|
}
|
||||||
|
|
||||||
|
public String LocationsToString(ArrayList<Location> locs)
|
||||||
|
{
|
||||||
|
String out = "";
|
||||||
|
|
||||||
|
for (Location loc : locs)
|
||||||
|
out += loc.getBlockX() + "," + loc.getBlockY() + "," + loc.getBlockZ() + ":";
|
||||||
|
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String LocationSignsToString(HashMap<Location, String> locs)
|
||||||
|
{
|
||||||
|
String out = "";
|
||||||
|
|
||||||
|
for (Location loc : locs.keySet())
|
||||||
|
out += locs.get(loc) + "@" + loc.getBlockX() + "," + loc.getBlockY() + "," + loc.getBlockZ() + ":";
|
||||||
|
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void Update(UpdateEvent event)
|
||||||
|
{
|
||||||
|
if (event.getType() != UpdateType.FAST)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!progressOrdered.isEmpty())
|
||||||
|
{
|
||||||
|
if (progressDisplayIndex >= progressOrdered.size())
|
||||||
|
progressDisplayIndex = 0;
|
||||||
|
|
||||||
|
Location loc = progressOrdered.get(progressDisplayIndex);
|
||||||
|
loc.getBlock().getWorld().playEffect(loc.getBlock().getLocation(), Effect.STEP_SOUND, 41);
|
||||||
|
|
||||||
|
progressDisplayIndex++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!spawnsOrdered.isEmpty())
|
||||||
|
{
|
||||||
|
if (spawnsDisplayIndex >= spawnsOrdered.size())
|
||||||
|
spawnsDisplayIndex = 0;
|
||||||
|
|
||||||
|
Location loc = spawnsOrdered.get(spawnsDisplayIndex);
|
||||||
|
loc.getBlock().getWorld().playEffect(loc.getBlock().getLocation(), Effect.STEP_SOUND, 22);
|
||||||
|
|
||||||
|
spawnsDisplayIndex++;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Location loc : returns)
|
||||||
|
loc.getBlock().getWorld().playEffect(loc.getBlock().getLocation(), Effect.STEP_SOUND, 90);
|
||||||
|
|
||||||
|
for (Location loc : items)
|
||||||
|
loc.getBlock().getWorld().playEffect(loc.getBlock().getLocation(), Effect.STEP_SOUND, 18);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,40 @@
|
|||||||
|
package nautilus.game.minekart.track.ents;
|
||||||
|
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.Sound;
|
||||||
|
import org.bukkit.entity.EntityType;
|
||||||
|
|
||||||
|
import mineplex.core.common.util.F;
|
||||||
|
import mineplex.core.common.util.UtilPlayer;
|
||||||
|
import nautilus.game.minekart.kart.Kart;
|
||||||
|
import nautilus.game.minekart.kart.crash.Crash_Explode;
|
||||||
|
import nautilus.game.minekart.track.TrackEntity;
|
||||||
|
import nautilus.game.minekart.track.Track;
|
||||||
|
|
||||||
|
public class Bomb extends TrackEntity
|
||||||
|
{
|
||||||
|
public Bomb(Track track, Location loc)
|
||||||
|
{
|
||||||
|
super(track, EntityType.CREEPER, "Bomb", 5, 1, 30000, loc);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void Collide(Kart kart)
|
||||||
|
{
|
||||||
|
this.SetSpawnTimer(System.currentTimeMillis());
|
||||||
|
this.GetEntity().remove();
|
||||||
|
|
||||||
|
if (!kart.IsInvulnerable(true))
|
||||||
|
{
|
||||||
|
|
||||||
|
UtilPlayer.message(kart.GetDriver(), F.main("MK", "You hit " + F.item(GetName()) + "."));
|
||||||
|
|
||||||
|
//Crash
|
||||||
|
kart.CrashStop();
|
||||||
|
new Crash_Explode(kart, 1.2f, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Effect
|
||||||
|
GetEntity().getWorld().playSound(GetEntity().getLocation(), Sound.EXPLODE, 2f, 0.2f);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,124 @@
|
|||||||
|
package nautilus.game.minekart.track.ents;
|
||||||
|
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.Sound;
|
||||||
|
import org.bukkit.craftbukkit.v1_7_R1.entity.CraftCreature;
|
||||||
|
import org.bukkit.entity.Creature;
|
||||||
|
import org.bukkit.entity.EntityType;
|
||||||
|
import org.bukkit.util.Vector;
|
||||||
|
|
||||||
|
import mineplex.core.common.util.F;
|
||||||
|
import mineplex.core.common.util.UtilAlg;
|
||||||
|
import mineplex.core.common.util.UtilBlock;
|
||||||
|
import mineplex.core.common.util.UtilMath;
|
||||||
|
import mineplex.core.common.util.UtilPlayer;
|
||||||
|
import mineplex.core.common.util.UtilTime;
|
||||||
|
import nautilus.game.minekart.kart.Kart;
|
||||||
|
import nautilus.game.minekart.kart.crash.Crash_Explode;
|
||||||
|
import nautilus.game.minekart.track.Track;
|
||||||
|
import nautilus.game.minekart.track.TrackEntity;
|
||||||
|
import net.minecraft.server.v1_7_R1.EntityCreature;
|
||||||
|
import net.minecraft.server.v1_7_R1.Navigation;
|
||||||
|
|
||||||
|
public class Cow extends TrackEntity
|
||||||
|
{
|
||||||
|
private boolean _spawned = false;
|
||||||
|
private Kart _owner;
|
||||||
|
private Vector _dir;
|
||||||
|
|
||||||
|
private long _spawn = 0;
|
||||||
|
|
||||||
|
public Cow(Track track, Location loc, Kart owner, Vector dir)
|
||||||
|
{
|
||||||
|
super(track, EntityType.COW, "Stampede", 5, 1.5, 30000, loc);
|
||||||
|
|
||||||
|
_owner = owner;
|
||||||
|
_dir = dir;
|
||||||
|
|
||||||
|
_dir.setY(0);
|
||||||
|
_dir.normalize();
|
||||||
|
_dir.multiply(1.2);
|
||||||
|
_dir.setY(-0.4);
|
||||||
|
|
||||||
|
_spawn = System.currentTimeMillis();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void CheckCollision(Kart kart)
|
||||||
|
{
|
||||||
|
if (kart.equals(_owner))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (GetEntity() == null || !GetEntity().isValid())
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (UtilMath.offset(kart.GetDriver().getLocation(), GetEntity().getLocation()) > GetCollideRange())
|
||||||
|
return;
|
||||||
|
|
||||||
|
Collide(kart);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void Collide(Kart kart)
|
||||||
|
{
|
||||||
|
if (!kart.IsInvulnerable(false))
|
||||||
|
{
|
||||||
|
UtilPlayer.message(kart.GetDriver(), F.main("MK", F.elem(_owner.GetDriver().getName()) + " hit you with " + F.item(GetName()) + "."));
|
||||||
|
|
||||||
|
//Crash
|
||||||
|
new Crash_Explode(kart, 1f, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Effect
|
||||||
|
GetEntity().getWorld().playSound(GetEntity().getLocation(), Sound.COW_HURT, 2f, 1f);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean Update()
|
||||||
|
{
|
||||||
|
if (UtilTime.elapsed(_spawn, 10000))
|
||||||
|
{
|
||||||
|
GetEntity().getWorld().playSound(GetEntity().getLocation(), Sound.COW_HURT, 2f, 0.5f);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GetEntity() != null && !UtilBlock.airFoliage(GetEntity().getLocation().add(_dir).add(0, 1, 0).getBlock()))
|
||||||
|
{
|
||||||
|
GetEntity().getWorld().playSound(GetEntity().getLocation(), Sound.COW_HURT, 2f, 0.5f);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Respawn
|
||||||
|
if (GetEntity() == null || !GetEntity().isValid())
|
||||||
|
{
|
||||||
|
if (_spawned)
|
||||||
|
{
|
||||||
|
GetEntity().getWorld().playSound(GetEntity().getLocation(), Sound.COW_HURT, 2f, 0.5f);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
SetEntity(GetLocation().getWorld().spawnEntity(GetLocation(), GetType()));
|
||||||
|
_spawned = true;
|
||||||
|
}
|
||||||
|
//Move
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//Push
|
||||||
|
GetEntity().setVelocity(_dir);
|
||||||
|
|
||||||
|
//Walk
|
||||||
|
if (GetEntity() instanceof Creature)
|
||||||
|
{
|
||||||
|
EntityCreature ec = ((CraftCreature)GetEntity()).getHandle();
|
||||||
|
Navigation nav = ec.getNavigation();
|
||||||
|
nav.a(GetEntity().getLocation().getX() + (_dir.getX() * 5), GetEntity().getLocation().getY(), GetEntity().getLocation().getZ() + (_dir.getZ() * 5), 0.4f);
|
||||||
|
|
||||||
|
//Direction
|
||||||
|
ec.setPositionRotation(GetEntity().getLocation().getX(), GetEntity().getLocation().getY(), GetEntity().getLocation().getZ(),
|
||||||
|
UtilAlg.GetYaw(_dir), 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,87 @@
|
|||||||
|
package nautilus.game.minekart.track.ents;
|
||||||
|
|
||||||
|
import org.bukkit.Effect;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.Sound;
|
||||||
|
|
||||||
|
import mineplex.core.common.util.F;
|
||||||
|
import mineplex.core.common.util.UtilMath;
|
||||||
|
import mineplex.core.common.util.UtilPlayer;
|
||||||
|
import mineplex.core.common.util.UtilTime;
|
||||||
|
import nautilus.game.minekart.kart.Kart;
|
||||||
|
import nautilus.game.minekart.kart.KartState;
|
||||||
|
import nautilus.game.minekart.kart.crash.Crash_Explode;
|
||||||
|
import nautilus.game.minekart.track.Track;
|
||||||
|
import nautilus.game.minekart.track.TrackEntity;
|
||||||
|
|
||||||
|
public class Mole extends TrackEntity
|
||||||
|
{
|
||||||
|
public Mole(Track track, Location loc)
|
||||||
|
{
|
||||||
|
super(track, null, "Monty Mole", 5, 1, 1500, loc);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void CheckCollision(Kart kart)
|
||||||
|
{
|
||||||
|
if (kart.GetKartState() == KartState.Crash)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (UtilMath.offset(kart.GetDriver().getLocation(), GetLocation()) > GetCollideRange())
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (GetLocation().getBlock().getType() != Material.RED_MUSHROOM)
|
||||||
|
return;
|
||||||
|
|
||||||
|
Collide(kart);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void Collide(Kart kart)
|
||||||
|
{
|
||||||
|
if (!kart.IsInvulnerable(false))
|
||||||
|
{
|
||||||
|
UtilPlayer.message(kart.GetDriver(), F.main("MK", "You hit " + F.item(GetName()) + "."));
|
||||||
|
|
||||||
|
//Crash
|
||||||
|
new Crash_Explode(kart, 1f, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Effect
|
||||||
|
GetLocation().getWorld().playSound(GetLocation(), Sound.EXPLODE, 2f, 1.5f);
|
||||||
|
|
||||||
|
//Remove Mole
|
||||||
|
GetLocation().getBlock().setType(Material.AIR);
|
||||||
|
SetSpawnTimer(System.currentTimeMillis());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean Update()
|
||||||
|
{
|
||||||
|
//Up
|
||||||
|
if (GetLocation().getBlock().getType() != Material.RED_MUSHROOM)
|
||||||
|
{
|
||||||
|
if (Math.random() > 0.99 && UtilTime.elapsed(GetSpawnTimer(), GetSpawnRate()))
|
||||||
|
{
|
||||||
|
GetLocation().getBlock().setType(Material.RED_MUSHROOM);
|
||||||
|
SetSpawnTimer(System.currentTimeMillis());
|
||||||
|
|
||||||
|
//Sound
|
||||||
|
GetLocation().getWorld().playSound(GetLocation(), Sound.BAT_HURT, 0.4f, 1.5f);
|
||||||
|
GetLocation().getWorld().playEffect(GetLocation(), Effect.STEP_SOUND, 3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//Down
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (UtilTime.elapsed(GetSpawnTimer(), 1500))
|
||||||
|
{
|
||||||
|
GetLocation().getBlock().setType(Material.AIR);
|
||||||
|
SetSpawnTimer(System.currentTimeMillis());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,183 @@
|
|||||||
|
package nautilus.game.minekart.track.ents;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
|
||||||
|
import org.bukkit.DyeColor;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.Sound;
|
||||||
|
import org.bukkit.craftbukkit.v1_7_R1.entity.CraftCreature;
|
||||||
|
import org.bukkit.entity.Creature;
|
||||||
|
import org.bukkit.entity.EntityType;
|
||||||
|
import org.bukkit.entity.Sheep;
|
||||||
|
import org.bukkit.util.Vector;
|
||||||
|
|
||||||
|
import mineplex.core.common.util.F;
|
||||||
|
import mineplex.core.common.util.UtilAlg;
|
||||||
|
import mineplex.core.common.util.UtilMath;
|
||||||
|
import mineplex.core.common.util.UtilPlayer;
|
||||||
|
import mineplex.core.common.util.UtilTime;
|
||||||
|
import nautilus.game.minekart.kart.Kart;
|
||||||
|
import nautilus.game.minekart.kart.crash.Crash_Explode;
|
||||||
|
import nautilus.game.minekart.track.Track;
|
||||||
|
import nautilus.game.minekart.track.TrackEntity;
|
||||||
|
import net.minecraft.server.v1_7_R1.EntityCreature;
|
||||||
|
|
||||||
|
public class Sheepile extends TrackEntity
|
||||||
|
{
|
||||||
|
private boolean _spawned = false;
|
||||||
|
private Kart _owner;
|
||||||
|
private HashSet<Kart> _hit = new HashSet<Kart>();
|
||||||
|
|
||||||
|
private long _spawn = 0;
|
||||||
|
|
||||||
|
private int _height = 2;
|
||||||
|
|
||||||
|
public Sheepile(Track track, Location loc, Kart owner)
|
||||||
|
{
|
||||||
|
super(track, EntityType.SHEEP, "Super Sheep", 5, 1, 30000, loc);
|
||||||
|
|
||||||
|
_owner = owner;
|
||||||
|
|
||||||
|
_spawn = System.currentTimeMillis();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void CheckCollision(Kart kart)
|
||||||
|
{
|
||||||
|
if (kart.equals(_owner))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (_hit.contains(kart))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (GetEntity() == null || !GetEntity().isValid())
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (UtilMath.offset(kart.GetDriver().getLocation(), GetEntity().getLocation()) > GetCollideRange())
|
||||||
|
return;
|
||||||
|
|
||||||
|
Collide(kart);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void Collide(Kart kart)
|
||||||
|
{
|
||||||
|
if (!kart.IsInvulnerable(true))
|
||||||
|
{
|
||||||
|
UtilPlayer.message(kart.GetDriver(), F.main("MK", F.elem(_owner.GetDriver().getName()) + " hit you with " + F.item(GetName()) + "."));
|
||||||
|
UtilPlayer.message(_owner.GetDriver(), F.main("MK", "You hit " + F.elem(kart.GetDriver().getName()) + " with " + F.item(GetName()) + "."));
|
||||||
|
|
||||||
|
//Crash
|
||||||
|
new Crash_Explode(kart, 1.2f, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
_hit.add(kart);
|
||||||
|
|
||||||
|
//Effect
|
||||||
|
GetEntity().getWorld().playSound(GetEntity().getLocation(), Sound.EXPLODE, 1f, 2f);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean Update()
|
||||||
|
{
|
||||||
|
if (UtilTime.elapsed(_spawn, 15000))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
//Respawn
|
||||||
|
if (GetEntity() == null || !GetEntity().isValid())
|
||||||
|
{
|
||||||
|
if (_spawned)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
SetEntity(GetLocation().getWorld().spawnEntity(GetLocation(), GetType()));
|
||||||
|
_spawned = true;
|
||||||
|
|
||||||
|
//Color
|
||||||
|
Sheep sheep = (Sheep)GetEntity();
|
||||||
|
sheep.setBaby();
|
||||||
|
sheep.setColor(DyeColor.RED);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//Control
|
||||||
|
Location target = null;
|
||||||
|
|
||||||
|
//Target Kart
|
||||||
|
for (Kart kart : Track.GetGP().GetKarts())
|
||||||
|
{
|
||||||
|
if (_owner.equals(kart) || _hit.contains(kart))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (UtilMath.offset(kart.GetDriver(), GetEntity()) < 8)
|
||||||
|
target = kart.GetDriver().getLocation();
|
||||||
|
}
|
||||||
|
|
||||||
|
//Target Lap
|
||||||
|
if (target == null)
|
||||||
|
{
|
||||||
|
int best = GetClosestNode();
|
||||||
|
Location node = Track.GetProgress().get((best+1)%Track.GetProgress().size());
|
||||||
|
|
||||||
|
target = new Location(node.getWorld(), node.getX(), node.getY() + _height, node.getZ());
|
||||||
|
}
|
||||||
|
|
||||||
|
//Push
|
||||||
|
Vector dir = UtilAlg.getTrajectory(GetEntity().getLocation(), target);
|
||||||
|
dir.normalize();
|
||||||
|
dir.multiply(1.2);
|
||||||
|
|
||||||
|
|
||||||
|
GetEntity().setVelocity(dir);
|
||||||
|
|
||||||
|
//Direction
|
||||||
|
if (GetEntity() instanceof Creature)
|
||||||
|
{
|
||||||
|
EntityCreature ec = ((CraftCreature)GetEntity()).getHandle();
|
||||||
|
ec.setPositionRotation(GetEntity().getLocation().getX(), GetEntity().getLocation().getY(), GetEntity().getLocation().getZ(),
|
||||||
|
UtilAlg.GetYaw(dir), 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Color
|
||||||
|
Sheep sheep = (Sheep)GetEntity();
|
||||||
|
sheep.setBaby();
|
||||||
|
double r = Math.random();
|
||||||
|
if (r > 0.75) sheep.setColor(DyeColor.RED);
|
||||||
|
else if (r > 0.5) sheep.setColor(DyeColor.YELLOW);
|
||||||
|
else if (r > 0.25) sheep.setColor(DyeColor.GREEN);
|
||||||
|
else sheep.setColor(DyeColor.BLUE);
|
||||||
|
|
||||||
|
//Sound
|
||||||
|
GetEntity().getWorld().playSound(GetEntity().getLocation(), Sound.SHEEP_IDLE, 2f, 2f);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int GetClosestNode()
|
||||||
|
{
|
||||||
|
int node = -1;
|
||||||
|
double bestDist = 9999;
|
||||||
|
|
||||||
|
for (int i=0 ; i<Track.GetProgress().size() ; i++)
|
||||||
|
{
|
||||||
|
Location cur = Track.GetProgress().get(i);
|
||||||
|
|
||||||
|
double dist = UtilMath.offset(GetEntity().getLocation().subtract(0, _height, 0), cur);
|
||||||
|
|
||||||
|
if (node == -1)
|
||||||
|
{
|
||||||
|
node = i;
|
||||||
|
bestDist = dist;
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (dist < bestDist)
|
||||||
|
{
|
||||||
|
node = i;
|
||||||
|
bestDist = dist;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,46 @@
|
|||||||
|
package nautilus.game.minekart.track.ents;
|
||||||
|
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.Sound;
|
||||||
|
import org.bukkit.entity.EntityType;
|
||||||
|
|
||||||
|
import mineplex.core.common.util.F;
|
||||||
|
import mineplex.core.common.util.UtilAlg;
|
||||||
|
import mineplex.core.common.util.UtilPlayer;
|
||||||
|
import nautilus.game.minekart.kart.Kart;
|
||||||
|
import nautilus.game.minekart.kart.KartState;
|
||||||
|
import nautilus.game.minekart.kart.crash.Crash_Spin;
|
||||||
|
import nautilus.game.minekart.track.Track;
|
||||||
|
import nautilus.game.minekart.track.TrackEntity;
|
||||||
|
|
||||||
|
public class Silverfish extends TrackEntity
|
||||||
|
{
|
||||||
|
public Silverfish(Track track, Location loc)
|
||||||
|
{
|
||||||
|
super(track, EntityType.SILVERFISH, "Silverfish", 3, 1, 30000, loc);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void Collide(Kart kart)
|
||||||
|
{
|
||||||
|
if (kart.GetKartState() == KartState.Crash)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!kart.IsInvulnerable(false))
|
||||||
|
{
|
||||||
|
|
||||||
|
UtilPlayer.message(kart.GetDriver(), F.main("MK", "You hit " + F.item(GetName()) + "."));
|
||||||
|
|
||||||
|
//Crash
|
||||||
|
if (kart.GetVelocity().length() == 0)
|
||||||
|
kart.SetVelocity(kart.GetDriver().getLocation().getDirection().setY(0));
|
||||||
|
|
||||||
|
kart.SetVelocity(UtilAlg.Normalize(kart.GetVelocityClone().setY(0)).multiply(0.6));
|
||||||
|
new Crash_Spin(kart, 0.6f);
|
||||||
|
kart.SetStability(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Effect
|
||||||
|
GetEntity().getWorld().playSound(GetEntity().getLocation(), Sound.BAT_HURT, 1f, 1f);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,129 @@
|
|||||||
|
package nautilus.game.minekart.track.ents;
|
||||||
|
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.Sound;
|
||||||
|
import org.bukkit.craftbukkit.v1_7_R1.entity.CraftCreature;
|
||||||
|
import org.bukkit.entity.Creature;
|
||||||
|
import org.bukkit.entity.EntityType;
|
||||||
|
import org.bukkit.util.Vector;
|
||||||
|
|
||||||
|
import mineplex.core.common.util.F;
|
||||||
|
import mineplex.core.common.util.UtilAlg;
|
||||||
|
import mineplex.core.common.util.UtilMath;
|
||||||
|
import mineplex.core.common.util.UtilPlayer;
|
||||||
|
import mineplex.core.common.util.UtilTime;
|
||||||
|
import nautilus.game.minekart.kart.Kart;
|
||||||
|
import nautilus.game.minekart.kart.crash.Crash_Explode;
|
||||||
|
import nautilus.game.minekart.track.Track;
|
||||||
|
import nautilus.game.minekart.track.TrackEntity;
|
||||||
|
import net.minecraft.server.v1_7_R1.EntityCreature;
|
||||||
|
import net.minecraft.server.v1_7_R1.Navigation;
|
||||||
|
|
||||||
|
public class Spiderling extends TrackEntity
|
||||||
|
{
|
||||||
|
private boolean _spawned = false;
|
||||||
|
private Kart _target;
|
||||||
|
private Kart _owner;
|
||||||
|
|
||||||
|
private long _spawn = 0;
|
||||||
|
|
||||||
|
private boolean _dead = false;
|
||||||
|
|
||||||
|
public Spiderling(Track track, Location loc, Kart owner, Kart target)
|
||||||
|
{
|
||||||
|
super(track, EntityType.CAVE_SPIDER, "Spiderling", 5, 1, 30000, loc);
|
||||||
|
|
||||||
|
_owner = owner;
|
||||||
|
_target = target;
|
||||||
|
|
||||||
|
_spawn = System.currentTimeMillis();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void CheckCollision(Kart kart)
|
||||||
|
{
|
||||||
|
if (kart.equals(_owner))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (GetEntity() == null || !GetEntity().isValid())
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (UtilMath.offset(kart.GetDriver().getLocation(), GetEntity().getLocation()) > GetCollideRange())
|
||||||
|
return;
|
||||||
|
|
||||||
|
Collide(kart);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void Collide(Kart kart)
|
||||||
|
{
|
||||||
|
this.SetSpawnTimer(System.currentTimeMillis());
|
||||||
|
this.GetEntity().remove();
|
||||||
|
|
||||||
|
if (!kart.IsInvulnerable(true))
|
||||||
|
{
|
||||||
|
UtilPlayer.message(kart.GetDriver(), F.main("MK", F.elem(_owner.GetDriver().getName()) + " hit you with " + F.item(GetName()) + "."));
|
||||||
|
UtilPlayer.message(_owner.GetDriver(), F.main("MK", "You hit " + F.elem(kart.GetDriver().getName()) + " with " + F.item(GetName()) + "."));
|
||||||
|
|
||||||
|
//Crash
|
||||||
|
new Crash_Explode(kart, 1.2f, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Effect
|
||||||
|
GetEntity().getWorld().playSound(GetEntity().getLocation(), Sound.SPIDER_DEATH, 2f, 1f);
|
||||||
|
GetEntity().getWorld().playSound(GetEntity().getLocation(), Sound.SPIDER_DEATH, 2f, 1f);
|
||||||
|
GetEntity().getWorld().playSound(GetEntity().getLocation(), Sound.SPIDER_DEATH, 2f, 1f);
|
||||||
|
GetEntity().getWorld().playSound(GetEntity().getLocation(), Sound.SPIDER_DEATH, 2f, 1f);
|
||||||
|
|
||||||
|
_dead = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean Update()
|
||||||
|
{
|
||||||
|
if (_dead)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if (UtilTime.elapsed(_spawn, 15000))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if (_target == null)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if (!_target.GetDriver().isOnline())
|
||||||
|
return true;
|
||||||
|
|
||||||
|
//Respawn
|
||||||
|
if (GetEntity() == null || !GetEntity().isValid())
|
||||||
|
{
|
||||||
|
if (_spawned)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
SetEntity(GetLocation().getWorld().spawnEntity(GetLocation(), GetType()));
|
||||||
|
_spawned = true;
|
||||||
|
}
|
||||||
|
//Return
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//Push
|
||||||
|
Vector dir = UtilAlg.getTrajectory2d(GetEntity(), _target.GetDriver());
|
||||||
|
dir.multiply(0.75);
|
||||||
|
dir.setY(-0.4);
|
||||||
|
GetEntity().setVelocity(dir);
|
||||||
|
|
||||||
|
//Walk
|
||||||
|
if (GetEntity() instanceof Creature)
|
||||||
|
{
|
||||||
|
EntityCreature ec = ((CraftCreature)GetEntity()).getHandle();
|
||||||
|
Navigation nav = ec.getNavigation();
|
||||||
|
nav.a(_target.GetDriver().getLocation().getX(), _target.GetDriver().getLocation().getY(), _target.GetDriver().getLocation().getZ(), 0.4f);
|
||||||
|
|
||||||
|
//Direction
|
||||||
|
ec.setPositionRotation(GetEntity().getLocation().getX(), GetEntity().getLocation().getY(), GetEntity().getLocation().getZ(),
|
||||||
|
UtilAlg.GetYaw(dir), 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,210 @@
|
|||||||
|
package nautilus.game.minekart.track.ents;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.Sound;
|
||||||
|
import org.bukkit.block.Block;
|
||||||
|
import org.bukkit.block.BlockFace;
|
||||||
|
import org.bukkit.craftbukkit.v1_7_R1.entity.CraftCreature;
|
||||||
|
import org.bukkit.entity.Creature;
|
||||||
|
import org.bukkit.entity.EntityType;
|
||||||
|
|
||||||
|
import mineplex.core.common.util.F;
|
||||||
|
import mineplex.core.common.util.UtilAlg;
|
||||||
|
import mineplex.core.common.util.UtilPlayer;
|
||||||
|
import nautilus.game.minekart.kart.Kart;
|
||||||
|
import nautilus.game.minekart.kart.KartState;
|
||||||
|
import nautilus.game.minekart.kart.crash.Crash_Explode;
|
||||||
|
import nautilus.game.minekart.track.Track;
|
||||||
|
import nautilus.game.minekart.track.TrackEntity;
|
||||||
|
import net.minecraft.server.v1_7_R1.EntityCreature;
|
||||||
|
|
||||||
|
public class Train extends TrackEntity
|
||||||
|
{
|
||||||
|
private Location _next = null;
|
||||||
|
private Location _past = null;
|
||||||
|
|
||||||
|
public Train(Track track, Location loc)
|
||||||
|
{
|
||||||
|
super(track, EntityType.IRON_GOLEM, "Golem Train", 5, 1.6, 200, loc);
|
||||||
|
|
||||||
|
_past = new Location(GetLocation().getWorld(), GetLocation().getX(), GetLocation().getY(), GetLocation().getZ());
|
||||||
|
_next = _past;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void Collide(Kart kart)
|
||||||
|
{
|
||||||
|
if (kart.GetKartState() == KartState.Crash)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!kart.IsInvulnerable(false))
|
||||||
|
{
|
||||||
|
|
||||||
|
UtilPlayer.message(kart.GetDriver(), F.main("MK", "You hit " + F.item(GetName()) + "."));
|
||||||
|
|
||||||
|
//Crash
|
||||||
|
kart.CrashStop();
|
||||||
|
new Crash_Explode(kart, 1.4f, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Effect
|
||||||
|
GetEntity().getWorld().playSound(GetEntity().getLocation(), Sound.EXPLODE, 2f, 0.2f);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void Movement()
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
if (_train >= 4)
|
||||||
|
return;
|
||||||
|
|
||||||
|
//Put on tracks
|
||||||
|
Location loc = FindTarget();
|
||||||
|
|
||||||
|
if (loc == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
_past = _next;
|
||||||
|
_next = loc;
|
||||||
|
|
||||||
|
GetEntity().teleport(_next);
|
||||||
|
|
||||||
|
//Project Forward
|
||||||
|
loc = FindTarget();
|
||||||
|
|
||||||
|
if (loc == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
_past = _next;
|
||||||
|
_next = loc;
|
||||||
|
|
||||||
|
GetEntity().setVelocity(UtilAlg.getTrajectory(_past, _next).multiply(0.5));
|
||||||
|
|
||||||
|
Minecart cart = (Minecart)GetEntity();
|
||||||
|
cart.setSlowWhenEmpty(false);
|
||||||
|
|
||||||
|
SetEntity(null);
|
||||||
|
|
||||||
|
_past = new Location(GetLocation().getWorld(), GetLocation().getX(), GetLocation().getY(), GetLocation().getZ());
|
||||||
|
_next = _past;
|
||||||
|
|
||||||
|
_carriage++;
|
||||||
|
|
||||||
|
if (_carriage >= 8)
|
||||||
|
{
|
||||||
|
_train++;
|
||||||
|
_carriage = 0;
|
||||||
|
SetSpawnTimer(System.currentTimeMillis() + 6000);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
if (_next.equals(_past))
|
||||||
|
{
|
||||||
|
//Get First
|
||||||
|
Location loc = FindTarget();
|
||||||
|
|
||||||
|
if (loc == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
_next = loc;
|
||||||
|
|
||||||
|
if (_next.getBlock().getRelative(BlockFace.NORTH).equals(_past.getBlock()))
|
||||||
|
{
|
||||||
|
_past = _next;
|
||||||
|
_next = _next.getBlock().getRelative(BlockFace.WEST).getLocation().add(0.5, 0, 0.5);
|
||||||
|
}
|
||||||
|
else if (_next.getBlock().getRelative(BlockFace.SOUTH).equals(_past.getBlock()))
|
||||||
|
{
|
||||||
|
_past = _next;
|
||||||
|
_next = _next.getBlock().getRelative(BlockFace.EAST).getLocation().add(0.5, 0, 0.5);
|
||||||
|
}
|
||||||
|
else if (_next.getBlock().getRelative(BlockFace.EAST).equals(_past.getBlock()))
|
||||||
|
{
|
||||||
|
_past = _next;
|
||||||
|
_next = _next.getBlock().getRelative(BlockFace.NORTH).getLocation().add(0.5, 0, 0.5);
|
||||||
|
}
|
||||||
|
else if (_next.getBlock().getRelative(BlockFace.WEST).equals(_past.getBlock()))
|
||||||
|
{
|
||||||
|
_past = _next;
|
||||||
|
_next = _next.getBlock().getRelative(BlockFace.SOUTH).getLocation().add(0.5, 0, 0.5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Location loc = FindTarget();
|
||||||
|
|
||||||
|
if (loc == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
_past = _next;
|
||||||
|
_next = loc;
|
||||||
|
|
||||||
|
GetEntity().teleport(_next);
|
||||||
|
SetSpawnTimer(System.currentTimeMillis());
|
||||||
|
|
||||||
|
if (GetEntity() instanceof Creature)
|
||||||
|
{
|
||||||
|
EntityCreature ec = ((CraftCreature)GetEntity()).getHandle();
|
||||||
|
|
||||||
|
//Direction
|
||||||
|
ec.setPositionRotation(GetEntity().getLocation().getX(), GetEntity().getLocation().getY(), GetEntity().getLocation().getZ(),
|
||||||
|
UtilAlg.GetYaw(UtilAlg.getTrajectory2d(_past, _next)), 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
if (UtilMath.offset(_next, GetEntity().getLocation()) < 0.5)
|
||||||
|
{
|
||||||
|
Location loc = FindTarget();
|
||||||
|
|
||||||
|
if (loc == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
_past = _next;
|
||||||
|
_next = loc;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
|
||||||
|
if (GetEntity() instanceof Creature)
|
||||||
|
{
|
||||||
|
EntityCreature ec = ((CraftCreature)GetEntity()).getHandle();
|
||||||
|
Navigation nav = ec.getNavigation();
|
||||||
|
nav.a(_next.getX(), _next.getY(), _next.getZ(), 0.4f);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (UtilTime.elapsed(GetSpawnTimer(), 200))
|
||||||
|
{
|
||||||
|
GetEntity().teleport(_next);
|
||||||
|
SetSpawnTimer(System.currentTimeMillis());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
public Location FindTarget()
|
||||||
|
{
|
||||||
|
ArrayList<Block> tracks = new ArrayList<Block>();
|
||||||
|
Block check;
|
||||||
|
|
||||||
|
check = _next.getBlock().getRelative(0, 0, 1);
|
||||||
|
if (check.getTypeId() == 66 || check.getTypeId() == 27) tracks.add(check);
|
||||||
|
|
||||||
|
check = _next.getBlock().getRelative( 1, 0, 0);
|
||||||
|
if (check.getTypeId() == 66 || check.getTypeId() == 27) tracks.add(check);
|
||||||
|
|
||||||
|
check = _next.getBlock().getRelative(0, 0, -1);
|
||||||
|
if (check.getTypeId() == 66 || check.getTypeId() == 27) tracks.add(check);
|
||||||
|
|
||||||
|
check = _next.getBlock().getRelative(-1, 0, 0);
|
||||||
|
if (check.getTypeId() == 66 || check.getTypeId() == 27) tracks.add(check);
|
||||||
|
|
||||||
|
tracks.remove(_past.getBlock());
|
||||||
|
|
||||||
|
if (tracks.isEmpty())
|
||||||
|
return null;
|
||||||
|
|
||||||
|
return tracks.get(0).getLocation().add(0.5, 0, 0.5);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user