Building / Fixed some tests

This commit is contained in:
Anuken
2020-02-15 14:51:31 -05:00
parent 03d0f54083
commit 8b4fcf99a6
21 changed files with 221 additions and 188 deletions

View File

@@ -7,12 +7,14 @@ import mindustry.type.*;
public class UnitTypes implements ContentList{
public static UnitType
draug, spirit, phantom,
wraith, ghoul, revenant, lich, reaper,
crawler, titan, fortress, eruptor, chaosArray, eradicator;
public static @EntityDef({Unitc.class, Legsc.class}) UnitType dagger;
public static @EntityDef({Unitc.class, WaterMovec.class}) UnitType vanguard;
public static @EntityDef({Unitc.class, Minerc.class}) UnitType draug;
public static @EntityDef({Unitc.class}) UnitType spirit;
public static @EntityDef({Unitc.class, Builderc.class}) UnitType phantom;
public static UnitType alpha, delta, tau, omega, dart, javelin, trident, glaive;
public static UnitType starter;
@@ -52,63 +54,51 @@ public class UnitTypes implements ContentList{
}});
}};
/*
draug = new UnitDef("draug", MinerDrone::new){{
draug = new UnitType("draug"){{
flying = true;
drag = 0.01f;
speed = 0.3f;
maxVelocity = 1.2f;
drag = 0.05f;
speed = 1.5f;
range = 50f;
health = 80;
minePower = 0.9f;
mineSpeed = 0.9f;
engineSize = 1.8f;
engineOffset = 5.7f;
drillTier = 1;
}};
spirit = new UnitDef("spirit", RepairDrone::new){{
spirit = new UnitType("spirit"){{
flying = true;
drag = 0.01f;
speed = 0.42f;
maxVelocity = 1.6f;
drag = 0.05f;
speed = 1.5f;
range = 50f;
health = 100;
engineSize = 1.8f;
engineOffset = 5.7f;
weapon = new Weapon(){{
length = 1.5f;
weapons.add(new Weapon(){{
y = 1.5f;
reload = 40f;
width = 0.5f;
x = 0.5f;
alternate = true;
ejectEffect = Fx.none;
recoil = 2f;
bullet = Bullets.healBulletBig;
shootSound = Sounds.pew;
}};
}});
}};
phantom = new UnitDef("phantom", BuilderDrone::new){{
phantom = new UnitType("phantom"){{
flying = true;
drag = 0.01f;
drag = 0.05f;
mass = 2f;
speed = 0.45f;
maxVelocity = 1.9f;
speed = 1.5f;
range = 70f;
itemCapacity = 70;
health = 400;
buildPower = 0.4f;
buildSpeed = 0.4f;
engineOffset = 6.5f;
toMine = ObjectSet.with(Items.lead, Items.copper, Items.titanium);
weapon = new Weapon(){{
length = 1.5f;
reload = 20f;
width = 0.5f;
alternate = true;
ejectEffect = Fx.none;
recoil = 2f;
bullet = Bullets.healBullet;
}};
}};
/*
dagger = new UnitDef("dagger", GroundUnit::new){{
maxVelocity = 1.1f;
speed = 0.2f;
@@ -421,7 +411,7 @@ public class UnitTypes implements ContentList{
{
flying = true;
drillTier = 1;
minePower = 4f;
mineSpeed = 4f;
speed = 0.49f;
drag = 0.09f;
health = 200f;
@@ -430,7 +420,7 @@ public class UnitTypes implements ContentList{
weaponOffsetY = -1;
engineColor = Pal.lightTrail;
cellTrnsY = 1f;
buildPower = 1.2f;
buildSpeed = 1.2f;
weapon = new Weapon("vanguard-blaster"){{
length = 1.5f;
reload = 30f;
@@ -479,7 +469,7 @@ public class UnitTypes implements ContentList{
itemCapacity = 15;
mass = 0.9f;
health = 150f;
buildPower = 0.9f;
buildSpeed = 0.9f;
weaponOffsetX = 1;
weaponOffsetY = -1;
engineColor = Pal.heal;
@@ -519,7 +509,7 @@ public class UnitTypes implements ContentList{
speed = 0.5f;
itemCapacity = 40;
boostSpeed = 0.95f;
buildPower = 1.2f;
buildSpeed = 1.2f;
engineColor = Color.valueOf("ffd37f");
health = 250f;
weaponOffsetX = 4f;
@@ -559,7 +549,7 @@ public class UnitTypes implements ContentList{
boostSpeed = 0.8f;
canHeal = true;
health = 200f;
buildPower = 1.6f;
buildSpeed = 1.6f;
engineColor = Pal.heal;
weapon = new Weapon("heal-blaster"){{
@@ -609,7 +599,7 @@ public class UnitTypes implements ContentList{
weaponOffsetY = 0;
engineColor = Color.valueOf("feb380");
health = 350f;
buildPower = 1.5f;
buildSpeed = 1.5f;
weapon = new Weapon("swarmer"){{
length = 1.5f;
recoil = 4f;
@@ -682,7 +672,7 @@ public class UnitTypes implements ContentList{
weaponOffsetY = -1;
engineColor = Pal.lightTrail;
cellTrnsY = 1f;
buildPower = 1.1f;
buildSpeed = 1.1f;
weapon = new Weapon("blaster"){{
length = 1.5f;
reload = 15f;
@@ -789,7 +779,7 @@ public class UnitTypes implements ContentList{
itemCapacity = 30;
engineColor = Color.valueOf("84f491");
cellTrnsY = 1f;
buildPower = 2.5f;
buildSpeed = 2.5f;
weapon = new Weapon("bomber"){{
length = 0f;
width = 2f;
@@ -831,7 +821,7 @@ public class UnitTypes implements ContentList{
itemCapacity = 60;
engineColor = Color.valueOf("feb380");
cellTrnsY = 1f;
buildPower = 1.2f;
buildSpeed = 1.2f;
weapon = new Weapon("bomber"){{
length = 1.5f;

View File

@@ -11,6 +11,7 @@ import arc.util.serialization.*;
import mindustry.*;
import mindustry.annotations.Annotations.*;
import mindustry.core.GameState.*;
import mindustry.entities.units.*;
import mindustry.game.EventType.*;
import mindustry.game.*;
import mindustry.gen.*;
@@ -528,23 +529,28 @@ public class NetClient implements ApplicationListener{
}
void sync(){
//TODO implement
/*
if(timer.get(0, playerSyncTime)){
BuildRequest[] requests;
//limit to 10 to prevent buffer overflows
int usedRequests = Math.min(player.builder().requests().size, 10);
BuildRequest[] requests = null;
if(player.isBuilder() && control.input.isBuilding){
//limit to 10 to prevent buffer overflows
int usedRequests = Math.min(player.builder().requests().size, 10);
requests = new BuildRequest[usedRequests];
for(int i = 0; i < usedRequests; i++){
requests[i] = player.builder().requests().get(i);
requests = new BuildRequest[usedRequests];
for(int i = 0; i < usedRequests; i++){
requests[i] = player.builder().requests().get(i);
}
}
Call.onClientShapshot(lastSent++, player.x, player.y,
player.pointerX, player.pointerY, player.rotation, player.baseRotation,
player.vel().x, player.vel().y,
Unitc unit = player.dead() ? Nulls.unit : player.unit();
Call.onClientShapshot(lastSent++,
unit.x(), unit.y(),
player.mouseX(), player.mouseY(),
unit.rotation(),
unit instanceof Legsc ? ((Legsc)unit).baseRotation() : 0,
unit.vel().x, unit.vel().y,
player.miner().mineTile(),
player.isBoosting, player.isShooting, ui.chatfrag.shown(), player.isBuilding,
/*player.isBoosting*/false, control.input.isShooting, ui.chatfrag.shown(),
requests,
Core.camera.position.x, Core.camera.position.y,
Core.camera.width * viewScale, Core.camera.height * viewScale);
@@ -552,7 +558,7 @@ public class NetClient implements ApplicationListener{
if(timer.get(1, 60)){
Call.onPing(Time.millis());
}*/
}
}
String getUsid(String ip){

View File

@@ -10,6 +10,7 @@ import arc.util.CommandHandler.*;
import arc.util.io.*;
import arc.util.serialization.*;
import mindustry.annotations.Annotations.*;
import mindustry.content.*;
import mindustry.core.GameState.*;
import mindustry.entities.units.*;
import mindustry.game.EventType.*;
@@ -501,8 +502,6 @@ public class NetServer implements ApplicationListener{
BuildRequest[] requests,
float viewX, float viewY, float viewWidth, float viewHeight
){
//TODO this entire thing needs to be rewritten.
/*
NetConnection connection = player.con();
if(connection == null || snapshotID < connection.lastRecievedClientSnapshot) return;
@@ -515,78 +514,90 @@ public class NetServer implements ApplicationListener{
connection.viewWidth = viewWidth;
connection.viewHeight = viewHeight;
long elapsed = Time.timeSinceMillis(connection.lastRecievedClientTime);
float maxSpeed = boosting && !player.mech.flying ? player.mech.compoundSpeedBoost : player.mech.compoundSpeed;
float maxMove = elapsed / 1000f * 60f * Math.min(maxSpeed, player.mech.maxSpeed) * 1.2f;
player.mouseX(pointerX);
player.mouseY(pointerY);
player.miner().mineTile(mining);
player.isTyping = chatting;
player.isBoosting = boosting;
player.isShooting = shooting;
player.isBuilding = building;
player.builder().requests().clear();
player.typing(chatting);
for(BuildRequest req : requests){
if(req == null) continue;
Tile tile = world.tile(req.x, req.y);
if(tile == null || (!req.breaking && req.block == null)) continue;
//auto-skip done requests
if(req.breaking && tile.block() == Blocks.air){
continue;
}else if(!req.breaking && tile.block() == req.block && (!req.block.rotate || tile.rotation() == req.rotation)){
continue;
}else if(connection.rejectedRequests.contains(r -> r.breaking == req.breaking && r.x == req.x && r.y == req.y)){ //check if request was recently rejected, and skip it if so
continue;
}else if(!netServer.admins.allowAction(player, req.breaking ? ActionType.breakBlock : ActionType.placeBlock, tile, action -> { //make sure request is allowed by the server
action.block = req.block;
action.rotation = req.rotation;
action.config = req.config;
})){
//force the player to remove this request if that's not the case
Call.removeQueueBlock(player.con(), req.x, req.y, req.breaking);
connection.rejectedRequests.add(req);
continue;
player.unit().controlWeapons(shooting, shooting);
player.unit().aim(pointerX, pointerY);
if(player.isBuilder()){
player.builder().clearBuilding();
}
if(player.isMiner()){
player.miner().mineTile(mining);
}
if(requests != null){
for(BuildRequest req : requests){
if(req == null) continue;
Tile tile = world.tile(req.x, req.y);
if(tile == null || (!req.breaking && req.block == null)) continue;
//auto-skip done requests
if(req.breaking && tile.block() == Blocks.air){
continue;
}else if(!req.breaking && tile.block() == req.block && (!req.block.rotate || tile.rotation() == req.rotation)){
continue;
}else if(connection.rejectedRequests.contains(r -> r.breaking == req.breaking && r.x == req.x && r.y == req.y)){ //check if request was recently rejected, and skip it if so
continue;
}else if(!netServer.admins.allowAction(player, req.breaking ? ActionType.breakBlock : ActionType.placeBlock, tile, action -> { //make sure request is allowed by the server
action.block = req.block;
action.rotation = req.rotation;
action.config = req.config;
})){
//force the player to remove this request if that's not the case
Call.removeQueueBlock(player.con(), req.x, req.y, req.breaking);
connection.rejectedRequests.add(req);
continue;
}
player.builder().requests().addLast(req);
}
player.builder().requests().addLast(req);
}
connection.rejectedRequests.clear();
vector.set(x - player.getInterpolator().target.x, y - player.getInterpolator().target.y);
vector.limit(maxMove);
if(!player.dead()){
Unitc unit = player.unit();
long elapsed = Time.timeSinceMillis(connection.lastRecievedClientTime);
float maxSpeed = player.dead() ? Float.MAX_VALUE : player.unit().type().speed;
float maxMove = elapsed / 1000f * 60f * maxSpeed * 1.1f;
float prevx = player.x, prevy = player.y;
player.set(player.getInterpolator().target.x, player.getInterpolator().target.y);
if(!player.mech.flying && player.boostHeat < 0.01f){
player.move(vector.x, vector.y);
vector.set(x - unit.interpolator().target.x, y - unit.interpolator().target.y);
vector.limit(maxMove);
float prevx = unit.x(), prevy = unit.y();
unit.set(unit.interpolator().target.x, unit.interpolator().target.y);
if(!unit.isFlying()){
unit.move(vector.x, vector.y);
}else{
unit.trns(vector.x, vector.y);
}
float newx = unit.x(), newy = unit.y();
if(!verifyPosition){
unit.x(prevx);
unit.y(prevy);
newx = x;
newy = y;
}else if(Mathf.dst(x, y, newx, newy) > correctDist){
Call.onPositionSet(player.con(), newx, newy); //teleport and correct position when necessary
}
//reset player to previous synced position so it gets interpolated
unit.x(prevx);
unit.y(prevy);
//set interpolator target to *new* position so it moves toward it
unit.interpolator().read(unit.x(), unit.y(), newx, newy, rotation, baseRotation);
unit.vel().set(xVelocity, yVelocity); //only for visual calculation purposes, doesn't actually update the player
}else{
player.x += vector.x;
player.y += vector.y;
player.x(x);
player.y(y);
}
float newx = player.x, newy = player.y;
if(!verifyPosition){
player.x = prevx;
player.y = prevy;
newx = x;
newy = y;
}else if(Mathf.dst(x, y, newx, newy) > correctDist){
Call.onPositionSet(player.con(), newx, newy); //teleport and correct position when necessary
}
//reset player to previous synced position so it gets interpolated
player.x = prevx;
player.y = prevy;
//set interpolator target to *new* position so it moves toward it
player.getInterpolator().read(player.x, player.y, newx, newy, rotation, baseRotation);
player.vel().set(xVelocity, yVelocity); //only for visual calculation purposes, doesn't actually update the player
connection.lastRecievedClientSnapshot = snapshotID;
connection.lastRecievedClientTime = Time.millis();*/
connection.lastRecievedClientTime = Time.millis();
}
@Remote(targets = Loc.client, called = Loc.server)

View File

@@ -10,7 +10,7 @@ class AllDefs{
}
@GroupDef(Playerc.class)
@GroupDef(value = Playerc.class, mapping = true)
class player{
}
@@ -20,7 +20,7 @@ class AllDefs{
}
@GroupDef(value = Unitc.class, spatial = true, collide = {unit.class})
@GroupDef(value = Unitc.class, spatial = true, collide = {unit.class}, mapping = true)
class unit{
}
@@ -30,7 +30,7 @@ class AllDefs{
}
@GroupDef(Syncc.class)
@GroupDef(value = Syncc.class, mapping = true)
class sync{
}

View File

@@ -23,7 +23,7 @@ import java.util.*;
import static mindustry.Vars.*;
@Component
abstract class BuilderComp implements Unitc{
abstract class BuilderComp implements Unitc, DrawLayerFlyingc{
static final Vec2[] tmptr = new Vec2[]{new Vec2(), new Vec2(), new Vec2(), new Vec2()};
@Import float x, y, rotation;
@@ -32,7 +32,8 @@ abstract class BuilderComp implements Unitc{
transient float buildSpeed = 1f;
//boolean building;
void updateBuilding(){
@Override
public void update(){
float finalPlaceDst = state.rules.infiniteResources ? Float.MAX_VALUE : buildingRange;
Iterator<BuildRequest> it = requests.iterator();
@@ -189,7 +190,8 @@ abstract class BuilderComp implements Unitc{
return requests.size == 0 ? null : requests.first();
}
void drawOver(){
@Override
public void drawFlying(){
if(!isBuilding()) return;
BuildRequest request = buildRequest();
Tile tile = world.tile(request.x, request.y);
@@ -211,7 +213,7 @@ abstract class BuilderComp implements Unitc{
tmptr[2].set(tile.drawx() - sz, tile.drawy() + sz);
tmptr[3].set(tile.drawx() + sz, tile.drawy() + sz);
Arrays.sort(tmptr, Structs.comparingFloat(vec -> Angles.angleDist(angleTo(vec), ang)));
Arrays.sort(tmptr, Structs.comparingFloat(vec -> -Angles.angleDist(angleTo(vec), ang)));
float x1 = tmptr[0].x, y1 = tmptr[0].y,
x3 = tmptr[1].x, y3 = tmptr[1].y;

View File

@@ -33,7 +33,8 @@ abstract class MinerComp implements Itemsc, Posc, Teamc, Rotc{
return mineTile != null;
}
void updateMining(){
@Override
public void update(){
Tilec core = closestCore();
if(core != null && mineTile != null && mineTile.drop() != null && !acceptsItem(mineTile.drop()) && dst(core) < mineTransferRange){
@@ -47,6 +48,7 @@ abstract class MinerComp implements Itemsc, Posc, Teamc, Rotc{
}
if(mineTile == null || core == null || mineTile.block() != Blocks.air || dst(mineTile.worldx(), mineTile.worldy()) > miningRange
|| (((Object)this) instanceof Builderc && ((Builderc)(Object)this).isBuilding())
|| mineTile.drop() == null || !acceptsItem(mineTile.drop()) || !canMine(mineTile.drop())){
mineTile = null;
mineTimer = 0f;

View File

@@ -20,7 +20,7 @@ import static mindustry.Vars.*;
@Component
abstract class UnitComp implements Healthc, Velc, Statusc, Teamc, Itemsc, Hitboxc, Rotc, Massc, Unitc, Weaponsc, Drawc, Boundedc,
DrawLayerGroundc, DrawLayerFlyingc, DrawLayerGroundShadowsc, DrawLayerFlyingShadowsc, Syncc{
@Import float x, y, rotation;
@Import float x, y, rotation, elevation;
private UnitController controller;
private UnitType type;
@@ -83,6 +83,8 @@ abstract class UnitComp implements Healthc, Velc, Statusc, Teamc, Itemsc, Hitbox
hitSize(type.hitsize);
controller(type.createController());
setupWeapons(type);
elevation = type.flying ? 1f : 0f;
}
@Override
@@ -186,4 +188,22 @@ abstract class UnitComp implements Healthc, Velc, Statusc, Teamc, Itemsc, Hitbox
Events.fire(Trigger.suicideBomb);
}
}
//TODO this is bad
public boolean isPlayer(){
return controller instanceof Playerc;
}
public boolean canMine(Item item){
return type.drillTier >= item.hardness;
}
public float miningSpeed(){
return type.mineSpeed;
}
public boolean offloadImmediately(){
return false;
}
}

View File

@@ -1,7 +1,6 @@
package mindustry.entities.units;
import arc.math.*;
import arc.util.*;
import mindustry.gen.*;
public class AIController implements UnitController{
@@ -21,11 +20,12 @@ public class AIController implements UnitController{
@Override
public void update(){
rot += Mathf.range(3f) * Time.delta();
//TODO implement
//rot += Mathf.range(3f) * Time.delta();
unit.moveAt(Tmp.v1.trns(rot, unit.type().speed));
if(!unit.vel().isZero()){
unit.lookAt(unit.vel().angle());
}
//unit.moveAt(Tmp.v1.trns(rot, unit.type().speed));
//if(!unit.vel().isZero()){
// unit.lookAt(unit.vel().angle());
//}
}
}

View File

@@ -3,8 +3,8 @@ package mindustry.game;
import arc.util.ArcAnnotate.*;
import mindustry.core.GameState.*;
import mindustry.ctype.*;
import mindustry.gen.*;
import mindustry.entities.units.*;
import mindustry.gen.*;
import mindustry.type.*;
import mindustry.world.*;
@@ -264,14 +264,13 @@ public class EventType{
public static class BlockBuildEndEvent{
public final Tile tile;
public final Team team;
public final @Nullable
Playerc player;
public final @Nullable Unitc unit;
public final boolean breaking;
public BlockBuildEndEvent(Tile tile, @Nullable Playerc player, Team team, boolean breaking){
public BlockBuildEndEvent(Tile tile, @Nullable Unitc unit, Team team, boolean breaking){
this.tile = tile;
this.team = team;
this.player = player;
this.unit = unit;
this.breaking = breaking;
}
}

View File

@@ -35,7 +35,7 @@ public class UnitType extends UnlockableContent{
public int itemCapacity = 30;
public int drillTier = -1;
public float buildPower = 1f, minePower = 1f;
public float buildSpeed = 1f, mineSpeed = 1f;
public Color engineColor = Pal.boostTo;
public float engineOffset = 5f, engineSize = 2.5f;
@@ -46,6 +46,8 @@ public class UnitType extends UnlockableContent{
public Color lightColor = Pal.powerLight;
public boolean drawCell = true, drawItems = true;
//public ObjectSet<Item> mineables = new ObjectSet<>();
public ObjectSet<StatusEffect> immunities = new ObjectSet<>();
public Sound deathSound = Sounds.bang;

View File

@@ -11,6 +11,7 @@ import arc.util.io.*;
import mindustry.annotations.Annotations.*;
import mindustry.content.*;
import mindustry.entities.*;
import mindustry.entities.units.*;
import mindustry.game.EventType.*;
import mindustry.game.*;
import mindustry.gen.*;
@@ -20,8 +21,6 @@ import mindustry.ui.*;
import mindustry.world.*;
import mindustry.world.modules.*;
import java.io.*;
import static mindustry.Vars.*;
public class BuildBlock extends Block{
@@ -55,7 +54,7 @@ public class BuildBlock extends Block{
public static void onDeconstructFinish(Tile tile, Block block, int builderID){
Team team = tile.team();
Fx.breakBlock.at(tile.drawx(), tile.drawy(), block.size);
Events.fire(new BlockBuildEndEvent(tile, Groups.player.getByID(builderID), team, true));
Events.fire(new BlockBuildEndEvent(tile, Groups.unit.getByID(builderID), team, true));
tile.remove();
if(shouldPlay()) Sounds.breaks.at(tile, calcPitch(false));
}
@@ -105,7 +104,7 @@ public class BuildBlock extends Block{
Call.onConstructFinish(tile, block, builderID, rotation, team, skipConfig);
tile.block().placed(tile);
Events.fire(new BlockBuildEndEvent(tile, Groups.player.getByID(builderID), team, false));
Events.fire(new BlockBuildEndEvent(tile, Groups.unit.getByID(builderID), team, false));
if(shouldPlay()) Sounds.place.at(tile, calcPitch(true));
}
@@ -141,16 +140,13 @@ public class BuildBlock extends Block{
public void tapped(Tile tile, Playerc player){
BuildEntity entity = tile.ent();
//TODO building
/*
//if the target is constructible, begin constructing
if(entity.cblock != null){
if(player.buildWasAutoPaused && !player.isBuilding){
player.isBuilding = true;
if(!headless && entity.cblock != null){
if(control.input.buildWasAutoPaused && !control.input.isBuilding && player.isBuilder()){
control.input.isBuilding = true;
}
//player.clearBuilding();
player.builder().addBuild(new BuildRequest(tile.x, tile.y, tile.rotation(), entity.cblock), false);
}*/
}
}
@Override
@@ -281,9 +277,7 @@ public class BuildBlock extends Block{
progress = Mathf.clamp(progress - amount);
if(builder instanceof Playerc){
builderID = builder.id();
}
builderID = builder.id();
if(progress <= 0 || state.rules.infiniteResources){
Call.onDeconstructFinish(tile, this.cblock == null ? previous : this.cblock, builderID);