mirror of
https://github.com/Grasscutters/Grasscutter.git
synced 2025-01-27 12:42:57 +08:00
Fix no static gadget in the map,example: no tree but a fruit in the air (#1415)
* fixGadget * fixGadget * add gadgetObject * fix bug
This commit is contained in:
parent
696206c73c
commit
5416a2f9fd
@ -39,13 +39,13 @@ public class EntityGadget extends EntityBaseGadget {
|
|||||||
private final Position pos;
|
private final Position pos;
|
||||||
private final Position rot;
|
private final Position rot;
|
||||||
private int gadgetId;
|
private int gadgetId;
|
||||||
|
|
||||||
private int state;
|
private int state;
|
||||||
private int pointType;
|
private int pointType;
|
||||||
private GadgetContent content;
|
private GadgetContent content;
|
||||||
private Int2FloatOpenHashMap fightProp;
|
private Int2FloatOpenHashMap fightProp;
|
||||||
private SceneGadget metaGadget;
|
private SceneGadget metaGadget;
|
||||||
|
|
||||||
public EntityGadget(Scene scene, int gadgetId, Position pos, Position rot) {
|
public EntityGadget(Scene scene, int gadgetId, Position pos, Position rot) {
|
||||||
super(scene);
|
super(scene);
|
||||||
this.data = GameData.getGadgetDataMap().get(gadgetId);
|
this.data = GameData.getGadgetDataMap().get(gadgetId);
|
||||||
@ -63,7 +63,7 @@ public class EntityGadget extends EntityBaseGadget {
|
|||||||
this(scene, gadgetId, pos, rot);
|
this(scene, gadgetId, pos, rot);
|
||||||
this.content = content;
|
this.content = content;
|
||||||
}
|
}
|
||||||
|
|
||||||
public GadgetData getGadgetData() {
|
public GadgetData getGadgetData() {
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
@ -77,7 +77,7 @@ public class EntityGadget extends EntityBaseGadget {
|
|||||||
public Position getRotation() {
|
public Position getRotation() {
|
||||||
return this.rot;
|
return this.rot;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getGadgetId() {
|
public int getGadgetId() {
|
||||||
return gadgetId;
|
return gadgetId;
|
||||||
}
|
}
|
||||||
@ -93,7 +93,7 @@ public class EntityGadget extends EntityBaseGadget {
|
|||||||
public void setState(int state) {
|
public void setState(int state) {
|
||||||
this.state = state;
|
this.state = state;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateState(int state){
|
public void updateState(int state){
|
||||||
this.setState(state);
|
this.setState(state);
|
||||||
this.getScene().broadcastPacket(new PacketGadgetStateNotify(this, state));
|
this.getScene().broadcastPacket(new PacketGadgetStateNotify(this, state));
|
||||||
@ -130,7 +130,7 @@ public class EntityGadget extends EntityBaseGadget {
|
|||||||
if (getContent() != null || getGadgetData() == null || getGadgetData().getType() == null) {
|
if (getContent() != null || getGadgetData() == null || getGadgetData().getType() == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
EntityType type = getGadgetData().getType();
|
EntityType type = getGadgetData().getType();
|
||||||
GadgetContent content = switch (type) {
|
GadgetContent content = switch (type) {
|
||||||
case GatherPoint -> new GadgetGatherPoint(this);
|
case GatherPoint -> new GadgetGatherPoint(this);
|
||||||
@ -138,9 +138,10 @@ public class EntityGadget extends EntityBaseGadget {
|
|||||||
case Worktop -> new GadgetWorktop(this);
|
case Worktop -> new GadgetWorktop(this);
|
||||||
case RewardStatue -> new GadgetRewardStatue(this);
|
case RewardStatue -> new GadgetRewardStatue(this);
|
||||||
case Chest -> new GadgetChest(this);
|
case Chest -> new GadgetChest(this);
|
||||||
|
case Gadget -> new GadgetObject(this);
|
||||||
default -> null;
|
default -> null;
|
||||||
};
|
};
|
||||||
|
|
||||||
this.content = content;
|
this.content = content;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -149,7 +150,7 @@ public class EntityGadget extends EntityBaseGadget {
|
|||||||
if (this.fightProp == null) this.fightProp = new Int2FloatOpenHashMap();
|
if (this.fightProp == null) this.fightProp = new Int2FloatOpenHashMap();
|
||||||
return this.fightProp;
|
return this.fightProp;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreate() {
|
public void onCreate() {
|
||||||
// Lua event
|
// Lua event
|
||||||
@ -166,7 +167,7 @@ public class EntityGadget extends EntityBaseGadget {
|
|||||||
}
|
}
|
||||||
getScene().getScriptManager().callEvent(EventType.EVENT_ANY_GADGET_DIE, new ScriptArgs(this.getConfigId()));
|
getScene().getScriptManager().callEvent(EventType.EVENT_ANY_GADGET_DIE, new ScriptArgs(this.getConfigId()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public SceneEntityInfo toProto() {
|
public SceneEntityInfo toProto() {
|
||||||
EntityAuthorityInfo authority = EntityAuthorityInfo.newBuilder()
|
EntityAuthorityInfo authority = EntityAuthorityInfo.newBuilder()
|
||||||
@ -175,7 +176,7 @@ public class EntityGadget extends EntityBaseGadget {
|
|||||||
.setAiInfo(SceneEntityAiInfo.newBuilder().setIsAiOpen(true).setBornPos(Vector.newBuilder()))
|
.setAiInfo(SceneEntityAiInfo.newBuilder().setIsAiOpen(true).setBornPos(Vector.newBuilder()))
|
||||||
.setBornPos(Vector.newBuilder())
|
.setBornPos(Vector.newBuilder())
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
SceneEntityInfo.Builder entityInfo = SceneEntityInfo.newBuilder()
|
SceneEntityInfo.Builder entityInfo = SceneEntityInfo.newBuilder()
|
||||||
.setEntityId(getId())
|
.setEntityId(getId())
|
||||||
.setEntityType(ProtEntityType.PROT_ENTITY_TYPE_GADGET)
|
.setEntityType(ProtEntityType.PROT_ENTITY_TYPE_GADGET)
|
||||||
@ -184,13 +185,13 @@ public class EntityGadget extends EntityBaseGadget {
|
|||||||
.setEntityClientData(EntityClientData.newBuilder())
|
.setEntityClientData(EntityClientData.newBuilder())
|
||||||
.setEntityAuthorityInfo(authority)
|
.setEntityAuthorityInfo(authority)
|
||||||
.setLifeState(1);
|
.setLifeState(1);
|
||||||
|
|
||||||
PropPair pair = PropPair.newBuilder()
|
PropPair pair = PropPair.newBuilder()
|
||||||
.setType(PlayerProperty.PROP_LEVEL.getId())
|
.setType(PlayerProperty.PROP_LEVEL.getId())
|
||||||
.setPropValue(ProtoHelper.newPropValue(PlayerProperty.PROP_LEVEL, 1))
|
.setPropValue(ProtoHelper.newPropValue(PlayerProperty.PROP_LEVEL, 1))
|
||||||
.build();
|
.build();
|
||||||
entityInfo.addPropList(pair);
|
entityInfo.addPropList(pair);
|
||||||
|
|
||||||
// We do not use the getter to null check because the getter will create a fight prop map if it is null
|
// We do not use the getter to null check because the getter will create a fight prop map if it is null
|
||||||
if (this.fightProp != null) {
|
if (this.fightProp != null) {
|
||||||
this.addAllFightPropsToEntityInfo(entityInfo);
|
this.addAllFightPropsToEntityInfo(entityInfo);
|
||||||
@ -203,13 +204,13 @@ public class EntityGadget extends EntityBaseGadget {
|
|||||||
.setGadgetState(this.getState())
|
.setGadgetState(this.getState())
|
||||||
.setIsEnableInteract(true)
|
.setIsEnableInteract(true)
|
||||||
.setAuthorityPeerId(this.getScene().getWorld().getHostPeerId());
|
.setAuthorityPeerId(this.getScene().getWorld().getHostPeerId());
|
||||||
|
|
||||||
if (this.getContent() != null) {
|
if (this.getContent() != null) {
|
||||||
this.getContent().onBuildProto(gadgetInfo);
|
this.getContent().onBuildProto(gadgetInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
entityInfo.setGadget(gadgetInfo);
|
entityInfo.setGadget(gadgetInfo);
|
||||||
|
|
||||||
return entityInfo.build();
|
return entityInfo.build();
|
||||||
}
|
}
|
||||||
public void die() {
|
public void die() {
|
||||||
|
@ -0,0 +1,22 @@
|
|||||||
|
package emu.grasscutter.game.entity.gadget;
|
||||||
|
|
||||||
|
import emu.grasscutter.game.entity.EntityGadget;
|
||||||
|
import emu.grasscutter.game.player.Player;
|
||||||
|
import emu.grasscutter.net.proto.GadgetInteractReqOuterClass;
|
||||||
|
import emu.grasscutter.net.proto.SceneGadgetInfoOuterClass;
|
||||||
|
|
||||||
|
public class GadgetObject extends GadgetContent{
|
||||||
|
public GadgetObject(EntityGadget gadget) {
|
||||||
|
super(gadget);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onInteract(Player player, GadgetInteractReqOuterClass.GadgetInteractReq req) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onBuildProto(SceneGadgetInfoOuterClass.SceneGadgetInfo.Builder gadgetInfo) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -75,11 +75,11 @@ public class Scene {
|
|||||||
public World getWorld() {
|
public World getWorld() {
|
||||||
return world;
|
return world;
|
||||||
}
|
}
|
||||||
|
|
||||||
public SceneData getSceneData() {
|
public SceneData getSceneData() {
|
||||||
return this.sceneData;
|
return this.sceneData;
|
||||||
}
|
}
|
||||||
|
|
||||||
public SceneType getSceneType() {
|
public SceneType getSceneType() {
|
||||||
return getSceneData().getSceneType();
|
return getSceneData().getSceneType();
|
||||||
}
|
}
|
||||||
@ -201,18 +201,18 @@ public class Scene {
|
|||||||
public boolean isInScene(GameEntity entity) {
|
public boolean isInScene(GameEntity entity) {
|
||||||
return this.entities.containsKey(entity.getId());
|
return this.entities.containsKey(entity.getId());
|
||||||
}
|
}
|
||||||
|
|
||||||
public synchronized void addPlayer(Player player) {
|
public synchronized void addPlayer(Player player) {
|
||||||
// Check if player already in
|
// Check if player already in
|
||||||
if (getPlayers().contains(player)) {
|
if (getPlayers().contains(player)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Remove player from prev scene
|
// Remove player from prev scene
|
||||||
if (player.getScene() != null) {
|
if (player.getScene() != null) {
|
||||||
player.getScene().removePlayer(player);
|
player.getScene().removePlayer(player);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add
|
// Add
|
||||||
getPlayers().add(player);
|
getPlayers().add(player);
|
||||||
player.setSceneId(this.getId());
|
player.setSceneId(this.getId());
|
||||||
@ -220,31 +220,31 @@ public class Scene {
|
|||||||
|
|
||||||
this.setupPlayerAvatars(player);
|
this.setupPlayerAvatars(player);
|
||||||
}
|
}
|
||||||
|
|
||||||
public synchronized void removePlayer(Player player) {
|
public synchronized void removePlayer(Player player) {
|
||||||
// Remove from challenge if leaving
|
// Remove from challenge if leaving
|
||||||
if (this.getChallenge() != null && this.getChallenge().inProgress()) {
|
if (this.getChallenge() != null && this.getChallenge().inProgress()) {
|
||||||
player.sendPacket(new PacketDungeonChallengeFinishNotify(this.getChallenge()));
|
player.sendPacket(new PacketDungeonChallengeFinishNotify(this.getChallenge()));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Remove player from scene
|
// Remove player from scene
|
||||||
getPlayers().remove(player);
|
getPlayers().remove(player);
|
||||||
player.setScene(null);
|
player.setScene(null);
|
||||||
|
|
||||||
// Remove player avatars
|
// Remove player avatars
|
||||||
this.removePlayerAvatars(player);
|
this.removePlayerAvatars(player);
|
||||||
|
|
||||||
// Remove player gadgets
|
// Remove player gadgets
|
||||||
for (EntityBaseGadget gadget : player.getTeamManager().getGadgets()) {
|
for (EntityBaseGadget gadget : player.getTeamManager().getGadgets()) {
|
||||||
this.removeEntity(gadget);
|
this.removeEntity(gadget);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Deregister scene if not in use
|
// Deregister scene if not in use
|
||||||
if (this.getPlayerCount() <= 0 && !this.dontDestroyWhenEmpty()) {
|
if (this.getPlayerCount() <= 0 && !this.dontDestroyWhenEmpty()) {
|
||||||
this.getWorld().deregisterScene(this);
|
this.getWorld().deregisterScene(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setupPlayerAvatars(Player player) {
|
private void setupPlayerAvatars(Player player) {
|
||||||
// Clear entities from old team
|
// Clear entities from old team
|
||||||
player.getTeamManager().getActiveTeam().clear();
|
player.getTeamManager().getActiveTeam().clear();
|
||||||
@ -255,13 +255,13 @@ public class Scene {
|
|||||||
EntityAvatar entity = new EntityAvatar(player.getScene(), player.getAvatars().getAvatarById(avatarId));
|
EntityAvatar entity = new EntityAvatar(player.getScene(), player.getAvatars().getAvatarById(avatarId));
|
||||||
player.getTeamManager().getActiveTeam().add(entity);
|
player.getTeamManager().getActiveTeam().add(entity);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Limit character index in case its out of bounds
|
// Limit character index in case its out of bounds
|
||||||
if (player.getTeamManager().getCurrentCharacterIndex() >= player.getTeamManager().getActiveTeam().size() || player.getTeamManager().getCurrentCharacterIndex() < 0) {
|
if (player.getTeamManager().getCurrentCharacterIndex() >= player.getTeamManager().getActiveTeam().size() || player.getTeamManager().getCurrentCharacterIndex() < 0) {
|
||||||
player.getTeamManager().setCurrentCharacterIndex(player.getTeamManager().getCurrentCharacterIndex() - 1);
|
player.getTeamManager().setCurrentCharacterIndex(player.getTeamManager().getCurrentCharacterIndex() - 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void removePlayerAvatars(Player player) {
|
private void removePlayerAvatars(Player player) {
|
||||||
Iterator<EntityAvatar> it = player.getTeamManager().getActiveTeam().iterator();
|
Iterator<EntityAvatar> it = player.getTeamManager().getActiveTeam().iterator();
|
||||||
while (it.hasNext()) {
|
while (it.hasNext()) {
|
||||||
@ -269,18 +269,18 @@ public class Scene {
|
|||||||
it.remove();
|
it.remove();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void spawnPlayer(Player player) {
|
public void spawnPlayer(Player player) {
|
||||||
if (this.isInScene(player.getTeamManager().getCurrentAvatarEntity())) {
|
if (this.isInScene(player.getTeamManager().getCurrentAvatarEntity())) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (player.getTeamManager().getCurrentAvatarEntity().getFightProperty(FightProperty.FIGHT_PROP_CUR_HP) <= 0f) {
|
if (player.getTeamManager().getCurrentAvatarEntity().getFightProperty(FightProperty.FIGHT_PROP_CUR_HP) <= 0f) {
|
||||||
player.getTeamManager().getCurrentAvatarEntity().setFightProperty(FightProperty.FIGHT_PROP_CUR_HP, 1f);
|
player.getTeamManager().getCurrentAvatarEntity().setFightProperty(FightProperty.FIGHT_PROP_CUR_HP, 1f);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.addEntity(player.getTeamManager().getCurrentAvatarEntity());
|
this.addEntity(player.getTeamManager().getCurrentAvatarEntity());
|
||||||
|
|
||||||
// Notify the client of any extra skill charges
|
// Notify the client of any extra skill charges
|
||||||
for (EntityAvatar entity : player.getTeamManager().getActiveTeam()) {
|
for (EntityAvatar entity : player.getTeamManager().getActiveTeam()) {
|
||||||
if (entity.getAvatar().getSkillExtraChargeMap().size() > 0) {
|
if (entity.getAvatar().getSkillExtraChargeMap().size() > 0) {
|
||||||
@ -288,12 +288,12 @@ public class Scene {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addEntityDirectly(GameEntity entity) {
|
private void addEntityDirectly(GameEntity entity) {
|
||||||
getEntities().put(entity.getId(), entity);
|
getEntities().put(entity.getId(), entity);
|
||||||
entity.onCreate(); // Call entity create event
|
entity.onCreate(); // Call entity create event
|
||||||
}
|
}
|
||||||
|
|
||||||
public synchronized void addEntity(GameEntity entity) {
|
public synchronized void addEntity(GameEntity entity) {
|
||||||
this.addEntityDirectly(entity);
|
this.addEntityDirectly(entity);
|
||||||
this.broadcastPacket(new PacketSceneEntityAppearNotify(entity));
|
this.broadcastPacket(new PacketSceneEntityAppearNotify(entity));
|
||||||
@ -307,7 +307,7 @@ public class Scene {
|
|||||||
public void addEntities(Collection<? extends GameEntity> entities){
|
public void addEntities(Collection<? extends GameEntity> entities){
|
||||||
addEntities(entities, VisionType.VISION_TYPE_BORN);
|
addEntities(entities, VisionType.VISION_TYPE_BORN);
|
||||||
}
|
}
|
||||||
|
|
||||||
public synchronized void addEntities(Collection<? extends GameEntity> entities, VisionType visionType) {
|
public synchronized void addEntities(Collection<? extends GameEntity> entities, VisionType visionType) {
|
||||||
if(entities == null || entities.isEmpty()){
|
if(entities == null || entities.isEmpty()){
|
||||||
return;
|
return;
|
||||||
@ -315,18 +315,18 @@ public class Scene {
|
|||||||
for (GameEntity entity : entities) {
|
for (GameEntity entity : entities) {
|
||||||
this.addEntityDirectly(entity);
|
this.addEntityDirectly(entity);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.broadcastPacket(new PacketSceneEntityAppearNotify(entities, visionType));
|
this.broadcastPacket(new PacketSceneEntityAppearNotify(entities, visionType));
|
||||||
}
|
}
|
||||||
|
|
||||||
private GameEntity removeEntityDirectly(GameEntity entity) {
|
private GameEntity removeEntityDirectly(GameEntity entity) {
|
||||||
return getEntities().remove(entity.getId());
|
return getEntities().remove(entity.getId());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void removeEntity(GameEntity entity) {
|
public void removeEntity(GameEntity entity) {
|
||||||
this.removeEntity(entity, VisionType.VISION_TYPE_DIE);
|
this.removeEntity(entity, VisionType.VISION_TYPE_DIE);
|
||||||
}
|
}
|
||||||
|
|
||||||
public synchronized void removeEntity(GameEntity entity, VisionType visionType) {
|
public synchronized void removeEntity(GameEntity entity, VisionType visionType) {
|
||||||
GameEntity removed = this.removeEntityDirectly(entity);
|
GameEntity removed = this.removeEntityDirectly(entity);
|
||||||
if (removed != null) {
|
if (removed != null) {
|
||||||
@ -351,7 +351,7 @@ public class Scene {
|
|||||||
public void showOtherEntities(Player player) {
|
public void showOtherEntities(Player player) {
|
||||||
List<GameEntity> entities = new LinkedList<>();
|
List<GameEntity> entities = new LinkedList<>();
|
||||||
GameEntity currentEntity = player.getTeamManager().getCurrentAvatarEntity();
|
GameEntity currentEntity = player.getTeamManager().getCurrentAvatarEntity();
|
||||||
|
|
||||||
for (GameEntity entity : this.getEntities().values()) {
|
for (GameEntity entity : this.getEntities().values()) {
|
||||||
if (entity == currentEntity) {
|
if (entity == currentEntity) {
|
||||||
continue;
|
continue;
|
||||||
@ -361,26 +361,26 @@ public class Scene {
|
|||||||
|
|
||||||
player.sendPacket(new PacketSceneEntityAppearNotify(entities, VisionType.VISION_TYPE_MEET));
|
player.sendPacket(new PacketSceneEntityAppearNotify(entities, VisionType.VISION_TYPE_MEET));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void handleAttack(AttackResult result) {
|
public void handleAttack(AttackResult result) {
|
||||||
//GameEntity attacker = getEntityById(result.getAttackerId());
|
//GameEntity attacker = getEntityById(result.getAttackerId());
|
||||||
GameEntity target = getEntityById(result.getDefenseId());
|
GameEntity target = getEntityById(result.getDefenseId());
|
||||||
|
|
||||||
if (target == null) {
|
if (target == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Godmode check
|
// Godmode check
|
||||||
if (target instanceof EntityAvatar) {
|
if (target instanceof EntityAvatar) {
|
||||||
if (((EntityAvatar) target).getPlayer().inGodmode()) {
|
if (((EntityAvatar) target).getPlayer().inGodmode()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sanity check
|
// Sanity check
|
||||||
target.damage(result.getDamage(), result.getAttackerId());
|
target.damage(result.getDamage(), result.getAttackerId());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void killEntity(GameEntity target, int attackerId) {
|
public void killEntity(GameEntity target, int attackerId) {
|
||||||
GameEntity attacker = getEntityById(attackerId);
|
GameEntity attacker = getEntityById(attackerId);
|
||||||
|
|
||||||
@ -404,7 +404,7 @@ public class Scene {
|
|||||||
}
|
}
|
||||||
|
|
||||||
this.removeEntity(target);
|
this.removeEntity(target);
|
||||||
|
|
||||||
// Death event
|
// Death event
|
||||||
target.onDeath(attackerId);
|
target.onDeath(attackerId);
|
||||||
}
|
}
|
||||||
@ -427,96 +427,102 @@ public class Scene {
|
|||||||
challenge.onCheckTimeOut();
|
challenge.onCheckTimeOut();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getEntityLevel(int baseLevel, int worldLevelOverride) {
|
public int getEntityLevel(int baseLevel, int worldLevelOverride) {
|
||||||
int level = worldLevelOverride > 0 ? worldLevelOverride + baseLevel - 22 : baseLevel;
|
int level = worldLevelOverride > 0 ? worldLevelOverride + baseLevel - 22 : baseLevel;
|
||||||
level = level >= 100 ? 100 : level;
|
level = level >= 100 ? 100 : level;
|
||||||
level = level <= 0 ? 1 : level;
|
level = level <= 0 ? 1 : level;
|
||||||
|
|
||||||
return level;
|
return level;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO - Test
|
// TODO - Test
|
||||||
public synchronized void checkSpawns() {
|
public synchronized void checkSpawns() {
|
||||||
|
int RANGE = 100;
|
||||||
|
|
||||||
SpatialIndex<SpawnGroupEntry> list = GameDepot.getSpawnListById(this.getId());
|
SpatialIndex<SpawnGroupEntry> list = GameDepot.getSpawnListById(this.getId());
|
||||||
Set<SpawnDataEntry> visible = new HashSet<>();
|
Set<SpawnDataEntry> visible = new HashSet<>();
|
||||||
|
|
||||||
for (Player player : this.getPlayers()) {
|
for (Player player : this.getPlayers()) {
|
||||||
int RANGE = 100;
|
Position position = player.getPos();
|
||||||
|
|
||||||
Collection<SpawnGroupEntry> entries = list.query(
|
Collection<SpawnGroupEntry> entries = list.query(
|
||||||
new double[] {player.getPos().getX() - RANGE, player.getPos().getZ() - RANGE},
|
new double[] {position.getX() - RANGE, position.getZ() - RANGE},
|
||||||
new double[] {player.getPos().getX() + RANGE, player.getPos().getZ() + RANGE}
|
new double[] {position.getX() + RANGE, position.getZ() + RANGE}
|
||||||
);
|
);
|
||||||
|
|
||||||
for (SpawnGroupEntry entry : entries) {
|
for (SpawnGroupEntry entry : entries) {
|
||||||
for (SpawnDataEntry spawnData : entry.getSpawns()) {
|
for (SpawnDataEntry spawnData : entry.getSpawns()) {
|
||||||
visible.add(spawnData);
|
visible.add(spawnData);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// World level
|
// World level
|
||||||
WorldLevelData worldLevelData = GameData.getWorldLevelDataMap().get(getWorld().getWorldLevel());
|
WorldLevelData worldLevelData = GameData.getWorldLevelDataMap().get(getWorld().getWorldLevel());
|
||||||
int worldLevelOverride = 0;
|
int worldLevelOverride = 0;
|
||||||
|
|
||||||
if (worldLevelData != null) {
|
if (worldLevelData != null) {
|
||||||
worldLevelOverride = worldLevelData.getMonsterLevel();
|
worldLevelOverride = worldLevelData.getMonsterLevel();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Todo
|
// Todo
|
||||||
List<GameEntity> toAdd = new LinkedList<>();
|
List<GameEntity> toAdd = new LinkedList<>();
|
||||||
List<GameEntity> toRemove = new LinkedList<>();
|
List<GameEntity> toRemove = new LinkedList<>();
|
||||||
|
var spawnedEntities = this.getSpawnedEntities();
|
||||||
for (SpawnDataEntry entry : visible) {
|
for (SpawnDataEntry entry : visible) {
|
||||||
// If spawn entry is in our view and hasnt been spawned/killed yet, we should spawn it
|
// If spawn entry is in our view and hasnt been spawned/killed yet, we should spawn it
|
||||||
if (!this.getSpawnedEntities().contains(entry) && !this.getDeadSpawnedEntities().contains(entry)) {
|
if (!spawnedEntities.contains(entry) && !this.getDeadSpawnedEntities().contains(entry)) {
|
||||||
// Entity object holder
|
// Entity object holder
|
||||||
GameEntity entity = null;
|
GameEntity entity = null;
|
||||||
|
|
||||||
// Check if spawn entry is monster or gadget
|
// Check if spawn entry is monster or gadget
|
||||||
if (entry.getMonsterId() > 0) {
|
if (entry.getMonsterId() > 0) {
|
||||||
MonsterData data = GameData.getMonsterDataMap().get(entry.getMonsterId());
|
MonsterData data = GameData.getMonsterDataMap().get(entry.getMonsterId());
|
||||||
if (data == null) continue;
|
if (data == null) continue;
|
||||||
|
|
||||||
int level = this.getEntityLevel(entry.getLevel(), worldLevelOverride);
|
int level = this.getEntityLevel(entry.getLevel(), worldLevelOverride);
|
||||||
|
|
||||||
EntityMonster monster = new EntityMonster(this, data, entry.getPos(), level);
|
EntityMonster monster = new EntityMonster(this, data, entry.getPos(), level);
|
||||||
monster.getRotation().set(entry.getRot());
|
monster.getRotation().set(entry.getRot());
|
||||||
monster.setGroupId(entry.getGroup().getGroupId());
|
monster.setGroupId(entry.getGroup().getGroupId());
|
||||||
monster.setPoseId(entry.getPoseId());
|
monster.setPoseId(entry.getPoseId());
|
||||||
monster.setConfigId(entry.getConfigId());
|
monster.setConfigId(entry.getConfigId());
|
||||||
monster.setSpawnEntry(entry);
|
monster.setSpawnEntry(entry);
|
||||||
|
|
||||||
entity = monster;
|
entity = monster;
|
||||||
} else if (entry.getGadgetId() > 0) {
|
} else if (entry.getGadgetId() > 0) {
|
||||||
EntityGadget gadget = new EntityGadget(this, entry.getGadgetId(), entry.getPos(), entry.getRot());
|
EntityGadget gadget = new EntityGadget(this, entry.getGadgetId(), entry.getPos(), entry.getRot());
|
||||||
gadget.setGroupId(entry.getGroup().getGroupId());
|
gadget.setGroupId(entry.getGroup().getGroupId());
|
||||||
gadget.setConfigId(entry.getConfigId());
|
gadget.setConfigId(entry.getConfigId());
|
||||||
gadget.setSpawnEntry(entry);
|
gadget.setSpawnEntry(entry);
|
||||||
|
int state = entry.getGadgetState();
|
||||||
|
if(state>0) {
|
||||||
|
gadget.setState(state);
|
||||||
|
}
|
||||||
gadget.buildContent();
|
gadget.buildContent();
|
||||||
|
|
||||||
gadget.setFightProperty(FightProperty.FIGHT_PROP_BASE_HP, 99999);
|
gadget.setFightProperty(FightProperty.FIGHT_PROP_BASE_HP, 99999);
|
||||||
gadget.setFightProperty(FightProperty.FIGHT_PROP_CUR_HP, 99999);
|
gadget.setFightProperty(FightProperty.FIGHT_PROP_CUR_HP, 99999);
|
||||||
gadget.setFightProperty(FightProperty.FIGHT_PROP_MAX_HP, 99999);
|
gadget.setFightProperty(FightProperty.FIGHT_PROP_MAX_HP, 99999);
|
||||||
|
|
||||||
entity = gadget;
|
entity = gadget;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (entity == null) continue;
|
if (entity == null) continue;
|
||||||
|
|
||||||
// Add to scene and spawned list
|
// Add to scene and spawned list
|
||||||
toAdd.add(entity);
|
toAdd.add(entity);
|
||||||
getSpawnedEntities().add(entry);
|
spawnedEntities.add(entry);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (GameEntity entity : this.getEntities().values()) {
|
for (GameEntity entity : this.getEntities().values()) {
|
||||||
if (entity.getSpawnEntry() != null && !visible.contains(entity.getSpawnEntry())) {
|
var spawnEntry = entity.getSpawnEntry();
|
||||||
|
if (spawnEntry != null && !visible.contains(spawnEntry)) {
|
||||||
toRemove.add(entity);
|
toRemove.add(entity);
|
||||||
|
spawnedEntities.remove(spawnEntry);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (toAdd.size() > 0) {
|
if (toAdd.size() > 0) {
|
||||||
toAdd.stream().forEach(this::addEntityDirectly);
|
toAdd.stream().forEach(this::addEntityDirectly);
|
||||||
this.broadcastPacket(new PacketSceneEntityAppearNotify(toAdd, VisionType.VISION_TYPE_BORN));
|
this.broadcastPacket(new PacketSceneEntityAppearNotify(toAdd, VisionType.VISION_TYPE_BORN));
|
||||||
@ -615,10 +621,10 @@ public class Scene {
|
|||||||
if (group.init_config == null) {
|
if (group.init_config == null) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Load garbages
|
// Load garbages
|
||||||
List<SceneGadget> garbageGadgets = group.getGarbageGadgets();
|
List<SceneGadget> garbageGadgets = group.getGarbageGadgets();
|
||||||
|
|
||||||
if (garbageGadgets != null) {
|
if (garbageGadgets != null) {
|
||||||
entities.addAll(garbageGadgets.stream().map(g -> scriptManager.createGadget(group.id, group.block_id, g))
|
entities.addAll(garbageGadgets.stream().map(g -> scriptManager.createGadget(group.id, group.block_id, g))
|
||||||
.filter(Objects::nonNull)
|
.filter(Objects::nonNull)
|
||||||
@ -647,7 +653,7 @@ public class Scene {
|
|||||||
//groups.forEach(g -> scriptManager.callEvent(EventType.EVENT_GROUP_LOAD, null));
|
//groups.forEach(g -> scriptManager.callEvent(EventType.EVENT_GROUP_LOAD, null));
|
||||||
Grasscutter.getLogger().info("Scene {} loaded {} group(s)", this.getId(), groups.size());
|
Grasscutter.getLogger().info("Scene {} loaded {} group(s)", this.getId(), groups.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onUnloadBlock(SceneBlock block) {
|
public void onUnloadBlock(SceneBlock block) {
|
||||||
List<GameEntity> toRemove = this.getEntities().values().stream()
|
List<GameEntity> toRemove = this.getEntities().values().stream()
|
||||||
.filter(e -> e.getBlockId() == block.id).toList();
|
.filter(e -> e.getBlockId() == block.id).toList();
|
||||||
@ -669,53 +675,53 @@ public class Scene {
|
|||||||
Grasscutter.getLogger().info("Scene {} Block {} is unloaded.", this.getId(), block.id);
|
Grasscutter.getLogger().info("Scene {} Block {} is unloaded.", this.getId(), block.id);
|
||||||
}
|
}
|
||||||
// Gadgets
|
// Gadgets
|
||||||
|
|
||||||
public void onPlayerCreateGadget(EntityClientGadget gadget) {
|
public void onPlayerCreateGadget(EntityClientGadget gadget) {
|
||||||
// Directly add
|
// Directly add
|
||||||
this.addEntityDirectly(gadget);
|
this.addEntityDirectly(gadget);
|
||||||
|
|
||||||
// Add to owner's gadget list
|
// Add to owner's gadget list
|
||||||
gadget.getOwner().getTeamManager().getGadgets().add(gadget);
|
gadget.getOwner().getTeamManager().getGadgets().add(gadget);
|
||||||
|
|
||||||
// Optimization
|
// Optimization
|
||||||
if (this.getPlayerCount() == 1 && this.getPlayers().get(0) == gadget.getOwner()) {
|
if (this.getPlayerCount() == 1 && this.getPlayers().get(0) == gadget.getOwner()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.broadcastPacketToOthers(gadget.getOwner(), new PacketSceneEntityAppearNotify(gadget));
|
this.broadcastPacketToOthers(gadget.getOwner(), new PacketSceneEntityAppearNotify(gadget));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onPlayerDestroyGadget(int entityId) {
|
public void onPlayerDestroyGadget(int entityId) {
|
||||||
GameEntity entity = getEntities().get(entityId);
|
GameEntity entity = getEntities().get(entityId);
|
||||||
|
|
||||||
if (entity == null || !(entity instanceof EntityClientGadget)) {
|
if (entity == null || !(entity instanceof EntityClientGadget)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get and remove entity
|
// Get and remove entity
|
||||||
EntityClientGadget gadget = (EntityClientGadget) entity;
|
EntityClientGadget gadget = (EntityClientGadget) entity;
|
||||||
this.removeEntityDirectly(gadget);
|
this.removeEntityDirectly(gadget);
|
||||||
|
|
||||||
// Remove from owner's gadget list
|
// Remove from owner's gadget list
|
||||||
gadget.getOwner().getTeamManager().getGadgets().remove(gadget);
|
gadget.getOwner().getTeamManager().getGadgets().remove(gadget);
|
||||||
|
|
||||||
// Optimization
|
// Optimization
|
||||||
if (this.getPlayerCount() == 1 && this.getPlayers().get(0) == gadget.getOwner()) {
|
if (this.getPlayerCount() == 1 && this.getPlayers().get(0) == gadget.getOwner()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.broadcastPacketToOthers(gadget.getOwner(), new PacketSceneEntityDisappearNotify(gadget, VisionType.VISION_TYPE_DIE));
|
this.broadcastPacketToOthers(gadget.getOwner(), new PacketSceneEntityDisappearNotify(gadget, VisionType.VISION_TYPE_DIE));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Broadcasting
|
// Broadcasting
|
||||||
|
|
||||||
public void broadcastPacket(BasePacket packet) {
|
public void broadcastPacket(BasePacket packet) {
|
||||||
// Send to all players - might have to check if player has been sent data packets
|
// Send to all players - might have to check if player has been sent data packets
|
||||||
for (Player player : this.getPlayers()) {
|
for (Player player : this.getPlayers()) {
|
||||||
player.getSession().send(packet);
|
player.getSession().send(packet);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void broadcastPacketToOthers(Player excludedPlayer, BasePacket packet) {
|
public void broadcastPacketToOthers(Player excludedPlayer, BasePacket packet) {
|
||||||
// Optimization
|
// Optimization
|
||||||
if (this.getPlayerCount() == 1 && this.getPlayers().get(0) == excludedPlayer) {
|
if (this.getPlayerCount() == 1 && this.getPlayers().get(0) == excludedPlayer) {
|
||||||
|
@ -12,9 +12,10 @@ public class SpawnDataEntry {
|
|||||||
private int level;
|
private int level;
|
||||||
private int poseId;
|
private int poseId;
|
||||||
private int gatherItemId;
|
private int gatherItemId;
|
||||||
|
private int gadgetState;
|
||||||
private Position pos;
|
private Position pos;
|
||||||
private Position rot;
|
private Position rot;
|
||||||
|
|
||||||
public SpawnGroupEntry getGroup() {
|
public SpawnGroupEntry getGroup() {
|
||||||
return group;
|
return group;
|
||||||
}
|
}
|
||||||
@ -26,23 +27,27 @@ public class SpawnDataEntry {
|
|||||||
public int getMonsterId() {
|
public int getMonsterId() {
|
||||||
return monsterId;
|
return monsterId;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getGadgetId() {
|
public int getGadgetId() {
|
||||||
return gadgetId;
|
return gadgetId;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getConfigId() {
|
public int getGadgetState() {
|
||||||
|
return gadgetState;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getConfigId() {
|
||||||
return configId;
|
return configId;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getLevel() {
|
public int getLevel() {
|
||||||
return level;
|
return level;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getPoseId() {
|
public int getPoseId() {
|
||||||
return poseId;
|
return poseId;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getGatherItemId() {
|
public int getGatherItemId() {
|
||||||
return gatherItemId;
|
return gatherItemId;
|
||||||
}
|
}
|
||||||
@ -50,18 +55,18 @@ public class SpawnDataEntry {
|
|||||||
public Position getPos() {
|
public Position getPos() {
|
||||||
return pos;
|
return pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Position getRot() {
|
public Position getRot() {
|
||||||
return rot;
|
return rot;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class SpawnGroupEntry {
|
public static class SpawnGroupEntry {
|
||||||
private int sceneId;
|
private int sceneId;
|
||||||
private int groupId;
|
private int groupId;
|
||||||
private int blockId;
|
private int blockId;
|
||||||
private Position pos;
|
private Position pos;
|
||||||
private List<SpawnDataEntry> spawns;
|
private List<SpawnDataEntry> spawns;
|
||||||
|
|
||||||
public int getSceneId() {
|
public int getSceneId() {
|
||||||
return sceneId;
|
return sceneId;
|
||||||
}
|
}
|
||||||
|
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue
Block a user