Merge pull request #4 from ProjectSWGCore/master

Update local fork
This commit is contained in:
tacef
2014-05-19 20:01:53 +02:00
20 changed files with 1471 additions and 1473 deletions
Binary file not shown.
+31
View File
@@ -0,0 +1,31 @@
/*******************************************************************************
* Copyright (c) 2013 <Project SWG>
*
* This File is part of NGECore2.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* Using NGEngine to work with NGECore2 is making a combined work based on NGEngine.
* Therefore all terms and conditions of the GNU Lesser General Public License cover the combination.
******************************************************************************/
package resources.datatables;
public class Citizenship {
public static final byte Homeless = 0;
public static final byte Citizen = 1;
public static final byte Militia = 2;
public static final byte Mayor = 3;
}
+31
View File
@@ -0,0 +1,31 @@
/*******************************************************************************
* Copyright (c) 2013 <Project SWG>
*
* This File is part of NGECore2.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* Using NGEngine to work with NGECore2 is making a combined work based on NGEngine.
* Therefore all terms and conditions of the GNU Lesser General Public License cover the combination.
******************************************************************************/
package resources.datatables;
public class GcwType {
public static final byte Generic = 0;
public static final byte Enemy = 1;
public static final byte Player = 2;
public static final byte Zone = 3;
}
+98
View File
@@ -0,0 +1,98 @@
/*******************************************************************************
* Copyright (c) 2013 <Project SWG>
*
* This File is part of NGECore2.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* Using NGEngine to work with NGECore2 is making a combined work based on NGEngine.
* Therefore all terms and conditions of the GNU Lesser General Public License cover the combination.
******************************************************************************/
package resources.gcw;
import org.apache.mina.core.buffer.IoBuffer;
import engine.resources.common.AString;
import engine.resources.objects.Baseline;
import engine.resources.objects.Delta;
public class RegionDefender extends Delta {
private static final long serialVersionUID = 1L;
private AString region;
private byte byte1 = 0;
private byte byte2 = 0;
public RegionDefender(String region, byte byte1, byte byte2) {
this.region = new AString(region);
this.byte1 = byte1;
this.byte2 = byte2;
}
public RegionDefender(String region) {
this.region = new AString(region);
}
public RegionDefender() {
this.region = new AString();
}
public String getRegion() {
synchronized(objectMutex) {
return region.get();
}
}
public void setRegion(String region) {
synchronized(objectMutex) {
this.region = new AString(region);
}
}
public byte getByte1() {
synchronized(objectMutex) {
return byte1;
}
}
public void setByte1(byte byte1) {
synchronized(objectMutex) {
this.byte1 = byte1;
}
}
public byte getByte2() {
synchronized(objectMutex) {
return byte2;
}
}
public void setByte2(byte byte2) {
synchronized(objectMutex) {
this.byte2 = byte2;
}
}
public byte[] getBytes() {
synchronized(objectMutex) {
IoBuffer buffer = Baseline.createBuffer(region.getBytes().length + 2);
buffer.put(region.getBytes());
buffer.put(byte1);
buffer.put(byte2);
return buffer.array();
}
}
}
@@ -19,16 +19,13 @@
* Using NGEngine to work with NGECore2 is making a combined work based on NGEngine.
* Therefore all terms and conditions of the GNU Lesser General Public License cover the combination.
******************************************************************************/
package resources.objects.tool;
package resources.harvest;
import java.io.Serializable;
import java.util.Vector;
import main.NGECore;
import com.sleepycat.persist.model.NotPersistent;
import com.sleepycat.persist.model.Persistent;
import engine.resources.scene.Planet;
import engine.resources.scene.Point3D;
import engine.resources.scene.Quaternion;
@@ -40,8 +37,6 @@ import resources.objects.tangible.TangibleObject;
/**
* @author Charon
*/
@Persistent(version=0)
public class SurveyTool extends TangibleObject implements Serializable {
private static final long serialVersionUID = 1L;
@@ -51,25 +46,15 @@ public class SurveyTool extends TangibleObject implements Serializable {
private Long tanoID=0L;
private byte SurveyRangeSetting=0;
@NotPersistent
private transient String surveyEffectString="";
@NotPersistent
private transient String sampleEffectString="";
@NotPersistent
private transient boolean currentlySurveying=false;
@NotPersistent
private transient boolean currentlySampling=false;
@NotPersistent
private transient boolean currentlyCoolingDown=false;
@NotPersistent
private transient boolean exceptionalState=false;
@NotPersistent
private transient boolean recoveryMode=false;
@NotPersistent
private transient Long lastSurveyTime=0L;
@NotPersistent
private transient Long lastSampleTime=0L;
@NotPersistent
private transient Long recoveryTime=10L;
public static byte MineralSurveyDevice = 1;
@@ -34,7 +34,6 @@ import resources.gcw.CurrentServerGCWZonePercent;
import resources.gcw.OtherServerGCWZonePercent;
import resources.guild.Guild;
import resources.objects.ObjectMessageBuilder;
import resources.objects.SWGList;
import resources.objects.SWGMap;
import resources.objects.SWGMultiMap;
import resources.objects.SWGSet;
@@ -21,16 +21,10 @@
******************************************************************************/
package resources.objects.player;
import java.nio.ByteOrder;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.apache.mina.core.buffer.IoBuffer;
import engine.resources.objects.Builder;
import resources.objects.intangible.IntangibleMessageBuilder;
import resources.objects.waypoint.WaypointObject;
public class PlayerMessageBuilder extends IntangibleMessageBuilder {
@@ -42,633 +36,6 @@ public class PlayerMessageBuilder extends IntangibleMessageBuilder {
super();
}
public IoBuffer buildBaseline3() {
PlayerObject player = (PlayerObject) object;
IoBuffer buffer = bufferPool.allocate(100, false).order(ByteOrder.LITTLE_ENDIAN);
buffer.setAutoExpand(true);
buffer.putShort((short) 0x14);
buffer.putFloat(1);
buffer.put(getAsciiString("string_id_table"));
buffer.putInt(0); // spacer
buffer.putShort((short) 0);
buffer.putInt(0); // custom name
buffer.putInt(0); // volume
buffer.putInt(0); // generic int
buffer.putInt(4); // flag bitmask list size
buffer.putInt(player.getFlagBitmask());
buffer.putInt(0);
buffer.putInt(0);
buffer.putInt(0);
buffer.putInt(4); // profile bitmask list size
buffer.putInt(0);
buffer.putInt(0);
buffer.putInt(0);
buffer.putInt(0);
if(player.getTitle() == null || player.getTitle().length() < 1)
buffer.putShort((short) 0);
else
buffer.put(getAsciiString(player.getTitle()));
buffer.putInt(0); // born date - Needs to be in yyymmdd format - Stored as epoch time of character create
buffer.putInt(player.getTotalPlayTime()); // total play time?
buffer.putInt(player.getProfessionIcon());
buffer.put(getAsciiString(player.getProfession()));
buffer.putInt(0); // GCW
buffer.putInt(0); // PvP Kills
buffer.putLong(0); // Lifetime GCW
buffer.putInt(0); // Lifetime PvP Kills
buffer.putInt(player.getCollections().length);
buffer.putInt(player.getHighestSetBit());
buffer.put(player.getCollections());
buffer.putInt(0); // Unknown, part of one delta, maybe a list
buffer.putInt(0); // Unknown, part of one delta, maybe a list
buffer.put((byte) ((player.isShowBackpack()) ? 1 : 0));
buffer.put((byte) ((player.isShowHelmet()) ? 1 : 0));
int size = buffer.position();
buffer = bufferPool.allocate(size, false).put(buffer.array(), 0, size);
buffer.flip();
buffer = createBaseline("PLAY", (byte) 3, buffer, size);
return buffer;
}
public IoBuffer buildBaseline6() {
PlayerObject player = (PlayerObject) object;
IoBuffer buffer = bufferPool.allocate(100, false).order(ByteOrder.LITTLE_ENDIAN);
buffer.setAutoExpand(true);
buffer.putShort((short) 0x11);
buffer.putInt((short) 0x43);
buffer.put(getAsciiString("string_id_table"));
buffer.putInt(0); // probably stringId
buffer.putShort((short) 0); // detailedDescription
buffer.put(player.getGodLevel());
buffer.putInt(0); // unk
buffer.putInt(0); // unk
buffer.putInt(0); // unk
buffer.putInt(0); // unk
buffer.putInt(0); // unk
if(player.getHome() == null || player.getHome().length() < 1) {
buffer.putShort((short) 0);
} else {
buffer.put(getAsciiString(player.getHome()));
}
buffer.putInt(0); // unk
buffer.put((byte) 0); // unk
buffer.putInt(0); // unk
buffer.putInt(0); // unk
buffer.putInt(0); // unk
buffer.putInt(0); // unk
buffer.putInt(0); // unk
buffer.putInt(0); // unk
int size = buffer.position();
buffer = bufferPool.allocate(size, false).put(buffer.array(), 0, size);
buffer.flip();
buffer = createBaseline("PLAY", (byte) 6, buffer, size);
return buffer;
}
public IoBuffer buildBaseline8() {
PlayerObject player = (PlayerObject) object;
IoBuffer buffer = bufferPool.allocate(100, false).order(ByteOrder.LITTLE_ENDIAN);
buffer.setAutoExpand(true);
buffer.putShort((short) 0x09);
if(player.getXpList().isEmpty()) {
buffer.putInt(0);
buffer.putInt(player.getXpListUpdateCounter());
} else {
buffer.putInt(player.getXpList().size());
buffer.putInt(player.getXpListUpdateCounter());
// no need for locking here, concurrent hash map iterator wont throw concurrency exceptions and multiple thread access at zone in is unlikely to occur for the PlayerObject
for(Entry<String, Integer> entry : player.getXpList().entrySet()) {
buffer.put((byte) 0);
buffer.put(getAsciiString(entry.getKey()));
buffer.putInt(entry.getValue());
}
}
if(player.getWaypoints().isEmpty()) {
buffer.putInt(0);
buffer.putInt(0);
} else {
buffer.putInt(player.getWaypoints().size());
buffer.putInt(0);
synchronized(player.getWaypoints()) {
for(WaypointObject waypoint : player.getWaypoints()) {
buffer.put((byte) 0);
buffer.putLong(waypoint.getObjectID());
buffer.putInt(waypoint.getCellId());
buffer.putFloat(waypoint.getPosition().x);
buffer.putFloat(waypoint.getPosition().y);
buffer.putFloat(waypoint.getPosition().z);
buffer.putLong(waypoint.getLocationNetworkId());
buffer.putInt(waypoint.getPlanetCRC());
buffer.put(getUnicodeString(waypoint.getName()));
buffer.putLong(waypoint.getObjectID());
buffer.put(waypoint.getColor());
buffer.put((byte) (waypoint.isActive() ? 1 : 0));
}
}
}
buffer.putInt(0); // Current force power ?
buffer.putInt(0); // Max force power ?
buffer.putInt(0); // Current FS Quest List size ?
buffer.putInt(0); // Current FS Quest List update counter ?
buffer.putInt(0); // Completed FS Quest List size ?
buffer.putInt(0); // Completed FS Quest List update counter ?
buffer.putInt(0); // Quest Journal List size ?
buffer.putInt(0); // Quest Journal List update counter ?
buffer.putInt(0); // unk
buffer.put(getAsciiString(player.getProfessionWheelPosition()));
int size = buffer.position();
buffer = bufferPool.allocate(size, false).put(buffer.array(), 0, size);
buffer.flip();
buffer = createBaseline("PLAY", (byte) 8, buffer, size);
return buffer;
}
public IoBuffer buildBaseline9() {
PlayerObject player = (PlayerObject) object;
IoBuffer buffer = bufferPool.allocate(100, false).order(ByteOrder.LITTLE_ENDIAN);
buffer.setAutoExpand(true);
buffer.putShort((short) 0x1F);
buffer.putInt(0); // ExperimentationFlag?
buffer.putInt(0); // CraftingStage?
buffer.putLong(0); // Nearest Crafting Station id ?
buffer.putInt(0); // Draft Schematic List Size
buffer.putInt(0); // Draft Schematic List update counter
buffer.putInt(0); // ExperimentationPoints?
buffer.putInt(0); // CraftingStage?
buffer.putInt(8); // unk
buffer.putInt(0); // unk
if(player.getFriendList().isEmpty()) {
buffer.putInt(0);
buffer.putInt(0);
} else {
buffer.putInt(player.getFriendList().size());
buffer.putInt(player.getFriendListUpdateCounter());
synchronized(player.getFriendList()) {
for(String friend : player.getFriendList()) {
buffer.put(getAsciiString(friend));
}
}
}
if(player.getIgnoreList().isEmpty()) {
buffer.putInt(0);
buffer.putInt(0);
} else {
buffer.putInt(player.getIgnoreList().size());
buffer.putInt(player.getIgnoreListUpdateCounter());
synchronized(player.getIgnoreList()) {
for(String ignored : player.getIgnoreList()) {
buffer.put(getAsciiString(ignored));
}
}
}
buffer.putInt(1);
buffer.putInt(0); // Current stomach unused in NGE
buffer.putInt(0x64); // Max stomach unused in NGE
buffer.putInt(0); // Current drink unused in NGE
buffer.putInt(0x64); // Max drink unused in NGE
buffer.putInt(0); // Current consumable unused in NGE
buffer.putInt(0x64); // Max consumable unused in NGE
buffer.putInt(0);
buffer.putInt(0);
buffer.putInt(0);
buffer.putInt(0);
buffer.putInt(0);
buffer.putInt(0);
buffer.putInt(0);
buffer.putInt(0);
buffer.putInt(0);
buffer.putInt(0);
buffer.putInt(0);
buffer.putInt(0);
buffer.putInt(0);
buffer.putInt(0);
buffer.putInt(0);
buffer.putInt(0);
buffer.putInt(0);
buffer.putInt(0);
buffer.putInt(0);
buffer.putInt(0);
buffer.putInt(0);
buffer.putInt(0); // jedi state???
buffer.putShort((short) 0);
int size = buffer.position();
buffer = bufferPool.allocate(size, false).put(buffer.array(), 0, size);
buffer.flip();
buffer = createBaseline("PLAY", (byte) 9, buffer, size);
return buffer;
}
public IoBuffer buildTitleDelta(String title) {
IoBuffer buffer = bufferPool.allocate(4 + getAsciiString(title).length, false).order(ByteOrder.LITTLE_ENDIAN);
buffer.put(getAsciiString(title));
int size = buffer.position();
buffer.flip();
buffer = createDelta("PLAY", (byte) 3, (short) 1, (short) 0x07, buffer, size + 4);
return buffer;
}
public IoBuffer buildProfessionIconDelta(int professionIcon) {
IoBuffer buffer = bufferPool.allocate(4, false).order(ByteOrder.LITTLE_ENDIAN);
buffer.putInt(professionIcon);
int size = buffer.position();
buffer.flip();
buffer = createDelta("PLAY", (byte) 3, (short) 1, (short) 0x0A, buffer, size + 4);
return buffer;
}
public IoBuffer buildCollectionsDelta(byte[] collections, int highestSetBit) {
IoBuffer buffer = bufferPool.allocate(8 + collections.length, false).order(ByteOrder.LITTLE_ENDIAN);
buffer.putInt(collections.length);
buffer.putInt(highestSetBit);
for (byte collection : collections) buffer.put(collection);
int size = buffer.position();
buffer.flip();
buffer = createDelta("PLAY", (byte) 3, (short) 1, (short) 16, buffer, size + 4);
return buffer;
}
public IoBuffer buildXPListDelta(String type, int amount, boolean alreadyExists) {
PlayerObject player = (PlayerObject) object;
player.setXpListUpdateCounter(player.getXpListUpdateCounter() + 1);
IoBuffer result = bufferPool.allocate(15 + type.length(), false).order(ByteOrder.LITTLE_ENDIAN);
result.putInt(1);
result.putInt(player.getXpListUpdateCounter());
result.put((byte) ((alreadyExists) ? 2 : 0));
result.put(getAsciiString(type));
result.putInt(amount);
int size = result.position();
result.flip();
result = createDelta("PLAY", (byte) 8, (short) 1, (short) 0, result, size + 4);
return result;
}
public IoBuffer buildProfessionWheelPositionDelta(String professionWheelPosition) {
IoBuffer buffer = bufferPool.allocate(2 + professionWheelPosition.length(), false).order(ByteOrder.LITTLE_ENDIAN);
buffer.put(getAsciiString(professionWheelPosition));
int size = buffer.position();
buffer.flip();
buffer = createDelta("PLAY", (byte) 8, (short) 1, (short) 8, buffer, size + 4);
return buffer;
}
public IoBuffer buildWaypointAddDelta(WaypointObject waypoint) {
PlayerObject player = (PlayerObject) object;
IoBuffer buffer = bufferPool.allocate(59 + waypoint.getName().length() * 2, false).order(ByteOrder.LITTLE_ENDIAN);
buffer.setAutoExpand(true);
int nextCounter = player.getWaypointListUpdateCounter() + 1;
player.setWaypointListUpdateCounter(nextCounter);
buffer.putInt(1);
buffer.putInt(player.getWaypointListUpdateCounter());
buffer.put((byte) 0); // updateType (SubType)
buffer.putLong(waypoint.getObjectID());
buffer.putInt(waypoint.getCellId());
buffer.putFloat(waypoint.getPosition().x);
buffer.putFloat(waypoint.getPosition().y);
buffer.putFloat(waypoint.getPosition().z);
buffer.putLong(0); // networklocationId
buffer.putInt(waypoint.getPlanetCRC());
buffer.put(getUnicodeString(waypoint.getName()));
buffer.putLong(waypoint.getObjectID());
buffer.put((byte) waypoint.getColor());
if (waypoint.isActive()) { buffer.put((byte) 1); }
else { buffer.put((byte) 0); }
int size = buffer.position();
buffer.flip();
buffer = createDelta("PLAY", (byte) 8, (short) 1, (short) 1, buffer, size + 4);
//System.out.println("WaypointAdd: " + buffer.getHexDump());
return buffer;
}
public IoBuffer buildWaypointRemoveDelta(WaypointObject waypoint) {
IoBuffer buffer = bufferPool.allocate(59 + waypoint.getName().length() * 2, false).order(ByteOrder.LITTLE_ENDIAN);
PlayerObject player = (PlayerObject) object;
int nextCounter = player.getWaypointListUpdateCounter() + 1;
player.setWaypointListUpdateCounter(nextCounter);
buffer.putInt(1);
buffer.putInt(player.getWaypointListUpdateCounter());
buffer.put((byte) 1); // updateType (SubType)
buffer.putLong(waypoint.getObjectID());
buffer.putInt(waypoint.getCellId());
buffer.putFloat(waypoint.getPosition().x);
buffer.putFloat(waypoint.getPosition().y);
buffer.putFloat(waypoint.getPosition().z);
buffer.putLong(0); // networklocationId
buffer.putInt(waypoint.getPlanetCRC());
buffer.put(getUnicodeString(waypoint.getName()));
buffer.putLong(waypoint.getObjectID());
buffer.put((byte) waypoint.getColor());
if (waypoint.isActive()) { buffer.put((byte) 1); }
else { buffer.put((byte) 0); }
int size = buffer.position();
buffer.flip();
buffer = createDelta("PLAY", (byte) 8, (short) 1, (short) 1, buffer, size + 4);
return buffer;
}
public IoBuffer buildWaypointUpdateDelta(WaypointObject waypoint) {
IoBuffer buffer = bufferPool.allocate(59 + waypoint.getName().length() * 2, false).order(ByteOrder.LITTLE_ENDIAN);
PlayerObject player = (PlayerObject) object;
int nextCounter = player.getWaypointListUpdateCounter() + 1;
player.setWaypointListUpdateCounter(nextCounter);
buffer.putInt(1);
buffer.putInt(player.getWaypointListUpdateCounter());
buffer.put((byte) 2); // updateType (SubType)
buffer.putLong(waypoint.getObjectID());
buffer.putInt(waypoint.getCellId());
buffer.putFloat(waypoint.getPosition().x);
buffer.putFloat(waypoint.getPosition().y);
buffer.putFloat(waypoint.getPosition().z);
buffer.putLong(0); // networklocationId << cluster system I guess?
buffer.putInt(waypoint.getPlanetCRC());
buffer.put(getUnicodeString(waypoint.getName()));
buffer.putLong(waypoint.getObjectID());
buffer.put((byte) waypoint.getColor());
if (waypoint.isActive()) { buffer.put((byte) 1); }
else { buffer.put((byte) 0); } // isActive. Activates automatically when created.
int size = buffer.position();
buffer.flip();
buffer = createDelta("PLAY", (byte) 8, (short) 1, (short) 1, buffer, size + 4);
return buffer;
}
public IoBuffer buildTotalPlayTimeDelta(int totalPlayTime) {
IoBuffer buffer = bufferPool.allocate(4, false).order(ByteOrder.LITTLE_ENDIAN);
buffer.putInt(totalPlayTime);
int size = buffer.position();
buffer.flip();
buffer = createDelta("PLAY", (byte) 3, (short) 1, (short) 0x09, buffer, size + 4);
return buffer;
}
public IoBuffer buildFriendAddDelta(List<String> friends) {
IoBuffer buffer = bufferPool.allocate(13 + (friends.size() * 2), false).order(ByteOrder.LITTLE_ENDIAN);
buffer.setAutoExpand(true);
PlayerObject player = (PlayerObject) object;
buffer.putInt(1);
buffer.putInt(player.getFriendListUpdateCounter());
buffer.put((byte) 3); // updateType (SubType)
buffer.putShort((short) (player.getFriendList().size()));
for (String f : friends) {
buffer.put(getAsciiString(f));
}
int size = buffer.position();
buffer.flip();
buffer = createDelta("PLAY", (byte) 9, (short) 1, (short) 7, buffer, size + 4);
return buffer;
}
public IoBuffer buildFriendRemoveDelta(List<String> friends) {
IoBuffer buffer = bufferPool.allocate(13 + (friends.size() * 2), false).order(ByteOrder.LITTLE_ENDIAN);
PlayerObject player = (PlayerObject) object;
buffer.putInt(1);
buffer.putInt(player.getFriendListUpdateCounter());
buffer.put((byte) 3); // updateType (SubType)
buffer.putShort((short) friends.size());
for (String f : friends) {
buffer.put(getAsciiString(f));
}
int size = buffer.position();
buffer.flip();
buffer = createDelta("PLAY", (byte) 9, (short) 1, (short) 7, buffer, size + 4);
return buffer;
}
public IoBuffer buildIgnoreAddDelta(List<String> ignoreList) {
IoBuffer buffer = bufferPool.allocate(13 + (ignoreList.size() * 2) , false).order(ByteOrder.LITTLE_ENDIAN);
buffer.setAutoExpand(true);
PlayerObject player = (PlayerObject) object;
buffer.putInt(1);
buffer.putInt(player.getIgnoreListUpdateCounter());
buffer.put((byte) 3); // updateType (SubType)
buffer.putShort((short) ignoreList.size());
for (String ignore : ignoreList) {
buffer.put(getAsciiString(ignore));
}
int size = buffer.position();
buffer.flip();
buffer = createDelta("PLAY", (byte) 9, (short) 1, (short) 8, buffer, size + 4);
return buffer;
}
public IoBuffer buildIgnoreRemoveDelta(List<String> ignoreList) {
IoBuffer buffer = bufferPool.allocate(13 + (ignoreList.size() * 2) , false).order(ByteOrder.LITTLE_ENDIAN);
buffer.setAutoExpand(true);
PlayerObject player = (PlayerObject) object;
buffer.putInt(1);
buffer.putInt(player.getIgnoreListUpdateCounter());
buffer.put((byte) 3); // updateType (SubType)
buffer.putShort((short) ignoreList.size());
for (String ignore : ignoreList) {
buffer.put(getAsciiString(ignore));
}
int size = buffer.position();
buffer.flip();
buffer = createDelta("PLAY", (byte) 9, (short) 1, (short) 8, buffer, size + 4);
return buffer;
}
public IoBuffer buildFlagBitmask(int bitmask) {
IoBuffer buffer = bufferPool.allocate(20, false).order(ByteOrder.LITTLE_ENDIAN);
buffer.putInt(4);
buffer.putInt(bitmask);
buffer.putInt(0);
buffer.putInt(0);
buffer.putInt(0);
int size = buffer.position();
buffer.flip();
buffer = createDelta("PLAY", (byte) 3, (short) 1, (short) 5, buffer, size + 4);
return buffer;
}
public IoBuffer buildShowBackpackDelta(boolean showBackpack) {
IoBuffer buffer = bufferPool.allocate(1, false).order(ByteOrder.LITTLE_ENDIAN);
buffer.put((byte) (showBackpack ? 1 : 0));
int size = buffer.position();
buffer.flip();
buffer = createDelta("PLAY", (byte) 3, (short) 1, (short) 18, buffer, size + 4);
return buffer;
}
public IoBuffer buildShowHelmetDelta(boolean showHelmet) {
IoBuffer buffer = bufferPool.allocate(1, false).order(ByteOrder.LITTLE_ENDIAN);
buffer.put((byte) (showHelmet ? 1 : 0));
int size = buffer.position();
buffer.flip();
buffer = createDelta("PLAY", (byte) 3, (short) 1, (short) 19, buffer, size + 4);
return buffer;
}
public IoBuffer buildGodLevelDelta(byte godLevel) {
IoBuffer buffer = bufferPool.allocate(1, false).order(ByteOrder.LITTLE_ENDIAN);
buffer.put(godLevel);
int size = buffer.position();
buffer.flip();
buffer = createDelta("PLAY", (byte) 6, (short) 1, (short) 0x02, buffer, size + 4);
return buffer;
}
@Override
public void buildBaseline3(Map<Integer, Builder> baselineBuilders, Map<Integer, Builder> deltaBuilders) {
super.buildBaseline3(baselineBuilders, deltaBuilders);
@@ -679,10 +46,12 @@ public class PlayerMessageBuilder extends IntangibleMessageBuilder {
super.buildBaseline6(baselineBuilders, deltaBuilders);
}
@Override
public void buildBaseline8(Map<Integer, Builder> baselineBuilders, Map<Integer, Builder> deltaBuilders) {
super.buildBaseline8(baselineBuilders, deltaBuilders);
}
@Override
public void buildBaseline9(Map<Integer, Builder> baselineBuilders, Map<Integer, Builder> deltaBuilders) {
super.buildBaseline9(baselineBuilders, deltaBuilders);
}
File diff suppressed because it is too large Load Diff
+1 -2
View File
@@ -287,6 +287,7 @@ public class CharacterService implements INetworkDispatch {
player.setProfession(clientCreateCharacter.getProfession());
player.setProfessionIcon(Professions.get(clientCreateCharacter.getProfession()));
player.setProfessionWheelPosition(clientCreateCharacter.getProfessionWheelPosition());
player.setNextUpdateTime(core.gcwService.calculateNextUpdateTime() + player.getBornDate());
if(clientCreateCharacter.getHairObject().length() > 0) {
String sharedHairTemplate = clientCreateCharacter.getHairObject().replace("/hair_", "/shared_hair_");
TangibleObject hair = (TangibleObject) core.objectService.createObject(sharedHairTemplate, object.getPlanet());
@@ -296,8 +297,6 @@ public class CharacterService implements INetworkDispatch {
object.addObjectToEquipList(hair);
}
player.setBornDate((int) System.currentTimeMillis());
TangibleObject inventory = (TangibleObject) core.objectService.createObject("object/tangible/inventory/shared_character_inventory.iff", object.getPlanet());
inventory.setContainerPermissions(CreatureContainerPermissions.CREATURE_CONTAINER_PERMISSIONS);
TangibleObject appInventory = (TangibleObject) core.objectService.createObject("object/tangible/inventory/shared_appearance_inventory.iff", object.getPlanet());
+1 -1
View File
@@ -36,11 +36,11 @@ import resources.common.FileUtilities;
import resources.common.Opcodes;
import resources.common.SpawnPoint;
import resources.datatables.WeaponType;
import resources.harvest.SurveyTool;
import resources.objects.building.BuildingObject;
import resources.objects.creature.CreatureObject;
import resources.objects.player.PlayerObject;
import resources.objects.tangible.TangibleObject;
import resources.objects.tool.SurveyTool;
import resources.objects.weapon.WeaponObject;
import services.sui.SUIWindow;
import services.sui.SUIService.ListBoxType;
+1
View File
@@ -924,6 +924,7 @@ public class PlayerService implements INetworkDispatch {
}
player.setXp(xpType, experience);
creature.setXpBarValue(experience);
// 2. See if they need to level up.
for (int i = 0; i < experienceTable.getRowCount(); i++) {
+1 -1
View File
@@ -31,13 +31,13 @@ import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import protocol.swg.PlayClientEffectLocMessage;
import resources.harvest.SurveyTool;
import resources.objects.creature.CreatureObject;
import resources.objects.player.PlayerObject;
import resources.objects.resource.GalacticResource;
import resources.objects.resource.ResourceContainerObject;
import resources.objects.resource.ResourceRoot;
import resources.objects.tangible.TangibleObject;
import resources.objects.tool.SurveyTool;
import services.sui.SUIWindow;
import services.sui.SUIWindow.SUICallback;
import services.sui.SUIWindow.Trigger;
+55 -3
View File
@@ -26,12 +26,14 @@ import java.util.Map.Entry;
import java.util.Random;
import java.util.Vector;
import resources.datatables.Difficulty;
import resources.datatables.FactionStatus;
import resources.datatables.GcwType;
import resources.objects.creature.CreatureObject;
import resources.objects.group.GroupObject;
import resources.objects.player.PlayerObject;
import engine.resources.objects.SWGObject;
import engine.resources.scene.Point3D;
import main.NGECore;
public class AIService {
@@ -109,5 +111,55 @@ public class AIService {
return baseXP;
}
public void awardGcw(AIActor actor) {
CreatureObject npc = actor.getCreature();
if (core.factionService.isPvpFaction(npc.getFaction())) {
int gcwPoints = 5;
if (npc.getDifficulty() == Difficulty.ELITE) {
gcwPoints *= 2;
}
if (npc.getDifficulty() == Difficulty.BOSS) {
gcwPoints *= 5;
}
//gcwPoints = actor.getMobileTemplate().getGcwPoints(); // We might want to make this get set in mobile templates if it was different for different npcs ie. assault squads.
for (CreatureObject player : actor.getDamageMap().keySet()) {
if (player.getGroupId() == 0) {
if (player.getFaction().length() > 0 && player.getFactionStatus() > FactionStatus.OnLeave) {
if ((npc.getLevel() / player.getLevel() * 100) < 86) {
continue;
}
core.gcwService.addGcwPoints(player, gcwPoints, GcwType.Enemy);
}
} else {
for (SWGObject object : ((GroupObject) core.objectService.getObject(player.getGroupId())).getMemberList()) {
CreatureObject member = (CreatureObject) object;
if (member == null) {
continue;
}
if (npc.getPlanet().getName().equals(member.getPlanet().getName()) && npc.getPosition().getDistance(member.getPosition()) > 300) {
continue;
}
if ((npc.getLevel() / member.getLevel() * 100) < 86) {
continue;
}
if (member.getFaction().length() > 0 && member.getFactionStatus() > FactionStatus.OnLeave) {
core.gcwService.addGcwPoints(member, gcwPoints, GcwType.Enemy);
}
}
}
}
}
}
}
+1
View File
@@ -31,6 +31,7 @@ public class DeathState extends AIState {
@Override
public byte onEnter(AIActor actor) {
NGECore.getInstance().aiService.awardExperience(actor);
NGECore.getInstance().aiService.awardGcw(actor);
actor.getCreature().setAttachment("radial_filename", "npc/corpse");
//NGECore.getInstance().scriptService.callScript("scripts/radial/npc/corpse", "", "createRadial", NGECore.getInstance(), actor.getCreature().getKiller(), actor.getCreature(), new Vector<RadialOptions>());
NGECore.getInstance().lootService.DropLoot((CreatureObject)(actor.getCreature().getKiller()),(TangibleObject)(actor.getCreature()));
-1
View File
@@ -38,7 +38,6 @@ import engine.resources.service.INetworkDispatch;
import engine.resources.service.INetworkRemoteEvent;
import resources.common.Opcodes;
import resources.common.OutOfBand;
import resources.common.ProsePackage;
import resources.datatables.DisplayType;
import resources.objects.building.BuildingObject;
import resources.objects.creature.CreatureObject;
+68 -8
View File
@@ -22,9 +22,11 @@
package services.combat;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Set;
import java.util.Vector;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
@@ -46,6 +48,7 @@ import resources.common.FileUtilities;
import resources.common.OutOfBand;
import resources.datatables.DisplayType;
import resources.datatables.FactionStatus;
import resources.datatables.GcwType;
import resources.datatables.Options;
import resources.datatables.Elemental;
import resources.datatables.Posture;
@@ -803,7 +806,9 @@ public class CombatService implements INetworkDispatch {
}
synchronized(target.getMutex()) {
if(core.mountService.isMounted(target)) core.mountService.dismount(target, (CreatureObject) target.getContainer());
if (core.mountService.isMounted(target)) {
core.mountService.dismount(target, (CreatureObject) target.getContainer());
}
target.setHealth(1);
target.setPosture(Posture.Incapacitated);
@@ -1026,7 +1031,6 @@ public class CombatService implements INetworkDispatch {
core.missionService.handleMissionComplete(attacker, mission);
}
} else if (target.getPlayerObject().getBountyMissionId() != 0) { // Bounty Hunter is being deathblown (They're the target)
bountyWindow = false;
MissionObject mission = (MissionObject) core.objectService.getObject(target.getPlayerObject().getBountyMissionId());
@@ -1039,16 +1043,22 @@ public class CombatService implements INetworkDispatch {
core.missionService.handleMissionAbort(target, mission);
}
}
if(target.getDuelList().contains(attacker))
if (target.getDuelList().contains(attacker)) {
bountyWindow = false;
handleEndDuel(target, attacker, false);
} else {
awardGcw(attacker, target);
}
if (bountyWindow) core.playerService.sendSetBountyWindow(target, attacker);
} else { attacker.sendSystemMessage("You have killed " + target.getCustomName() + ".", (byte) 0); }
if (bountyWindow) {
core.playerService.sendSetBountyWindow(target, attacker);
}
} else {
attacker.sendSystemMessage("You have killed " + ((target.getCustomName() == null) ? target.getObjectName().getStfValue() : target.getCustomName()) + ".", DisplayType.Broadcast);
}
attacker.removeDefender(target);
target.removeDefender(attacker);
target.setSpeedMultiplierBase(0);
@@ -1427,5 +1437,55 @@ public class CombatService implements INetworkDispatch {
defenderList.stream().forEach(attacker -> defender.removeDefender(attacker));
}
}
public void awardGcw(CreatureObject actor, CreatureObject target) {
try {
if (actor.getSlottedObject("ghost") == null || target.getSlottedObject("ghost") == null) {
return;
}
PlayerObject targetPlayer = (PlayerObject) target.getSlottedObject("ghost");
if (!core.factionService.isFactionEnemy(actor, target) && target.isAttackableBy(actor)) {
return;
}
Set<CreatureObject> inRange = new HashSet<CreatureObject>();
inRange.add(actor);
actor.getObservers().stream().forEach(observer -> inRange.add((CreatureObject) observer.getParent()));
for (CreatureObject rangedPlayer : inRange) {
if (!(rangedPlayer.getFaction().equals(actor.getFaction()) && target.isAttackableBy(rangedPlayer))){
continue;
}
if (!((rangedPlayer.getLevel() / target.getLevel() * 100) < 70)) {
continue;
}
if (rangedPlayer.getSlottedObject("ghost") == null) {
continue;
}
PlayerObject player = (PlayerObject) rangedPlayer.getSlottedObject("ghost");
float gcwPoints = 37.5f;
gcwPoints *= targetPlayer.getCurrentRank();
float decay = (((float) player.getPvpKills()) / 100f * gcwPoints);
gcwPoints = (((gcwPoints - decay) < 0) ? 0 : (gcwPoints - decay));
core.gcwService.addGcwPoints(rangedPlayer, (int) gcwPoints, GcwType.Player);
actor.sendSystemMessage(OutOfBand.ProsePackage("@gcw:gcw_rank_pvp_kill_point_grant", (int) gcwPoints, "TT", target.getCustomName()), DisplayType.Broadcast);
}
} catch (Exception e) {
}
}
}
+59 -19
View File
@@ -47,7 +47,9 @@ import resources.objects.creature.CreatureObject;
import resources.objects.mission.MissionObject;
import resources.objects.player.PlayerObject;
import resources.objects.tangible.TangibleObject;
import engine.clientdata.ClientFileManager;
import engine.clientdata.StfTable;
import engine.clientdata.visitors.DatatableVisitor;
import engine.clients.Client;
import engine.resources.common.CRC;
import engine.resources.service.INetworkDispatch;
@@ -61,6 +63,8 @@ public class FactionService implements INetworkDispatch {
private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
private DatatableVisitor pvpFactions;
public FactionService(NGECore core) {
this.core = core;
@@ -74,6 +78,8 @@ public class FactionService implements INetworkDispatch {
factionMap.put(faction, CRC.StringtoCRC(faction));
}
}
pvpFactions = ClientFileManager.loadFile("datatables/player/pvp_factions.iff", DatatableVisitor.class);
} catch (Exception e) {
e.printStackTrace();
}
@@ -352,28 +358,56 @@ public class FactionService implements INetworkDispatch {
return pvpBitmask;
}
// temp fix until calculatePvpStatus is fixed
/*
public int calculatePvpStatus(CreatureObject player, TangibleObject target) {
if(target.getSlottedObject("ghost") != null) {
if(!player.getFaction().equals(target.getFaction()) && player.getFactionStatus() == FactionStatus.SpecialForces && ((CreatureObject) target).getFactionStatus() == FactionStatus.SpecialForces)
return 55;
else if(core.combatService.areInDuel(player, (CreatureObject) target))
return 55;
else
return 0x14;
} else {
if(target.getAttachment("AI") != null)
return PvpStatus.Attackable;
else
return 0;
public boolean isPvpFaction(String faction) {
if (!isFaction(faction)) {
return false;
}
try {
for (int i = 0; i < pvpFactions.getRowCount(); i++) {
if (pvpFactions.getObject(i, 0) != null) {
if (((String) pvpFactions.getObject(i, 0)).equals(faction)) {
return true;
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
public void join(CreatureObject actor, String faction) {
if (actor.getPvpBitmask() == PvpStatus.GoingCovert) {
actor.sendSystemMessage("@faction_recruiter:pvp_status_changing", DisplayType.Broadcast);
return;
}
if (actor.getPvpBitmask() == PvpStatus.GoingOvert) {
actor.sendSystemMessage("@faction_recruiter:pvp_status_changing", DisplayType.Broadcast);
return;
}
if (actor.getFaction().length() > 0) {
actor.sendSystemMessage("@faction_recruiter:resign_on_leave", DisplayType.Broadcast);
return;
}
scheduler.schedule(() -> {
actor.setFaction(faction);
actor.setFactionStatus(FactionStatus.Combatant);
actor.setPvpBitmask(0);
PlayerObject player = ((PlayerObject) actor.getSlottedObject("ghost"));
if (player != null) {
player.resetGcwPoints();
player.resetPvpKills();
player.setCurrentRank(1);
}
actor.updatePvpStatus();
}, 1, TimeUnit.SECONDS);
}
*/
public void changeFactionStatus(CreatureObject actor, int factionStatus) {
long time = 1;
@@ -464,6 +498,12 @@ public class FactionService implements INetworkDispatch {
actor.setPvpBitmask(0);
actor.setFactionStatus(FactionStatus.OnLeave);
actor.setFaction("");
PlayerObject player = ((PlayerObject) actor.getSlottedObject("ghost"));
if (player != null) {
player.resetGcwPoints();
player.resetPvpKills();
player.setCurrentRank(0);
}
actor.updatePvpStatus();
actor.sendSystemMessage("@faction_recruiter:resign_complete", DisplayType.Broadcast);
}, time, TimeUnit.SECONDS);
+290 -1
View File
@@ -25,10 +25,13 @@ import java.math.BigDecimal;
import java.math.MathContext;
import java.nio.ByteOrder;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TimeZone;
import java.util.TreeMap;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Executors;
@@ -44,15 +47,20 @@ import protocol.swg.GcwGroupsRsp;
import protocol.swg.GcwRegionsReq;
import protocol.swg.GcwRegionsRsp;
import resources.common.Opcodes;
import resources.common.OutOfBand;
import resources.common.collidables.CollidableCircle;
import resources.datatables.DisplayType;
import resources.datatables.FactionStatus;
import resources.datatables.GcwType;
import resources.gcw.CurrentServerGCWZoneHistory;
import resources.gcw.CurrentServerGCWZonePercent;
import resources.gcw.OtherServerGCWZonePercent;
import resources.objects.creature.CreatureObject;
import resources.objects.guild.GuildObject;
import resources.objects.player.PlayerObject;
import main.NGECore;
import engine.clients.Client;
import engine.resources.database.ODBCursor;
import engine.resources.objects.SWGObject;
import engine.resources.scene.Planet;
import engine.resources.scene.Point2D;
@@ -63,9 +71,18 @@ import engine.resources.service.INetworkRemoteEvent;
public class GCWService implements INetworkDispatch {
private NGECore core;
private GuildObject object;
private static final int[] MOD2 = { 10250, 7250, 7250, 6750, 6750, 6750, 6750, 6750, 6750, 6750, 6750, 6750 };
private static final int[] DECAY1 = { 0, 0, 0, 0, 0, 0, 2727, 2744, 2769, 2799, 2823, 2857 };
private static final int[] DECAY2 = { 0, 0, 0, 0, 0, 0, 6000, 6500, 7200, 8200, 9600, 12000 };
private static final int[] CONST2 = { 0, 0, 0, 0, 0, 0, 12200, 12200, 12900, 14100, 16200, 18700 };
private static final int[] CONST4 = { 0, 0, 0, 0, 0, 0, 1950, 3550, 5600, 7800, 9350, 11100 };
private Map<String, Map<String, CurrentServerGCWZonePercent>> zoneMap() { return object.getZoneMap(); }
private Map<Planet, List<PvPZone>> pvpZones = new ConcurrentHashMap<Planet, List<PvPZone>>();
private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
protected final Object objectMutex = new Object();
@@ -81,6 +98,7 @@ public class GCWService implements INetworkDispatch {
try {
core.scriptService.callScript("scripts/", "gcwzones", "addZones", core);
core.scriptService.callScript("scripts/", "pvpzones", "addZones", core);
updateNextUpdateTime();
} catch (Exception e) {
e.printStackTrace();
}
@@ -287,6 +305,63 @@ public class GCWService implements INetworkDispatch {
}
}
}, 2, 2, TimeUnit.DAYS);
scheduler.scheduleAtFixedRate(new Runnable() {
@Override public void run() { gcwUpdate(); }
private void gcwUpdate() {
int nextUpdateTime = (int) calculateNextUpdateTime();
ODBCursor cursor = core.getSWGObjectODB().getCursor();
while (cursor.hasNext()) {
SWGObject object = (SWGObject) cursor.next();
if (object == null) {
continue;
}
if (core.objectService.getObject(object.getObjectID()) == null) {
object = core.objectService.getObject(object.getObjectID());
}
if (!(object instanceof CreatureObject)) {
continue;
}
CreatureObject creature = (CreatureObject) object;
if (creature.getSlottedObject("ghost") == null) {
continue;
}
PlayerObject player = (PlayerObject) creature.getSlottedObject("ghost");
// TODO update statistics
if (core.factionService.isPvpFaction(creature.getFaction())) {
updateGcwRank(creature);
player.addLifetimeGcwPoints(player.getGcwPoints());
player.addLifetimePvpKills(player.getPvpKills());
player.resetGcwPoints();
player.resetPvpKills();
if (creature.getFaction().equals("rebel") && player.getCurrentRank() > player.getHighestRebelRank()) {
player.setHighestRebelRank(player.getCurrentRank());
}
if (creature.getFaction().equals("imperial") && player.getCurrentRank() > player.getHighestImperialRank()) {
player.setHighestImperialRank(player.getCurrentRank());
}
player.setNextUpdateTime(nextUpdateTime - player.getBornDate());
}
}
cursor.close();
}
}, calculateNextUpdateTime(), 6048000, TimeUnit.SECONDS);
}
public void addZone(String planet, String zone, float x, float z, float radius, int weight, int type) {
@@ -367,6 +442,117 @@ public class GCWService implements INetworkDispatch {
}
}
public void addGcwPoints(CreatureObject actor, int gcwPoints, byte gcwType) {
if (actor == null) {
return;
}
if (!core.factionService.isPvpFaction(actor.getFaction())) {
return;
}
if (actor.getSlottedObject("ghost") == null) {
return;
}
PlayerObject player = (PlayerObject) actor.getSlottedObject("ghost");
String planet = actor.getPlanet().getName();
String prefix = ((planet.startsWith("space")) ? (planet + "_space") : planet);
switch (gcwType) {
case GcwType.Enemy:
adjustZone(planet, prefix + "_pve", actor.getFaction(), gcwPoints);
actor.sendSystemMessage(OutOfBand.ProsePackage("@gcw:gcw_rank_generic_point_grant", gcwPoints), DisplayType.Broadcast);
break;
case GcwType.Player:
adjustZone(planet, prefix + "_pvp", actor.getFaction(), gcwPoints);
break;
}
String zone = getCurrentGcwRegion(actor);
if (zone != null) {
adjustZone(planet, zone, actor.getFaction(), gcwPoints);
}
player.setGcwPoints(player.getGcwPoints() + gcwPoints);
}
/* Ported from javascript.
* Written for us by Hendrik of http://swg.activeframe.de.
*/
private double helper(int points, int rank) {
int faktor = points / (MOD2[rank-1] - 250 * rank);
int rt = points / (1 + faktor) - DECAY1[rank-1];
if (rank >= 7) {
if (points > DECAY2[rank-1] && rt > 0) {
rt = rt * (((17 - rank) / (14 - rank)) + (CONST2[rank-1] / (points - CONST4[rank-1])));
}
}
return Math.floor(rt);
}
/* Ported from javascript.
* Written for us by Hendrik of http://swg.activeframe.de.
*/
public void updateGcwRank(CreatureObject actor) {
if (actor == null) {
return;
}
if (actor.getFaction().length() == 0) {
return;
}
if (actor.getSlottedObject("ghost") == null) {
return;
}
PlayerObject player = (PlayerObject) actor.getSlottedObject("ghost");
int oldrank = player.getCurrentRank();
int oldprogress = (int) ((player.getRankProgress() > 100) ? 100 : player.getRankProgress());
int oldpoints = player.getGcwPoints();
int newrank = oldrank;
int newprogress = oldprogress;
int oldranktotal = 0;
int oldrankprogress = 0;
int newranktotal = 0;
int newrankprogress = 0;
oldrankprogress = oldprogress * 50;
oldranktotal = 5000 * (oldrank - 1) + oldrankprogress;
newprogress = (int) helper(oldpoints, oldrank);
if (newprogress < -2000) {
newprogress = -2000;
}
newranktotal = oldranktotal + newprogress;
if (oldrank == 7 && newprogress < 0 && newranktotal < 30000) {
newranktotal = 29999;
}
newrank = (int) (Math.floor(newranktotal / 5000) + 1);
if (newrank > 12) {
newrank = 12;
newranktotal = 12 * 5000 - 1;
}
newrankprogress = newranktotal - (newrank - 1) * 5000;
newprogress = newrankprogress * 100 / 5000;
player.setCurrentRank(newrank);
player.setRankProgress((float) Math.floor(newprogress));
}
public List<SWGObject> getSFPlayers() {
List<SWGObject> flagged = new ArrayList<SWGObject>();
@@ -380,7 +566,7 @@ public class GCWService implements INetworkDispatch {
Iterator<SWGObject> it = flagged.iterator();
while(it.hasNext()) {
while (it.hasNext()) {
SWGObject obj = it.next();
if (((CreatureObject) obj).getFactionStatus() != 2) {
it.remove();
@@ -390,6 +576,109 @@ public class GCWService implements INetworkDispatch {
return flagged;
}
public String getCurrentGcwRegion(CreatureObject actor) {
try {
String planet = actor.getPlanet().getName();
if (zoneMap().containsKey(planet)) {
for (String zoneName : zoneMap().get(planet).keySet()) {
CurrentServerGCWZonePercent zone = zoneMap().get(planet).get(zoneName).clone();
if (zone.getRadius() > 0) {
List<SWGObject> objects = core.simulationService.get(core.terrainService.getPlanetByName(planet), zone.getPosition().x, zone.getPosition().z, (int) zone.getRadius());
if (objects.contains(actor)) {
return zoneName;
}
}
}
}
} catch (Exception e) {
return null;
}
return null;
}
public int calculateNextUpdateTime() {
Calendar c = Calendar.getInstance();
Date now = new Date();
c.setTime(now);
c.setTimeZone(TimeZone.getTimeZone("GMT"));
if (c.get(Calendar.DAY_OF_WEEK) == Calendar.THURSDAY && c.get(Calendar.HOUR_OF_DAY) >= 7) {
c.add(Calendar.DAY_OF_YEAR, 7);
}
while (c.get(Calendar.DAY_OF_WEEK) != Calendar.THURSDAY) {
c.add(Calendar.DAY_OF_WEEK, 1);
}
c.set(Calendar.HOUR_OF_DAY, 7);
c.set(Calendar.MINUTE, 0);
c.set(Calendar.SECOND, 0);
c.set(Calendar.MILLISECOND, 0);
return (int) ((c.getTimeInMillis() - now.getTime()) / 1000L);
}
public void updateNextUpdateTime() {
ODBCursor cursor = core.getSWGObjectODB().getCursor();
while (cursor.hasNext()) {
SWGObject object = (SWGObject) cursor.next();
if (object == null) {
continue;
}
if (core.objectService.getObject(object.getObjectID()) == null) {
object = core.objectService.getObject(object.getObjectID());
}
if (!(object instanceof CreatureObject)) {
continue;
}
CreatureObject creature = (CreatureObject) object;
if (creature.getSlottedObject("ghost") == null) {
continue;
}
PlayerObject player = (PlayerObject) creature.getSlottedObject("ghost");
player.setNextUpdateTime(player.getBornDate() + calculateNextUpdateTime());
}
cursor.close();
}
public long calculateResetTime() {
Calendar c = Calendar.getInstance();
Date now = new Date();
c.setTime(now);
int weekday = c.get(Calendar.DAY_OF_WEEK);
if (weekday != Calendar.THURSDAY) {
int days = ((Calendar.WEDNESDAY - weekday + 2) % 7);
c.add(Calendar.DAY_OF_YEAR, days);
} else if (c.get(Calendar.HOUR_OF_DAY) >= 7) {
c.add(Calendar.DAY_OF_YEAR, 7);
}
c.set(Calendar.HOUR_OF_DAY, 7);
c.set(Calendar.MINUTE, 0);
c.set(Calendar.SECOND, 0);
c.set(Calendar.MILLISECOND, 0);
return c.getTimeInMillis();
}
public void insertOpcodes(Map<Integer, INetworkRemoteEvent> swgOpcodes, Map<Integer, INetworkRemoteEvent> objControllerOpcodes) {
swgOpcodes.put(Opcodes.GcwRegionsReq, new INetworkRemoteEvent() {
-1
View File
@@ -29,7 +29,6 @@ import resources.common.collidables.AbstractCollidable.ExitEvent;
import resources.datatables.FactionStatus;
import resources.datatables.PvpStatus;
import resources.objects.creature.CreatureObject;
import engine.resources.objects.SWGObject;
import engine.resources.scene.Planet;
import engine.resources.scene.Point3D;
+1 -1
View File
@@ -48,6 +48,7 @@ import java.util.concurrent.atomic.AtomicLong;
import resources.common.*;
import resources.datatables.Options;
import resources.datatables.PlayerFlags;
import resources.harvest.SurveyTool;
import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.session.IoSession;
@@ -118,7 +119,6 @@ import resources.objects.resource.ResourceContainerObject;
import resources.objects.resource.ResourceRoot;
import resources.objects.staticobject.StaticObject;
import resources.objects.tangible.TangibleObject;
import resources.objects.tool.SurveyTool;
import resources.objects.waypoint.WaypointObject;
import resources.objects.weapon.WeaponObject;
import services.ai.AIActor;