mirror of
https://github.com/VolmitSoftware/Iris.git
synced 2025-07-04 00:46:08 +00:00
Sync!
This commit is contained in:
parent
713c3a4762
commit
073be82dcc
@ -24,8 +24,11 @@ import com.volmit.iris.core.tools.IrisPackBenchmarking;
|
|||||||
import com.volmit.iris.core.tools.IrisToolbelt;
|
import com.volmit.iris.core.tools.IrisToolbelt;
|
||||||
import com.volmit.iris.core.tools.IrisWorldDump;
|
import com.volmit.iris.core.tools.IrisWorldDump;
|
||||||
import com.volmit.iris.engine.framework.Engine;
|
import com.volmit.iris.engine.framework.Engine;
|
||||||
|
import com.volmit.iris.engine.framework.EnginePlayer;
|
||||||
import com.volmit.iris.engine.object.IrisDimension;
|
import com.volmit.iris.engine.object.IrisDimension;
|
||||||
import com.volmit.iris.engine.service.EngineStatusSVC;
|
import com.volmit.iris.engine.service.EngineStatusSVC;
|
||||||
|
import com.volmit.iris.util.collection.KList;
|
||||||
|
import com.volmit.iris.util.collection.KMap;
|
||||||
import com.volmit.iris.util.decree.DecreeExecutor;
|
import com.volmit.iris.util.decree.DecreeExecutor;
|
||||||
import com.volmit.iris.util.decree.DecreeOrigin;
|
import com.volmit.iris.util.decree.DecreeOrigin;
|
||||||
import com.volmit.iris.util.decree.annotations.Decree;
|
import com.volmit.iris.util.decree.annotations.Decree;
|
||||||
@ -198,6 +201,34 @@ public class CommandDeveloper implements DecreeExecutor {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Decree(description = "All players in iris worlds")
|
||||||
|
public void getPlayers() {
|
||||||
|
KList<World> IrisWorlds = new KList<>();
|
||||||
|
for (World w : Bukkit.getServer().getWorlds()) {
|
||||||
|
if(IrisToolbelt.isIrisWorld(w)) {
|
||||||
|
IrisWorlds.add(w);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sender().isPlayer()) {
|
||||||
|
sender().sendMessage(C.BLUE + "Iris Worlds: ");
|
||||||
|
for (World IrisWorld : IrisWorlds.copy()) {
|
||||||
|
sender().sendMessage(C.IRIS + "- " + IrisWorld.getName() + C.GRAY + ", " + IrisToolbelt.access(IrisWorld).getEngine().getEnginePlayers().stream().count() + " players");
|
||||||
|
for (EnginePlayer player : IrisToolbelt.access(IrisWorld).getEngine().getEnginePlayers()) {
|
||||||
|
sender().sendMessage(C.DARK_GRAY + "> " + player.getPlayer().getName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Iris.info(C.BLUE + "Iris Worlds: ");
|
||||||
|
for (World IrisWorld : IrisWorlds.copy()) {
|
||||||
|
Iris.info(C.IRIS + "- " + IrisWorld.getName() + C.GRAY + ", " + IrisToolbelt.access(IrisWorld).getEngine().getEnginePlayers().stream().count() + " players");
|
||||||
|
for (EnginePlayer player : IrisToolbelt.access(IrisWorld).getEngine().getEnginePlayers()) {
|
||||||
|
Iris.info(C.DARK_GRAY + "> " + player.getPlayer().getName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Decree(description = "Test the compression algorithms")
|
@Decree(description = "Test the compression algorithms")
|
||||||
public void compression(
|
public void compression(
|
||||||
@Param(description = "base IrisWorld") World world,
|
@Param(description = "base IrisWorld") World world,
|
||||||
|
@ -34,6 +34,7 @@ import com.volmit.iris.engine.object.*;
|
|||||||
import com.volmit.iris.engine.scripting.EngineExecutionEnvironment;
|
import com.volmit.iris.engine.scripting.EngineExecutionEnvironment;
|
||||||
import com.volmit.iris.engine.service.EngineEffectsSVC;
|
import com.volmit.iris.engine.service.EngineEffectsSVC;
|
||||||
import com.volmit.iris.util.atomics.AtomicRollingSequence;
|
import com.volmit.iris.util.atomics.AtomicRollingSequence;
|
||||||
|
import com.volmit.iris.util.collection.KList;
|
||||||
import com.volmit.iris.util.collection.KMap;
|
import com.volmit.iris.util.collection.KMap;
|
||||||
import com.volmit.iris.util.context.ChunkContext;
|
import com.volmit.iris.util.context.ChunkContext;
|
||||||
import com.volmit.iris.util.context.IrisContext;
|
import com.volmit.iris.util.context.IrisContext;
|
||||||
@ -47,6 +48,7 @@ import com.volmit.iris.util.mantle.MantleFlag;
|
|||||||
import com.volmit.iris.util.math.M;
|
import com.volmit.iris.util.math.M;
|
||||||
import com.volmit.iris.util.math.RNG;
|
import com.volmit.iris.util.math.RNG;
|
||||||
import com.volmit.iris.util.matter.MatterStructurePOI;
|
import com.volmit.iris.util.matter.MatterStructurePOI;
|
||||||
|
import com.volmit.iris.util.mobs.IrisMobPiece;
|
||||||
import com.volmit.iris.util.plugin.VolmitSender;
|
import com.volmit.iris.util.plugin.VolmitSender;
|
||||||
import com.volmit.iris.util.scheduling.ChronoLatch;
|
import com.volmit.iris.util.scheduling.ChronoLatch;
|
||||||
import com.volmit.iris.util.scheduling.J;
|
import com.volmit.iris.util.scheduling.J;
|
||||||
@ -62,15 +64,15 @@ import org.bukkit.block.Biome;
|
|||||||
import org.bukkit.block.data.BlockData;
|
import org.bukkit.block.data.BlockData;
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.EventPriority;
|
||||||
|
import org.bukkit.event.player.PlayerChangedWorldEvent;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.lang.reflect.Constructor;
|
import java.lang.reflect.Constructor;
|
||||||
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.InvocationTargetException;
|
||||||
import java.util.Collections;
|
import java.util.*;
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
import java.util.concurrent.atomic.AtomicLong;
|
import java.util.concurrent.atomic.AtomicLong;
|
||||||
@ -106,6 +108,7 @@ public class IrisEngine implements Engine {
|
|||||||
private EngineMode mode;
|
private EngineMode mode;
|
||||||
private EngineExecutionEnvironment execution;
|
private EngineExecutionEnvironment execution;
|
||||||
private EngineWorldManager worldManager;
|
private EngineWorldManager worldManager;
|
||||||
|
private KList<EnginePlayer> players;
|
||||||
private volatile int parallelism;
|
private volatile int parallelism;
|
||||||
private volatile int minHeight;
|
private volatile int minHeight;
|
||||||
private boolean failing;
|
private boolean failing;
|
||||||
@ -119,6 +122,7 @@ public class IrisEngine implements Engine {
|
|||||||
public IrisEngine(EngineTarget target, boolean studio) {
|
public IrisEngine(EngineTarget target, boolean studio) {
|
||||||
this.studio = studio;
|
this.studio = studio;
|
||||||
this.target = target;
|
this.target = target;
|
||||||
|
this.players = new KList<>();
|
||||||
getEngineData();
|
getEngineData();
|
||||||
verifySeed();
|
verifySeed();
|
||||||
this.seedManager = new SeedManager(target.getWorld().getRawWorldSeed());
|
this.seedManager = new SeedManager(target.getWorld().getRawWorldSeed());
|
||||||
@ -187,6 +191,23 @@ public class IrisEngine implements Engine {
|
|||||||
if (effects != null) effects.tickRandomPlayer();
|
if (effects != null) effects.tickRandomPlayer();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public EnginePlayer getEnginePlayer(UUID uuid) {
|
||||||
|
return getPlayer(uuid);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public KList<EnginePlayer> getEnginePlayers() {
|
||||||
|
return players;
|
||||||
|
}
|
||||||
|
|
||||||
|
private EnginePlayer getPlayer(UUID uuid) {
|
||||||
|
for (EnginePlayer player : players) {
|
||||||
|
if (player.getPlayer().getUniqueId().equals(uuid)) return player;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
private void prehotload() {
|
private void prehotload() {
|
||||||
worldManager.close();
|
worldManager.close();
|
||||||
complex.close();
|
complex.close();
|
||||||
|
@ -23,6 +23,7 @@ import com.volmit.iris.core.IrisSettings;
|
|||||||
import com.volmit.iris.core.loader.IrisData;
|
import com.volmit.iris.core.loader.IrisData;
|
||||||
import com.volmit.iris.engine.framework.Engine;
|
import com.volmit.iris.engine.framework.Engine;
|
||||||
import com.volmit.iris.engine.framework.EngineAssignedWorldManager;
|
import com.volmit.iris.engine.framework.EngineAssignedWorldManager;
|
||||||
|
import com.volmit.iris.engine.framework.EnginePlayer;
|
||||||
import com.volmit.iris.engine.object.*;
|
import com.volmit.iris.engine.object.*;
|
||||||
import com.volmit.iris.util.collection.KList;
|
import com.volmit.iris.util.collection.KList;
|
||||||
import com.volmit.iris.util.collection.KMap;
|
import com.volmit.iris.util.collection.KMap;
|
||||||
@ -50,14 +51,16 @@ import org.bukkit.World;
|
|||||||
import org.bukkit.entity.Entity;
|
import org.bukkit.entity.Entity;
|
||||||
import org.bukkit.entity.LivingEntity;
|
import org.bukkit.entity.LivingEntity;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
import org.bukkit.event.block.BlockBreakEvent;
|
import org.bukkit.event.block.BlockBreakEvent;
|
||||||
import org.bukkit.event.block.BlockPlaceEvent;
|
import org.bukkit.event.block.BlockPlaceEvent;
|
||||||
|
import org.bukkit.event.player.PlayerChangedWorldEvent;
|
||||||
|
import org.bukkit.event.player.PlayerJoinEvent;
|
||||||
|
import org.bukkit.event.player.PlayerLevelChangeEvent;
|
||||||
import org.bukkit.event.player.PlayerTeleportEvent;
|
import org.bukkit.event.player.PlayerTeleportEvent;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.*;
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.concurrent.CompletableFuture;
|
import java.util.concurrent.CompletableFuture;
|
||||||
import java.util.concurrent.ExecutionException;
|
import java.util.concurrent.ExecutionException;
|
||||||
import java.util.concurrent.Future;
|
import java.util.concurrent.Future;
|
||||||
@ -181,6 +184,56 @@ public class IrisWorldManager extends EngineAssignedWorldManager {
|
|||||||
looper.start();
|
looper.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
private void on(PlayerChangedWorldEvent event) {
|
||||||
|
updatePlayers();
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
private void on(PlayerJoinEvent event) {
|
||||||
|
updatePlayers();
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
private void on(PlayerLevelChangeEvent event) {
|
||||||
|
updatePlayers();
|
||||||
|
}
|
||||||
|
|
||||||
|
public synchronized void updatePlayers() {
|
||||||
|
// ^ perhaps synchronized isn't the best one to use here
|
||||||
|
if (!getEngine().getWorld().tryGetRealWorld() || getEngine().isHeadless()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var world = getEngine().getWorld().realWorld();
|
||||||
|
if (world == null) return;
|
||||||
|
|
||||||
|
Set<Player> worldPlayers = new HashSet<>(world.getPlayers());
|
||||||
|
|
||||||
|
Map<UUID, EnginePlayer> enginePlayerMap = new HashMap<>();
|
||||||
|
for (EnginePlayer ep : getEngine().getEnginePlayers()) {
|
||||||
|
enginePlayerMap.put(ep.getOwner(), ep);
|
||||||
|
}
|
||||||
|
|
||||||
|
Iterator<Map.Entry<UUID, EnginePlayer>> iterator = enginePlayerMap.entrySet().iterator();
|
||||||
|
while (iterator.hasNext()) {
|
||||||
|
Map.Entry<UUID, EnginePlayer> entry = iterator.next();
|
||||||
|
if (worldPlayers.stream().noneMatch(p -> p.getUniqueId().equals(entry.getKey()))) {
|
||||||
|
entry.getValue().close();
|
||||||
|
iterator.remove();
|
||||||
|
getEngine().getEnginePlayers().remove(entry.getValue());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Player player : worldPlayers) {
|
||||||
|
if (!enginePlayerMap.containsKey(player.getUniqueId())) {
|
||||||
|
EnginePlayer newEnginePlayer = new EnginePlayer(getEngine(), player);
|
||||||
|
enginePlayerMap.put(player.getUniqueId(), newEnginePlayer);
|
||||||
|
getEngine().getEnginePlayers().add(newEnginePlayer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void discoverChunks() {
|
private void discoverChunks() {
|
||||||
var mantle = getEngine().getMantle().getMantle();
|
var mantle = getEngine().getMantle().getMantle();
|
||||||
for (Player i : getEngine().getWorld().realWorld().getPlayers()) {
|
for (Player i : getEngine().getWorld().realWorld().getPlayers()) {
|
||||||
|
@ -94,6 +94,8 @@ public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdat
|
|||||||
|
|
||||||
int getBlockUpdatesPerSecond();
|
int getBlockUpdatesPerSecond();
|
||||||
|
|
||||||
|
boolean isHeadless();
|
||||||
|
|
||||||
void printMetrics(CommandSender sender);
|
void printMetrics(CommandSender sender);
|
||||||
|
|
||||||
EngineMantle getMantle();
|
EngineMantle getMantle();
|
||||||
@ -819,6 +821,10 @@ public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdat
|
|||||||
|
|
||||||
int getCacheID();
|
int getCacheID();
|
||||||
|
|
||||||
|
EnginePlayer getEnginePlayer(UUID uuid);
|
||||||
|
|
||||||
|
KList<EnginePlayer> getEnginePlayers();
|
||||||
|
|
||||||
default IrisBiome getBiomeOrMantle(Location l) {
|
default IrisBiome getBiomeOrMantle(Location l) {
|
||||||
return getBiomeOrMantle(l.getBlockX(), l.getBlockY(), l.getBlockZ());
|
return getBiomeOrMantle(l.getBlockX(), l.getBlockY(), l.getBlockZ());
|
||||||
}
|
}
|
||||||
|
@ -29,6 +29,8 @@ import lombok.Data;
|
|||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
public class EnginePlayer {
|
public class EnginePlayer {
|
||||||
private final Engine engine;
|
private final Engine engine;
|
||||||
@ -99,4 +101,12 @@ public class EnginePlayer {
|
|||||||
biome = engine.getBiome(l);
|
biome = engine.getBiome(l);
|
||||||
region = engine.getRegion(l);
|
region = engine.getRegion(l);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public UUID getOwner() {
|
||||||
|
return player.getUniqueId();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void close() {
|
||||||
|
engine.getEnginePlayers().remove(this);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -31,7 +31,6 @@ import java.util.UUID;
|
|||||||
import java.util.concurrent.Semaphore;
|
import java.util.concurrent.Semaphore;
|
||||||
|
|
||||||
public class EngineEffectsSVC extends IrisEngineService {
|
public class EngineEffectsSVC extends IrisEngineService {
|
||||||
private KMap<UUID, EnginePlayer> players;
|
|
||||||
private Semaphore limit;
|
private Semaphore limit;
|
||||||
|
|
||||||
public EngineEffectsSVC(Engine engine) {
|
public EngineEffectsSVC(Engine engine) {
|
||||||
@ -40,58 +39,34 @@ public class EngineEffectsSVC extends IrisEngineService {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onEnable(boolean hotload) {
|
public void onEnable(boolean hotload) {
|
||||||
players = new KMap<>();
|
|
||||||
limit = new Semaphore(1);
|
limit = new Semaphore(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onDisable(boolean hotload) {
|
public void onDisable(boolean hotload) {
|
||||||
players = null;
|
|
||||||
limit = null;
|
limit = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updatePlayerMap() {
|
|
||||||
List<Player> pr = engine.getWorld().getPlayers();
|
|
||||||
|
|
||||||
if (pr == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (Player i : pr) {
|
|
||||||
boolean pcc = players.containsKey(i.getUniqueId());
|
|
||||||
if (!pcc) {
|
|
||||||
players.put(i.getUniqueId(), new EnginePlayer(engine, i));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (UUID i : players.k()) {
|
|
||||||
if (!pr.contains(players.get(i).getPlayer())) {
|
|
||||||
players.remove(i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void tickRandomPlayer() {
|
public void tickRandomPlayer() {
|
||||||
if (limit.tryAcquire()) {
|
if (limit.tryAcquire()) {
|
||||||
if (M.r(0.02)) {
|
if (M.r(0.02)) {
|
||||||
updatePlayerMap();
|
|
||||||
limit.release();
|
limit.release();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (players.isEmpty()) {
|
if (engine.getEnginePlayers().isEmpty()) {
|
||||||
limit.release();
|
limit.release();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
double limitms = 1.5;
|
double limitms = 1.5;
|
||||||
int max = players.size();
|
int max = engine.getEnginePlayers().size();
|
||||||
PrecisionStopwatch p = new PrecisionStopwatch();
|
PrecisionStopwatch p = new PrecisionStopwatch();
|
||||||
|
|
||||||
while (max-- > 0 && M.ms() - p.getMilliseconds() < limitms) {
|
while (max-- > 0 && M.ms() - p.getMilliseconds() < limitms) {
|
||||||
players.v().getRandom().tick();
|
engine.getEnginePlayers().getRandom().tick();
|
||||||
}
|
}
|
||||||
|
|
||||||
limit.release();
|
limit.release();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,15 +1,9 @@
|
|||||||
package com.volmit.iris.util.mobs;
|
package com.volmit.iris.util.mobs;
|
||||||
|
|
||||||
import com.volmit.iris.engine.framework.Engine;
|
import com.volmit.iris.engine.framework.EnginePlayer;
|
||||||
import com.volmit.iris.engine.object.IrisEngineChunkData;
|
|
||||||
import com.volmit.iris.engine.object.IrisEngineSpawnerCooldown;
|
|
||||||
import com.volmit.iris.engine.object.IrisEntitySpawn;
|
|
||||||
import com.volmit.iris.engine.object.IrisPosition;
|
|
||||||
import com.volmit.iris.engine.service.EngineMobHandlerSVC;
|
|
||||||
import com.volmit.iris.util.math.M;
|
import com.volmit.iris.util.math.M;
|
||||||
import com.volmit.iris.util.math.RNG;
|
|
||||||
import jakarta.activation.DataHandler;
|
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
|
import org.bukkit.World;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
@ -20,11 +14,14 @@ import java.util.UUID;
|
|||||||
public class IrisMobPiece {
|
public class IrisMobPiece {
|
||||||
@Getter
|
@Getter
|
||||||
private final Player player;
|
private final Player player;
|
||||||
|
private double energyPiece;
|
||||||
|
private final World world;
|
||||||
private IrisMobDataHandler dataHandler;
|
private IrisMobDataHandler dataHandler;
|
||||||
private long lastRanPlayer;
|
private long lastRanPlayer;
|
||||||
|
|
||||||
public IrisMobPiece(Player player, IrisMobDataHandler dh) {
|
public IrisMobPiece(Player player, IrisMobDataHandler dh) {
|
||||||
this.player = player;
|
this.player = player;
|
||||||
|
this.world = player.getWorld();
|
||||||
this.dataHandler = dh;
|
this.dataHandler = dh;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -58,12 +55,12 @@ public class IrisMobPiece {
|
|||||||
* Ticks the current player
|
* Ticks the current player
|
||||||
* @param energy the energy given for the tick
|
* @param energy the energy given for the tick
|
||||||
*/
|
*/
|
||||||
public void tick(int energy) {
|
public void tick(double energy) {
|
||||||
lastRanPlayer = M.ms();
|
lastRanPlayer = M.ms();
|
||||||
|
this.energyPiece += energy;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public UUID getOwner() {
|
public UUID getOwner() {
|
||||||
return player.getUniqueId();
|
return player.getUniqueId();
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user