Completely rework the kart mechanics
This commit is contained in:
parent
5b9f5e1678
commit
e716c9b2ea
@ -36,6 +36,7 @@ import mineplex.core.game.nano.NanoFavourite;
|
||||
import mineplex.core.incognito.IncognitoManager;
|
||||
import mineplex.core.incognito.events.IncognitoStatusChangeEvent;
|
||||
import mineplex.core.newnpc.NewNPCManager;
|
||||
import mineplex.core.packethandler.PacketHandler;
|
||||
import mineplex.core.serverConfig.ServerConfiguration;
|
||||
import mineplex.core.stats.StatsManager;
|
||||
import mineplex.core.status.ServerStatusManager;
|
||||
@ -113,6 +114,9 @@ public class NanoManager extends MiniPlugin implements IRelation
|
||||
// AntiCheat
|
||||
private final AntiHack _antiHack;
|
||||
|
||||
// Packet
|
||||
private final PacketHandler _packetHandler;
|
||||
|
||||
// NPC
|
||||
private final NewNPCManager _npcManager;
|
||||
|
||||
@ -189,6 +193,8 @@ public class NanoManager extends MiniPlugin implements IRelation
|
||||
|
||||
_antiHack = require(AntiHack.class);
|
||||
|
||||
_packetHandler = require(PacketHandler.class);
|
||||
|
||||
_npcManager = require(NewNPCManager.class);
|
||||
|
||||
_damageManager = require(DamageManager.class);
|
||||
@ -412,6 +418,11 @@ public class NanoManager extends MiniPlugin implements IRelation
|
||||
return _antiHack;
|
||||
}
|
||||
|
||||
public PacketHandler getPacketHandler()
|
||||
{
|
||||
return _packetHandler;
|
||||
}
|
||||
|
||||
public NewNPCManager getNpcManager()
|
||||
{
|
||||
return _npcManager;
|
||||
|
@ -1,11 +1,14 @@
|
||||
package mineplex.game.nano.game.games.minekart;
|
||||
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.entity.LivingEntity;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.entity.Sheep;
|
||||
import org.bukkit.util.Vector;
|
||||
|
||||
import mineplex.core.common.util.UtilEnt;
|
||||
import mineplex.core.common.util.UtilTime;
|
||||
import mineplex.game.nano.game.games.minekart.KartController.DriftDirection;
|
||||
|
||||
public class Kart
|
||||
{
|
||||
@ -16,23 +19,32 @@ public class Kart
|
||||
private int _lap, _lapCheckpoint, _lapKeyCheckpoint;
|
||||
|
||||
private Vector _velocity;
|
||||
private boolean _crashed;
|
||||
private float _frontWaysInput, _sidewaysInput;
|
||||
private float _yaw;
|
||||
private DriftDirection _driftDirection;
|
||||
private float _driftPower;
|
||||
private long _driftLast;
|
||||
|
||||
Kart(MineKart game, Player driver)
|
||||
private boolean _crashed;
|
||||
private long _crashedAt;
|
||||
|
||||
Kart(Player driver)
|
||||
{
|
||||
_driver = driver;
|
||||
|
||||
_vehicle = driver.getWorld().spawn(driver.getLocation(), Sheep.class);
|
||||
Location location = driver.getLocation();
|
||||
_vehicle = driver.getWorld().spawn(location, Sheep.class);
|
||||
|
||||
UtilEnt.vegetate(_vehicle, true);
|
||||
UtilEnt.ghost(_vehicle, true, false);
|
||||
UtilEnt.setFakeHead(_vehicle, true);
|
||||
|
||||
_vehicle.setPassenger(driver);
|
||||
|
||||
_lap = 1;
|
||||
|
||||
_velocity = new Vector();
|
||||
|
||||
_vehicle.setPassenger(driver);
|
||||
_yaw = location.getYaw();
|
||||
}
|
||||
|
||||
public void remove()
|
||||
@ -90,13 +102,82 @@ public class Kart
|
||||
return _velocity;
|
||||
}
|
||||
|
||||
public void setInput(float frontWaysInput, float sidewaysInput)
|
||||
{
|
||||
_frontWaysInput = frontWaysInput;
|
||||
_sidewaysInput = sidewaysInput;
|
||||
}
|
||||
|
||||
public float getFrontWaysInput()
|
||||
{
|
||||
return _frontWaysInput;
|
||||
}
|
||||
|
||||
public float getSidewaysInput()
|
||||
{
|
||||
return _sidewaysInput;
|
||||
}
|
||||
|
||||
public void setYaw(float yaw)
|
||||
{
|
||||
_yaw = yaw;
|
||||
}
|
||||
|
||||
public float getYaw()
|
||||
{
|
||||
return _yaw;
|
||||
}
|
||||
|
||||
public void setDriftDirection(DriftDirection driftDirection)
|
||||
{
|
||||
_driftDirection = driftDirection;
|
||||
}
|
||||
|
||||
public void setDriftPower(float driftPower)
|
||||
{
|
||||
_driftPower = Math.min(0.999F, driftPower);
|
||||
}
|
||||
|
||||
public DriftDirection getDriftDirection()
|
||||
{
|
||||
return _driftDirection;
|
||||
}
|
||||
|
||||
public float getDriftPower()
|
||||
{
|
||||
return _driftPower;
|
||||
}
|
||||
|
||||
public void setDriftLast()
|
||||
{
|
||||
_driftLast = System.currentTimeMillis();
|
||||
_driftPower = 0;
|
||||
}
|
||||
|
||||
public boolean isBoosting()
|
||||
{
|
||||
return !UtilTime.elapsed(_driftLast, 1000);
|
||||
}
|
||||
|
||||
public void setCrashed(boolean crashed)
|
||||
{
|
||||
_crashed = crashed;
|
||||
_driftDirection = null;
|
||||
_driftLast = 0;
|
||||
|
||||
if (crashed)
|
||||
{
|
||||
_crashedAt = System.currentTimeMillis();
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isCrashed()
|
||||
{
|
||||
return _crashed;
|
||||
}
|
||||
|
||||
public long getCrashedAt()
|
||||
{
|
||||
return _crashedAt;
|
||||
}
|
||||
}
|
||||
|
@ -4,12 +4,24 @@ import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.util.Vector;
|
||||
|
||||
import mineplex.core.common.util.UtilAlg;
|
||||
|
||||
public class KartController
|
||||
{
|
||||
|
||||
public enum DriftDirection
|
||||
{
|
||||
LEFT, RIGHT
|
||||
}
|
||||
|
||||
void applyAirDrag(Kart kart)
|
||||
{
|
||||
Vector velocity = kart.getVelocity().multiply(0.96);
|
||||
if (kart.getFrontWaysInput() != 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
Vector velocity = kart.getVelocity().multiply(0.95);
|
||||
|
||||
if (velocity.length() < 0.05)
|
||||
{
|
||||
@ -21,9 +33,11 @@ public class KartController
|
||||
{
|
||||
Location location = kart.getVehicle().getLocation().add(0, 0.5, 0);
|
||||
|
||||
kart.getDriver().sendMessage("y=" + kart.getVehicle().getLocation().getY() % 1);
|
||||
|
||||
if (location.getBlock().getType() != Material.AIR)
|
||||
{
|
||||
kart.getVelocity().multiply(-0.5);
|
||||
kart.getVelocity().multiply(-1);
|
||||
kart.getVelocity().setY(0.5);
|
||||
kart.setCrashed(true);
|
||||
}
|
||||
@ -37,21 +51,43 @@ public class KartController
|
||||
}
|
||||
|
||||
Vector velocity = kart.getVelocity();
|
||||
Vector player = kart.getDriver().getLocation().getDirection().setY(0).multiply(0.04);
|
||||
Vector facing = UtilAlg.getTrajectory(kart.getYaw(), 0).multiply(0.03 * kart.getFrontWaysInput());
|
||||
velocity.add(facing);
|
||||
}
|
||||
|
||||
if (velocity.lengthSquared() == 0)
|
||||
void turn(Kart kart)
|
||||
{
|
||||
double velocityLength = kart.getVelocity().length();
|
||||
|
||||
if (velocityLength < 0.1)
|
||||
{
|
||||
velocity = player;
|
||||
|
||||
if (velocity.lengthSquared() == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
kart.setVelocity(velocity);
|
||||
return;
|
||||
}
|
||||
|
||||
velocity.add(player);
|
||||
float velocityInverse = (float) (2 - velocityLength);
|
||||
float rotation = 3 * kart.getSidewaysInput() * velocityInverse;
|
||||
|
||||
kart.setYaw(kart.getYaw() - rotation);
|
||||
}
|
||||
|
||||
void drift(Kart kart)
|
||||
{
|
||||
if (kart.getDriftDirection() != null && kart.getVelocity().lengthSquared() > 0)
|
||||
{
|
||||
float power = 0.05F * (kart.getDriftDirection() == DriftDirection.LEFT ? kart.getSidewaysInput() : -kart.getSidewaysInput());
|
||||
|
||||
kart.setDriftPower(kart.getDriftPower() + power);
|
||||
}
|
||||
else if (kart.getDriftPower() > 0.2)
|
||||
{
|
||||
Vector facing = UtilAlg.getTrajectory(kart.getYaw(), 0).multiply(kart.getVelocity().length() + (kart.getDriftPower() / 2));
|
||||
kart.setVelocity(facing);
|
||||
kart.setDriftLast();
|
||||
}
|
||||
else
|
||||
{
|
||||
kart.setDriftPower(0);
|
||||
}
|
||||
}
|
||||
|
||||
void applyTopSpeed(Kart kart)
|
||||
@ -62,12 +98,15 @@ public class KartController
|
||||
}
|
||||
|
||||
Vector velocity = kart.getVelocity();
|
||||
double length = velocity.length();
|
||||
double max = kart.isBoosting() ? 1.5 : 0.7;
|
||||
|
||||
if (velocity.length() > 1)
|
||||
if (length > max)
|
||||
{
|
||||
kart.setVelocity(velocity.clone()
|
||||
.setY(0)
|
||||
.normalize());
|
||||
.normalize()
|
||||
.multiply(max));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -6,17 +6,20 @@ import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import net.minecraft.server.v1_8_R3.PacketPlayInSteerVehicle;
|
||||
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.Sound;
|
||||
import org.bukkit.entity.LivingEntity;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
import mineplex.core.common.util.UtilAlg;
|
||||
import mineplex.core.common.util.UtilEnt;
|
||||
import mineplex.core.common.util.UtilMath;
|
||||
import mineplex.core.common.util.UtilTime;
|
||||
import mineplex.core.packethandler.IPacketHandler;
|
||||
import mineplex.core.packethandler.PacketInfo;
|
||||
import mineplex.core.updater.UpdateType;
|
||||
import mineplex.core.updater.event.UpdateEvent;
|
||||
import mineplex.game.nano.NanoManager;
|
||||
@ -25,8 +28,9 @@ import mineplex.game.nano.game.SoloGame;
|
||||
import mineplex.game.nano.game.event.PlayerGameApplyEvent;
|
||||
import mineplex.game.nano.game.event.PlayerGameRespawnEvent;
|
||||
import mineplex.game.nano.game.event.PlayerStateChangeEvent;
|
||||
import mineplex.game.nano.game.games.minekart.KartController.DriftDirection;
|
||||
|
||||
public class MineKart extends SoloGame
|
||||
public class MineKart extends SoloGame implements IPacketHandler
|
||||
{
|
||||
|
||||
private int _spawnIndex;
|
||||
@ -52,6 +56,8 @@ public class MineKart extends SoloGame
|
||||
_teamComponent.setAdjustSpawnYaw(false);
|
||||
|
||||
_damageComponent.setDamage(false);
|
||||
|
||||
manager.getPacketHandler().addPacketHandler(this, PacketPlayInSteerVehicle.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -97,6 +103,41 @@ public class MineKart extends SoloGame
|
||||
public void disable()
|
||||
{
|
||||
_checkpoints.clear();
|
||||
_manager.getPacketHandler().removePacketHandler(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handle(PacketInfo packetInfo)
|
||||
{
|
||||
Kart kart = _karts.get(packetInfo.getPlayer());
|
||||
|
||||
if (kart != null)
|
||||
{
|
||||
PacketPlayInSteerVehicle packet = (PacketPlayInSteerVehicle) packetInfo.getPacket();
|
||||
|
||||
// Dismounting
|
||||
if (packet.d())
|
||||
{
|
||||
packetInfo.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
|
||||
// a() - Right-Left, b() - Backwards-Forwards
|
||||
kart.setInput(packet.b(), packet.a());
|
||||
|
||||
// Holding Space
|
||||
if (packet.c())
|
||||
{
|
||||
if (packet.a() != 0 && kart.getDriftDirection() == null)
|
||||
{
|
||||
kart.setDriftDirection(packet.a() > 0 ? DriftDirection.LEFT : DriftDirection.RIGHT);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
kart.setDriftDirection(null);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
@ -118,11 +159,9 @@ public class MineKart extends SoloGame
|
||||
{
|
||||
_worldComponent.setCreatureAllowOverride(true);
|
||||
|
||||
Kart kart = new Kart(this, player);
|
||||
Kart kart = new Kart(player);
|
||||
_karts.put(player, kart);
|
||||
|
||||
player.getInventory().addItem(new ItemStack(Material.STONE_SWORD));
|
||||
|
||||
_worldComponent.setCreatureAllowOverride(false);
|
||||
}, 1);
|
||||
}
|
||||
@ -173,7 +212,7 @@ public class MineKart extends SoloGame
|
||||
|
||||
if (kart.isCrashed())
|
||||
{
|
||||
if (UtilEnt.isGrounded(kart.getVehicle()))
|
||||
if (UtilTime.elapsed(kart.getCrashedAt(), 1000) && UtilEnt.isGrounded(kart.getVehicle()))
|
||||
{
|
||||
kart.setCrashed(false);
|
||||
player.sendMessage("setCrashed(false)");
|
||||
@ -190,9 +229,11 @@ public class MineKart extends SoloGame
|
||||
_controller.collideBlock(kart);
|
||||
|
||||
// Accelerate
|
||||
if (canControl && player.isBlocking())
|
||||
if (canControl)
|
||||
{
|
||||
_controller.turn(kart);
|
||||
_controller.accelerate(kart);
|
||||
_controller.drift(kart);
|
||||
_controller.applyTopSpeed(kart);
|
||||
}
|
||||
|
||||
@ -201,10 +242,11 @@ public class MineKart extends SoloGame
|
||||
location.add(kart.getVelocity());
|
||||
location.setDirection(kart.getVelocity());
|
||||
UtilEnt.setPosition(vehicle, location);
|
||||
UtilEnt.CreatureLook(vehicle, location.getYaw());
|
||||
UtilEnt.CreatureLook(vehicle, kart.getYaw());
|
||||
|
||||
location.getWorld().playSound(location, Sound.PIG_IDLE, (float) (.1 + velocityLength / 2), (float) (.5 + velocityLength));
|
||||
player.setExp((float) velocityLength);
|
||||
player.setLevel((int) (velocityLength * 100));
|
||||
player.setExp(kart.getDriftPower());
|
||||
});
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user