-
Notifications
You must be signed in to change notification settings - Fork 2
Add player trade command (/wp trade <playerName>)
#298
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from 3 commits
b316b44
1822eae
7e81f22
86b1d14
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,93 @@ | ||
| package dansplugins.wildpets.commands; | ||
|
|
||
| import dansplugins.wildpets.data.EphemeralData; | ||
| import dansplugins.wildpets.exceptions.PetRecordNotFoundException; | ||
| import dansplugins.wildpets.pet.Pet; | ||
| import dansplugins.wildpets.pet.list.PetListRepository; | ||
| import dansplugins.wildpets.pet.record.PetRecord; | ||
| import dansplugins.wildpets.pet.record.PetRecordRepository; | ||
|
|
||
| import org.bukkit.Bukkit; | ||
| import org.bukkit.ChatColor; | ||
| import org.bukkit.command.CommandSender; | ||
| import org.bukkit.entity.Player; | ||
|
|
||
| import java.util.ArrayList; | ||
| import java.util.Arrays; | ||
|
|
||
| /** | ||
| * @author Daniel McCoy Stephenson | ||
| * Command to transfer a selected pet to another online player. | ||
| */ | ||
| public class TradeCommand extends AbstractPluginCommand { | ||
| private final EphemeralData ephemeralData; | ||
| private final PetListRepository petListRepository; | ||
| private final PetRecordRepository petRecordRepository; | ||
|
|
||
| public TradeCommand(EphemeralData ephemeralData, PetListRepository petListRepository, PetRecordRepository petRecordRepository) { | ||
| super(new ArrayList<>(Arrays.asList("trade")), new ArrayList<>(Arrays.asList("wp.trade"))); | ||
| this.ephemeralData = ephemeralData; | ||
| this.petListRepository = petListRepository; | ||
| this.petRecordRepository = petRecordRepository; | ||
| } | ||
|
|
||
| @Override | ||
| public boolean execute(CommandSender sender) { | ||
| sender.sendMessage(ChatColor.RED + "Usage: /wp trade (playerName)"); | ||
| return false; | ||
| } | ||
|
|
||
| @Override | ||
| public boolean execute(CommandSender sender, String[] args) { | ||
| if (!(sender instanceof Player)) { | ||
| return false; | ||
| } | ||
|
|
||
| Player player = (Player) sender; | ||
|
|
||
| Pet pet = ephemeralData.getPetSelectionForPlayer(player.getUniqueId()); | ||
| if (pet == null) { | ||
| player.sendMessage(ChatColor.RED + "No pet selected. Use /wp select first."); | ||
| return false; | ||
| } | ||
|
|
||
| if (args.length < 1) { | ||
| return execute(sender); | ||
| } | ||
|
|
||
| String targetName = args[0]; | ||
| Player targetPlayer = Bukkit.getPlayer(targetName); | ||
|
|
||
| if (targetPlayer == null) { | ||
| player.sendMessage(ChatColor.RED + "That player is not online."); | ||
| return false; | ||
|
Comment on lines
+58
to
+63
|
||
| } | ||
|
|
||
| if (targetPlayer.getUniqueId().equals(player.getUniqueId())) { | ||
| player.sendMessage(ChatColor.RED + "You cannot trade a pet to yourself."); | ||
| return false; | ||
| } | ||
|
|
||
| String petName = pet.getName(); | ||
|
|
||
| boolean success = petListRepository.transferPet(pet, targetPlayer.getUniqueId()); | ||
| if (!success) { | ||
| player.sendMessage(ChatColor.RED + "Failed to transfer pet."); | ||
| return false; | ||
| } | ||
|
|
||
| // Update pet record | ||
| try { | ||
| PetRecord petRecord = petRecordRepository.getPetRecord(pet.getUniqueID()); | ||
| petRecord.setOwnerUUID(targetPlayer.getUniqueId()); | ||
| } catch (PetRecordNotFoundException e) { | ||
| petRecordRepository.addPetRecord(pet); | ||
| } | ||
|
|
||
| ephemeralData.clearPetSelectionForPlayer(player.getUniqueId()); | ||
|
|
||
| player.sendMessage(ChatColor.GREEN + petName + " has been traded to " + targetPlayer.getName() + "."); | ||
| targetPlayer.sendMessage(ChatColor.GREEN + player.getName() + " has traded " + petName + " to you."); | ||
| return true; | ||
| } | ||
| } | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -50,6 +50,25 @@ public boolean removePet(Pet petToRemove) { | |
| return getPetList(petToRemove.getOwnerUUID()).removePet(petToRemove); | ||
| } | ||
|
|
||
| public boolean transferPet(Pet pet, UUID newOwnerUUID) { | ||
| PetList oldList = getPetList(pet.getOwnerUUID()); | ||
| if (oldList == null || !oldList.getPets().remove(pet)) { | ||
|
Comment on lines
+53
to
+55
|
||
| return false; | ||
| } | ||
|
|
||
| PetList newList = getPetList(newOwnerUUID); | ||
| if (newList == null) { | ||
| createPetListForPlayer(newOwnerUUID); | ||
| newList = getPetList(newOwnerUUID); | ||
| } | ||
|
|
||
| pet.setOwnerUUID(newOwnerUUID); | ||
| pet.removeFromAccessList(oldList.getOwnerUUID()); | ||
| pet.addToAccessList(newOwnerUUID); | ||
| newList.addPet(pet); | ||
| return true; | ||
|
Comment on lines
+59
to
+76
|
||
| } | ||
|
|
||
| public Pet getPet(Entity entity) { | ||
| for (PetList petList : getPetLists()) { | ||
| Pet pet = petList.getPet(entity.getUniqueId()); | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -44,5 +44,7 @@ permissions: | |
| default: true | ||
| wp.gather: | ||
| default: true | ||
| wp.trade: | ||
| default: true | ||
| wp.config: | ||
| default: op | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The missing-argument check happens after the selected-pet check, so
/wp tradewith no args can report "No pet selected" instead of showing usage. For consistency with commands likeRenameCommand, validateargs.lengthfirst (show usage), then validate selection/transfer prerequisites.