org.jtrfp.trcl.obj.Player.java Source code

Java tutorial

Introduction

Here is the source code for org.jtrfp.trcl.obj.Player.java

Source

/*******************************************************************************
 * This file is part of TERMINAL RECALL
 * Copyright (c) 2012-2014 Chuck Ritola
 * Part of the jTRFP.org project
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the GNU Public License v3.0
 * which accompanies this distribution, and is available at
 * http://www.gnu.org/licenses/gpl.html
 * 
 * Contributors:
 *     chuck - initial API and implementation
 ******************************************************************************/
package org.jtrfp.trcl.obj;

import org.apache.commons.math3.geometry.euclidean.threed.Vector3D;
import org.jtrfp.trcl.beh.AfterburnerBehavior;
import org.jtrfp.trcl.beh.Cloakable;
import org.jtrfp.trcl.beh.CollidesWithTerrain;
import org.jtrfp.trcl.beh.CollidesWithTunnelWalls;
import org.jtrfp.trcl.beh.DamageableBehavior;
import org.jtrfp.trcl.beh.DamageableBehavior.SupplyNotNeededException;
import org.jtrfp.trcl.beh.DamagedByCollisionWithGameplayObject;
import org.jtrfp.trcl.beh.DamagedByCollisionWithSurface;
import org.jtrfp.trcl.beh.HeadingXAlwaysPositiveBehavior;
import org.jtrfp.trcl.beh.LoopingPositionBehavior;
import org.jtrfp.trcl.beh.ProjectileFiringBehavior;
import org.jtrfp.trcl.beh.RollLevelingBehavior;
import org.jtrfp.trcl.beh.SurfaceImpactSFXBehavior;
import org.jtrfp.trcl.beh.UpdatesNAVRadar;
import org.jtrfp.trcl.beh.UpgradeableProjectileFiringBehavior;
import org.jtrfp.trcl.beh.phy.AccelleratedByPropulsion;
import org.jtrfp.trcl.beh.phy.BouncesOffSurfaces;
import org.jtrfp.trcl.beh.phy.HasPropulsion;
import org.jtrfp.trcl.beh.phy.MovesByVelocity;
import org.jtrfp.trcl.beh.phy.RotationalDragBehavior;
import org.jtrfp.trcl.beh.phy.RotationalMomentumBehavior;
import org.jtrfp.trcl.beh.phy.VelocityDragBehavior;
import org.jtrfp.trcl.beh.ui.UpdatesHealthMeterBehavior;
import org.jtrfp.trcl.beh.ui.UpdatesThrottleMeterBehavior;
import org.jtrfp.trcl.beh.ui.UserInputRudderElevatorControlBehavior;
import org.jtrfp.trcl.beh.ui.UserInputThrottleControlBehavior;
import org.jtrfp.trcl.beh.ui.WeaponSelectionBehavior;
import org.jtrfp.trcl.core.TR;
import org.jtrfp.trcl.core.ThreadManager;
import org.jtrfp.trcl.file.Weapon;
import org.jtrfp.trcl.gpu.Model;

public class Player extends WorldObject implements RelevantEverywhere {
    //private final Camera    camera;
    //private int       cameraDistance          = 0;
    public static final int CLOAK_COUNTDOWN_START = ThreadManager.GAMEPLAY_FPS * 30;// 30sec
    public static final int INVINCIBILITY_COUNTDOWN_START = ThreadManager.GAMEPLAY_FPS * 30;// 30sec
    private final ProjectileFiringBehavior[] weapons = new ProjectileFiringBehavior[Weapon.values().length];

