From 43af96e047e334f1c87d3ca54c9f9785b5b05ab0 Mon Sep 17 00:00:00 2001 From: Obique PSWG Date: Thu, 2 Jun 2016 06:01:55 -0500 Subject: [PATCH] Re-did container permissions --- .../containers/ContainerPermissions.java | 190 ++------------- ...ory.java => ContainerPermissionsType.java} | 58 ++--- .../containers/DefaultPermissions.java | 16 +- .../containers/InventoryPermissions.java | 11 +- .../containers/WorldPermissions.java | 81 ------- src/resources/objects/SWGObject.java | 216 +++++------------- .../buildouts/TerrainBuildoutLoader.java | 6 - .../buildouts/TerrainSnapshotLoader.java | 8 +- .../creature/CreatureObjectSharedNP.java | 8 +- .../player/CharacterCreationService.java | 6 +- 10 files changed, 127 insertions(+), 473 deletions(-) rename src/resources/containers/{ContainerPermissionsFactory.java => ContainerPermissionsType.java} (70%) delete mode 100644 src/resources/containers/WorldPermissions.java diff --git a/src/resources/containers/ContainerPermissions.java b/src/resources/containers/ContainerPermissions.java index c0cee9bc4..7cf969c1f 100644 --- a/src/resources/containers/ContainerPermissions.java +++ b/src/resources/containers/ContainerPermissions.java @@ -26,182 +26,38 @@ ******************************************************************************/ package resources.containers; -import java.util.ArrayList; -import java.util.EnumSet; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import resources.network.NetBufferStream; import resources.objects.SWGObject; -import resources.persistable.Persistable; - -/** - * Structure for creating permission sets that will allow the object to be viewed/modified/added/removed by a requested - * object depending on the implemented abstract methods. - * @author Waverunner - */ -public abstract class ContainerPermissions implements Persistable { - - public static final WorldPermissions WORLD = new WorldPermissions(); - public static final InventoryPermissions INVENTORY = new InventoryPermissions(); - - private Map permissionGroups; - private List joinedGroups; +public abstract class ContainerPermissions { + public ContainerPermissions() { - this.permissionGroups = new HashMap<>(); - this.joinedGroups = new ArrayList<>(); - } - - protected boolean hasPermissions(String group, Permission... permissions) { - if (!hasPermissionGroup(group)) - return false; - - EnumSet groupPermissions = Permission.getFlags(permissionGroups.get(group)); - - for (Permission permission : permissions) { - if (!groupPermissions.contains(permission)) - return false; - } - - return true; - } - - public boolean hasPermissions(List requesterGroups, Permission ... permission) { - for (String group : requesterGroups) { - if (hasPermissions(group, permission)) - return true; - } - return false; - } - - public void addPermissions(String group, Permission... permissions) { - if (!hasPermissionGroup(group)) { - permissionGroups.put(group, Permission.valueOf(permissions)); - return; - } - - EnumSet groupPermissions = Permission.getFlags(permissionGroups.get(group)); - - for (Permission permission : permissions) { - groupPermissions.add(permission); - } - - synchronized (permissionGroups) { - permissionGroups.put(group, Permission.valueOf(groupPermissions)); - } - } - - public void removePermissions(String group, Permission... permissions) { - - if (!hasPermissionGroup(group)) - return; - - EnumSet groupPermissions = Permission.getFlags(permissionGroups.get(group)); - - for (Permission permission : permissions) { - groupPermissions.add(permission); - } - - synchronized (permissionGroups) { - permissionGroups.put(group, Permission.valueOf(groupPermissions)); - } - } - - public void clearPermissions(String group) { - synchronized (permissionGroups) { - if (permissionGroups.containsKey(group)) - permissionGroups.put(group, 0); - } - } - - public boolean hasPermissionGroup(String group) { - return permissionGroups.containsKey(group); - } - - public Set getPermissionGroups() { - synchronized(permissionGroups) { - return permissionGroups.keySet(); - } - } - - public List getJoinedGroups() { - return joinedGroups; - } - - public void addDefaultWorldPermissions() { - addPermissions("world", Permission.VIEW, Permission.ENTER); + } - @Override - public void save(NetBufferStream stream) { - stream.addByte(0); - synchronized (permissionGroups) { - stream.addMap(permissionGroups, (e) -> { - stream.addAscii(e.getKey()); - stream.addInt(e.getValue()); - }); - } - synchronized (joinedGroups) { - stream.addList(joinedGroups, (g) -> stream.addAscii(g)); - } - } - - @Override - public void read(NetBufferStream stream) { - stream.getByte(); - stream.getList((i) -> permissionGroups.put(stream.getAscii(), stream.getInt())); - stream.getList((i) -> joinedGroups.add(stream.getAscii())); - } - public abstract boolean canView(SWGObject viewer, SWGObject container); public abstract boolean canEnter(SWGObject requester, SWGObject container); public abstract boolean canRemove(SWGObject requester, SWGObject container); public abstract boolean canMove(SWGObject requester, SWGObject container); public abstract boolean canAdd(SWGObject requester, SWGObject container); - - public enum Permission { - VIEW(1), - REMOVE(1<<1), - ADD(1<<2), - MOVE(1<<3), - ENTER(1<<4); - - int bitmask; - - Permission(int bitmask) { - this.bitmask = bitmask; - } - - public static EnumSet getFlags(int bits) { - EnumSet states = EnumSet.noneOf(Permission.class); - for (Permission state : values()) { - if ((state.bitmask & bits) != 0) - states.add(state); - } - return states; - } - - public static int valueOf(EnumSet bitmaskSet) { - int value = 0; - - for (Permission permission : bitmaskSet) { - value += permission.bitmask; - } - - return value; - } - - public static int valueOf(Permission... permissions) { - int value = 0; - - for (Permission permission : permissions) { - value += permission.bitmask; - } - - return value; - } + + public boolean canView(SWGObject container) { + return canView(null, container); } + + public boolean canEnter(SWGObject container) { + return canEnter(null, container); + } + + public boolean canRemove(SWGObject container) { + return canRemove(null, container); + } + + public boolean canMove(SWGObject container) { + return canMove(null, container); + } + + public boolean canAdd(SWGObject container) { + return canAdd(null, container); + } + } diff --git a/src/resources/containers/ContainerPermissionsFactory.java b/src/resources/containers/ContainerPermissionsType.java similarity index 70% rename from src/resources/containers/ContainerPermissionsFactory.java rename to src/resources/containers/ContainerPermissionsType.java index b801f8d46..1feb242f1 100644 --- a/src/resources/containers/ContainerPermissionsFactory.java +++ b/src/resources/containers/ContainerPermissionsType.java @@ -27,40 +27,40 @@ ***********************************************************************************/ package resources.containers; -import resources.network.NetBufferStream; +import resources.objects.SWGObject; -public class ContainerPermissionsFactory { +public enum ContainerPermissionsType { + DEFAULT (new DefaultPermissions()), + INVENTORY (new InventoryPermissions()); - public static ContainerPermissions create(NetBufferStream stream) { - ContainerPermissions permissions; - byte type = stream.getByte(); - switch (type) { - case 1: - permissions = new DefaultPermissions(); - break; - case 2: - permissions = new InventoryPermissions(); - break; - case 3: - permissions = new WorldPermissions(); - break; - default: - throw new IllegalStateException("Unknown type byte! Type: " + type); - } - permissions.read(stream); + private final ContainerPermissions permissions; + + ContainerPermissionsType(ContainerPermissions permissions) { + this.permissions = permissions; + } + + public ContainerPermissions getContainerPermissions() { return permissions; } - public static void save(ContainerPermissions permissions, NetBufferStream stream) { - if (permissions instanceof DefaultPermissions) - stream.addByte(1); - else if (permissions instanceof InventoryPermissions) - stream.addByte(2); - else if (permissions instanceof WorldPermissions) - stream.addByte(3); - else - throw new IllegalArgumentException("Unknown permissions type! Permissions: " + permissions); - permissions.save(stream); + public boolean canView(SWGObject viewer, SWGObject container) { + return permissions.canView(viewer, container); + } + + public boolean canEnter(SWGObject viewer, SWGObject container) { + return permissions.canEnter(viewer, container); + } + + public boolean canRemove(SWGObject viewer, SWGObject container) { + return permissions.canRemove(viewer, container); + } + + public boolean canMove(SWGObject viewer, SWGObject container) { + return permissions.canMove(viewer, container); + } + + public boolean canAdd(SWGObject viewer, SWGObject container) { + return permissions.canAdd(viewer, container); } } diff --git a/src/resources/containers/DefaultPermissions.java b/src/resources/containers/DefaultPermissions.java index 0a1718422..95fe30a00 100644 --- a/src/resources/containers/DefaultPermissions.java +++ b/src/resources/containers/DefaultPermissions.java @@ -34,39 +34,39 @@ import resources.objects.SWGObject; * for every new object. * @author Waverunner */ -public class DefaultPermissions extends ContainerPermissions { +class DefaultPermissions extends ContainerPermissions { @Override public boolean canView(SWGObject requester, SWGObject container) { return true; } - + @Override public boolean canEnter(SWGObject requester, SWGObject container) { return true; } - + @Override public boolean canRemove(SWGObject requester, SWGObject container) { - if (requester.getOwner() == null) + if (requester == null || requester.getOwner() == null) return true; if (container.getOwner() == null) return false; return requester.getOwner().equals(container.getOwner()); } - + @Override public boolean canMove(SWGObject requester, SWGObject container) { - if (requester.getOwner() == null) + if (requester == null || requester.getOwner() == null) return true; if (container.getOwner() == null) return false; return requester.getOwner().equals(container.getOwner()); } - + @Override public boolean canAdd(SWGObject requester, SWGObject container) { - if (requester.getOwner() == null) + if (requester == null || requester.getOwner() == null) return true; if (container.getOwner() == null) return false; diff --git a/src/resources/containers/InventoryPermissions.java b/src/resources/containers/InventoryPermissions.java index ceb55e4b3..743a6cf13 100644 --- a/src/resources/containers/InventoryPermissions.java +++ b/src/resources/containers/InventoryPermissions.java @@ -29,16 +29,11 @@ package resources.containers; import resources.objects.SWGObject; -/** - * This set of permissions will allow only the owner to view the container. - * - * @author Waverunner - */ -public class InventoryPermissions extends DefaultPermissions { +class InventoryPermissions extends DefaultPermissions { @Override public boolean canView(SWGObject requester, SWGObject container) { - if (requester.getOwner() == null) + if (requester == null || requester.getOwner() == null) return true; if (container.getOwner() == null) return false; @@ -47,7 +42,7 @@ public class InventoryPermissions extends DefaultPermissions { @Override public boolean canEnter(SWGObject requester, SWGObject container) { - if (requester.getOwner() == null) + if (requester == null || requester.getOwner() == null) return true; if (container.getOwner() == null) return false; diff --git a/src/resources/containers/WorldPermissions.java b/src/resources/containers/WorldPermissions.java deleted file mode 100644 index 301f9cb68..000000000 --- a/src/resources/containers/WorldPermissions.java +++ /dev/null @@ -1,81 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2015 /// Project SWG /// www.projectswg.com - * - * ProjectSWG is the first NGE emulator for Star Wars Galaxies founded on - * July 7th, 2011 after SOE announced the official shutdown of Star Wars Galaxies. - * Our goal is to create an emulator which will provide a server for players to - * continue playing a game similar to the one they used to play. We are basing - * it on the final publish of the game prior to end-game events. - * - * This file is part of Holocore. - * - * -------------------------------------------------------------------------------- - * - * Holocore is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * Holocore 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 Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with Holocore. If not, see - ******************************************************************************/ - -package resources.containers; - -import resources.objects.SWGObject; - -/** - * This is essentially a universal "all-in-one" permission set for managing permission groups for world objects. This - * class makes use of permission groups. Every player joins the world permission group upon creation. When a specific - * group is needed, the object will have to remove the world permission set and replace it with their own group of - * permissions. - *

Example: In order to allow only certain players into an area of Jabba's palace, you would first - * create a permission group for the CellObject with a unique name. Then you need to add the named group to the - * players ContainerPermissions joinedGroups list in order for them to properly pass the checks. - *

- * This set of permissions will allow: - *
    - *
  1. View - If the viewer has joined a group that is recognized by the container with viewing permissions
  2. - *
  3. Enter - If the viewer has joined a group that is recognized by the container with enter permissions
  4. - *
  5. Remove, Move, Add - If the container has the same owner as the requester
  6. - *
- * @author Waverunner - */ -public class WorldPermissions extends DefaultPermissions { - - @Override - public boolean canView(SWGObject viewer, SWGObject container) { - if (super.canView(viewer, container)) - return true; - - return hasPermissions(viewer.getContainerPermissions().getJoinedGroups(), Permission.VIEW); - } - - @Override - public boolean canEnter(SWGObject requester, SWGObject container) { - if (super.canView(requester, container)) - return true; - - return hasPermissions(requester.getContainerPermissions().getJoinedGroups(), Permission.ENTER); - } - - @Override - public boolean canRemove(SWGObject requester, SWGObject container) { - return super.canRemove(requester, container); - } - - @Override - public boolean canMove(SWGObject requester, SWGObject container) { - return super.canMove(requester, container); - } - - @Override - public boolean canAdd(SWGObject requester, SWGObject container) { - return super.canAdd(requester, container); - } -} diff --git a/src/resources/objects/SWGObject.java b/src/resources/objects/SWGObject.java index 8572eedb9..7f80f4cbf 100644 --- a/src/resources/objects/SWGObject.java +++ b/src/resources/objects/SWGObject.java @@ -42,11 +42,8 @@ import resources.Terrain; import resources.buildout.BuildoutArea; import resources.client_info.visitors.ObjectData.ObjectDataAttribute; import resources.common.CRC; -import resources.containers.ContainerPermissions; -import resources.containers.ContainerPermissionsFactory; +import resources.containers.ContainerPermissionsType; import resources.containers.ContainerResult; -import resources.containers.DefaultPermissions; -import resources.containers.ContainerPermissions.Permission; import resources.encodables.StringId; import resources.network.BaselineBuilder; import resources.network.BaselineObject; @@ -66,42 +63,40 @@ import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; -import java.util.Hashtable; -import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; public abstract class SWGObject extends BaselineObject implements Comparable, Persistable { - private final Location location; - private final long objectId; - private final HashMap slots; // HashMap used for null value support - private final Set containedObjects; - private final Map attributes; - private final Map dataAttributes; - private transient Set objectsAware; - private transient Set customAware; - private transient BuildoutArea buildoutArea; - private transient Player owner; - private List > arrangement; - - private ObjectClassification classification = ObjectClassification.GENERATED; - private GameObjectType gameObjectType = GameObjectType.GOT_NONE; - private ContainerPermissions containerPermissions; - private SWGObject parent = null; - private StringId stringId = new StringId("", ""); - private StringId detailStringId = new StringId("", ""); - private String template = ""; - private int crc = 0; - private String objectName = ""; - private int volume = 0; - private float complexity = 1; - private int containerType = 0; - private double loadRange = 0; - private int areaId = -1; - - private int slotArrangement = -1; + private final long objectId; + private final Location location = new Location(); + private final Set containedObjects= new HashSet<>(); + private final Map attributes = new HashMap<>(); + private final Set objectsAware = new HashSet<>(); + private final Set customAware = new HashSet<>(); + private final HashMap slots = new HashMap<>(); // HashMap used for null value support + private final Map dataAttributes = new HashMap<>(); + + private ObjectClassification classification = ObjectClassification.GENERATED; + private GameObjectType gameObjectType = GameObjectType.GOT_NONE; + private ContainerPermissionsType permissions = ContainerPermissionsType.DEFAULT; + private List > arrangement = new ArrayList<>(); + private BuildoutArea buildoutArea = null; + private Player owner = null; + + private SWGObject parent = null; + private StringId stringId = new StringId("", ""); + private StringId detailStringId = new StringId("", ""); + private String template = ""; + private int crc = 0; + private String objectName = ""; + private int volume = 0; + private float complexity = 1; + private int containerType = 0; + private double loadRange = 0; + private int areaId = -1; + private int slotArrangement = -1; public SWGObject() { this(0, null); @@ -110,16 +105,8 @@ public abstract class SWGObject extends BaselineObject implements Comparable(); - this.customAware = new HashSet<>(); - this.slots = new HashMap<>(); - this.containedObjects = new HashSet<>(); - this.attributes = new LinkedHashMap<>(); - this.dataAttributes = new Hashtable<>(); - this.containerPermissions = new DefaultPermissions(); } - + /** * Adds the specified object to this object and places it in the appropriate slot if needed * @param object Object to add to this container, which will either be put into the appropriate slot(s) or become a contained object @@ -229,7 +216,7 @@ public abstract class SWGObject extends BaselineObject implements ComparableThis is the same as calling addPermissions(String.valueOf(permissionRequester.getObjectId() + getObjectId()), permissions) - * with the added benefit of adding the group to the permissionRequester's joined container groups - * @param permissionRequester The object that should be given unique permissions to this object - * @param permissions Permissions that the permissionRequester will have for this object - */ - public void addPermissions(SWGObject permissionRequester, ContainerPermissions.Permission... permissions) { - addPermissions(String.valueOf(permissionRequester.getObjectId() + getObjectId()), permissions); - permissionRequester.joinPermissionGroup(String.valueOf(getObjectId() + permissionRequester.getObjectId())); - } - - /** - * Removes all the unique permissions for the permissionRequester from this object. - * @param permissionRequester The object that should no longer have unique permissions to this object - */ - public void removePermissions(SWGObject permissionRequester) { - String group = String.valueOf(permissionRequester.getObjectId() + getObjectId()); - removePermissions(group); - permissionRequester.containerPermissions.getJoinedGroups().remove(group); - } - - /** - * Assigns this object to a permission group - * @param group - */ - public void joinPermissionGroup(String group) { - containerPermissions.getJoinedGroups().add(group); - } - - public void setContainerPermissions(ContainerPermissions permissions) { - this.containerPermissions = permissions; - } - + public void addAttribute(String attribute, String value) { attributes.put(attribute, value); } @@ -624,6 +522,14 @@ public abstract class SWGObject extends BaselineObject implements Comparable { stream.addAscii(e.getKey()); stream.addAscii(e.getValue()); }); } - stream.addAscii(classification.name()); - stream.addUnicode(objectName); - stream.addInt(volume); - stream.addFloat(complexity); - stream.addFloat((float) loadRange); Set contained; synchronized (containedObjects) { contained = new HashSet<>(containedObjects); @@ -1121,24 +1025,18 @@ public abstract class SWGObject extends BaselineObject implements Comparable= 1 && stream.getBoolean()) + if (stream.getBoolean()) parent = SWGObjectFactory.create(stream); - stream.getList((i) -> attributes.put(stream.getAscii(), stream.getAscii())); + permissions = ContainerPermissionsType.valueOf(stream.getAscii()); classification = ObjectClassification.valueOf(stream.getAscii()); objectName = stream.getUnicode(); volume = stream.getInt(); complexity = stream.getFloat(); loadRange = stream.getFloat(); - Set contained = new HashSet<>(); - stream.getList((i) -> contained.add(SWGObjectFactory.create(stream))); - for (SWGObject obj : contained) - obj.moveToContainer(this); + stream.getList((i) -> attributes.put(stream.getAscii(), stream.getAscii())); + stream.getList((i) -> SWGObjectFactory.create(stream).moveToContainer(this)); } public enum ObjectClassification { diff --git a/src/resources/objects/buildouts/TerrainBuildoutLoader.java b/src/resources/objects/buildouts/TerrainBuildoutLoader.java index b6885b6ae..a2ba07e34 100644 --- a/src/resources/objects/buildouts/TerrainBuildoutLoader.java +++ b/src/resources/objects/buildouts/TerrainBuildoutLoader.java @@ -37,7 +37,6 @@ import resources.Terrain; import resources.client_info.ClientFactory; import resources.client_info.visitors.CrcStringTableData; import resources.client_info.visitors.DatatableData; -import resources.containers.ContainerPermissions; import resources.objects.SWGObject; import resources.objects.SWGObject.ObjectClassification; import resources.objects.cell.CellObject; @@ -96,7 +95,6 @@ class TerrainBuildoutLoader { object.setBuildoutAreaId(area.getIndex()); setCellInformation(object, buildoutRow.getCellIndex()); addObject(area.getName(), object, buildoutRow.getContainerId()); - updatePermissions(object); } } @@ -132,8 +130,4 @@ class TerrainBuildoutLoader { cell.setNumber(cellIndex); } - private void updatePermissions(SWGObject object) { - object.setContainerPermissions(ContainerPermissions.WORLD); - } - } diff --git a/src/resources/objects/buildouts/TerrainSnapshotLoader.java b/src/resources/objects/buildouts/TerrainSnapshotLoader.java index 698103087..d02252f6a 100644 --- a/src/resources/objects/buildouts/TerrainSnapshotLoader.java +++ b/src/resources/objects/buildouts/TerrainSnapshotLoader.java @@ -37,7 +37,6 @@ import resources.Terrain; import resources.client_info.ClientFactory; import resources.client_info.visitors.WorldSnapshotData; import resources.client_info.visitors.WorldSnapshotData.Node; -import resources.containers.ContainerPermissions; import resources.objects.SWGObject; import resources.objects.SWGObject.ObjectClassification; import resources.objects.cell.CellObject; @@ -83,8 +82,7 @@ public class TerrainSnapshotLoader { object.setLoadRange(node.getRadius()); setCellInformation(object, node.getCellIndex()); addObject(object, node.getContainerId()); - updatePermissions(object); - + for (Node child : node.getChildren()) { createFromNode(templates, child); } @@ -117,8 +115,4 @@ public class TerrainSnapshotLoader { cell.setNumber(cellIndex); } - private void updatePermissions(SWGObject object) { - object.setContainerPermissions(ContainerPermissions.WORLD); - } - } diff --git a/src/resources/objects/creature/CreatureObjectSharedNP.java b/src/resources/objects/creature/CreatureObjectSharedNP.java index 57a3c5eaa..503520061 100644 --- a/src/resources/objects/creature/CreatureObjectSharedNP.java +++ b/src/resources/objects/creature/CreatureObjectSharedNP.java @@ -66,10 +66,10 @@ class CreatureObjectSharedNP implements Persistable { private boolean shownOnRadar = true; private boolean beast = false; - private SWGList attributes = new SWGList(6, 21); - private SWGList maxAttributes = new SWGList(6, 22); - private SWGList equipmentList = new SWGList(6, 23); - private SWGList appearanceList = new SWGList(6, 33); + private SWGList attributes = new SWGList<>(6, 21); + private SWGList maxAttributes = new SWGList<>(6, 22); + private SWGList equipmentList = new SWGList<>(6, 23); + private SWGList appearanceList = new SWGList<>(6, 33); private SWGMap buffs = new SWGMap<>(6, 26); diff --git a/src/services/player/CharacterCreationService.java b/src/services/player/CharacterCreationService.java index 26fc6dca8..065e470b7 100644 --- a/src/services/player/CharacterCreationService.java +++ b/src/services/player/CharacterCreationService.java @@ -58,7 +58,7 @@ import resources.Race; import resources.client_info.ClientFactory; import resources.client_info.visitors.ProfTemplateData; import resources.config.ConfigFile; -import resources.containers.ContainerPermissions; +import resources.containers.ContainerPermissionsType; import resources.control.Service; import resources.objects.SWGObject; import resources.objects.building.BuildingObject; @@ -378,7 +378,7 @@ public class CharacterCreationService extends Service { private SWGObject createInventoryObject(ObjectManager objManager, CreatureObject creatureObj, String template) { SWGObject obj = ObjectCreator.createObjectFromTemplate(template); obj.moveToContainer(creatureObj); - obj.setContainerPermissions(ContainerPermissions.INVENTORY); + obj.setContainerPermissions(ContainerPermissionsType.INVENTORY); new ObjectCreatedIntent(obj).broadcast(); return obj; } @@ -413,8 +413,6 @@ public class CharacterCreationService extends Service { // Any character can perform the basic dance. creatureObj.addAbility("startDance+basic"); - - creatureObj.joinPermissionGroup("world"); } private void setPlayerObjectValues(PlayerObject playerObj, ClientCreateCharacter create) {