This commit is contained in:
Waverunner
2013-08-16 17:35:27 -04:00
9 changed files with 417 additions and 9 deletions
+1
View File
@@ -0,0 +1 @@
LOAD.SNAPSHOT_OBJECTS=0
+10
View File
@@ -0,0 +1,10 @@
import sys
def setup():
return
def run(core, actor, target, commandString):
if actor and target:
core.groupService.handleGroupInvite(actor, target)
return
@@ -737,6 +737,22 @@ public class CreatureMessageBuilder extends ObjectMessageBuilder {
return buffer;
}
public IoBuffer buildGroupInviteDelta(long inviteSenderId, long inviteCounter, String leaderName) {
IoBuffer buffer = bufferPool.allocate(18 + leaderName.length(), false).order(ByteOrder.LITTLE_ENDIAN);
buffer.putLong(inviteSenderId);
buffer.put(getAsciiString(leaderName));
buffer.putLong(inviteCounter);
int size = buffer.position();
buffer.flip();
buffer = createDelta("CREO", (byte) 6, (short) 1, (short) 0x0E, buffer, size + 4);
return buffer;
}
@@ -936,6 +936,15 @@ public class CreatureObject extends TangibleObject implements IPersistent {
}
return null;
}
public void updateGroupInviteInfo() {
if(getClient() == null || getClient().getSession() == null)
return;
getClient().getSession().write(messageBuilder.buildGroupInviteDelta(getInviteSenderId(), getInviteCounter(), getInviteSenderName()));
}
}
@@ -0,0 +1,195 @@
/*******************************************************************************
* 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.objects.group;
import java.nio.ByteOrder;
import org.apache.mina.core.buffer.IoBuffer;
import engine.resources.objects.SWGObject;
import resources.objects.ObjectMessageBuilder;
public class GroupMessageBuilder extends ObjectMessageBuilder {
public GroupMessageBuilder(GroupObject groupObject) {
setObject(groupObject);
}
public IoBuffer buildBaseline3() {
IoBuffer buffer = bufferPool.allocate(100, false).order(ByteOrder.LITTLE_ENDIAN);
buffer.setAutoExpand(true);
buffer.putShort((short) 4); // Obj Operand Count
buffer.putFloat(1); // Complexity
buffer.put(getAsciiString("string_id_table"));
buffer.putInt(0);
buffer.putInt(0);
buffer.putInt(0);
buffer.putShort((short) 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.put((byte) 0);
int size = buffer.position();
buffer = bufferPool.allocate(size, false).put(buffer.array(), 0, size);
buffer.flip();
buffer = createBaseline("GRUP", (byte) 3, buffer, size);
return buffer;
}
public IoBuffer buildBaseline6() {
GroupObject group = (GroupObject) object;
IoBuffer buffer = bufferPool.allocate(100, false).order(ByteOrder.LITTLE_ENDIAN);
buffer.setAutoExpand(true);
buffer.putShort((short) 0x0B); // Obj Operand Count
buffer.putInt(0x45);
buffer.put(getAsciiString("string_id_table"));
buffer.putInt(0);
buffer.putShort((short) 0);
buffer.putInt(group.getMemberList().size());
buffer.putInt(group.getMemberListUpdateCounter());
synchronized(group.getMemberList().getMutex()) {
for(SWGObject obj : group.getMemberList().get()) {
buffer.putLong(obj.getObjectID());
buffer.put(getAsciiString(obj.getCustomName()));
}
}
buffer.putInt(0);
buffer.putInt(0);
buffer.putInt(0);
buffer.putInt(0);
buffer.putInt(0);
buffer.putInt(0);
buffer.putInt(0);
buffer.putInt(1);
buffer.putShort((short) 0);
buffer.putShort((short) 0x5A);
buffer.putInt(0);
buffer.putLong(group.getGroupLeader().getObjectID());
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);
int size = buffer.position();
buffer = bufferPool.allocate(size, false).put(buffer.array(), 0, size);
buffer.flip();
buffer = createBaseline("GRUP", (byte) 6, buffer, size);
return buffer;
}
public IoBuffer buildAddMemberDelta(SWGObject member) {
GroupObject group = (GroupObject) object;
IoBuffer buffer = bufferPool.allocate(15, false).order(ByteOrder.LITTLE_ENDIAN);
buffer.putInt(1);
buffer.putInt(group.getMemberListUpdateCounter());
buffer.put((byte) 1);
buffer.putShort((short) group.getMemberList().indexOf(member));
buffer.putLong(member.getObjectID());
buffer.put(getAsciiString(member.getCustomName()));
int size = buffer.position();
buffer.flip();
return buffer = createDelta("GRUP", (byte) 6, (short) 1, (short) 2, buffer, size + 4);
}
public IoBuffer buildRemoveMemberDelta(SWGObject member) {
GroupObject group = (GroupObject) object;
IoBuffer buffer = bufferPool.allocate(15, false).order(ByteOrder.LITTLE_ENDIAN);
buffer.putInt(1);
buffer.putInt(group.getMemberListUpdateCounter());
buffer.put((byte) 0);
buffer.putShort((short) group.getMemberList().indexOf(member));
int size = buffer.position();
buffer.flip();
return buffer = createDelta("GRUP", (byte) 6, (short) 1, (short) 2, buffer, size + 4);
}
@Override
public void sendListDelta(byte viewType, short updateType, IoBuffer buffer) {
// TODO Auto-generated method stub
}
@Override
public void sendBaselines() {
// TODO Auto-generated method stub
}
}
+40 -5
View File
@@ -21,8 +21,9 @@
******************************************************************************/
package resources.objects.group;
import java.util.Vector;
import org.apache.mina.core.buffer.IoBuffer;
import resources.objects.SWGList;
import engine.clients.Client;
import engine.resources.objects.SWGObject;
import engine.resources.scene.Point3D;
@@ -31,18 +32,20 @@ import engine.resources.scene.Quaternion;
public class GroupObject extends SWGObject {
private Vector<SWGObject> memberList = new Vector<SWGObject>();
private SWGList<SWGObject> memberList = new SWGList<SWGObject>();
private int memberListUpdateCounter;
private SWGObject groupLeader;
private SWGObject lootMaster;
private short groupLevel;
private int lootMode;
private GroupMessageBuilder messageBuilder;
public GroupObject(long objectId) {
super(objectId, null, new Point3D(0, 0, 0), new Quaternion(0, 0, 0, 1), "object/group/shared_group_object.iff");
messageBuilder = new GroupMessageBuilder(this);
}
public Vector<SWGObject> getMemberList() {
public SWGList<SWGObject> getMemberList() {
return memberList;
}
@@ -105,10 +108,42 @@ public class GroupObject extends SWGObject {
this.lootMode = lootMode;
}
}
public void addMember(SWGObject member) {
if(memberList.size() >= 8 || member.getClient() == null)
return;
memberList.add(member);
setMemberListUpdateCounter(getMemberListUpdateCounter() + 1);
notifyObservers(messageBuilder.buildAddMemberDelta(member), false);
}
public void removeMember(SWGObject member) {
if(memberList.size() <= 0 || member.getClient() == null)
return;
setMemberListUpdateCounter(getMemberListUpdateCounter() + 1);
notifyObservers(messageBuilder.buildRemoveMemberDelta(member), false);
memberList.remove(member);
}
@Override
public void sendBaselines(Client client) {
// TODO Auto-generated method stub
public void sendBaselines(Client destination) {
if(destination == null || destination.getSession() == null) {
System.out.println("NULL session");
return;
}
destination.getSession().write(messageBuilder.buildBaseline3());
destination.getSession().write(messageBuilder.buildBaseline6());
}
+133
View File
@@ -0,0 +1,133 @@
/*******************************************************************************
* 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 services;
import java.util.Map;
import resources.objects.creature.CreatureObject;
import resources.objects.group.GroupObject;
import main.NGECore;
import engine.clients.Client;
import engine.resources.objects.SWGObject;
import engine.resources.service.INetworkDispatch;
import engine.resources.service.INetworkRemoteEvent;
public class GroupService implements INetworkDispatch {
private NGECore core;
public GroupService(NGECore core) {
this.core = core;
core.commandService.registerCommand("invite");
core.commandService.registerCommand("join");
core.commandService.registerCommand("disband");
core.commandService.registerCommand("decline");
}
@Override
public void insertOpcodes(Map<Integer, INetworkRemoteEvent> swgOpcodes, Map<Integer, INetworkRemoteEvent> objControllerOpcodes) {
}
@Override
public void shutdown() {
}
public void handleGroupInvite(CreatureObject leader, CreatureObject member) {
Client leaderClient = leader.getClient();
Client memberClient = member.getClient();
if(leaderClient == null || memberClient == null)
return;
long leaderGroupId = leader.getGroupId();
long memberGroupId = member.getGroupId();
if(leader == member) {
leader.sendSystemMessage("@group:invite_no_target_self", (byte) 0);
return;
}
if(memberGroupId != 0) {
leader.sendSystemMessage(member.getCustomName() + " is already in a group.", (byte) 0);
return;
}
if(leaderGroupId != 0) {
GroupObject group = (GroupObject) core.objectService.getObject(leaderGroupId);
if(group.getGroupLeader() != leader) {
leader.sendSystemMessage("@group:must_be_leader", (byte) 0);
return;
}
if(group.getMemberList().size() >= 8) {
leader.sendSystemMessage("@group:full", (byte) 0);
return;
}
}
if(member.getInviteSenderId() != 0 && member.getInviteSenderId() != leader.getObjectID()) {
leader.sendSystemMessage(member.getCustomName() + " is considering joining another group.", (byte) 0);
return;
}
if(member.getInviteSenderId() != 0 && member.getInviteSenderId() == leader.getObjectID()) {
leader.sendSystemMessage(member.getCustomName() + " has already been invited to join your group.", (byte) 0);
return;
}
leader.sendSystemMessage("You invite " + member.getCustomName() + " to join the group.", (byte) 0);
member.setInviteCounter(member.getInviteCounter() + 1);
member.setInviteSenderId(member.getObjectId());
member.setInviteSenderName(leader.getCustomName());
member.updateGroupInviteInfo();
}
public void handleGroupDecline(CreatureObject invited) {
CreatureObject leader = (CreatureObject) core.objectService.getObject(invited.getInviteSenderId());
invited.setInviteCounter(invited.getInviteCounter() + 1);
invited.setInviteSenderId(0);
invited.setInviteSenderName("");
invited.sendSystemMessage("You decline to join " + leader.getCustomName() + "'s group.", (byte) 0);
invited.updateGroupInviteInfo();
leader.sendSystemMessage(invited.getCustomName() + " declines to join your group.", (byte) 0);
}
}
+7 -3
View File
@@ -26,11 +26,10 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import engine.resources.config.Config;
import engine.resources.scene.Planet;
import main.NGECore;
public class TerrainService {
@@ -127,7 +126,12 @@ public class TerrainService {
@Override
public void run() {
core.objectService.loadSnapshotObjects(planet);
Config config = new Config();
config.setFilePath("options.cfg");
if (config.loadConfigFile() && config.getInt("LOAD.SNAPSHOT_OBJECTS") > 0) {
core.objectService.loadSnapshotObjects(planet);
}
}
});
+6 -1
View File
@@ -370,7 +370,12 @@ public class TradeService implements INetworkDispatch{
{
cleanTradeSession(client, tradePartner.getClient());
}
actingTraderInventory.transferTo(tradePartner, tradePartnerInventory, tradeObject);
//actingTraderInventory.transferTo(tradePartner, tradePartnerInventory, tradeObject);
actingTraderInventory._remove(tradeObject);
actingTrader.makeUnaware(tradeObject);
tradePartnerInventory.add(tradeObject);
itr.remove();
}