diff --git a/src/main/java/com/projectswg/holocore/resources/gameplay/player/ActivePlayerPredicate.java b/src/main/java/com/projectswg/holocore/resources/gameplay/player/ActivePlayerPredicate.kt similarity index 65% rename from src/main/java/com/projectswg/holocore/resources/gameplay/player/ActivePlayerPredicate.java rename to src/main/java/com/projectswg/holocore/resources/gameplay/player/ActivePlayerPredicate.kt index 0735cabb1..1925143dc 100644 --- a/src/main/java/com/projectswg/holocore/resources/gameplay/player/ActivePlayerPredicate.java +++ b/src/main/java/com/projectswg/holocore/resources/gameplay/player/ActivePlayerPredicate.kt @@ -1,5 +1,5 @@ /*********************************************************************************** - * Copyright (c) 2018 /// Project SWG /// www.projectswg.com * + * Copyright (c) 2023 /// 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. * @@ -24,36 +24,30 @@ * You should have received a copy of the GNU Affero General Public License * * along with Holocore. If not, see . * ***********************************************************************************/ -package com.projectswg.holocore.resources.gameplay.player; +package com.projectswg.holocore.resources.gameplay.player -import com.projectswg.common.data.encodables.tangible.Posture; -import com.projectswg.holocore.resources.support.global.player.Player; -import com.projectswg.holocore.resources.support.global.player.PlayerFlags; -import com.projectswg.holocore.resources.support.objects.swg.SWGObject; -import com.projectswg.holocore.resources.support.objects.swg.cell.CellObject; -import com.projectswg.holocore.resources.support.objects.swg.creature.CreatureObject; -import com.projectswg.holocore.resources.support.objects.swg.player.PlayerObject; +import com.projectswg.common.data.encodables.tangible.Posture +import com.projectswg.holocore.resources.support.global.player.Player +import com.projectswg.holocore.resources.support.global.player.PlayerFlags +import com.projectswg.holocore.resources.support.objects.swg.cell.CellObject +import java.util.function.Predicate -import java.util.function.Predicate; +class ActivePlayerPredicate : Predicate { + override fun test(player: Player): Boolean { + val creatureObject = player.creatureObject + val playerObject = creatureObject.playerObject -public class ActivePlayerPredicate implements Predicate { - @Override - public boolean test(Player player) { - CreatureObject creatureObject = player.getCreatureObject(); - PlayerObject playerObject = creatureObject.getPlayerObject(); - boolean afk = playerObject.isFlagSet(PlayerFlags.AFK); - boolean offline = playerObject.isFlagSet(PlayerFlags.LD); - boolean incapacitated = creatureObject.getPosture() == Posture.INCAPACITATED; - boolean dead = creatureObject.getPosture() == Posture.DEAD; - boolean cloaked = !creatureObject.isVisible(); - boolean privateCell = false; // Player might be inside a private building - - SWGObject parent = creatureObject.getParent(); - - if (parent instanceof CellObject) { - privateCell = !((CellObject) parent).isPublic(); + val afk = playerObject.flags[PlayerFlags.AFK] + val offline = playerObject.flags[PlayerFlags.LD] + val incapacitated = creatureObject.posture == Posture.INCAPACITATED + val dead = creatureObject.posture == Posture.DEAD + val cloaked = !creatureObject.isVisible + var privateCell = false // Player might be inside a private building + + val parent = creatureObject.parent + if (parent is CellObject) { + privateCell = !parent.isPublic } - - return !afk && !offline && !incapacitated && !dead && !cloaked && !privateCell; + return !afk && !offline && !incapacitated && !dead && !cloaked && !privateCell } -} +} \ No newline at end of file diff --git a/src/main/java/com/projectswg/holocore/resources/support/data/collections/SWGBitSet.java b/src/main/java/com/projectswg/holocore/resources/support/data/collections/SWGBitSet.kt similarity index 62% rename from src/main/java/com/projectswg/holocore/resources/support/data/collections/SWGBitSet.java rename to src/main/java/com/projectswg/holocore/resources/support/data/collections/SWGBitSet.kt index 29f062ace..2d8ca62c0 100644 --- a/src/main/java/com/projectswg/holocore/resources/support/data/collections/SWGBitSet.java +++ b/src/main/java/com/projectswg/holocore/resources/support/data/collections/SWGBitSet.kt @@ -1,5 +1,5 @@ /*********************************************************************************** - * Copyright (c) 2018 /// Project SWG /// www.projectswg.com * + * Copyright (c) 2023 /// 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. * @@ -24,65 +24,69 @@ * You should have received a copy of the GNU Affero General Public License * * along with Holocore. If not, see . * ***********************************************************************************/ -package com.projectswg.holocore.resources.support.data.collections; +package com.projectswg.holocore.resources.support.data.collections -import com.projectswg.common.encoding.Encodable; -import com.projectswg.common.network.NetBuffer; -import com.projectswg.holocore.resources.support.objects.swg.SWGObject; +import com.projectswg.common.encoding.Encodable +import com.projectswg.common.network.NetBuffer +import com.projectswg.holocore.resources.support.objects.swg.SWGObject +import java.util.BitSet -import java.util.BitSet; +class SWGBitSet(private var view: Int, private var updateType: Int) : BitSet(128), Encodable { -public class SWGBitSet extends BitSet implements Encodable { - - private static final long serialVersionUID = 1L; - - private int view; - private int updateType; - - public SWGBitSet() { - super(128); + fun wrapper(obj: SWGObject): SWGBitSetWrapper { + return SWGBitSetWrapper(obj) } - - public SWGBitSet(int view, int updateType) { - super(128); // Seems to be the default size for the bitmask sets in SWGPackets - this.view = view; - this.updateType = updateType; - } - - @Override - public byte[] encode() { - byte[] bytes = toByteArray(); - NetBuffer buffer = NetBuffer.allocate(8 + bytes.length); - buffer.addInt(bytes.length); - buffer.addInt(super.length()); - buffer.addRawArray(bytes); - return buffer.array(); - } - - @Override - public void decode(NetBuffer data) { - int len = data.getInt(); - data.getInt(); - byte [] bytes = data.getArray(len); - clear(); - or(BitSet.valueOf(bytes)); - } - - @Override - public int getLength() { - return 8 + (super.length()+7) / 8; - } - - public void read(byte[] bytes) { - clear(); + override fun encode(): ByteArray { + val bytes = toByteArray() + val buffer = NetBuffer.allocate(8 + bytes.size) + buffer.addInt(bytes.size) + buffer.addInt(super.length()) + buffer.addRawArray(bytes) + return buffer.array() + } + + override fun decode(data: NetBuffer) { + val len = data.int + data.int + val bytes = data.getArray(len) + clear() + or(valueOf(bytes)) + } + + override val length: Int + get() = 8 + (super.length() + 7) / 8 + + fun read(bytes: ByteArray?) { + clear() if (bytes != null) { - xor(valueOf(bytes)); + xor(valueOf(bytes)) } } - public void sendDeltaMessage(SWGObject target) { - target.sendDelta(view, updateType, encode()); + fun sendDeltaMessage(target: SWGObject) { + target.sendDelta(view, updateType, encode()) } - -} + + inner class SWGBitSetWrapper(private val obj: SWGObject) { + + val flags: BitSet + get() = this@SWGBitSet.clone() as BitSet + + fun get(): BitSet { + return this@SWGBitSet.clone() as BitSet + } + + fun add(flags: BitSet) { + this@SWGBitSet.or(flags) + this@SWGBitSet.sendDeltaMessage(obj) + } + + fun set(flags: BitSet) { + this@SWGBitSet.clear() + this@SWGBitSet.or(flags) + this@SWGBitSet.sendDeltaMessage(obj) + } + + } +} \ No newline at end of file diff --git a/src/main/java/com/projectswg/holocore/resources/support/data/collections/SWGFlag.java b/src/main/java/com/projectswg/holocore/resources/support/data/collections/SWGFlag.java deleted file mode 100644 index ac3567aff..000000000 --- a/src/main/java/com/projectswg/holocore/resources/support/data/collections/SWGFlag.java +++ /dev/null @@ -1,106 +0,0 @@ -/*********************************************************************************** - * Copyright (c) 2018 /// 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 com.projectswg.holocore.resources.support.data.collections; - -import com.projectswg.common.encoding.Encodable; -import com.projectswg.common.network.NetBuffer; -import com.projectswg.holocore.resources.support.objects.swg.SWGObject; -import org.jetbrains.annotations.NotNull; - -import java.util.Arrays; -import java.util.BitSet; - -public class SWGFlag extends BitSet implements Encodable { - - private final int view; - private final int updateType; - - /** - * Creates a new {@link SWGFlag} for the defined baseline with the given view and update. Note - * that this is an extension of {@link BitSet} - * - * @param view The baseline number this BitSet resides in - * @param updateType The update variable used for sending a delta, it's the operand count that - * this BitSet resides at within the baseline - */ - public SWGFlag(int view, int updateType) { - super(128); // Seems to be the default size for the bitmask sets in SWGPackets - this.view = view; - this.updateType = updateType; - } - - @Override - public byte @NotNull [] encode() { - byte [] encoded = toByteArray(); - int resultingInts = (encoded.length + 3) / 4; // rounds up - - NetBuffer buffer = NetBuffer.allocate(4 + resultingInts * 4); - buffer.addInt(resultingInts); - buffer.addRawArray(encoded); - return buffer.array(); - } - - @Override - public void decode(NetBuffer data) { - int len = data.getInt(); - byte [] encoded = data.getArray(len * 4); - - clear(); - xor(BitSet.valueOf(encoded)); - } - - @Override - public int getLength() { - return 4 + (int) Math.ceil(super.size()/32.0); - } - - @Override - public boolean equals(Object o) { - if (!(o instanceof SWGFlag)) - return super.equals(o); - return Arrays.equals(toList(), ((SWGFlag) o).toList()); - } - - @Override - public int hashCode() { - return Arrays.hashCode(toList()); - } - - public void sendDeltaMessage(SWGObject target) { - target.sendDelta(view, updateType, encode()); - } - - public int[] toList() { - int[] integers = new int[(int) Math.ceil(size()/32.0)]; - - for (int i = nextSetBit(0); i >= 0; i = nextSetBit(i+1)) { - integers[i / 32] |= (1 << (i % 32)); - } - - return integers; - } -} diff --git a/src/main/java/com/projectswg/holocore/resources/support/data/collections/SWGFlag.kt b/src/main/java/com/projectswg/holocore/resources/support/data/collections/SWGFlag.kt new file mode 100644 index 000000000..0c42b9e47 --- /dev/null +++ b/src/main/java/com/projectswg/holocore/resources/support/data/collections/SWGFlag.kt @@ -0,0 +1,133 @@ +/*********************************************************************************** + * Copyright (c) 2023 /// 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 com.projectswg.holocore.resources.support.data.collections + +import com.projectswg.common.encoding.Encodable +import com.projectswg.common.network.NetBuffer +import com.projectswg.holocore.resources.support.objects.swg.SWGObject +import java.util.* +import kotlin.math.ceil + +/** + * Creates a new [SWGFlag] for the defined baseline with the given view and update. Note + * that this is an extension of [BitSet] + * + * @param view The baseline number this BitSet resides in + * @param updateType The update variable used for sending a delta, it's the operand count that + * this BitSet resides at within the baseline + */ +class SWGFlag(private val view: Int, private val updateType: Int) : BitSet(128), Encodable { + + fun wrapper(obj: SWGObject): SWGFlagWrapper { + return wrapper(obj) { it } + } + + fun wrapper(obj: SWGObject, converter: (T) -> Int): SWGFlagWrapper { + return SWGFlagWrapper(obj, converter) + } + + override fun encode(): ByteArray { + val encoded = toByteArray() + val resultingInts = (encoded.size + 3) / 4 // rounds up + val buffer = NetBuffer.allocate(4 + resultingInts * 4) + buffer.addInt(resultingInts) + buffer.addRawArray(encoded) + return buffer.array() + } + + override fun decode(data: NetBuffer) { + val len = data.int + val encoded = data.getArray(len * 4) + clear() + xor(valueOf(encoded)) + } + + override val length: Int + get() = 4 + ceil(super.size() / 32.0).toInt() + + override fun equals(other: Any?): Boolean { + return if (other !is SWGFlag) super.equals(other) else toList().contentEquals(other.toList()) + } + + override fun hashCode(): Int { + return toList().contentHashCode() + } + + fun sendDeltaMessage(target: SWGObject) { + target.sendDelta(view, updateType, encode()) + } + + fun toList(): IntArray { + val integers = IntArray(ceil(size() / 32.0).toInt()) + var i = nextSetBit(0) + while (i >= 0) { + integers[i / 32] = integers[i / 32] or (1 shl i % 32) + i = nextSetBit(i + 1) + } + return integers + } + + inner class SWGFlagWrapper(private val obj: SWGObject, private val converter: (T) -> Int) { + + val flags: BitSet + get() = this@SWGFlag.clone() as BitSet + + operator fun get(flag: T): Boolean { + return this@SWGFlag[converter(flag)] + } + + fun set(flag: T) { + this@SWGFlag.set(converter(flag)) + this@SWGFlag.sendDeltaMessage(obj) + } + + fun clear(flag: T) { + this@SWGFlag.clear(converter(flag)) + this@SWGFlag.sendDeltaMessage(obj) + } + + fun toggle(flag: T) { + this@SWGFlag.flip(converter(flag)) + this@SWGFlag.sendDeltaMessage(obj) + } + + fun set(flags: BitSet) { + this@SWGFlag.or(flags) + this@SWGFlag.sendDeltaMessage(obj) + } + + fun clear(flags: BitSet) { + this@SWGFlag.andNot(flags) + this@SWGFlag.sendDeltaMessage(obj) + } + + fun toggle(flags: BitSet) { + this@SWGFlag.xor(flags) + this@SWGFlag.sendDeltaMessage(obj) + } + } +} diff --git a/src/main/java/com/projectswg/holocore/resources/support/global/commands/callbacks/flags/CmdToggleAwayFromKeyboard.java b/src/main/java/com/projectswg/holocore/resources/support/global/commands/callbacks/flags/CmdToggleAwayFromKeyboard.java index eae30ea7b..a17d6daa6 100644 --- a/src/main/java/com/projectswg/holocore/resources/support/global/commands/callbacks/flags/CmdToggleAwayFromKeyboard.java +++ b/src/main/java/com/projectswg/holocore/resources/support/global/commands/callbacks/flags/CmdToggleAwayFromKeyboard.java @@ -1,3 +1,30 @@ +/*********************************************************************************** + * Copyright (c) 2023 /// 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 com.projectswg.holocore.resources.support.global.commands.callbacks.flags; import com.projectswg.holocore.resources.support.global.commands.ICmdCallback; @@ -10,7 +37,7 @@ public final class CmdToggleAwayFromKeyboard implements ICmdCallback { @Override public void execute(@NotNull Player player, SWGObject target, @NotNull String args) { - player.getPlayerObject().toggleFlag(PlayerFlags.AFK); + player.getPlayerObject().getFlags().toggle(PlayerFlags.AFK); } } diff --git a/src/main/java/com/projectswg/holocore/resources/support/global/commands/callbacks/flags/CmdToggleDisplayingFactionRank.java b/src/main/java/com/projectswg/holocore/resources/support/global/commands/callbacks/flags/CmdToggleDisplayingFactionRank.java index 22b66558e..3d6c0030a 100644 --- a/src/main/java/com/projectswg/holocore/resources/support/global/commands/callbacks/flags/CmdToggleDisplayingFactionRank.java +++ b/src/main/java/com/projectswg/holocore/resources/support/global/commands/callbacks/flags/CmdToggleDisplayingFactionRank.java @@ -1,3 +1,29 @@ +/*********************************************************************************** + * Copyright (c) 2023 /// 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 com.projectswg.holocore.resources.support.global.commands.callbacks.flags; import com.projectswg.holocore.resources.support.global.commands.ICmdCallback; @@ -10,7 +36,7 @@ public final class CmdToggleDisplayingFactionRank implements ICmdCallback { @Override public void execute(@NotNull Player player, SWGObject target, @NotNull String args) { - player.getPlayerObject().toggleFlag(PlayerFlags.FACTIONRANK); + player.getPlayerObject().getFlags().toggle(PlayerFlags.FACTIONRANK); } } diff --git a/src/main/java/com/projectswg/holocore/resources/support/global/commands/callbacks/flags/CmdToggleHelper.java b/src/main/java/com/projectswg/holocore/resources/support/global/commands/callbacks/flags/CmdToggleHelper.java index d50ef7460..1e64ef8d8 100644 --- a/src/main/java/com/projectswg/holocore/resources/support/global/commands/callbacks/flags/CmdToggleHelper.java +++ b/src/main/java/com/projectswg/holocore/resources/support/global/commands/callbacks/flags/CmdToggleHelper.java @@ -1,3 +1,30 @@ +/*********************************************************************************** + * Copyright (c) 2023 /// 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 com.projectswg.holocore.resources.support.global.commands.callbacks.flags; import com.projectswg.holocore.resources.support.global.commands.ICmdCallback; @@ -10,7 +37,7 @@ public final class CmdToggleHelper implements ICmdCallback { @Override public void execute(@NotNull Player player, SWGObject target, @NotNull String args) { - player.getPlayerObject().toggleFlag(PlayerFlags.HELPER); + player.getPlayerObject().getFlags().toggle(PlayerFlags.HELPER); } } diff --git a/src/main/java/com/projectswg/holocore/resources/support/global/commands/callbacks/flags/CmdToggleLookingForGroup.java b/src/main/java/com/projectswg/holocore/resources/support/global/commands/callbacks/flags/CmdToggleLookingForGroup.java index cdba26aac..c208eeb7a 100644 --- a/src/main/java/com/projectswg/holocore/resources/support/global/commands/callbacks/flags/CmdToggleLookingForGroup.java +++ b/src/main/java/com/projectswg/holocore/resources/support/global/commands/callbacks/flags/CmdToggleLookingForGroup.java @@ -1,3 +1,30 @@ +/*********************************************************************************** + * Copyright (c) 2023 /// 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 com.projectswg.holocore.resources.support.global.commands.callbacks.flags; import com.projectswg.holocore.resources.support.global.commands.ICmdCallback; @@ -10,7 +37,7 @@ public final class CmdToggleLookingForGroup implements ICmdCallback { @Override public void execute(@NotNull Player player, SWGObject target, @NotNull String args) { - player.getPlayerObject().toggleFlag(PlayerFlags.LFG); + player.getPlayerObject().getFlags().toggle(PlayerFlags.LFG); } } diff --git a/src/main/java/com/projectswg/holocore/resources/support/global/commands/callbacks/flags/CmdToggleRolePlay.java b/src/main/java/com/projectswg/holocore/resources/support/global/commands/callbacks/flags/CmdToggleRolePlay.java index b0d8a09b0..4f3ec940c 100644 --- a/src/main/java/com/projectswg/holocore/resources/support/global/commands/callbacks/flags/CmdToggleRolePlay.java +++ b/src/main/java/com/projectswg/holocore/resources/support/global/commands/callbacks/flags/CmdToggleRolePlay.java @@ -1,3 +1,30 @@ +/*********************************************************************************** + * Copyright (c) 2023 /// 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 com.projectswg.holocore.resources.support.global.commands.callbacks.flags; import com.projectswg.holocore.resources.support.global.commands.ICmdCallback; @@ -10,7 +37,7 @@ public final class CmdToggleRolePlay implements ICmdCallback { @Override public void execute(@NotNull Player player, SWGObject target, @NotNull String args) { - player.getPlayerObject().toggleFlag(PlayerFlags.ROLEPLAYER); + player.getPlayerObject().getFlags().toggle(PlayerFlags.ROLEPLAYER); } } diff --git a/src/main/java/com/projectswg/holocore/resources/support/objects/swg/player/PlayerObject.kt b/src/main/java/com/projectswg/holocore/resources/support/objects/swg/player/PlayerObject.kt index eb6764b8c..dfaaeb541 100644 --- a/src/main/java/com/projectswg/holocore/resources/support/objects/swg/player/PlayerObject.kt +++ b/src/main/java/com/projectswg/holocore/resources/support/objects/swg/player/PlayerObject.kt @@ -45,6 +45,7 @@ import java.time.ZonedDateTime import java.time.temporal.ChronoUnit import java.util.* import java.util.concurrent.ConcurrentHashMap +import kotlin.math.max class PlayerObject(objectId: Long) : IntangibleObject(objectId, BaselineType.PLAY) { @@ -74,7 +75,7 @@ class PlayerObject(objectId: Long) : IntangibleObject(objectId, BaselineType.PLA fun adjustFactionPoints(faction: String, adjustment: Int): Int { val oldValue = factionPoints.getOrDefault(faction, 0) val value = oldValue + adjustment - val cappedValue = Math.min(Math.max(value, -5000), 5000) + val cappedValue = value.coerceAtLeast(-5000).coerceAtMost(5000) val delta = cappedValue - oldValue if (delta != 0) { factionPoints[faction] = value @@ -119,63 +120,8 @@ class PlayerObject(objectId: Long) : IntangibleObject(objectId, BaselineType.PLA removeMail(m.id) } - val flagsList: BitSet - get() = play3.getFlagsList() - - fun setFlag(flag: PlayerFlags) { - play3.setFlag(flag.flag) - } - - fun clearFlag(flag: PlayerFlags) { - play3.clearFlag(flag.flag) - } - - fun toggleFlag(flag: PlayerFlags) { - play3.toggleFlag(flag.flag) - } - - fun setFlags(flags: Set) { - play3.setFlags(PlayerFlags.bitsetFromFlags(flags)) - } - - fun clearFlags(flags: Set) { - play3.clearFlags(PlayerFlags.bitsetFromFlags(flags)) - } - - fun toggleFlags(flags: Set) { - play3.toggleFlags(PlayerFlags.bitsetFromFlags(flags)) - } - - fun isFlagSet(flag: PlayerFlags): Boolean { - return play3.isFlagSet(flag.flag) - } - - val profileFlags: BitSet - get() = play3.getProfileFlags() - - fun setProfileFlag(flag: PlayerFlags) { - play3.setProfileFlag(flag.flag) - } - - fun clearProfileFlag(flag: PlayerFlags) { - play3.clearProfileFlag(flag.flag) - } - - fun toggleProfileFlag(flag: PlayerFlags) { - play3.toggleProfileFlag(flag.flag) - } - - fun setProfileFlags(flags: Set) { - play3.setProfileFlags(PlayerFlags.bitsetFromFlags(flags)) - } - - fun clearProfileFlags(flags: Set) { - play3.clearProfileFlags(PlayerFlags.bitsetFromFlags(flags)) - } - - fun toggleProfileFlags(flags: Set) { - play3.toggleProfileFlags(PlayerFlags.bitsetFromFlags(flags)) - } + val flags by play3::flags + val profileFlags by play3::profileFlags var title by play3::title val playTime by play3::playTime @@ -250,27 +196,11 @@ class PlayerObject(objectId: Long) : IntangibleObject(objectId, BaselineType.PLA get() = play8.getWaypoints() var forcePower by play8::forcePower var maxForcePower by play8::maxForcePower - var completedQuests: BitSet - get() = play8.getCompletedQuests() - set(completedQuests) { - play8.setCompletedQuests(completedQuests) - } - - fun addCompletedQuests(completedQuests: BitSet) { - play8.addCompletedQuests(completedQuests) - } - - var activeQuests: BitSet - get() = play8.getActiveQuests() - set(activeQuests) { - play8.setActiveQuests(activeQuests) - } - - fun addActiveQuests(activeQuests: BitSet) { - play8.addActiveQuests(activeQuests) - } + val completedQuests by play8::completedQuests + val activeQuests by play8::activeQuests var activeQuest by play8::activeQuest + val quests: Map get() = play8.getQuests() diff --git a/src/main/java/com/projectswg/holocore/resources/support/objects/swg/player/PlayerObjectOwner.kt b/src/main/java/com/projectswg/holocore/resources/support/objects/swg/player/PlayerObjectOwner.kt index 84cfe4092..26a1ab772 100644 --- a/src/main/java/com/projectswg/holocore/resources/support/objects/swg/player/PlayerObjectOwner.kt +++ b/src/main/java/com/projectswg/holocore/resources/support/objects/swg/player/PlayerObjectOwner.kt @@ -46,8 +46,10 @@ import java.util.stream.Collectors internal class PlayerObjectOwner(private val obj: PlayerObject) : MongoPersistable { private val experience = SWGMap(8, 0, StringType.ASCII) private val waypoints = SWGMap(8, 1) - private val completedQuests = SWGBitSet(8, 4) - private val activeQuests = SWGBitSet(8, 5) + private val _completedQuests = SWGBitSet(8, 4) + val completedQuests = _completedQuests.wrapper(obj) + private val _activeQuests = SWGBitSet(8, 5) + val activeQuests = _activeQuests.wrapper(obj) private val quests = SWGMap(8, 7) var forcePower by IndirectBaselineDelegate(obj = obj, value = 100, page = 8, update = 2) @@ -102,32 +104,6 @@ internal class PlayerObjectOwner(private val obj: PlayerObject) : MongoPersistab synchronized(waypoints) { if (waypoints.remove(objId) != null) waypoints.sendDeltaMessage(obj) } } - fun getCompletedQuests(): BitSet { - return completedQuests.clone() as BitSet - } - - fun addCompletedQuests(completedQuests: BitSet) { - this.completedQuests.or(completedQuests) - } - - fun setCompletedQuests(completedQuests: BitSet) { - this.completedQuests.clear() - this.completedQuests.or(completedQuests) - } - - fun getActiveQuests(): BitSet { - return activeQuests.clone() as BitSet - } - - fun addActiveQuests(activeQuests: BitSet) { - this.activeQuests.or(activeQuests) - } - - fun setActiveQuests(activeQuests: BitSet) { - this.activeQuests.clear() - this.activeQuests.or(activeQuests) - } - fun getQuests(): Map { return Collections.unmodifiableMap(quests) } @@ -137,8 +113,8 @@ internal class PlayerObjectOwner(private val obj: PlayerObject) : MongoPersistab bb.addObject(waypoints) // 1 bb.addInt(forcePower) // 2 bb.addInt(maxForcePower) // 3 - bb.addObject(completedQuests) // 4 - bb.addObject(activeQuests) // 5 + bb.addObject(_completedQuests) // 4 + bb.addObject(_activeQuests) // 5 bb.addInt(activeQuest) // 6 bb.addObject(quests) // 7 bb.incrementOperandCount(8) @@ -149,8 +125,8 @@ internal class PlayerObjectOwner(private val obj: PlayerObject) : MongoPersistab data.putArray("waypoints", waypoints.values.stream().map { obj: WaypointObject -> obj.oob }.collect(Collectors.toList())) data.putInteger("forcePower", forcePower) data.putInteger("maxForcePower", maxForcePower) - data.putByteArray("completedQuests", completedQuests.toByteArray()) - data.putByteArray("activeQuests", activeQuests.toByteArray()) + data.putByteArray("completedQuests", _completedQuests.toByteArray()) + data.putByteArray("activeQuests", _activeQuests.toByteArray()) data.putInteger("activeQuest", activeQuest) data.putMap("quests", quests) } @@ -164,8 +140,8 @@ internal class PlayerObjectOwner(private val obj: PlayerObject) : MongoPersistab .forEach(Consumer { obj: WaypointObject -> waypoints[obj.objectId] = obj }) forcePower = data.getInteger("forcePower", forcePower) maxForcePower = data.getInteger("maxForcePower", maxForcePower) - completedQuests.read(data.getByteArray("completedQuests")) - activeQuests.read(data.getByteArray("activeQuests")) + _completedQuests.read(data.getByteArray("completedQuests")) + _activeQuests.read(data.getByteArray("activeQuests")) activeQuest = data.getInteger("activeQuest", activeQuest) quests.putAll(data.getMap("quests", CRC::class.java, Quest::class.java)) } diff --git a/src/main/java/com/projectswg/holocore/resources/support/objects/swg/player/PlayerObjectShared.kt b/src/main/java/com/projectswg/holocore/resources/support/objects/swg/player/PlayerObjectShared.kt index 5d61932fc..72a7c54f1 100644 --- a/src/main/java/com/projectswg/holocore/resources/support/objects/swg/player/PlayerObjectShared.kt +++ b/src/main/java/com/projectswg/holocore/resources/support/objects/swg/player/PlayerObjectShared.kt @@ -32,7 +32,9 @@ import com.projectswg.common.encoding.StringType import com.projectswg.common.network.NetBuffer import com.projectswg.holocore.resources.support.data.collections.SWGFlag import com.projectswg.holocore.resources.support.global.network.BaselineBuilder +import com.projectswg.holocore.resources.support.global.player.PlayerFlags import com.projectswg.holocore.resources.support.objects.swg.IndirectBaselineDelegate +import com.projectswg.holocore.resources.support.objects.swg.SWGObject import com.projectswg.holocore.utilities.MathUtils import java.util.* @@ -41,86 +43,17 @@ import java.util.* */ internal class PlayerObjectShared(private val obj: PlayerObject) : MongoPersistable { - private val flagsList = SWGFlag(3, 5) - private val profileFlags = SWGFlag(3, 6) + private val _flags = SWGFlag(3, 5) + val flags = _flags.wrapper(obj) { it: PlayerFlags -> it.flag } + + private val _profileFlags = SWGFlag(3, 6) + val profileFlags = _profileFlags.wrapper(obj) { it: PlayerFlags -> it.flag } var title by IndirectBaselineDelegate(obj = obj, value = "", page = 3, update = 7, stringType = StringType.ASCII) var bornDate by IndirectBaselineDelegate(obj = obj, value = 0, page = 3, update = 8) var playTime by IndirectBaselineDelegate(obj = obj, value = 0, page = 3, update = 9) var professionIcon by IndirectBaselineDelegate(obj = obj, value = 0, page = 3, update = 10) - fun getFlagsList(): BitSet { - return flagsList.clone() as BitSet - } - - fun setFlag(flag: Int) { - flagsList.set(flag) - flagsList.sendDeltaMessage(obj) - } - - fun clearFlag(flag: Int) { - flagsList.clear(flag) - flagsList.sendDeltaMessage(obj) - } - - fun toggleFlag(flag: Int) { - flagsList.flip(flag) - flagsList.sendDeltaMessage(obj) - } - - fun setFlags(flags: BitSet) { - flagsList.or(flags) - flagsList.sendDeltaMessage(obj) - } - - fun clearFlags(flags: BitSet) { - flagsList.andNot(flags) - flagsList.sendDeltaMessage(obj) - } - - fun toggleFlags(flags: BitSet) { - flagsList.xor(flags) - flagsList.sendDeltaMessage(obj) - } - - fun isFlagSet(flag: Int): Boolean { - return flagsList[flag] - } - - fun getProfileFlags(): BitSet { - return profileFlags.clone() as BitSet - } - - fun setProfileFlag(flag: Int) { - profileFlags.set(flag) - profileFlags.sendDeltaMessage(obj) - } - - fun clearProfileFlag(flag: Int) { - profileFlags.clear(flag) - profileFlags.sendDeltaMessage(obj) - } - - fun toggleProfileFlag(flag: Int) { - profileFlags.flip(flag) - profileFlags.sendDeltaMessage(obj) - } - - fun setProfileFlags(flags: BitSet) { - profileFlags.or(flags) - profileFlags.sendDeltaMessage(obj) - } - - fun clearProfileFlags(flags: BitSet) { - profileFlags.andNot(flags) - profileFlags.sendDeltaMessage(obj) - } - - fun toggleProfileFlags(flags: BitSet) { - profileFlags.xor(flags) - profileFlags.sendDeltaMessage(obj) - } - fun incrementPlayTime(playTime: Int) { this.playTime += playTime } @@ -130,8 +63,8 @@ internal class PlayerObjectShared(private val obj: PlayerObject) : MongoPersista } fun createBaseline3(bb: BaselineBuilder) { - bb.addObject(flagsList) // 5 - bb.addObject(profileFlags) // 6 + bb.addObject(_flags) // 5 + bb.addObject(_profileFlags) // 6 bb.addAscii(title) // 7 bb.addInt(bornDate) // 8 bb.addInt(playTime) // 9 @@ -140,8 +73,8 @@ internal class PlayerObjectShared(private val obj: PlayerObject) : MongoPersista } fun parseBaseline3(buffer: NetBuffer) { - flagsList.decode(buffer) // 5 - profileFlags.decode(buffer) // 6 + _flags.decode(buffer) // 5 + _profileFlags.decode(buffer) // 6 title = buffer.ascii // 7 bornDate = buffer.int // 8 playTime = buffer.int // 9 diff --git a/src/main/java/com/projectswg/holocore/services/support/global/zone/ConnectionService.java b/src/main/java/com/projectswg/holocore/services/support/global/zone/ConnectionService.java index 7c1125887..15e1c6bdb 100644 --- a/src/main/java/com/projectswg/holocore/services/support/global/zone/ConnectionService.java +++ b/src/main/java/com/projectswg/holocore/services/support/global/zone/ConnectionService.java @@ -1,5 +1,5 @@ /*********************************************************************************** - * Copyright (c) 2018 /// Project SWG /// www.projectswg.com * + * Copyright (c) 2023 /// 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. * @@ -127,14 +127,14 @@ public class ConnectionService extends Service { PlayerObject player = p.getPlayerObject(); if (player == null) return; - player.setFlag(PlayerFlags.LD); + player.getFlags().set(PlayerFlags.LD); } private void clearPlayerFlag(Player p) { PlayerObject player = p.getPlayerObject(); if (player == null) return; - player.clearFlag(PlayerFlags.LD); + player.getFlags().clear(PlayerFlags.LD); } private void zoneIn(Player p) { diff --git a/src/test/java/com/projectswg/holocore/resources/gameplay/player/TestActivePlayerPredicate.java b/src/test/java/com/projectswg/holocore/resources/gameplay/player/TestActivePlayerPredicate.java index 007087a82..659e24cf3 100644 --- a/src/test/java/com/projectswg/holocore/resources/gameplay/player/TestActivePlayerPredicate.java +++ b/src/test/java/com/projectswg/holocore/resources/gameplay/player/TestActivePlayerPredicate.java @@ -1,3 +1,30 @@ +/*********************************************************************************** + * Copyright (c) 2023 /// 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 com.projectswg.holocore.resources.gameplay.player; import com.projectswg.common.data.encodables.tangible.Posture; @@ -35,7 +62,7 @@ public class TestActivePlayerPredicate { @Test public void testAfk() { - playerObject.setFlag(PlayerFlags.AFK); + playerObject.getFlags().set(PlayerFlags.AFK); boolean actual = predicate.test(player); @@ -44,7 +71,7 @@ public class TestActivePlayerPredicate { @Test public void testOffline() { - playerObject.setFlag(PlayerFlags.LD); + playerObject.getFlags().set(PlayerFlags.LD); boolean actual = predicate.test(player);