Conflicts:
	src/resources/objects/creature/CreatureMessageBuilder.java
	src/resources/objects/creature/CreatureObject.java
	src/services/PlayerService.java
This commit is contained in:
Light2
2014-03-25 20:14:16 +01:00
434 changed files with 6253 additions and 1485 deletions
+200 -9
View File
@@ -34,6 +34,7 @@ import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.function.Predicate;
import java.util.concurrent.atomic.AtomicBoolean;
import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.session.IoSession;
@@ -41,6 +42,8 @@ import org.apache.mina.core.session.IoSession;
import protocol.swg.CharacterSheetResponseMessage;
import protocol.swg.ClientIdMsg;
import protocol.swg.ClientMfdStatusUpdateMessage;
import protocol.swg.CollectionServerFirstListRequest;
import protocol.swg.CollectionServerFirstListResponse;
import protocol.swg.CreateClientPathMessage;
import protocol.swg.ExpertiseRequestMessage;
import protocol.swg.GuildRequestMessage;
@@ -52,12 +55,12 @@ import protocol.swg.SetWaypointColor;
import protocol.swg.objectControllerObjects.ChangeRoleIconChoice;
import protocol.swg.objectControllerObjects.ShowFlyText;
import protocol.swg.objectControllerObjects.ShowLootBox;
import resources.common.Console;
import resources.common.FileUtilities;
import resources.common.ObjControllerOpcodes;
import resources.common.Opcodes;
import resources.common.RGB;
import resources.common.SpawnPoint;
import resources.common.StringUtilities;
import resources.datatables.PlayerFlags;
import resources.guild.Guild;
import resources.objects.Buff;
@@ -66,6 +69,7 @@ import resources.objects.cell.CellObject;
import resources.objects.creature.CreatureObject;
import resources.objects.player.PlayerMessageBuilder;
import resources.objects.player.PlayerObject;
import resources.objects.tangible.TangibleObject;
import resources.objects.waypoint.WaypointObject;
import services.sui.SUIService.ListBoxType;
import services.sui.SUIWindow;
@@ -77,6 +81,7 @@ import engine.clientdata.visitors.CrcStringTableVisitor;
import engine.clientdata.visitors.DatatableVisitor;
import engine.clients.Client;
import engine.resources.common.CRC;
import engine.resources.container.Traverser;
import engine.resources.objects.DraftSchematic;
import engine.resources.objects.SWGObject;
import engine.resources.scene.Point3D;
@@ -312,7 +317,29 @@ public class PlayerService implements INetworkDispatch {
});
swgOpcodes.put(Opcodes.CollectionServerFirstListRequest, (session, data) -> {
data.order(ByteOrder.LITTLE_ENDIAN);
data.position(0);
Client client = core.getClient(session);
if (client == null)
return;
SWGObject player = client.getParent();
if (player == null)
return;
CollectionServerFirstListRequest request = new CollectionServerFirstListRequest();
request.deserialize(data);
String server = request.getServer();
System.out.println(server);
if (server == null || server.equals(""))
return;
CollectionServerFirstListResponse response = new CollectionServerFirstListResponse(server, core.guildService.getGuildObject().getServerFirst());
session.write(response.serialize());
});
swgOpcodes.put(Opcodes.Unknown, (session, data) -> {
@@ -361,7 +388,7 @@ public class PlayerService implements INetworkDispatch {
if(!FileUtilities.doesFileExist("scripts/expertise/" + expertiseBox + ".py"))
return;
core.scriptService.callScript("scripts/expertise/", "addExpertisePoint", expertiseBox, core, creature);
core.scriptService.callScript("scripts/expertise/", expertiseBox, "addExpertisePoint", core, creature);
}
@@ -464,6 +491,10 @@ public class PlayerService implements INetworkDispatch {
// Cannot gain more than half of the XP needed for the next level in one go
// Do check
int experienceBonus = creature.getSkillModBase("flush_with_success");
experience += ((experience * experienceBonus) / 100);
// 1. Add the experience.
if (experience > 0) {
creature.showFlyText("base_player", "prose_flytext_xp", "", experience, (float) 2.5, new RGB(180, 60, 240), 1);
@@ -485,7 +516,7 @@ public class PlayerService implements INetworkDispatch {
creature.playEffectObject("clienteffect/level_granted.cef", "");
creature.getClient().getSession().write((new ClientMfdStatusUpdateMessage((float) ((creature.getLevel() == 90) ? 90 : (creature.getLevel() + 1)), "/GroundHUD.MFDStatus.vsp.role.targetLevel")).serialize());
creature.setLevel(((Integer) experienceTable.getObject(i, 0)).shortValue());
core.scriptService.callScript("scripts/collections/", "addMasterBadge", "master_" + player.getProfession(), core, creature);
core.scriptService.callScript("scripts/collections/", "master_" + player.getProfession(), "addMasterBadge", core, creature);
// 3. Add the relevant health/action and expertise points.
float luck = (((((float) (core.scriptService.getMethod("scripts/roadmap/", player.getProfession(), "getLuck").__call__().asInt()) + (core.scriptService.getMethod("scripts/roadmap/", creature.getStfName(), "getLuck").__call__().asInt())) / ((float) 90)) * ((float) creature.getLevel())) - ((float) creature.getSkillModBase("luck")));
@@ -578,6 +609,8 @@ public class PlayerService implements INetworkDispatch {
try {
roadmap = ClientFileManager.loadFile("datatables/roadmap/item_rewards.iff", DatatableVisitor.class);
Vector<SWGObject> rewards = new Vector<SWGObject>();
for (int s = 0; s < roadmap.getRowCount(); s++) {
if (roadmap.getObject(s, 0) != null) {
if (((String) roadmap.getObject(s, 1)).equals(roadmapSkillName)) {
@@ -602,11 +635,12 @@ public class PlayerService implements INetworkDispatch {
item = (item.substring(0, (item.lastIndexOf("/") + 1)) + "shared_" + item.substring((item.lastIndexOf("/") + 1)));
} else {
customServerTemplate = item;
item = core.scriptService.callScript("scripts/roadmap/", "roadmap_rewards", "get", item).asString();
item = core.scriptService.callScript("scripts/roadmap/", player.getProfession(), "getRewards", item).asString();
}
if (item != null && item != "") {
creature.getSlottedObject("inventory").add(core.objectService.createObject(item, 0, creature.getPlanet(), new Point3D(0, 0, 0), new Quaternion(1, 0, 0, 0), customServerTemplate));
SWGObject itemObj = core.objectService.createObject(item, 0, creature.getPlanet(), new Point3D(0, 0, 0), new Quaternion(1, 0, 0, 0), customServerTemplate);
rewards.add(itemObj);
} else {
//System.out.println("Can't find template: " + item);
}
@@ -618,6 +652,11 @@ public class PlayerService implements INetworkDispatch {
}
}
}
if (rewards != null && !rewards.isEmpty()) {
giveItems(creature, rewards);
}
} catch (InstantiationException | IllegalAccessException e) {
e.printStackTrace();
}
@@ -629,6 +668,9 @@ public class PlayerService implements INetworkDispatch {
} catch (InstantiationException | IllegalAccessException e) {
e.printStackTrace();
}
if(player.getProfession().equals("entertainer_1a") && creature.getLevel() == (short) 90 && creature.getEntertainerExperience() != null)
creature.getEntertainerExperience().cancel(true);
//}
}
@@ -672,11 +714,38 @@ public class PlayerService implements INetworkDispatch {
}
/**
* Gives a player items and shows the "New Items" message.
* @param reciever Player receiving the items
* @param items The object(s) to be given. This will allow multiple arguments.
* Gives a player an item and shows the "New Items" message.
* @param reciever Player receiving the item.
* @param item The object to be given.
* @author Waverunner
*/
public void giveItems(CreatureObject reciever, SWGObject... items) {
public void giveItem(CreatureObject reciever, SWGObject item) {
if (reciever == null || item == null)
return;
if (reciever.getClient() == null)
return;
Client client = reciever.getClient();
if (client.getSession() == null)
return;
SWGObject inventory = reciever.getSlottedObject("inventory");
if (inventory == null)
return;
inventory.add(item);
ObjControllerMessage objController = new ObjControllerMessage(11, new ShowLootBox(reciever.getObjectID(), item));
client.getSession().write(objController.serialize());
}
/**
* Gives a player a variety of items and shows the "New Items" message.
* @param reciever Player receiving the items.
* @param items Vector of the items.
*/
public void giveItems(CreatureObject reciever, Vector<SWGObject> items) {
if (reciever == null || items == null)
return;
@@ -699,6 +768,128 @@ public class PlayerService implements INetworkDispatch {
client.getSession().write(objController.serialize());
}
public void performUnity(final CreatureObject acceptor, final CreatureObject proposer){
TangibleObject acceptorInventory = (TangibleObject) acceptor.getSlottedObject("inventory");
final AtomicBoolean acceptorHasRing = new AtomicBoolean();
acceptorInventory.viewChildren(acceptor, false, false, new Traverser() {
@Override
public void process(SWGObject obj) {
if(obj.getAttachment("objType") != null) {
String objType = (String) obj.getAttachment("objType");
if(objType == "ring") {
acceptorHasRing.set(true);
}
}
}
});
if(acceptorHasRing.get() == false) {
acceptor.sendSystemMessage("@unity:no_ring", (byte) 0);
proposer.sendSystemMessage("@unity:accept_fail", (byte) 0);
acceptor.setAttachment("proposer", null);
} else {
PlayerObject aGhost = (PlayerObject) acceptor.getSlottedObject("ghost");
PlayerObject pGhost = (PlayerObject) proposer.getSlottedObject("ghost");
if (aGhost == null || pGhost == null) {
acceptor.sendSystemMessage("@unity:wed_error", (byte) 0);
proposer.sendSystemMessage("@unity:wed_error", (byte) 0);
acceptor.setAttachment("proposer", null);
return;
} else {
final Vector<SWGObject> ringList = new Vector<SWGObject>();
acceptorInventory.viewChildren(acceptor, false, false, new Traverser() {
@Override
public void process(SWGObject obj) {
if (obj.getAttachment("objType") != null) {
if (obj.getAttachment("objType") == "ring") {
ringList.add(obj);
}
}
}
});
if (ringList.size() > 1) {
sendRingSelectWindow(acceptor, proposer, ringList);
} else {
// Proposer's ring is already 'unified' from the start, so no
// need to set a unity attachment.
ringList.get(0).setAttachment("unity", (Boolean) true);
if(!acceptor.getEquipmentList().contains(ringList.get(0)))
core.equipmentService.equip(acceptor, ringList.get(0));
aGhost.setSpouseName(proposer.getCustomName());
pGhost.setSpouseName(acceptor.getCustomName());
acceptor.sendSystemMessage("Your union with " + proposer.getCustomName() + " is complete.", (byte) 0);
proposer.sendSystemMessage("Your union with " + acceptor.getCustomName() + " is complete.", (byte) 0);
acceptor.setAttachment("proposer", null);
}
}
}
}
private void sendRingSelectWindow(final CreatureObject actor, final CreatureObject proposer, Vector<SWGObject> ringList) {
Map<Long, String> ringData = new HashMap<Long, String>();
for(SWGObject obj : ringList) {
ringData.put(obj.getObjectId(), obj.getCustomName());
}
final SUIWindow ringWindow = core.suiService.createListBox(ListBoxType.LIST_BOX_OK_CANCEL, "@unity:ring_prompt", "@unity:ring_prompt", ringData, actor, proposer, (float) 15);
Vector<String> returnList = new Vector<String>();
returnList.add("List.lstList:SelectedRow");
ringWindow.addHandler(0, "", Trigger.TRIGGER_OK, returnList, new SUICallback() {
@Override
public void process(SWGObject owner, int eventType, Vector<String> returnList) {
int index = Integer.parseInt(returnList.get(0));
SWGObject selectedRing = core.objectService.getObject(ringWindow.getObjectIdByIndex(index));
selectedRing.setAttachment("unity", (Boolean) true);
if(!actor.getEquipmentList().contains(selectedRing))
core.equipmentService.equip(actor, selectedRing);
PlayerObject aGhost = (PlayerObject) actor.getSlottedObject("ghost");
PlayerObject pGhost = (PlayerObject) proposer.getSlottedObject("ghost");
aGhost.setSpouseName(proposer.getCustomName());
pGhost.setSpouseName(actor.getCustomName());
actor.sendSystemMessage("Your union with " + proposer.getCustomName() + " is complete.", (byte) 0);
proposer.sendSystemMessage("Your union with " + actor.getCustomName() + " is complete.", (byte) 0);
}
});
ringWindow.addHandler(1, "", Trigger.TRIGGER_CANCEL, returnList, new SUICallback() {
@Override
public void process(SWGObject owner, int eventType, Vector<String> returnList) {
PlayerObject aGhost = (PlayerObject) actor.getSlottedObject("ghost");
PlayerObject pGhost = (PlayerObject) proposer.getSlottedObject("ghost");
actor.sendSystemMessage("@unity:decline", (byte) 0);
proposer.sendSystemMessage("@unity:declined", (byte) 0);
actor.setAttachment("proposer", null);
for(SWGObject obj : proposer.getEquipmentList()) {
if(obj.getAttachment("unity") != null) {
obj.setAttachment("unity", null);
break;
}
}
}
});
core.suiService.openSUIWindow(ringWindow);
}
@Override
public void shutdown() {
// TODO Auto-generated method stub