    public Player(final TR tr, final Model model) {
        super(tr, model);
        setVisible(false);
        DamageableBehavior db = new DamageableBehavior();
        addBehavior(db);
        String godMode = System.getProperty("org.jtrfp.trcl.godMode");
        if (godMode != null) {
            if (godMode.toUpperCase().contains("TRUE")) {
                db.setEnable(false);
            }
        }

        addBehavior(new AccelleratedByPropulsion());
        addBehavior(new MovesByVelocity());
        addBehavior(new HasPropulsion());
        addBehavior(new CollidesWithTunnelWalls(true, true));
        addBehavior(new UserInputThrottleControlBehavior());
        addBehavior(new VelocityDragBehavior());
        addBehavior(new RollLevelingBehavior());
        addBehavior(new UserInputRudderElevatorControlBehavior());
        addBehavior(new RotationalMomentumBehavior());
        addBehavior(new RotationalDragBehavior());
        addBehavior(new CollidesWithTerrain().setTunnelEntryCapable(true).setIgnoreHeadingForImpact(false));
        addBehavior(new AfterburnerBehavior());
        addBehavior(new LoopingPositionBehavior());
        addBehavior(new HeadingXAlwaysPositiveBehavior().setEnable(false));
        addBehavior(
                new UpdatesThrottleMeterBehavior().setController(tr.getGame().getHUDSystem().getThrottleMeter()));
        addBehavior(new UpdatesHealthMeterBehavior().setController(tr.getGame().getHUDSystem().getHealthMeter()));
        addBehavior(new DamagedByCollisionWithGameplayObject());
        addBehavior(new DamagedByCollisionWithSurface());
        addBehavior(new BouncesOffSurfaces());
        addBehavior(new UpdatesNAVRadar());
        addBehavior(new Cloakable());
        addBehavior(new SurfaceImpactSFXBehavior(tr));
        addBehavior(new RedFlashOnDamage());

        final Weapon[] allWeapons = Weapon.values();

        for (int i = 0; i < allWeapons.length; i++) {
            final Weapon w = allWeapons[i];
            if (w.getButtonToSelect() != -1) {
                final ProjectileFiringBehavior pfb;
                if (w.isLaser()) {// LASER
                    pfb = new UpgradeableProjectileFiringBehavior()
                            .setProjectileFactory(tr.getResourceManager().getProjectileFactories()[w.ordinal()]);
                    ((UpgradeableProjectileFiringBehavior) pfb).setMaxCapabilityLevel(2)
                            .setFiringMultiplexMap(new Vector3D[][] {
                                    new Vector3D[] { new Vector3D(5000, -3000, 0), new Vector3D(-5000, -3000, 0) }, // Level 0,
                                    // single
                                    new Vector3D[] { new Vector3D(5000, -3000, 0), new Vector3D(-5000, -3000, 0) }, // Level 1,
                                    // double
                                    new Vector3D[] { new Vector3D(5000, -3000, 0), new Vector3D(-5000, -3000, 0), // Level 2 quad
                                            new Vector3D(5000, 3000, 0), new Vector3D(-5000, 3000, 0) } });// Level
                    // 2
                    // cont'd
                } // end if(isLaser)
                else {// NOT LASER
                    pfb = new ProjectileFiringBehavior()
                            .setFiringPositions(
                                    new Vector3D[] { new Vector3D(5000, -3000, 0), new Vector3D(-5000, -3000, 0) })
                            .setProjectileFactory(tr.getResourceManager().getProjectileFactories()[w.ordinal()]);
                    if (w == Weapon.DAM)
                        pfb.setAmmoLimit(1);
                }
                addBehavior(pfb);
                weapons[w.getButtonToSelect() - 1] = pfb;
                if (System.getProperties().containsKey("org.jtrfp.trcl.allAmmo")) {
                    if (System.getProperty("org.jtrfp.trcl.allAmmo").toUpperCase().contains("TRUE")) {
                        System.out.println("allAmmo cheat active for weapon " + w.getButtonToSelect());
                        pfb.setAmmoLimit(Integer.MAX_VALUE);
                        try {
                            pfb.addSupply(Double.POSITIVE_INFINITY);
                        } catch (SupplyNotNeededException e) {
                        }
                    } //end if(property=true)
                } //end if(allAmmo)
            } // end if(hasButton)
        }
        addBehavior(new WeaponSelectionBehavior().setBehaviors(weapons));
        //camera = tr.renderer.get().getCamera();
        getBehavior().probeForBehavior(VelocityDragBehavior.class).setDragCoefficient(.86);
        getBehavior().probeForBehavior(Propelled.class).setMinPropulsion(0);
        getBehavior().probeForBehavior(Propelled.class).setMaxPropulsion(900000);
        getBehavior().probeForBehavior(RotationalDragBehavior.class).setDragCoefficient(.86);
        setActive(false);
    }//end constructor

    public void resetVelocityRotMomentum() {
        //probeForBehavior(HasPropulsion.class).setPropulsion(0);
        probeForBehavior(RotationalMomentumBehavior.class).setEquatorialMomentum(0).setLateralMomentum(0)
                .setPolarMomentum(0);
        probeForBehavior(MovesByVelocity.class).setVelocity(Vector3D.ZERO);
    }

    @Override
    public void setHeading(Vector3D lookAt) {
        /*camera.setLookAtVector(lookAt);
        camera.setPosition(new Vector3D(getPosition()).subtract(lookAt
           .scalarMultiply(cameraDistance)));*/
        super.setHeading(lookAt);
    }

    @Override
    public void setTop(Vector3D top) {
        //camera.setUpVector(top);
        super.setTop(top);
    }

    @Override
    public Player setPosition(double[] pos) {
        super.setPosition(pos);
        return this;
    }

    /**
     * @return the weapons
     */
    public ProjectileFiringBehavior[] getWeapons() {
        return weapons;
    }
}// end Player