mirror of
https://github.com/Grasscutters/Grasscutter.git
synced 2025-12-14 07:55:57 +01:00
fix: home transfer (#2327)
* fix: home transfer * Update HomeSceneItem.java
This commit is contained in:
@@ -9,9 +9,12 @@ import emu.grasscutter.game.entity.EntityHomeAnimal;
|
||||
import emu.grasscutter.game.world.Position;
|
||||
import emu.grasscutter.game.world.Scene;
|
||||
import emu.grasscutter.net.proto.HomeSceneArrangementInfoOuterClass.HomeSceneArrangementInfo;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
import java.util.stream.Collectors;
|
||||
import lombok.*;
|
||||
import lombok.experimental.FieldDefaults;
|
||||
@@ -81,6 +84,21 @@ public class HomeSceneItem {
|
||||
return mainHouse == null || mainHouse.getAsItem() == null;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public Position getTeleportPointPos(int guid) {
|
||||
var pos = new AtomicReference<Position>();
|
||||
|
||||
this.getBlockItems().values().stream()
|
||||
.map(HomeBlockItem::getDeployFurnitureList)
|
||||
.flatMap(Collection::stream)
|
||||
.filter(homeFurnitureItem -> homeFurnitureItem.getGuid() == guid)
|
||||
.map(HomeFurnitureItem::getSpawnPos)
|
||||
.findFirst()
|
||||
.ifPresent(pos::set);
|
||||
|
||||
return pos.get();
|
||||
}
|
||||
|
||||
public List<EntityHomeAnimal> getAnimals(Scene scene) {
|
||||
return this.blockItems.values().stream()
|
||||
.map(HomeBlockItem::getDeployAnimalList)
|
||||
|
||||
@@ -2,11 +2,18 @@ package emu.grasscutter.game.home;
|
||||
|
||||
import emu.grasscutter.game.player.Player;
|
||||
import emu.grasscutter.game.props.EnterReason;
|
||||
import emu.grasscutter.game.world.*;
|
||||
import emu.grasscutter.game.world.Position;
|
||||
import emu.grasscutter.game.world.World;
|
||||
import emu.grasscutter.game.world.data.TeleportProperties;
|
||||
import emu.grasscutter.net.proto.*;
|
||||
import emu.grasscutter.server.event.player.*;
|
||||
import emu.grasscutter.server.game.*;
|
||||
import emu.grasscutter.net.proto.EnterTypeOuterClass;
|
||||
import emu.grasscutter.net.proto.OtherPlayerEnterHomeNotifyOuterClass;
|
||||
import emu.grasscutter.net.proto.PlayerApplyEnterHomeResultNotifyOuterClass;
|
||||
import emu.grasscutter.net.proto.RetcodeOuterClass;
|
||||
import emu.grasscutter.server.event.player.PlayerEnterHomeEvent;
|
||||
import emu.grasscutter.server.event.player.PlayerLeaveHomeEvent;
|
||||
import emu.grasscutter.server.event.player.PlayerTeleportEvent;
|
||||
import emu.grasscutter.server.game.BaseGameSystem;
|
||||
import emu.grasscutter.server.game.GameServer;
|
||||
import emu.grasscutter.server.packet.send.*;
|
||||
|
||||
public class HomeWorldMPSystem extends BaseGameSystem {
|
||||
@@ -98,10 +105,10 @@ public class HomeWorldMPSystem extends BaseGameSystem {
|
||||
return;
|
||||
}
|
||||
|
||||
this.enterHome(requester, owner);
|
||||
this.enterHome(requester, owner, 0, false);
|
||||
}
|
||||
|
||||
public void enterHome(Player requester, Player owner) {
|
||||
public void enterHome(Player requester, Player owner, int teleportPoint, boolean toSafe) {
|
||||
if (requester.getWorld().isMultiplayer()) {
|
||||
return;
|
||||
}
|
||||
@@ -134,9 +141,16 @@ public class HomeWorldMPSystem extends BaseGameSystem {
|
||||
}
|
||||
|
||||
int realmId = 2000 + owner.getCurrentRealmId();
|
||||
targetHome.getHomeSceneItem(realmId);
|
||||
var item = targetHome.getHomeSceneItem(realmId);
|
||||
targetHome.save();
|
||||
var pos = world.getSceneById(realmId).getScriptManager().getConfig().born_pos;
|
||||
var pos = toSafe ? world.getSceneById(realmId).getScriptManager().getConfig().born_pos : item.getBornPos();
|
||||
|
||||
if (teleportPoint != 0) {
|
||||
var target = item.getTeleportPointPos(teleportPoint);
|
||||
if (target != null) {
|
||||
pos = target;
|
||||
}
|
||||
}
|
||||
|
||||
requester.getPrevPosForHome().set(requester.getPosition());
|
||||
requester.setCurHomeWorld(world);
|
||||
@@ -188,21 +202,12 @@ public class HomeWorldMPSystem extends BaseGameSystem {
|
||||
player.getPosition().set(pos);
|
||||
var world = new World(player);
|
||||
world.addPlayer(player, prevScene);
|
||||
player
|
||||
.getCurHomeWorld()
|
||||
.sendPacketToHostIfOnline(
|
||||
new PacketOtherPlayerEnterOrLeaveHomeNotify(
|
||||
player,
|
||||
OtherPlayerEnterHomeNotifyOuterClass.OtherPlayerEnterHomeNotify.Reason.LEAVE));
|
||||
player.setCurHomeWorld(this.server.getHomeWorldOrCreate(player));
|
||||
player.getCurHomeWorld().sendPacketToHostIfOnline(new PacketOtherPlayerEnterOrLeaveHomeNotify(player, OtherPlayerEnterHomeNotifyOuterClass.OtherPlayerEnterHomeNotify.Reason.LEAVE));
|
||||
var myHome = this.server.getHomeWorldOrCreate(player);
|
||||
player.setCurHomeWorld(myHome);
|
||||
myHome.getHome().onOwnerLogin(player);
|
||||
|
||||
player.sendPacket(
|
||||
new PacketPlayerEnterSceneNotify(
|
||||
player,
|
||||
EnterTypeOuterClass.EnterType.ENTER_TYPE_BACK,
|
||||
EnterReason.TeamBack,
|
||||
prevScene,
|
||||
pos));
|
||||
player.sendPacket(new PacketPlayerEnterSceneNotify(player, EnterTypeOuterClass.EnterType.ENTER_TYPE_BACK, EnterReason.TeamBack, prevScene, pos));
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -234,13 +239,10 @@ public class HomeWorldMPSystem extends BaseGameSystem {
|
||||
victim.getPosition().set(victim.getPrevPosForHome());
|
||||
var world = new World(victim);
|
||||
world.addPlayer(victim, 3);
|
||||
victim
|
||||
.getCurHomeWorld()
|
||||
.sendPacketToHostIfOnline(
|
||||
new PacketOtherPlayerEnterOrLeaveHomeNotify(
|
||||
victim,
|
||||
OtherPlayerEnterHomeNotifyOuterClass.OtherPlayerEnterHomeNotify.Reason.LEAVE));
|
||||
victim.setCurHomeWorld(this.server.getHomeWorldOrCreate(victim));
|
||||
victim.getCurHomeWorld().sendPacketToHostIfOnline(new PacketOtherPlayerEnterOrLeaveHomeNotify(victim, OtherPlayerEnterHomeNotifyOuterClass.OtherPlayerEnterHomeNotify.Reason.LEAVE));
|
||||
var myHome = this.server.getHomeWorldOrCreate(victim);
|
||||
victim.setCurHomeWorld(myHome);
|
||||
myHome.getHome().onOwnerLogin(victim);
|
||||
|
||||
victim.sendPacket(
|
||||
new PacketPlayerEnterSceneNotify(
|
||||
|
||||
Reference in New Issue
Block a user