List of usage examples for org.apache.commons.math3.geometry.euclidean.threed Vector3D PLUS_J
Vector3D PLUS_J
To view the source code for org.apache.commons.math3.geometry.euclidean.threed Vector3D PLUS_J.
Click Source Link
From source file:jtrace.Scene.java
/** * Add a set of axes to an image. If the object parameter is not null, * the axes corresponding to the object's coordinate system are drawn. * //from ww w . j av a 2 s . co m * @param image Image generated using scene's camera * @param object (Possibly null) object */ private void renderAxes(BufferedImage image, SceneObject object) { Graphics gr = image.getGraphics(); int[] origin, xhat, yhat, zhat; if (object == null) { origin = camera.getPixel(image.getWidth(), image.getHeight(), Vector3D.ZERO); xhat = camera.getPixel(image.getWidth(), image.getHeight(), Vector3D.PLUS_I); yhat = camera.getPixel(image.getWidth(), image.getHeight(), Vector3D.PLUS_J); zhat = camera.getPixel(image.getWidth(), image.getHeight(), Vector3D.PLUS_K); } else { origin = camera.getPixel(image.getWidth(), image.getHeight(), object.objectToSceneVector(Vector3D.ZERO)); xhat = camera.getPixel(image.getWidth(), image.getHeight(), object.objectToSceneVector(Vector3D.PLUS_I)); yhat = camera.getPixel(image.getWidth(), image.getHeight(), object.objectToSceneVector(Vector3D.PLUS_J)); zhat = camera.getPixel(image.getWidth(), image.getHeight(), object.objectToSceneVector(Vector3D.PLUS_K)); } String objName; if (object == null) objName = ""; else objName = "(" + object.getClass().getSimpleName() + ")"; gr.setColor(Color.red); gr.drawLine(origin[0], origin[1], xhat[0], xhat[1]); gr.setColor(Color.white); gr.drawString("x " + objName, xhat[0], xhat[1]); gr.setColor(Color.green); gr.drawLine(origin[0], origin[1], yhat[0], yhat[1]); gr.setColor(Color.white); gr.drawString("y " + objName, yhat[0], yhat[1]); gr.setColor(Color.blue); gr.drawLine(origin[0], origin[1], zhat[0], zhat[1]); gr.setColor(Color.white); gr.drawString("z " + objName, zhat[0], zhat[1]); }
From source file:nova.core.render.model.TechneModelProvider.java
@Override public void load(InputStream stream) { try {/*from w w w . ja v a2 s. c om*/ Map<String, byte[]> zipContents = new HashMap<>(); ZipInputStream zipInput = new ZipInputStream(stream); ZipEntry entry; while ((entry = zipInput.getNextEntry()) != null) { byte[] data = new byte[(int) entry.getSize()]; // For some reason, using read(byte[]) makes reading stall upon reaching a 0x1E byte int i = 0; while (zipInput.available() > 0 && i < data.length) { data[i++] = (byte) zipInput.read(); } zipContents.put(entry.getName(), data); } byte[] modelXml = zipContents.get("model.xml"); if (modelXml == null) { throw new RenderException("Model " + name + " contains no model.xml file"); } DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); Document document = documentBuilder.parse(new ByteArrayInputStream(modelXml)); NodeList nodeListTechne = document.getElementsByTagName("Techne"); if (nodeListTechne.getLength() < 1) { throw new RenderException("Model " + name + " contains no Techne tag"); } NodeList nodeListModel = document.getElementsByTagName("Model"); if (nodeListModel.getLength() < 1) { throw new RenderException("Model " + name + " contains no Model tag"); } NamedNodeMap modelAttributes = nodeListModel.item(0).getAttributes(); if (modelAttributes == null) { throw new RenderException("Model " + name + " contains a Model tag with no attributes"); } NodeList textureSize = document.getElementsByTagName("TextureSize"); if (textureSize.getLength() == 0) throw new RenderException("Model has no texture size"); String[] textureDimensions = textureSize.item(0).getTextContent().split(","); double textureWidth = Integer.parseInt(textureDimensions[0]); double textureHeight = Integer.parseInt(textureDimensions[1]); NodeList shapes = document.getElementsByTagName("Shape"); for (int i = 0; i < shapes.getLength(); i++) { Node shape = shapes.item(i); NamedNodeMap shapeAttributes = shape.getAttributes(); if (shapeAttributes == null) { throw new RenderException("Shape #" + (i + 1) + " in " + name + " has no attributes"); } Node name = shapeAttributes.getNamedItem("name"); String shapeName = null; if (name != null) { shapeName = name.getNodeValue(); } if (shapeName == null) { shapeName = "Shape #" + (i + 1); } String shapeType = null; Node type = shapeAttributes.getNamedItem("type"); if (type != null) { shapeType = type.getNodeValue(); } if (shapeType != null && !cubeIDs.contains(shapeType)) { System.out.println( "Model shape [" + shapeName + "] in " + this.name + " is not a cube, ignoring"); continue; } boolean mirrored = false; String[] offset = new String[3]; String[] position = new String[3]; String[] rotation = new String[3]; String[] size = new String[3]; String[] textureOffset = new String[2]; NodeList shapeChildren = shape.getChildNodes(); for (int j = 0; j < shapeChildren.getLength(); j++) { Node shapeChild = shapeChildren.item(j); String shapeChildName = shapeChild.getNodeName(); String shapeChildValue = shapeChild.getTextContent(); if (shapeChildValue != null) { shapeChildValue = shapeChildValue.trim(); switch (shapeChildName) { case "IsMirrored": mirrored = !shapeChildValue.equals("False"); break; case "Offset": offset = shapeChildValue.split(","); break; case "Position": position = shapeChildValue.split(","); break; case "Rotation": rotation = shapeChildValue.split(","); break; case "Size": size = shapeChildValue.split(","); break; case "TextureOffset": textureOffset = shapeChildValue.split(","); break; } } } /* Generate new models Models in Techne are based on cubes. Each cube is, by default, skewed to the side. They are not centered. Everything is scaled by a factor of 16. The y coordinate is inversed, y = 24 is the surface The z coordinate is inverted, too. */ double positionX = Double.parseDouble(position[0]) / 16d; double positionY = (16 - Double.parseDouble(position[1])) / 16d; double positionZ = -Double.parseDouble(position[2]) / 16d; double sizeX = Double.parseDouble(size[0]) / 16d; double sizeY = Double.parseDouble(size[1]) / 16d; double sizeZ = Double.parseDouble(size[2]) / 16d; double offsetX = Double.parseDouble(offset[0]) / 16d; double offsetY = -Double.parseDouble(offset[1]) / 16d; double offsetZ = -Double.parseDouble(offset[2]) / 16d; double angleX = -Math.toRadians(Double.parseDouble(rotation[0])); double angleY = Math.toRadians(Double.parseDouble(rotation[1])); double angleZ = Math.toRadians(Double.parseDouble(rotation[2])); double textureOffsetU = Double.parseDouble(textureOffset[0]); double textureOffsetV = Double.parseDouble(textureOffset[1]); CubeTextureCoordinates textureCoordinates = new TechneCubeTextureCoordinates(textureWidth, textureHeight, textureOffsetU, textureOffsetV, sizeX, sizeY, sizeZ); final String modelName = shapeName; MeshModel modelPart = new MeshModel(modelName); BlockRenderPipeline.drawCube(modelPart, offsetX, offsetY - sizeY, offsetZ - sizeZ, offsetX + sizeX, offsetY, offsetZ, textureCoordinates); MatrixStack ms = new MatrixStack(); ms.translate(positionX, positionY, positionZ); ms.rotate(Vector3D.PLUS_J, angleY); ms.rotate(Vector3D.PLUS_I, angleX); ms.rotate(Vector3D.PLUS_K, angleZ); modelPart.matrix = ms; modelPart.textureOffset = new Vector2D(Integer.parseInt(textureOffset[0]), Integer.parseInt(textureOffset[1])); if (model.children.stream().anyMatch(m -> m.name.equals(modelName))) { throw new RenderException( "Model contained duplicate part name: '" + shapeName + "' node #" + i); } model.children.add(modelPart); } } catch (ZipException e) { throw new RenderException("Model " + name + " is not a valid zip file"); } catch (IOException e) { throw new RenderException("Model " + name + " could not be read", e); } catch (SAXException e) { throw new RenderException("Model " + name + " contains invalid XML", e); } catch (Exception e) { e.printStackTrace(); } }
From source file:nova.core.wrapper.mc.forge.v17.wrapper.entity.backward.BWEntity.java
public BWEntity(net.minecraft.entity.Entity entity) { this.entity = entity; components.add(new MCEntityTransform(entity)); components.add(new Damageable() { @Override//from w w w .ja va 2s . c o m public void damage(double amount, DamageType type) { if (type == DamageType.generic) { entity.attackEntityFrom(DamageSource.generic, (float) amount); } // TODO: Apply other damage source wrappers? } }); if (entity instanceof EntityLivingBase) { if (entity instanceof EntityPlayer) { MCPlayer player = components.add(new MCPlayer(this)); player.faceDisplacement = () -> Vector3D.PLUS_J.scalarMultiply(entity.getEyeHeight()); } else { Living living = components.add(new Living()); living.faceDisplacement = () -> Vector3D.PLUS_J.scalarMultiply(entity.getEyeHeight()); } } }
From source file:org.jtrfp.trcl.beh.CollidesWithTerrain.java
@Override public void _tick(long tickTimeMillis) { if (tickCounter++ % 2 == 0 && !recentlyCollided) return;/*from w w w . j ava 2s . c om*/ recentlyCollided = false; final WorldObject p = getParent(); final TR tr = p.getTr(); final World world = tr.getWorld(); final InterpolatingAltitudeMap aMap; final Mission mission = tr.getGame().getCurrentMission(); try { aMap = mission.getOverworldSystem().getAltitudeMap(); } catch (NullPointerException e) { return; } if (mission.getOverworldSystem().isTunnelMode()) return;//No terrain to collide with while in tunnel mode. if (aMap == null) return; final double[] thisPos = p.getPosition(); final double groundHeightNorm = aMap.heightAt((thisPos[0] / TR.mapSquareSize), (thisPos[2] / TR.mapSquareSize)); final double groundHeight = groundHeightNorm * (world.sizeY / 2); final double ceilingHeight = (1.99 - aMap.heightAt((thisPos[0] / TR.mapSquareSize), (thisPos[2] / TR.mapSquareSize))) * (world.sizeY / 2) + CEILING_Y_NUDGE; final Vector3D groundNormal = (aMap.normalAt((thisPos[0] / TR.mapSquareSize), (thisPos[2] / TR.mapSquareSize))); Vector3D downhillDirectionXZ = new Vector3D(groundNormal.getX(), 0, groundNormal.getZ()); if (downhillDirectionXZ.getNorm() != 0) downhillDirectionXZ = downhillDirectionXZ.normalize(); else downhillDirectionXZ = Vector3D.PLUS_J; final OverworldSystem overworldSystem = tr.getGame().getCurrentMission().getOverworldSystem(); if (overworldSystem == null) return; final boolean terrainMirror = overworldSystem.isChamberMode(); final double thisY = thisPos[1]; boolean groundImpact = thisY < (groundHeight + (autoNudge ? nudgePadding : 0)); final boolean ceilingImpact = (thisY > ceilingHeight && terrainMirror && !ignoreCeiling); final Vector3D ceilingNormal = new Vector3D(groundNormal.getX(), -groundNormal.getY(), groundNormal.getZ()); Vector3D surfaceNormal = groundImpact ? groundNormal : ceilingNormal; final double dot = surfaceNormal.dotProduct(getParent().getHeading()); if (terrainMirror && groundHeightNorm > .97) { groundImpact = true; surfaceNormal = downhillDirectionXZ; } //end if(smushed between floor and ceiling) if (groundLock) { recentlyCollided = true; thisPos[1] = groundHeight; p.notifyPositionChange(); return; } //end if(groundLock) if (tunnelEntryCapable && groundImpact && dot < 0) { final OverworldSystem os = mission.getOverworldSystem(); if (!os.isTunnelMode()) { TunnelEntranceObject teo = mission.getTunnelEntranceObject( new Point((int) (thisPos[0] / TR.mapSquareSize), (int) (thisPos[2] / TR.mapSquareSize))); if (teo != null && !mission.isBossFight()) { mission.enterTunnel(teo.getSourceTunnel()); return; } } //end if(above ground) } //end if(tunnelEntryCapable()) if (groundImpact || ceilingImpact) {// detect collision recentlyCollided = true; double padding = autoNudge ? nudgePadding : 0; padding *= groundImpact ? 1 : -1; thisPos[1] = (groundImpact ? groundHeight : ceilingHeight) + padding; p.notifyPositionChange(); if (dot < 0 || ignoreHeadingForImpact) {//If toward ground, call impact listeners. surfaceNormalVar = surfaceNormal; final Behavior behavior = p.getBehavior(); behavior.probeForBehaviors(sub, SurfaceImpactListener.class); } //end if(pointedTowardGround) } // end if(collision) }
From source file:org.jtrfp.trcl.beh.CubeCollisionBehavior.java
@Override public void proposeCollision(WorldObject obj) { if (obj instanceof Player) { final WorldObject p = getParent(); final double[] relPos = TR.twosComplimentSubtract(obj.getPosition(), p.getPosition(), new double[3]); final Rotation rot = new Rotation(Vector3D.PLUS_K, Vector3D.PLUS_J, p.getHeading(), p.getTop()); final double[] rotPos = rot.applyInverseTo(new Vector3D(relPos)).toArray(); final double[] rotTransPos = Vect3D.add(rotPos, origin, rotTransPosVar); if (TR.twosComplimentDistance(obj.getPosition(), p.getPosition()) < 80000) if (rotTransPos[0] > 0 && rotTransPos[0] < dims[0] && rotTransPos[1] > 0 && rotTransPos[1] < dims[1] && rotTransPos[2] > 0 && rotTransPos[2] < dims[2]) { obj.probeForBehaviors(new AbstractSubmitter<DamageableBehavior>() { @Override// w w w .j a va 2 s . c o m public void submit(DamageableBehavior item) { item.proposeDamage(new GroundCollisionDamage(damageOnImpact)); } }, DamageableBehavior.class); } //end if(withinRange) } //end if(Player) }
From source file:org.jtrfp.trcl.beh.FacingObject.java
@Override public void _tick(long tickTimeMillis) { if (target != null) { final WorldObject parent = getParent(); final double[] tPos = target.getPosition(); final double[] pPos = parent.getPosition(); Vect3D.subtract(tPos, pPos, work); parent.setHeading(new Vector3D(Vect3D.normalize(work, work))); Vect3D.cross(work, UP, perp);/*from w w w . j av a 2s . c o m*/ Vect3D.cross(perp, work, perp); parent.setTop(Vector3D.PLUS_J); } //end if(!null) }
From source file:org.jtrfp.trcl.beh.ProjectileFiringBehavior.java
@Override public void _tick(long tickTimeMillis) { if (tickTimeMillis > timeWhenNextFiringPermittedMillis && pendingFiring) { if (takeAmmo()) { final WorldObject p = getParent(); Vector3D heading = this.firingHeading; if (this.firingHeading == null) heading = p.getHeading(); for (int mi = 0; mi < multiplexLevel; mi++) { final Vector3D firingPosition = new Rotation(Vector3D.PLUS_K, Vector3D.PLUS_J, heading, p.getTop()).applyTo(getNextFiringPosition()); resetFiringTimer();//from w ww .jav a 2 s . co m projectileFactory.fire( Vect3D.add(p.getPositionWithOffset(), firingPosition.toArray(), new double[3]), heading, getParent()); } //for(multiplex) heading = p.getHeading(); } //end if(ammo) pendingFiring = false; } //end timeWhenNextfiringPermitted }
From source file:org.jtrfp.trcl.flow.GameShell.java
public void applyGFXState() { final Renderer renderer = tr.mainRenderer.get(); final Camera camera = renderer.getCamera(); camera.probeForBehavior(SkyCubeCloudModeUpdateBehavior.class).setEnable(false); renderer.getSkyCube().setSkyCubeGen(DEFAULT_GRADIENT); camera.setHeading(Vector3D.PLUS_I); camera.setTop(Vector3D.PLUS_J); }
From source file:org.jtrfp.trcl.flow.Mission.java
public Result go() { setMissionMode(new Mission.LoadingMode()); synchronized (missionLock) { synchronized (missionEnd) { if (missionEnd[0] != null) return missionEnd[0]; }/* ww w .j av a2s . co m*/ tr.getThreadManager().setPaused(true); for (ProjectileFactory pf : tr.getResourceManager().getProjectileFactories()) for (Projectile proj : pf.getProjectiles()) proj.destroy(); System.out.println("Starting GampeplayLevel loading sequence..."); final LoadingProgressReporter rootProgress = LoadingProgressReporter.Impl .createRoot(new UpdateHandler() { @Override public void update(double unitProgress) { game.getLevelLoadingScreen().setLoadingProgress(unitProgress); } }); final LoadingProgressReporter[] progressStages = rootProgress .generateSubReporters(LoadingStages.values().length); final Renderer renderer = tr.mainRenderer.get(); renderer.getCamera().probeForBehavior(SkyCubeCloudModeUpdateBehavior.class).setEnable(false); renderer.getSkyCube().setSkyCubeGen(GameShell.DEFAULT_GRADIENT); final Camera camera = renderer.getCamera(); camera.setHeading(Vector3D.PLUS_I); camera.setTop(Vector3D.PLUS_J); game.setDisplayMode(game.levelLoadingMode); game.getUpfrontDisplay().submitPersistentMessage(levelName); try { final ResourceManager rm = tr.getResourceManager(); final Player player = tr.getGame().getPlayer(); final World world = tr.getWorld(); final TDFFile tdf = rm.getTDFData(lvl.getTunnelDefinitionFile()); player.setActive(false); // Abort check synchronized (missionEnd) { if (missionEnd[0] != null) return missionEnd[0]; } overworldSystem = new OverworldSystem(tr, progressStages[LoadingStages.overworld.ordinal()]); getOverworldSystem().loadLevel(lvl, tdf); System.out.println("\t...Done."); // Install NAVs final NAVSystem navSystem = tr.getGame().getNavSystem(); navSubObjects = rm.getNAVData(lvl.getNavigationFile()).getNavObjects(); START s = (START) navSubObjects.get(0); Location3D l3d = s.getLocationOnMap(); playerStartPosition[0] = TR.legacy2Modern(l3d.getZ()); playerStartPosition[2] = TR.legacy2Modern(l3d.getX()); final double HEIGHT_PADDING = 10000; playerStartPosition[1] = Math.max( HEIGHT_PADDING + (world.sizeY / 2) * getOverworldSystem().getAltitudeMap() .heightAt(TR.legacy2MapSquare(l3d.getZ()), TR.legacy2MapSquare(l3d.getX())), TR.legacy2Modern(l3d.getY())); playerStartDirection = new ObjectDirection(s.getRoll(), s.getPitch(), s.getYaw()); // ////// INITIAL HEADING player.setPosition(getPlayerStartPosition()); player.setDirection(getPlayerStartDirection()); player.setHeading(player.getHeading().negate());// Kludge to fix // incorrect heading ///////// STATE final Propelled propelled = player.probeForBehavior(Propelled.class); propelled.setPropulsion(propelled.getMinPropulsion()); installTunnels(tdf, progressStages[LoadingStages.tunnels.ordinal()]); Factory f = new NAVObjective.Factory(tr); final LoadingProgressReporter[] navProgress = progressStages[LoadingStages.navs.ordinal()] .generateSubReporters(navSubObjects.size()); for (int i = 0; i < navSubObjects.size(); i++) { final NAVSubObject obj = navSubObjects.get(i); f.create(tr, obj, navs); navProgress[i].complete(); } // end for(navSubObjects) navSystem.updateNAVState(); player.resetVelocityRotMomentum(); final String startX = System.getProperty("org.jtrfp.trcl.startX"); final String startY = System.getProperty("org.jtrfp.trcl.startY"); final String startZ = System.getProperty("org.jtrfp.trcl.startZ"); final double[] playerPos = player.getPosition(); if (startX != null && startY != null && startZ != null) { System.out.println("Using user-specified start point"); final int sX = Integer.parseInt(startX); final int sY = Integer.parseInt(startY); final int sZ = Integer.parseInt(startZ); playerPos[0] = sX; playerPos[1] = sY; playerPos[2] = sZ; player.notifyPositionChange(); } // end if(user start point) System.out.println("Start position set to " + player.getPosition()[0] + " " + player.getPosition()[1] + " " + player.getPosition()[2]); System.out.println("Setting sun vector"); final AbstractTriplet sunVector = lvl.getSunlightDirectionVector(); tr.getThreadManager().submitToGL(new Callable<Void>() { @Override public Void call() throws Exception { tr.mainRenderer.get().setSunVector( new Vector3D(sunVector.getX(), sunVector.getY(), sunVector.getZ()).normalize()); return null; } }).get(); System.out.println("\t...Done."); } catch (Exception e) { e.printStackTrace(); } if (System.getProperties().containsKey("org.jtrfp.trcl.flow.Mission.skipNavs")) { try { final int skips = Integer.parseInt(System.getProperty("org.jtrfp.trcl.flow.Mission.skipNavs")); System.out.println("Skipping " + skips + " navs."); for (int i = 0; i < skips; i++) { removeNAVObjective(currentNAVObjective()); } // end for(skips) } catch (NumberFormatException e) { System.err.println( "Invalid format for property \"org.jtrfp.trcl.flow.Mission.skipNavs\". Must be integer."); } } // end if(containsKey) //System.out.println("Invoking JVM's garbage collector..."); //TR.nuclearGC(); //System.out.println("Mission.go() complete."); // Transition to gameplay mode. // Abort check synchronized (missionEnd) { if (missionEnd[0] != null) return missionEnd[0]; } //end sync(missionEnd) tr.getThreadManager().submitToThreadPool(new Callable<Void>() { @Override public Void call() throws Exception { final SoundSystem ss = Mission.this.tr.soundSystem.get(); MusicPlaybackEvent evt; Mission.this.tr.soundSystem.get().enqueuePlaybackEvent(evt = ss.getMusicFactory().create( new GPUResidentMOD(tr, tr.getResourceManager().getMOD(lvl.getBackgroundMusicFile())), true)); synchronized (Mission.this) { if (bgMusic != null) return null; bgMusic = evt; bgMusic.play(); } //end sync(Mission.this) return null; }// end call() }); game.getUpfrontDisplay().removePersistentMessage(); tr.getThreadManager().setPaused(false); if (showIntro) { setMissionMode(new Mission.IntroMode()); game.getBriefingScreen().briefingSequence(lvl); } setMissionMode(new Mission.AboveGroundMode()); getOverworldSystem().activate(); final SkySystem skySystem = getOverworldSystem().getSkySystem(); tr.mainRenderer.get().getCamera().probeForBehavior(SkyCubeCloudModeUpdateBehavior.class) .setEnable(true); renderer.getSkyCube().setSkyCubeGen(skySystem.getBelowCloudsSkyCubeGen()); renderer.setAmbientLight(skySystem.getSuggestedAmbientLight()); renderer.setSunColor(skySystem.getSuggestedSunColor()); game.getNavSystem().activate(); game.setDisplayMode(game.gameplayMode); game.getPlayer().setActive(true); tr.getGame().setPaused(false); //Wait for mission end synchronized (missionEnd) { while (missionEnd[0] == null) { try { missionEnd.wait(); } catch (InterruptedException e) { break; } } } //Completion summary if (missionEnd[0] != null) if (!missionEnd[0].isAbort()) { setMissionMode(new Mission.MissionSummaryMode()); game.getBriefingScreen().missionCompleteSummary(lvl, missionEnd[0]); } //end if(proper ending) tr.getThreadManager().submitToThreadPool(new Callable<Void>() { @Override public Void call() throws Exception { bgMusic.stop(); return null; }// end call() }); cleanup(); return missionEnd[0]; } //end sync }
From source file:org.jtrfp.trcl.obj.DEFObject.java
public DEFObject(final TR tr, Model model, EnemyDefinition def, EnemyPlacement pl) { super(tr, model); this.def = def; boundingRadius = TR.legacy2Modern(def.getBoundingBoxRadius()) / 1.5; anchoring = Anchoring.floating;//from ww w.j a va 2 s. c om logic = def.getLogic(); mobile = true; canTurn = true; foliage = false; boss = def.isObjectIsBoss(); //Default Direction setDirection(new ObjectDirection(pl.getRoll(), pl.getPitch(), pl.getYaw() + 65536)); boolean customExplosion = false; this.setModelOffset(TR.legacy2Modern(def.getPivotX()), TR.legacy2Modern(def.getPivotY()), TR.legacy2Modern(def.getPivotZ())); switch (logic) { case groundDumb: mobile = false; canTurn = false; anchoring = Anchoring.terrain; break; case groundTargeting://Ground turrets { mobile = false; canTurn = true; addBehavior(new HorizAimAtPlayerBehavior(tr.getGame().getPlayer())); //TODO: def.getFiringVertices() needs actual vertex lookup. ProjectileFiringBehavior pfb; addBehavior(pfb = new ProjectileFiringBehavior() .setProjectileFactory( tr.getResourceManager().getProjectileFactories()[def.getWeapon().ordinal()]) .setFiringPositions(new Vector3D[] { new Vector3D(0, 0, 0) })); try { pfb.addSupply(9999999); } catch (SupplyNotNeededException e) { } addBehavior(new AutoFiring().setProjectileFiringBehavior(pfb) .setPatternOffsetMillis((int) (Math.random() * 2000)).setMaxFiringDistance(TR.mapSquareSize * 3) .setSmartFiring(false).setMaxFireVectorDeviation(.5).setTimePerPatternEntry(500)); anchoring = Anchoring.terrain; break; } case flyingDumb: canTurn = false; break; case groundTargetingDumb: addBehavior(new HorizAimAtPlayerBehavior(tr.getGame().getPlayer())); anchoring = Anchoring.terrain; break; case flyingSmart: smartPlaneBehavior(tr, def, false); break; case bankSpinDrill: unhandled(def); break; case sphereBoss: projectileFiringBehavior(); mobile = true; break; case flyingAttackRetreatSmart: smartPlaneBehavior(tr, def, false); //addBehavior(new HorizAimAtPlayerBehavior(tr.getGame().getPlayer())); break; case splitShipSmart://TODO smartPlaneBehavior(tr, def, false); //addBehavior(new HorizAimAtPlayerBehavior(tr.getGame().getPlayer())); break; case groundStaticRuin://Destroyed object is replaced with another using SimpleModel i.e. weapons bunker mobile = false; canTurn = false; anchoring = Anchoring.terrain; break; case targetHeadingSmart: mobile = false;//Belazure's crane bots addBehavior(new HorizAimAtPlayerBehavior(tr.getGame().getPlayer())); projectileFiringBehavior(); anchoring = Anchoring.terrain; break; case targetPitchSmart: mobile = false; addBehavior(new HorizAimAtPlayerBehavior(tr.getGame().getPlayer())); projectileFiringBehavior(); anchoring = Anchoring.terrain; break; case coreBossSmart: mobile = false; projectileFiringBehavior(); break; case cityBossSmart: mobile = false; projectileFiringBehavior(); break; case staticFiringSmart: { //addBehavior(new HorizAimAtPlayerBehavior(tr.getGame().getPlayer())); final ProjectileFiringBehavior pfb = new ProjectileFiringBehavior(); try { pfb.addSupply(99999999); } catch (SupplyNotNeededException e) { } pfb.setProjectileFactory(tr.getResourceManager().getProjectileFactories()[def.getWeapon().ordinal()]); addBehavior(pfb); addBehavior(new AutoFiring().setProjectileFiringBehavior(pfb) .setPatternOffsetMillis((int) (Math.random() * 2000)).setMaxFiringDistance(TR.mapSquareSize * 8) .setSmartFiring(true)); mobile = false; canTurn = false; break; } case sittingDuck: canTurn = false; mobile = false; break; case tunnelAttack: { final ProjectileFiringBehavior pfb = new ProjectileFiringBehavior(); try { pfb.addSupply(99999999); } catch (SupplyNotNeededException e) { } pfb.setProjectileFactory(tr.getResourceManager().getProjectileFactories()[def.getWeapon().ordinal()]); addBehavior(pfb); //addBehavior(new HorizAimAtPlayerBehavior(tr.getGame().getPlayer())); addBehavior(new AutoFiring().setProjectileFiringBehavior(pfb) .setPatternOffsetMillis((int) (Math.random() * 2000)) .setMaxFiringDistance(TR.mapSquareSize * .2).setSmartFiring(false).setMaxFireVectorDeviation(.3) .setTimePerPatternEntry(2000)); /*addBehavior(new Bobbing(). setPhase(Math.random()). setBobPeriodMillis(10*1000+Math.random()*3000).setAmplitude(2000). setAdditionalHeight(0));*/ //Conflicts with TunnelRailed mobile = false; break; } case takeoffAndEscape: addBehavior(new MovesByVelocity()); addBehavior( (Behavior) (new HasPropulsion().setMinPropulsion(0).setPropulsion(def.getThrustSpeed() / 1.2))); addBehavior(new AccelleratedByPropulsion().setEnable(false)); addBehavior(new VelocityDragBehavior().setDragCoefficient(.86)); addBehavior(new CustomPlayerWithinRangeBehavior() { @Override public void withinRange() { DEFObject.this.getBehavior().probeForBehavior(AccelleratedByPropulsion.class) .setThrustVector(Vector3D.PLUS_J).setEnable(true); } }).setRange(TR.mapSquareSize * 10); addBehavior(new LoopingPositionBehavior()); addBehavior(new ExplodesOnDeath(ExplosionType.Blast, BIG_EXP_SOUNDS[(int) (Math.random() * 3)])); customExplosion = true; canTurn = false; mobile = false; break; case fallingAsteroid: anchoring = Anchoring.floating; fallingObjectBehavior(); customExplosion = true; addBehavior(new ExplodesOnDeath(ExplosionType.BigExplosion, MED_EXP_SOUNDS[(int) (Math.random() * 2)])); //setVisible(false); //addBehavior(new FallingDebrisBehavior(tr,model)); break; case cNome://Walky bot? anchoring = Anchoring.terrain; break; case cNomeLegs://Walky bot? anchoring = Anchoring.terrain; break; case cNomeFactory: mobile = false; break; case geigerBoss: addBehavior(new HorizAimAtPlayerBehavior(tr.getGame().getPlayer())); projectileFiringBehavior(); anchoring = Anchoring.terrain; mobile = false; break; case volcanoBoss: addBehavior(new HorizAimAtPlayerBehavior(tr.getGame().getPlayer())); projectileFiringBehavior(); anchoring = Anchoring.terrain; mobile = false; break; case volcano://Wat. unhandled(def); canTurn = false; mobile = false; anchoring = Anchoring.terrain; break; case missile://Silo? mobile = false;//TODO anchoring = Anchoring.terrain; break; case bob: addBehavior(new Bobbing().setAdditionalHeight(TR.mapSquareSize * 1)); addBehavior(new SteadilyRotating()); addBehavior(new ExplodesOnDeath(ExplosionType.Blast, MED_EXP_SOUNDS[(int) (Math.random() * 2)])); possibleBobbingSpinAndCrashOnDeath(.5, def); customExplosion = true; anchoring = Anchoring.floating; mobile = false; canTurn = false;//ironic? break; case alienBoss: addBehavior(new HorizAimAtPlayerBehavior(tr.getGame().getPlayer())); projectileFiringBehavior(); mobile = false; break; case canyonBoss1: addBehavior(new HorizAimAtPlayerBehavior(tr.getGame().getPlayer())); projectileFiringBehavior(); mobile = false; break; case canyonBoss2: addBehavior(new HorizAimAtPlayerBehavior(tr.getGame().getPlayer())); projectileFiringBehavior(); mobile = false; break; case lavaMan://Also terraform-o-bot addBehavior(new HorizAimAtPlayerBehavior(tr.getGame().getPlayer())); projectileFiringBehavior(); mobile = false; break; case arcticBoss: //ARTIC / Ymir. Hangs from ceiling. addBehavior(new HorizAimAtPlayerBehavior(tr.getGame().getPlayer())); projectileFiringBehavior(); mobile = false; anchoring = Anchoring.ceiling; break; case helicopter://TODO break; case tree: canTurn = false; mobile = false; foliage = true; anchoring = Anchoring.terrain; break; case ceilingStatic: canTurn = false; mobile = false; setTop(Vector3D.MINUS_J); anchoring = Anchoring.ceiling; break; case bobAndAttack: { addBehavior(new SteadilyRotating().setRotationPhase(2 * Math.PI * Math.random())); final ProjectileFiringBehavior pfb = new ProjectileFiringBehavior(); try { pfb.addSupply(99999999); } catch (SupplyNotNeededException e) { } pfb.setProjectileFactory(tr.getResourceManager().getProjectileFactories()[def.getWeapon().ordinal()]); addBehavior(pfb);//Bob and attack don't have the advantage of movement, so give them the advantage of range. addBehavior(new AutoFiring().setProjectileFiringBehavior(pfb) .setPatternOffsetMillis((int) (Math.random() * 2000)) .setMaxFiringDistance(TR.mapSquareSize * 17).setSmartFiring(true)); addBehavior(new Bobbing().setPhase(Math.random()).setBobPeriodMillis(10 * 1000 + Math.random() * 3000)); addBehavior(new ExplodesOnDeath(ExplosionType.Blast, BIG_EXP_SOUNDS[(int) (Math.random() * 3)])); possibleBobbingSpinAndCrashOnDeath(.5, def); customExplosion = true; mobile = false; canTurn = false; anchoring = Anchoring.floating; break; } case forwardDrive: canTurn = false; anchoring = Anchoring.terrain; break; case fallingStalag: fallingObjectBehavior(); customExplosion = true; addBehavior(new ExplodesOnDeath(ExplosionType.BigExplosion, MED_EXP_SOUNDS[(int) (Math.random() * 2)])); //canTurn=false; //mobile=false; anchoring = Anchoring.floating; break; case attackRetreatBelowSky: smartPlaneBehavior(tr, def, false); anchoring = Anchoring.floating; break; case attackRetreatAboveSky: smartPlaneBehavior(tr, def, true); anchoring = Anchoring.floating; break; case bobAboveSky: addBehavior(new Bobbing().setAdditionalHeight(TR.mapSquareSize * 5)); addBehavior(new SteadilyRotating()); possibleBobbingSpinAndCrashOnDeath(.5, def); mobile = false; canTurn = false; anchoring = Anchoring.floating; break; case factory: canTurn = false; mobile = false; anchoring = Anchoring.floating; break; }//end switch(logic) /////////////////////////////////////////////////////////// //Position Limit { final PositionLimit posLimit = new PositionLimit(); posLimit.getPositionMaxima()[1] = tr.getWorld().sizeY; posLimit.getPositionMinima()[1] = -tr.getWorld().sizeY; addBehavior(posLimit); } if (anchoring == Anchoring.terrain) { addBehavior(new CustomDeathBehavior(new Runnable() { @Override public void run() { tr.getGame().getCurrentMission().notifyGroundTargetDestroyed(); } })); addBehavior(new TerrainLocked()); } else if (anchoring == Anchoring.ceiling) { addBehavior(new TerrainLocked().setLockedToCeiling(true)); } else addBehavior(new CustomDeathBehavior(new Runnable() { @Override public void run() { tr.getGame().getCurrentMission().notifyAirTargetDestroyed(); }//end run() })); //Misc addBehavior(new TunnelRailed(tr));//Centers in tunnel when appropriate addBehavior(new DeathBehavior()); addBehavior(new DamageableBehavior().setHealth(pl.getStrength() + (spinCrash ? 16 : 0)) .setMaxHealth(pl.getStrength() + (spinCrash ? 16 : 0)).setEnable(!boss)); setActive(!boss); addBehavior(new DamagedByCollisionWithGameplayObject()); if (!foliage) addBehavior(new DebrisOnDeathBehavior()); else { addBehavior(new CustomDeathBehavior(new Runnable() { @Override public void run() { tr.getGame().getCurrentMission().notifyFoliageDestroyed(); } })); } if (canTurn || boss) { addBehavior(new RotationalMomentumBehavior()); addBehavior(new RotationalDragBehavior()).setDragCoefficient(.86); addBehavior(new AutoLeveling()); } if (foliage) { addBehavior(new ExplodesOnDeath(ExplosionType.Billow)); } else if ((!mobile || anchoring == Anchoring.terrain) && !customExplosion) { addBehavior(new ExplodesOnDeath(ExplosionType.BigExplosion, BIG_EXP_SOUNDS[(int) (Math.random() * 3)])); } else if (!customExplosion) { addBehavior(new ExplodesOnDeath(ExplosionType.Blast, MED_EXP_SOUNDS[(int) (Math.random() * 2)])); } if (mobile) { addBehavior(new MovesByVelocity()); addBehavior(new HasPropulsion()); addBehavior(new AccelleratedByPropulsion()); addBehavior(new VelocityDragBehavior()); if (anchoring == Anchoring.terrain) { } else {//addBehavior(new BouncesOffSurfaces().setReflectHeading(false)); addBehavior(new CollidesWithTerrain().setAutoNudge(true).setNudgePadding(40000)); } getBehavior().probeForBehavior(VelocityDragBehavior.class).setDragCoefficient(.86); getBehavior().probeForBehavior(Propelled.class).setMinPropulsion(0); getBehavior().probeForBehavior(Propelled.class).setPropulsion(def.getThrustSpeed() / 1.2); addBehavior(new LoopingPositionBehavior()); } //end if(mobile) if (def.getPowerup() != null && Math.random() * 100. < def.getPowerupProbability()) { addBehavior(new LeavesPowerupOnDeathBehavior(def.getPowerup())); } }