mirror of
https://github.com/Grasscutters/Grasscutter.git
synced 2025-01-24 14:03:02 +08:00
Add PlayerSwitchAvatarEvent
This commit is contained in:
parent
e3f15bca47
commit
dbc45f36f0
@ -1,7 +1,5 @@
|
|||||||
package emu.grasscutter.game.player;
|
package emu.grasscutter.game.player;
|
||||||
|
|
||||||
import static emu.grasscutter.config.Configuration.GAME_OPTIONS;
|
|
||||||
|
|
||||||
import dev.morphia.annotations.*;
|
import dev.morphia.annotations.*;
|
||||||
import emu.grasscutter.*;
|
import emu.grasscutter.*;
|
||||||
import emu.grasscutter.data.GameData;
|
import emu.grasscutter.data.GameData;
|
||||||
@ -18,14 +16,17 @@ import emu.grasscutter.net.proto.PlayerDieTypeOuterClass.PlayerDieType;
|
|||||||
import emu.grasscutter.net.proto.RetcodeOuterClass.Retcode;
|
import emu.grasscutter.net.proto.RetcodeOuterClass.Retcode;
|
||||||
import emu.grasscutter.net.proto.TrialAvatarGrantRecordOuterClass.TrialAvatarGrantRecord.GrantReason;
|
import emu.grasscutter.net.proto.TrialAvatarGrantRecordOuterClass.TrialAvatarGrantRecord.GrantReason;
|
||||||
import emu.grasscutter.server.event.entity.EntityCreationEvent;
|
import emu.grasscutter.server.event.entity.EntityCreationEvent;
|
||||||
import emu.grasscutter.server.event.player.PlayerTeamDeathEvent;
|
import emu.grasscutter.server.event.player.*;
|
||||||
import emu.grasscutter.server.packet.send.*;
|
import emu.grasscutter.server.packet.send.*;
|
||||||
import emu.grasscutter.utils.Utils;
|
import emu.grasscutter.utils.Utils;
|
||||||
import it.unimi.dsi.fastutil.ints.*;
|
import it.unimi.dsi.fastutil.ints.*;
|
||||||
import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
|
import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
|
||||||
|
import lombok.*;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
import lombok.*;
|
|
||||||
|
import static emu.grasscutter.config.Configuration.GAME_OPTIONS;
|
||||||
|
|
||||||
@Entity
|
@Entity
|
||||||
public final class TeamManager extends BasePlayerDataManager {
|
public final class TeamManager extends BasePlayerDataManager {
|
||||||
@ -187,7 +188,7 @@ public final class TeamManager extends BasePlayerDataManager {
|
|||||||
|
|
||||||
public EntityAvatar getCurrentAvatarEntity() {
|
public EntityAvatar getCurrentAvatarEntity() {
|
||||||
// Check if any avatars are equipped.
|
// Check if any avatars are equipped.
|
||||||
if (this.getActiveTeam().size() == 0) return null;
|
if (this.getActiveTeam().isEmpty()) return null;
|
||||||
|
|
||||||
if (this.currentCharacterIndex >= this.getActiveTeam().size()) {
|
if (this.currentCharacterIndex >= this.getActiveTeam().size()) {
|
||||||
this.currentCharacterIndex = 0; // Reset to the first character.
|
this.currentCharacterIndex = 0; // Reset to the first character.
|
||||||
@ -424,15 +425,23 @@ public final class TeamManager extends BasePlayerDataManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Check if character changed
|
// Check if character changed
|
||||||
if (currentEntity != this.getCurrentAvatarEntity()) {
|
var newAvatarEntity = this.getCurrentAvatarEntity();
|
||||||
|
if (currentEntity != null &&
|
||||||
|
newAvatarEntity != null &&
|
||||||
|
currentEntity != newAvatarEntity) {
|
||||||
|
// Call PlayerSwitchAvatarEvent.
|
||||||
|
var event = new PlayerSwitchAvatarEvent(this.getPlayer(),
|
||||||
|
currentEntity.getAvatar(), newAvatarEntity.getAvatar());
|
||||||
|
if (!event.call()) return;
|
||||||
|
|
||||||
// Remove and Add
|
// Remove and Add
|
||||||
this.getPlayer().getScene().replaceEntity(currentEntity, this.getCurrentAvatarEntity());
|
this.getPlayer().getScene().replaceEntity(currentEntity, newAvatarEntity);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public synchronized void setupAvatarTeam(int teamId, List<Long> list) {
|
public synchronized void setupAvatarTeam(int teamId, List<Long> list) {
|
||||||
// Sanity checks
|
// Sanity checks
|
||||||
if (list.size() == 0
|
if (list.isEmpty()
|
||||||
|| list.size() > this.getMaxTeamSize()
|
|| list.size() > this.getMaxTeamSize()
|
||||||
|| this.getPlayer().isInMultiplayer()) {
|
|| this.getPlayer().isInMultiplayer()) {
|
||||||
return;
|
return;
|
||||||
@ -732,10 +741,14 @@ public final class TeamManager extends BasePlayerDataManager {
|
|||||||
this.getPlayer().sendPacket(new PacketChangeTeamNameRsp(teamId, teamName));
|
this.getPlayer().sendPacket(new PacketChangeTeamNameRsp(teamId, teamName));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Swaps the current avatar in the scene.
|
||||||
|
*
|
||||||
|
* @param guid The GUID of the avatar to swap to.
|
||||||
|
*/
|
||||||
public synchronized void changeAvatar(long guid) {
|
public synchronized void changeAvatar(long guid) {
|
||||||
EntityAvatar oldEntity = this.getCurrentAvatarEntity();
|
EntityAvatar oldEntity = this.getCurrentAvatarEntity();
|
||||||
|
if (oldEntity == null || guid == oldEntity.getAvatar().getGuid()) {
|
||||||
if (guid == oldEntity.getAvatar().getGuid()) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -752,6 +765,13 @@ public final class TeamManager extends BasePlayerDataManager {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Call PlayerSwitchAvatarEvent.
|
||||||
|
var event = new PlayerSwitchAvatarEvent(this.getPlayer(),
|
||||||
|
oldEntity.getAvatar(), newEntity.getAvatar());
|
||||||
|
if (!event.call()) return;
|
||||||
|
|
||||||
|
newEntity = event.getNewAvatarEntity();
|
||||||
|
|
||||||
// Set index
|
// Set index
|
||||||
this.setCurrentCharacterIndex(index);
|
this.setCurrentCharacterIndex(index);
|
||||||
|
|
||||||
|
@ -0,0 +1,37 @@
|
|||||||
|
package emu.grasscutter.server.event.player;
|
||||||
|
|
||||||
|
import emu.grasscutter.game.avatar.Avatar;
|
||||||
|
import emu.grasscutter.game.entity.EntityAvatar;
|
||||||
|
import emu.grasscutter.game.player.Player;
|
||||||
|
import emu.grasscutter.server.event.Cancellable;
|
||||||
|
import emu.grasscutter.server.event.types.PlayerEvent;
|
||||||
|
import lombok.*;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
public final class PlayerSwitchAvatarEvent extends PlayerEvent implements Cancellable {
|
||||||
|
private final Avatar previousAvatar;
|
||||||
|
@Setter private Avatar newAvatar;
|
||||||
|
|
||||||
|
public PlayerSwitchAvatarEvent(Player player,
|
||||||
|
Avatar previousAvatar,
|
||||||
|
Avatar newAvatar) {
|
||||||
|
super(player);
|
||||||
|
|
||||||
|
this.previousAvatar = previousAvatar;
|
||||||
|
this.newAvatar = newAvatar;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The previous avatar as an entity.
|
||||||
|
*/
|
||||||
|
public EntityAvatar getPreviousAvatarEntity() {
|
||||||
|
return this.previousAvatar.getAsEntity();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The new avatar as an entity.
|
||||||
|
*/
|
||||||
|
public EntityAvatar getNewAvatarEntity() {
|
||||||
|
return this.newAvatar.getAsEntity();
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user