commit 3758e3d1e2a35e413b2cff9774851f918afc394a Author: Brandon <46827438+disclearing@users.noreply.github.com> Date: Mon May 1 19:59:40 2023 +0100 Oi oi fuck simplytrash <3 diff --git a/Configs + Precompiled/config/CrackShot/general.yml b/Configs + Precompiled/config/CrackShot/general.yml new file mode 100644 index 0000000..f9f9b77 --- /dev/null +++ b/Configs + Precompiled/config/CrackShot/general.yml @@ -0,0 +1,41 @@ +#Visit the Complete Guide to CrackShot for information on everything in the configuration. +#https://github.com/Shampaggon/CrackShot/wiki/The-Complete-Guide-to-CrackShot + +#Use this node to completely disable CrackShot in certain worlds. Example usage: +# +#Disabled_Worlds: +# - world_nether +# - world_the_end +# - world_foldername +# +#"Disabled_Worlds: []" means the list is empty. Change it to "Disabled_Worlds:" before listing worlds. +#Remember not to use any tabs. The spacing must also be correct. +Disabled_Worlds: [] + +#Use this module to limit the amount of weapons a player can have in the hot bar. +#If the specified amount is exceeded, the weapon cannot be used. Example usage: +# +#Inventory_Control: +# Group_Primary: +# Limit: 2 +# Group_BlaBlaBla: +# Limit: 2 +# Whatever_Name_You_Want: +# Limit: 2 +# +#You can create as many groups as you want. Messages and sounds are optional. +#Enforce these limits using the Inventory_Control node in the weapon's Item_Information module. +#The example below is used for the default weapon Bazooka. +Inventory_Control: + Group_Bazookas: + Limit: 1 + Message_Exceeded: "&e[IC] &bYou cannot have more than one Bazooka in the hot bar!" + Sounds_Exceeded: LAVA_POP-1-1-0 + +#A merged reload refers to the act of reloading multiple weapons in the same slot. +#Set "Disable" to true if you wish to prevent players from doing this. +#Messages and sounds are optional. +Merged_Reload: + Disable: false + Message_Denied: "&eYou cannot reload slots that contain more than one weapon!" + Sounds_Denied: VILLAGER_NO-1-1-0 \ No newline at end of file diff --git a/Configs + Precompiled/config/CrackShot/messages.yml b/Configs + Precompiled/config/CrackShot/messages.yml new file mode 100644 index 0000000..29d5b61 --- /dev/null +++ b/Configs + Precompiled/config/CrackShot/messages.yml @@ -0,0 +1,32 @@ +#Visit the Complete Guide to CrackShot for information on everything in the configuration. +#https://github.com/Shampaggon/CrackShot/wiki/The-Complete-Guide-to-CrackShot + +#These are the messages most likely to be seen by the ordinary, non-administrative player. +#Feel free to customize them to your liking. +# +#Notes: +# - Some messages use special variables, such as "", "" and "". +# They represent numbers, weapon names and the multiplication sign. +# - It is good practice to surround all messages with quotes ("). +# - To completely hide a message, provide an empty message. (i.e. Store_Created: "") +# - Color codes are not supported. + +#Permission-related messages. +NP_Weapon_Use: "You do not have permission to use this." +NP_Weapon_Craft: "You do not have permission to craft this." +NP_Store_Create: "You do not have permission to create this store." +NP_Store_Purchase: "You do not have permission to purchase this item." + +#Store-related messages. +Store_Created: "Store successfully created!" +Store_Cannot_Afford: "You cannot afford to purchase this item." +Store_Items_Needed: "You need ." +Store_Purchased: "Item purchased - " + +#The message displayed when the reload command is used on a weapon that cannot be reloaded. +#Not to be confused with "/shot config reload", which reloads the configuration. +Cannot_Reload: "This weapon cannot be reloaded." + +#The message displayed when a player receives a weapon given with the give command. +#The command in question has the format "/shot give <#>". +Weapon_Received: "Package received - " \ No newline at end of file diff --git a/Configs + Precompiled/config/CrackShot/weapons/defaultAttachments.yml b/Configs + Precompiled/config/CrackShot/weapons/defaultAttachments.yml new file mode 100644 index 0000000..ef73727 --- /dev/null +++ b/Configs + Precompiled/config/CrackShot/weapons/defaultAttachments.yml @@ -0,0 +1,54 @@ +M320: + Item_Information: + Attachments: + Type: accessory + Toggle_Delay: 5 + Sounds_Toggle: NOTE_STICKS-1-2-0 + Shooting: + Cancel_Left_Click_Block_Damage: true + Cancel_Right_Click_Interactions: true + Recoil_Amount: 2 + Projectile_Amount: 1 + Projectile_Type: egg + Projectile_Speed: 20 + Projectile_Damage: 1 + Sounds_Shoot: EXPLODE-1-2-0 + Sneak: + Enable: true + No_Recoil: true + Reload: + Enable: true + Reload_Amount: 1 + Reload_Duration: 45 + Sounds_Reloading: PISTON_EXTEND-1-1-10,SKELETON_WALK-1-0-20,PISTON_RETRACT-1-1-35 + Particles: + Enable: true + Particle_Impact_Anything: BLOCK_BREAK-24 + Explosions: + Enable: true + Damage_Multiplier: 10 + Explosion_No_Grief: true + Explosion_Radius: 5 + On_Impact_With_Anything: true + Projectile_Activation_Time: 5 + Sounds_Shooter: SHOOT_ARROW-2-2-0 + +Tactical_Knife: + Item_Information: + Item_Name: "&eTactical Knife" + Item_Type: 288 + Item_Lore: "&eA melee attachment.|&eNot intended for standalone use." + Melee_Mode: true + Sounds_Acquired: SHOOT_ARROW-1-0-0 + Hidden_From_List: true + Shooting: + Cancel_Left_Click_Block_Damage: true + Cancel_Right_Click_Interactions: true + Delay_Between_Shots: 20 + Projectile_Damage: 40 + Particles: + Enable: true + Particle_Hit: BLOCK_BREAK-55 + Hit_Events: + Enable: true + Sounds_Shooter: SHOOT_ARROW-1-0-0,SLIME_WALK-1-1-1 \ No newline at end of file diff --git a/Configs + Precompiled/config/CrackShot/weapons/defaultExplosives.yml b/Configs + Precompiled/config/CrackShot/weapons/defaultExplosives.yml new file mode 100644 index 0000000..a7a6b65 --- /dev/null +++ b/Configs + Precompiled/config/CrackShot/weapons/defaultExplosives.yml @@ -0,0 +1,232 @@ +CocoPops: + Item_Information: + Item_Name: "&eCocoPops" + Item_Type: 351~3 + Item_Lore: "&eA cluster bomb that releases|&e10 bomblets upon detonation." + Sounds_Acquired: BAT_TAKEOFF-1-1-0 + Remove_Unused_Tag: true + Shooting: + Right_Click_To_Shoot: true + Cancel_Right_Click_Interactions: true + Projectile_Amount: 1 + Projectile_Type: grenade + Projectile_Subtype: 351~3 + Projectile_Speed: 12 + Sounds_Projectile: EAT-2-1-28,EAT-2-1-32,EAT-2-1-36 + Sounds_Shoot: FIRE_IGNITE-2-0-0 + Cluster_Bombs: + Enable: true + Bomblet_Type: 362 + Delay_Before_Split: 40 + Number_Of_Splits: 1 + Number_Of_Bomblets: 10 + Speed_Of_Bomblets: 8 + Delay_Before_Detonation: 40 + Detonation_Delay_Variation: 10 + Particle_Release: BLOCK_BREAK-127 + Sounds_Release: BURP-2-1-0 + Explosions: + Enable: true + Damage_Multiplier: 25 + Explosion_No_Grief: true + Explosion_Radius: 4 + Sounds_Explode: ITEM_PICKUP-2-1-0 + Extras: + One_Time_Use: true + +Trinket: + Item_Information: + Item_Name: "&eTrinket" + Item_Type: 264 + Item_Lore: "&eLeft-click to set the owner.|&eExplodes when:|&e- picked up|&e- shot out of a dispenser|&e- a chest containing this item is opened|&e- placed in an item frame, and nearby|&e ...pressure plates are stepped on.|&e&oOwners cannot trigger their own traps." + Sounds_Acquired: BAT_TAKEOFF-1-1-0 + Explosive_Devices: + Enable: true + Device_Type: trap + Device_Info: true-true-true-false-false + Sounds_Deploy: ITEM_PICKUP-2-0-0 + Message_Trigger_Placer: "&e has triggered your booby trap!" + Message_Trigger_Victim: "&eYou have triggered 's booby trap!" + Sounds_Trigger: SHEEP_IDLE-2-1-0 + Explosions: + Enable: true + Damage_Multiplier: 50 + Explosion_No_Grief: true + Enable_Owner_Immunity: true + Explosion_Radius: 5 + Explosion_Potion_Effect: POISON-100-2,HUNGER-100-2 + Explosion_Delay: 10 + Sounds_Explode: WITHER_SHOOT-2-2-0 + +Putty: + Item_Information: + Item_Name: "&ePutty" + Item_Type: 404 + Item_Lore: "&eRemote explosives.|&eRight click to throw.|&eLeft click to detonate." + Sounds_Acquired: BAT_TAKEOFF-1-1-0 + Shooting: + Cancel_Left_Click_Block_Damage: true + Cancel_Right_Click_Interactions: true + Explosive_Devices: + Enable: true + Device_Type: itembomb + Device_Info: 2,10,159,159~14 + Sounds_Deploy: SHOOT_ARROW-1-0-0 + Sounds_Alert_Placer: CLICK-1-1-0 + Sounds_Trigger: SHEEP_SHEAR-1-2-0 + Explosions: + Enable: true + Explosion_No_Grief: true + Explosion_Radius: 5 + Explosion_Delay: 16 + Sounds_Explode: ZOMBIE_WOOD-2-0-0 + +C4: + Item_Information: + Item_Name: "&eC4" + Item_Type: 69 + Item_Lore: "&eRemote explosives.|&eRight click to place.|&eLeft click to detonate." + Sounds_Acquired: BAT_TAKEOFF-1-1-0 + Shooting: + Cancel_Left_Click_Block_Damage: true +# Ammo: +# Enable: true +# Ammo_Item_ID: 46 +# Take_Ammo_Per_Shot: true + Explosive_Devices: + Enable: true + Device_Type: remote + Device_Info: 2-1A-TheStabbyBunny + Sounds_Deploy: CHICKEN_EGG_POP-1-1-0 + Message_Disarm: "&eYou have disarmed an explosive device." + Message_Trigger_Placer: "&e has set off your C4!" + Message_Trigger_Victim: "&eYou have set off 's C4!" + Sounds_Alert_Placer: CLICK-1-1-0 + Sounds_Trigger: SHEEP_SHEAR-1-1-0 + Explosions: + Enable: true + Explosion_No_Grief: true + Explosion_Radius: 6 + Explosion_Delay: 16 + Sounds_Explode: ZOMBIE_WOOD-2-0-0 +# Extras: +# One_Time_Use: true + +Airstrike: + Item_Information: + Item_Name: "&eHarrier Strike" + Item_Type: 76 + Item_Lore: "&eCalls in an airstrike at the|&eposition of the thrown flare." + Sounds_Acquired: BAT_TAKEOFF-1-1-0 + Remove_Unused_Tag: true + Shooting: + Right_Click_To_Shoot: true + Cancel_Right_Click_Interactions: true + Projectile_Amount: 1 + Projectile_Type: flare + Projectile_Subtype: 76 + Projectile_Speed: 10 + Sounds_Shoot: FIRE_IGNITE-2-0-0,FIZZ-2-0-0 + Airstrikes: + Enable: true + Flare_Activation_Delay: 60 + Particle_Call_Airstrike: lightning + Message_Call_Airstrike: "&eFriendly airstrike on the way." + Block_Type: 85 + Area: 4 + Distance_Between_Bombs: 4 + Height_Dropped: 90 + Vertical_Variation: 10 + Horizontal_Variation: 10 + Multiple_Strikes: + Enable: true + Number_Of_Strikes: 3 + Delay_Between_Strikes: 20 + Sounds_Airstrike: ENDERMAN_STARE-2-2-0 + Explosions: + Enable: true + Explosion_No_Grief: true + Explosion_Radius: 4 + Sounds_Explode: ENDERDRAGON_HIT-2-2-0 + Extras: + One_Time_Use: true + +Grenade: + Item_Information: + Item_Name: "&eFrag Grenade" + Item_Type: 402 + Item_Lore: "&eExplodes three seconds after launch." + Sounds_Acquired: BAT_TAKEOFF-1-1-0 + Remove_Unused_Tag: true + Shooting: + Right_Click_To_Shoot: true + Cancel_Right_Click_Interactions: true + Delay_Between_Shots: 10 + Projectile_Amount: 1 + Projectile_Type: grenade + Projectile_Subtype: 46 + Projectile_Speed: 10 + Sounds_Shoot: SHOOT_ARROW-2-0-0 + Explosions: + Enable: true + Explosion_No_Grief: true + Explosion_Radius: 4 + Explosion_Delay: 60 + Extras: + One_Time_Use: true + +Flashbang: + Item_Information: + Item_Name: "&eFlashbang" + Item_Type: 351~8 + Item_Lore: "&eDisorientates the target upon detonation." + Sounds_Acquired: BAT_TAKEOFF-1-1-0 + Remove_Unused_Tag: true + Shooting: + Right_Click_To_Shoot: true + Cancel_Right_Click_Interactions: true + Delay_Between_Shots: 10 + Projectile_Amount: 1 + Projectile_Type: grenade + Projectile_Subtype: 351~8 + Projectile_Speed: 10 + Sounds_Shoot: SHOOT_ARROW-2-0-0 + Explosions: + Enable: true + Explosion_No_Grief: true + Explosion_No_Damage: true + Explosion_Radius: 6 + Explosion_Potion_Effect: BLINDNESS-120-1,SLOW-120-1 + Explosion_Delay: 20 + Sounds_Victim: LEVEL_UP-1-0-0 + Sounds_Explode: ANVIL_LAND-2-1-0 + Extras: + One_Time_Use: true + +Toaster: + Item_Information: + Item_Name: "&eToaster" + Item_Type: 343 + Item_Lore: "&eAnti-personnel mine.|&eTriggers a fiery explosion when:|&e- walked into by mobs or players|&e- struck with fists or items|&e- shot by projectiles" + Sounds_Acquired: BAT_TAKEOFF-1-1-0 + Remove_Unused_Tag: true + Shooting: + Right_Click_To_Shoot: true + Cancel_Right_Click_Interactions: true + Explosive_Devices: + Enable: true + Device_Type: landmine + Device_Info: 46,MINECART + Sounds_Deploy: ORB_PICKUP-2-2-0 + Message_Trigger_Placer: "&e has triggered your mine!" + Message_Trigger_Victim: "&eYou have triggered 's mine!" + Sounds_Trigger: ITEM_BREAK-2-1-0,ZOMBIE_UNFECT-2-2-0 + Explosions: + Enable: true + Ignite_Victims: 120 + Explosion_No_Grief: true + Explosion_Radius: 4 + Explosion_Delay: 16 + Sounds_Explode: FIRE-2-0-0,ZOMBIE_METAL-2-0-0 + Extras: + One_Time_Use: true \ No newline at end of file diff --git a/Configs + Precompiled/config/CrackShot/weapons/defaultWeapons.yml b/Configs + Precompiled/config/CrackShot/weapons/defaultWeapons.yml new file mode 100644 index 0000000..5b3556c --- /dev/null +++ b/Configs + Precompiled/config/CrackShot/weapons/defaultWeapons.yml @@ -0,0 +1,428 @@ +Gauss: + Item_Information: + Item_Name: "&eGauss Shotgun" + Item_Type: 417 + Item_Lore: "&eAdvanced pump-action shotgun.|&eFires metal slugs that penetrate|&eall targets within 40 blocks.|&eDeals 200% damage to Zombies." + Sounds_Acquired: BAT_TAKEOFF-1-1-0 + Shooting: + Cancel_Left_Click_Block_Damage: true + Cancel_Right_Click_Interactions: true + Projectile_Amount: 1 + Projectile_Type: energy + Projectile_Subtype: 40-1-NONE-0 + Projectile_Damage: 12 + Sounds_Shoot: WITHER_SHOOT-1-2-0,EXPLODE-1-2-0 + Reload: + Enable: true + Reload_Amount: 8 + Reload_Bullets_Individually: true + Reload_Duration: 10 + Sounds_Reloading: IRONGOLEM_THROW-1-2-0 + Firearm_Action: + Type: pump + Open_Duration: 12 + Close_Duration: 3 + Sound_Open: PISTON_EXTEND-1-2-0 + Sound_Close: PISTON_EXTEND-1-2-0 + Abilities: + Reset_Hit_Cooldown: true + Super_Effective: ZOMBIE-2 + Particles: + Enable: true + Particle_Player_Shoot: BLOCK_BREAK-57 + Hit_Events: + Enable: true + Sounds_Shooter: SHOOT_ARROW-1-2-0 + +Carbine: + Item_Information: + Item_Name: "&eCarbine" + Item_Type: 417 + Item_Lore: "&eDeals crits with a 10% chance.|&eSwitch to the grenade launcher|&ewith right click. Fired grenades|&earm themselves in 0.25 seconds." + Attachments: + Type: main + Info: "M320" + Toggle_Delay: 5 + Sounds_Toggle: NOTE_STICKS-1-2-0 + Sounds_Acquired: BAT_TAKEOFF-1-1-0 + Shooting: + Cancel_Left_Click_Block_Damage: true + Cancel_Right_Click_Interactions: true + Delay_Between_Shots: 3 + Recoil_Amount: 1 + Projectile_Amount: 1 + Projectile_Type: snowball + Projectile_Speed: 40 + Projectile_Damage: 4 + Bullet_Spread: 0.5 + Sounds_Shoot: BLAZE_HIT-1-2-0,ZOMBIE_WOOD-1-2-0 + Sneak: + Enable: true + No_Recoil: true + Bullet_Spread: 0.4 + Reload: + Enable: true + Reload_Amount: 8 + Reload_Duration: 30 + Sounds_Reloading: SKELETON_IDLE-1-0-0,FIRE_IGNITE-1-1-14,DOOR_OPEN-1-2-16,FIRE_IGNITE-1-1-26,HURT_FLESH-1-0-27,DOOR_CLOSE-1-2-28 + Firearm_Action: + Type: slide + Close_Duration: 8 + Sound_Close: CLICK-1-1-0 + Abilities: + Reset_Hit_Cooldown: true + Particles: + Enable: true + Particle_Impact_Anything: BLOCK_BREAK-80 + Particle_Critical: BLOCK_BREAK-55 + Hit_Events: + Enable: true + Sounds_Shooter: SHOOT_ARROW-1-2-0 + Critical_Hits: + Enable: true + Bonus_Damage: 2 + Chance: 10 + Sounds_Shooter: ORB_PICKUP-1-2-0 + +Deagle: + Item_Information: + Item_Name: "&eDesert Eagle" + Item_Type: 417 + Item_Lore: "&eDual pistols.|&eLeft/right click to shoot.|&eShoot enemies in the back|&efor bonus backstab damage." + Sounds_Acquired: BAT_TAKEOFF-1-1-0 + Shooting: + Dual_Wield: true + Cancel_Left_Click_Block_Damage: true + Cancel_Right_Click_Interactions: true + Delay_Between_Shots: 2 + Recoil_Amount: 2 + Projectile_Amount: 1 + Projectile_Type: egg + Projectile_Speed: 40 + Projectile_Damage: 4 + Bullet_Spread: 1 + Sounds_Shoot: ZOMBIE_WOOD-1-2-0,ZOMBIE_WOOD-1-0-0 + Sneak: + Enable: true + No_Recoil: true + Bullet_Spread: 0.75 + Reload: + Enable: true + Reload_Amount: 7 + Reload_Duration: 40 + Sounds_Out_Of_Ammo: CLICK-1-1-0 + Sounds_Reloading: DOOR_OPEN-1-2-4,DOOR_OPEN-1-2-8,DOOR_CLOSE-1-2-23,DOOR_CLOSE-1-2-38 + Dual_Wield: + Single_Reload_Duration: 25 + Sounds_Single_Reload: DOOR_OPEN-1-2-4,DOOR_CLOSE-1-2-23 + Sounds_Shoot_With_No_Ammo: CLICK-1-2-0 + Abilities: + Reset_Hit_Cooldown: true + Backstab: + Enable: true + Bonus_Damage: 2 + Sounds_Shooter: ORB_PICKUP-1-2-0 + Particles: + Enable: true + Particle_Backstab: BLOCK_BREAK-55 + Hit_Events: + Enable: true + Sounds_Shooter: SHOOT_ARROW-1-2-0 + +Bazooka: + Item_Information: + Item_Name: "&eBazooka" + Item_Type: 417 + Item_Lore: "&eRocket launcher.|&eFire down at your|&efeet to rocket-jump.|&eNegates fall damage." + Sounds_Acquired: BAT_TAKEOFF-1-1-0 + Inventory_Control: Group_Bazookas + Shooting: + Cancel_Left_Click_Block_Damage: true + Cancel_Right_Click_Interactions: true + Recoil_Amount: 2 + Projectile_Amount: 1 + Projectile_Type: fireball + Projectile_Speed: 10 + Sounds_Shoot: ZOMBIE_WOOD-1-0-0,FIZZ-1-1-0 + Sneak: + Enable: true + No_Recoil: true + Abilities: + No_Fall_Damage: true + Reload: + Enable: true + Reload_Amount: 1 + Reload_Duration: 55 + Sounds_Reloading: SKELETON_IDLE-1-0-10,PISTON_EXTEND-1-0-28,SKELETON_WALK-1-0-48 + Particles: + Enable: true + Particle_Player_Shoot: BLOCK_BREAK-35 + Shrapnel: + Enable: true + Block_Type: 77 + Amount: 14 + Speed: 7 + Explosions: + Enable: true + Knockback: 5 + Damage_Multiplier: 10 + Explosion_No_Grief: true + Explosion_Radius: 6 + Sounds_Shooter: SHOOT_ARROW-1-2-0 + +Python: + Item_Information: + Item_Name: "&ePython &l/&e Knife" + Item_Type: 417 + Item_Lore: "&eRevolver with high power.|&eLeft click to melee enemies|&ewith the tactical knife." + Melee_Attachment: Tactical_Knife + Sounds_Acquired: BAT_TAKEOFF-1-1-0 + Shooting: + Right_Click_To_Shoot: true + Cancel_Left_Click_Block_Damage: true + Cancel_Right_Click_Interactions: true + Delay_Between_Shots: 2 + Projectile_Amount: 1 + Projectile_Type: snowball + Projectile_Speed: 40 + Projectile_Damage: 6 + Bullet_Spread: 0.5 + Sounds_Shoot: IRONGOLEM_HIT-1-2-0,ZOMBIE_METAL-1-2-0 + Reload: + Enable: true + Reload_Amount: 6 + Reload_Duration: 35 + Sounds_Reloading: LEVEL_UP-1-1-10,FIRE_IGNITE-1-2-28 + Firearm_Action: + Type: revolver + Open_Duration: 5 + Close_Duration: 5 + Sound_Open: DOOR_OPEN-1-2-0 + Sound_Close: DOOR_CLOSE-1-2-0 + Abilities: + Reset_Hit_Cooldown: true + Hit_Events: + Enable: true + Sounds_Shooter: SHOOT_ARROW-1-2-0 + +Riotshield: + Item_Information: + Item_Name: "&eRiot Shield" + Item_Type: 267 + Item_Lore: "&eBlocks all melee and ranged attacks.|&eIneffective against attacks from behind." + Sounds_Acquired: BAT_TAKEOFF-1-1-0 + Remove_Unused_Tag: true + Riot_Shield: + Enable: true + Durability_Loss_Per_Hit: 10 + Sounds_Blocked: GLASS-2-2-0 + Sounds_Break: ITEM_BREAK-2-1-0 + +Olympia: + Item_Information: + Item_Name: "&eOlympia" + Item_Type: 417 + Item_Lore: "&eDouble-barreled shotgun.|&eDeadly at close range.|&eIneffective at longer ranges.|&eFires incendiary ammo." + Sounds_Acquired: BAT_TAKEOFF-1-1-0 + Shooting: + Cancel_Left_Click_Block_Damage: true + Cancel_Right_Click_Interactions: true + Delay_Between_Shots: 3 + Recoil_Amount: 5 + Projectile_Amount: 8 + Projectile_Type: egg + Removal_Or_Drag_Delay: 4-false + Projectile_Speed: 30 + Projectile_Damage: 5 + Projectile_Flames: true + Projectile_Incendiary: + Enable: true + Duration: 80 + Bullet_Spread: 1 + Reset_Fall_Distance: true + Sounds_Shoot: ZOMBIE_WOOD-1-1-0,EXPLODE-1-2-0,GHAST_FIREBALL-1-1-0 + Sneak: + Enable: true + No_Recoil: true + Bullet_Spread: 1 + Reload: + Enable: true + Reload_Amount: 2 + Reload_Bullets_Individually: true + Reload_Duration: 15 + Sounds_Reloading: NOTE_STICKS-1-1-0,NOTE_SNARE_DRUM-1-6-1 + Firearm_Action: + Type: break + Open_Duration: 10 + Close_Duration: 15 + Sound_Open: DOOR_OPEN-1-2-0 + Sound_Close: DOOR_CLOSE-1-2-0 + Abilities: + Reset_Hit_Cooldown: true + No_Fall_Damage: true + Hit_Events: + Enable: true + Sounds_Shooter: SHOOT_ARROW-1-2-0 + Damage_Based_On_Flight_Time: + Enable: true + Bonus_Damage_Per_Tick: -1 + Maximum_Damage: -4 + Particles: + Enable: true + Particle_Player_Shoot: FLAMES-1 + Particle_Impact_Anything: BLOCK_BREAK-51 + +Hunting: + Item_Information: + Item_Name: "&eHunting Rifle" + Item_Type: 417 + Item_Lore: "&eBolt-action rifle with high accuracy.|&eEquipped with a night vision scope.|&eDeals double damage on headshots." + Sounds_Acquired: BAT_TAKEOFF-1-1-0 + Shooting: + Cancel_Left_Click_Block_Damage: true + Cancel_Right_Click_Interactions: true + Projectile_Amount: 1 + Projectile_Type: snowball + Projectile_Speed: 1000 + Projectile_Damage: 12 + Sounds_Shoot: BLAZE_HIT-1-1-0,EXPLODE-1-2-0 + Custom_Death_Message: + Normal: "&e was sniped by 's Hunting Rifle!" + Reload: + Enable: true + Starting_Amount: 0 + Reload_Amount: 5 + Reload_Bullets_Individually: true + Reload_Duration: 10 + Sounds_Reloading: NOTE_STICKS-1-1-0 + Firearm_Action: + Type: bolt + Open_Duration: 8 + Close_Duration: 7 + Close_Shoot_Delay: 6 + Sound_Open: NOTE_STICKS-1-0-0,PISTON_RETRACT-1-2-2 + Sound_Close: PISTON_EXTEND-1-2-0 + Headshot: + Enable: true + Bonus_Damage: 12 + Sounds_Shooter: NOTE_PLING-1-2-0 + Sounds_Victim: VILLAGER_DEATH-1-1-0 + Abilities: + Reset_Hit_Cooldown: true + Knockback: 3 + Particles: + Enable: true + Particle_Player_Shoot: BLOCK_BREAK-1 + Particle_Terrain: true + Fireworks: + Enable: true + Firework_Headshot: STAR-TRUE-TRUE-250-0-0 + Scope: + Enable: true + Night_Vision: true + Zoom_Amount: 5 + Sounds_Toggle_Zoom: NOTE_STICKS-1-2-0 + Hit_Events: + Enable: true + Sounds_Shooter: SHOOT_ARROW-1-2-0 + +Type95: + Item_Information: + Item_Name: "&eType 95" + Item_Type: 417 + Item_Lore: "&eSemi-automatic with three round burst fire.|&eGhast Tears are required for reloads." + Sounds_Acquired: BAT_TAKEOFF-1-1-0 + SignShops: + Enable: true + Price: 266-10 + Sign_Gun_ID: 95 + Shooting: + Cancel_Left_Click_Block_Damage: true + Cancel_Right_Click_Interactions: true + Delay_Between_Shots: 7 + Recoil_Amount: 1 + Projectile_Amount: 1 + Projectile_Type: snowball + Projectile_Speed: 40 + Projectile_Damage: 4 + Bullet_Spread: 2 + Sounds_Shoot: ITEM_BREAK-1-2-2,NOTE_SNARE_DRUM-1-0-2 + Sneak: + Enable: true + No_Recoil: true + Bullet_Spread: 1 + Burstfire: + Enable: true + Shots_Per_Burst: 3 + Delay_Between_Shots_In_Burst: 1 + Ammo: + Enable: true + Ammo_Item_ID: 370 + Sounds_Out_Of_Ammo: NOTE_PLING-1-2-0 + Sounds_Shoot_With_No_Ammo: NOTE_STICKS-1-2-0 + Reload: + Enable: true + Reload_Amount: 30 + Take_Ammo_On_Reload: true + Reload_Duration: 40 + Sounds_Reloading: FIRE_IGNITE-1-1-4,DOOR_OPEN-1-2-6,FIRE_IGNITE-1-1-36,HURT_FLESH-1-0-37,DOOR_CLOSE-1-2-38 + Firearm_Action: + Type: slide + Close_Duration: 10 + Sound_Close: PISTON_RETRACT-1-2-0,PISTON_RETRACT-1-2-2 + Scope: + Enable: true + Zoom_Amount: 5 + Zoom_Bullet_Spread: 0 + Sounds_Toggle_Zoom: ENDERDRAGON_WINGS-1-2-0 + Abilities: + Reset_Hit_Cooldown: true + Hit_Events: + Enable: true + Sounds_Shooter: SHOOT_ARROW-1-2-0 + +AK-47: + Item_Information: + Item_Name: "&eAK-47" + Item_Type: 417 + Item_Lore: "&eFully automatic with high power.|&eEffective at medium range.|&eControls are inverted." + Sounds_Acquired: BAT_TAKEOFF-1-1-0 + Shooting: + Right_Click_To_Shoot: true + Cancel_Left_Click_Block_Damage: true + Cancel_Right_Click_Interactions: true + Recoil_Amount: 1 + Projectile_Amount: 1 + Projectile_Type: snowball + Projectile_Speed: 40 + Projectile_Damage: 4 + Bullet_Spread: 2 + Sounds_Shoot: IRONGOLEM_HIT-1-2-0,SKELETON_HURT-1-2-0,ZOMBIE_WOOD-1-2-0 + Sneak: + Enable: true + No_Recoil: true + Bullet_Spread: 1 + Fully_Automatic: + Enable: true + Fire_Rate: 6 + Reload: + Enable: true + Reload_Amount: 30 + Reload_Duration: 40 + Sounds_Out_Of_Ammo: ITEM_BREAK-1-1-0 + Sounds_Reloading: FIRE_IGNITE-1-1-4,DOOR_OPEN-1-2-6,FIRE_IGNITE-1-1-36,HURT_FLESH-1-0-37,DOOR_CLOSE-1-2-38 + Firearm_Action: + Type: slide + Close_Duration: 10 + Close_Shoot_Delay: 12 + Sound_Close: PISTON_RETRACT-1-2-0,PISTON_RETRACT-1-2-3 + Scope: + Enable: true + Zoom_Amount: 5 + Zoom_Bullet_Spread: 0 + Sounds_Toggle_Zoom: ENDERDRAGON_WINGS-1-2-0 + Abilities: + Reset_Hit_Cooldown: true + Hit_Events: + Enable: true + Sounds_Shooter: SHOOT_ARROW-1-2-0 \ No newline at end of file diff --git a/Configs + Precompiled/config/CrateReloaded/block.yml b/Configs + Precompiled/config/CrateReloaded/block.yml new file mode 100644 index 0000000..4e36bed --- /dev/null +++ b/Configs + Precompiled/config/CrateReloaded/block.yml @@ -0,0 +1,106 @@ +world: +- KEYCRATE:-15:69:33:DrePvP +- KEYCRATE:-15:69:36:SimplyTrash +- KEYCRATE:-15:69:24:Dylan +- KEYCRATE:8:69:39:Silver +- KEYCRATE:12:69:39:Items +- KEYCRATE:15:69:36:Perk +- KEYCRATE:18:69:33:Seasonal +- KEYCRATE:18:69:29:Gold +- KEYCRATE:17:69:25:Token +- KEYCRATE:-165:68:1175:Items +- KEYCRATE:6:70:13:Airdrop +- KEYCRATE:419:72:1524:Silver +- KEYCRATE:417:72:1524:Gold +- KEYCRATE:415:72:1524:Items +- KEYCRATE:413:72:1524:Seasonal +- KEYCRATE:411:72:1524:Token +- KEYCRATE:409:72:1524:Perk +- KEYCRATE:407:72:1524:Dylan +- KEYCRATE:405:72:1524:Headed +- KEYCRATE:403:72:1524:iMakeMcVids +- KEYCRATE:401:72:1524:DrePvP +- KEYCRATE:399:72:1524:SimplyTrash +- KEYCRATE:-28:4:1262:Perk +- KEYCRATE:-28:4:1264:Items +- KEYCRATE:-28:4:1266:Seasonal +- KEYCRATE:-28:4:1268:iMakeMcVids +- KEYCRATE:-28:4:1272:SimplyTrash +- KEYCRATE:-28:4:1274:DrePvP +- KEYCRATE:-28:4:1260:SamHCF +- KEYCRATE:-28:4:1258:Lectors +- KEYCRATE:-28:4:1256:QnA +- KEYCRATE:-14:70:18:Airdrop +- KEYCRATE:22:69:53:Perk +- KEYCRATE:22:69:57:Items +- KEYCRATE:22:69:45:Gold +- KEYCRATE:22:69:61:Silver +- KEYCRATE:22:69:49:Seasonal +- KEYCRATE:8:69:26:SimplyTrash +- KEYCRATE:8:69:29:Dylan +- KEYCRATE:8:69:35:DrePvP +- KEYCRATE:8:69:38:Headed +- KEYCRATE:13:69:62:Token +- KEYCRATE:117:67:2092:Silver +- KEYCRATE:115:67:2092:Gold +- KEYCRATE:113:67:2092:Items +- KEYCRATE:111:67:2092:Seasonal +- KEYCRATE:109:67:2092:Perk +- KEYCRATE:107:67:2092:Headed +- KEYCRATE:105:67:2092:Dylan +- KEYCRATE:103:67:2092:DrePvP +- KEYCRATE:101:67:2092:iMakeMcVids +- KEYCRATE:99:67:2092:SimplyTrash +- KEYCRATE:263:65:1156:iMakeMcVids +- KEYCRATE:260:65:1156:SimplyTrash +- KEYCRATE:260:65:1158:Dylan +- KEYCRATE:263:65:1158:Dylan +- KEYCRATE:263:65:1160:Headed +- KEYCRATE:-37:94:38:Gold +- KEYCRATE:-29:94:38:Seasonal +- KEYCRATE:-33:94:38:Items +- KEYCRATE:-29:94:29:Perk +- KEYCRATE:-32:92:6:SimplyTrash +- KEYCRATE:-28:92:6:Headed +- KEYCRATE:-24:92:6:iMakeMcVids +- KEYCRATE:-20:92:6:Dylan +- KEYCRATE:-16:92:6:DrePvP +- KEYCRATE:-25:94:38:Silver +- KEYCRATE:-58:69:1039:Silver +- KEYCRATE:-58:69:1037:Gold +- KEYCRATE:-58:69:1035:Token +- KEYCRATE:-58:69:1033:Items +- KEYCRATE:-58:69:1031:Seasonal +- KEYCRATE:-58:69:1029:Perk +- KEYCRATE:-58:69:1027:iMakeMcVids +- KEYCRATE:-58:69:1025:DrePvP +- KEYCRATE:-58:69:1023:Dylan +- KEYCRATE:-58:69:1021:SimplyTrash +- KEYCRATE:-58:69:1019:Headed +- KEYCRATE:-21:94:38:Token +- KEYCRATE:-174:159:6:Partner +- KEYCRATE:-65:68:1346:SOTW +- KEYCRATE:-65:68:1344:Seasonal +- KEYCRATE:-65:68:1342:Perk +- KEYCRATE:-65:68:1340:iMakeMcVids +- KEYCRATE:-65:68:1338:NotRamix +- KEYCRATE:239:66:1129:Resucting +- KEYCRATE:236:66:1129:Seasonal +Spawn: +- KEYCRATE:24:71:25:SOTW +- KEYCRATE:-27:71:6:iMakeMcVids +- KEYCRATE:-9:107:0:SOTW +- KEYCRATE:-7:108:31:Airdrop +- KEYCRATE:-1:108:31:Partner +- KEYCRATE:-9:108:31:Lootbox +- KEYCRATE:-5:108:31:Seasonal +- KEYCRATE:4:108:22:Legendary +- KEYCRATE:24:71:25:Rare +- KEYCRATE:20:71:29:Legendary +- KEYCRATE:23:71:28:Cave +- KEYCRATE:-8:71:28:Seasonal +- KEYCRATE:8:71:28:Lootbox +- KEYCRATE:4:71:28:Airdrop +- KEYCRATE:-4:71:28:Perk +- KEYCRATE:-21:71:0:Partner +- KEYCRATE:-27:71:-6:Headed diff --git a/Configs + Precompiled/config/CrateReloaded/config.yml b/Configs + Precompiled/config/CrateReloaded/config.yml new file mode 100644 index 0000000..1744a66 --- /dev/null +++ b/Configs + Precompiled/config/CrateReloaded/config.yml @@ -0,0 +1,91 @@ +# ======================================================= # +# # +# CONFIG.YML # +# Revision-07 by Bart/Dinosaur # +# # +# Thank you for supporting CrateReloaded! # +# Developer Note: Enjoy the plugin! # +# # +# ======================================================= # +# +# +# ======================================================= # +# # +# Administration # +# # +# ======================================================= # +# +# Prefix +# Goes before every message +# +prefix: '&4&lCrate &8┃ &7' +# +# Language +# Currently Supports: en, fr, bg, es, fi +# +locale: en +# +# Logger +# Creates a log folder which automatically logs important information. +# +logger: false +# +# +# ======================================================= # +# # +# Crate Settings # +# Please view Crate.YML for reward configuration # +# # +# ======================================================= # +# +# Chance Format +# ex: #.## 1.23 +# +display: + chanceFormat: '#' +# +# Global Crate Cooldown +# Wait time before consecutive crate actions +# +usage: + cooldown: -1 +# +# Confirmation Menu +# +confirmation-menu: + name: 'Are you sure?' + yesDisplay: '159:5 1 &a&lOPEN &7Opens_the_Mystery_Box!%line%%line%Action_is_irreversible.' + dialogDisplay: '116 1 &f&lCHOOSER' + noDisplay: '159:14 1 &4&lCANCEL &7Cancels your previous action.' +# +# Preview Menu +# +preview-menu: + name: 'Crates' + backButton: '355 1 &4&lGo_back! &7Return_to_the_crate_selector!' +# +# Velocity multipliers +# +pushback: + enabled: false + modifiers: + x: 1.0 + y: 1.0 + z: 1.0 +# +# Roulette and CSGO Settings +# +glassName: '' +roulette: + length: 5 +csgo: + length: 6 + topPrizeDisplay: 'REDSTONE_TORCH_ON 1 &6Prize!' + botPrizeDisplay: 'REDSTONE_TORCH_ON 1 &6Prize!' +# +# Holographic Offset +# +holographic-offset: + x: 0.0 + y: 5.0 + z: 0.0 \ No newline at end of file diff --git a/Configs + Precompiled/config/CrateReloaded/crate.yml b/Configs + Precompiled/config/CrateReloaded/crate.yml new file mode 100644 index 0000000..a7be7e7 --- /dev/null +++ b/Configs + Precompiled/config/CrateReloaded/crate.yml @@ -0,0 +1,1035 @@ +############################################ +# +---------------------------------------+# +# | Config Revision 16 |# +# +---------------------------------------+# +############################################ + +Rare: + type: KEYCRATE + displayName: '&b&lRare Crate' + holographic: + - '' + - '' + preview: + enabled: true + rows: 1 + buy: + enabled: false + cost: 0 + message: + onOpen: '' + raw: '' + key: + item: 'Tripwire_Hook' + enchantment: '' + name: '&b&lRare Key' + lore: + - '' + - '&7Right click the &bRare Crate &7to obtain rewards!' + effect: + onOpenEffects: 'reddust' + dormantEffects: '' + reward: + minimumRewards: 2 + maximumRewards: 2 + rewards: + - 'display:(160:11 1 &7&o), chance:(0), noduplicate:()' + - 'item:(310 1 &b&lRare_&7┃_&fHelmet 0:2;34:3), chance:(5)' + - 'item:(311 1 &b&lRare_&7┃_&fChestplate 0:2;34:3), chance:(5)' + - 'item:(312 1 &b&lRare_&7┃_&fLeggings 0:2;34:3), chance:(5)' + - 'item:(313 1 &b&lRare_&7┃_&fBoots 0:2;34:3;2:4), chance:(5)' + - 'item:(276 1 &b&lRare_&7┃_&fSword 16:2;21:3), chance:(5)' + - 'item:(261 1 &b&lRare_&7┃_&fBow 48:4;34:3;51:1), chance:(5)' + - 'cmd:(/giveitem %player% 368 4), display:(368 4), chance:(7)' + - 'display:(160:11 1 &7&o), chance:(0), noduplicate:()' + - 'display:(160:3 1 &7&o), chance:(0), noduplicate:()' + - 'cmd:(/giveitem %player% 133 16), display:(emerald_block 16), chance:(10)' + - 'cmd:(/giveitem %player% 57 16), display:(diamond_block 16), chance:(10)' + - 'cmd:(/addlives %player% 5), display:(339 5 &a&l5_Lives), chance:(7)' + - 'cmd:(/cr givekey %player% Legendary 3), display:(131 3 &5&lLegendary_Key %line%&7Right_click_the_&5Legendary_Key_&7to_obtain_rewards!), chance:(0.5)' + - 'cmd:(/giveitem %player% 322 8), display:(322 8), chance:(6)' + - 'cmd:(/giveitem %player% 348 16), display:(348 16), chance:(2)' + - 'cmd:(/giveitem %player% 289 16), display:(289 16), chance:(2)' + - 'display:(160:3 1 &7&o), chance:(0), noduplicate:()' + - 'display:(160:11 1 &7&o), chance:(0), noduplicate:()' + - 'cmd:(/giveitem %player% 41 16), display:(gold_block 16), chance:(10)' + - 'cmd:(/giveitem %player% 42 16), display:(iron_block 16), chance:(10)' + - 'cmd:(/addlives %player% 10), display:(339 10 &a&l10_Lives), chance:(2)' + - 'cmd:(/fancybrewer give %player% 1), display:(379 1 &b&lFancy_Brewer &7A_brewing_stand..._but_fancy.%line%&7Place_the_brewer_and_open_to_get_started.%line%%line%&aLearn_more_at_cavepvp.org/fancybrewers), chance:(2)' + - 'cmd:(/giveitem %player% 322:1 1), display:(322:1 1), chance:(6)' + - 'cmd:(/giveitem %player% 372 16), display:(372 16), chance:(10)' + - 'cmd:(/giveitem %player% 382 16), display:(382 16), chance:(10)' + - 'display:(160:11 1 &7&o), chance:(0), noduplicate:()' +Legendary: + type: KEYCRATE + displayName: '&5&lLegendary Crate' + holographic: + - '' + - '' + preview: + enabled: true + rows: 1 + buy: + enabled: false + cost: 0 + message: + onOpen: '' + raw: '' + key: + item: 'Tripwire_Hook' + enchantment: '' + name: '&5&lLegendary Key' + lore: + - '' + - '&7Right click the &5Legendary Crate &7to obtain rewards!' + effect: + onOpenEffects: 'reddust' + dormantEffects: '' + reward: + minimumRewards: 2 + maximumRewards: 2 + rewards: + - 'display:(160:10 1 &7&o), chance:(0), noduplicate:()' + - 'item:(310 1 &5&lLegendary_&7┃_&fHelmet 0:2;34:3), chance:(5)' + - 'item:(311 1 &5&lLegendary_&7┃_&fChestplate &cFireResistance_I 0:2;34:3), chance:(5)' + - 'item:(312 1 &5&lLegendary_&7┃_&fLeggings 0:2;34:3), chance:(5)' + - 'item:(313 1 &5&lLegendary_&7┃_&fBoots &cSpeed_II 0:2;34:3;2:4), chance:(5)' + - 'item:(276 1 &5&lLegendary_&7┃_&fSword 16:2;21:3;34:3), chance:(5)' + - 'cmd:(/ability MedKit 2 %player%), display:(paper 2 &a&lMed_Kit %line%&6❙_&fRight_Click_to_receive_Resistance_3,%line%&6❙_&fRegeneration_3,_and_4_Absorption%line%&6❙_&fHearts_for_5_seconds!%line%%line%&fCan_be_found_in_the_&6&lHalloween_Crate&f!), chance:(2.5)' + - 'cmd:(/ability AntiBlockup 2 %player%), display:(369 2 &6&lAnti_Blockup %line%&6❙_&fWhen_you_hit_a_player_with_this%line%&6❙_&c&l3_times_&fthey_may_not_block_up_for_&e&l15_seconds&f.%line%%line%&fCan_be_found_in_the_&6&lHalloween_Crate&f!), chance:(2.5)' + - 'display:(160:10 1 &7&o), chance:(0), noduplicate:()' + - 'display:(160:2 1 &7&o), chance:(0), noduplicate:()' + - 'cmd:(/giveitem %player% 133 32), display:(emerald_block 32), chance:(10)' + - 'cmd:(/giveitem %player% 57 32), display:(diamond_block 32), chance:(10)' + - 'cmd:(/addlives %player% 10), display:(339 10 &a&l10_Lives), chance:(7)' + - 'cmd:(/crates give %player% Reinforce 1), display:(138 1 &6&lReinforce_Lootbox %line%&7View_all_the_rewards_at_&estore.cavepvp.org&7!), chance:(2.0)' + - 'cmd:(/givebasetokens %player% 1), display:(95:14 1 &d&lBase_Token %line%&7Type_&d/blueprints_&7to_use_it!), chance:(1.0)' + - 'cmd:(/cr givekey %player% Seasonal 2), display:(131 2 &e&ki&6&lHalloween_Key&e&ki&r %line%&7Right_click_the_&6Halloween_Crate_&7to_obtain_rewards!), chance:(0.5)' + - 'cmd:(/giveitem %player% 322 32), display:(322 32), chance:(6)' + - 'display:(160:2 1 &7&o), chance:(0), noduplicate:()' + - 'display:(160:10 1 &7&o), chance:(0), noduplicate:()' + - 'cmd:(/giveitem %player% 41 32), display:(gold_block 32), chance:(10)' + - 'cmd:(/giveitem %player% 42 32), display:(iron_block 32), chance:(10)' + - 'cmd:(/addlives %player% 15), display:(339 15 &a&l15_Lives), chance:(2)' + - 'cmd:(/fancybrewer give %player% 1), display:(379 1 &b&lFancy_Brewer &7A_brewing_stand..._but_fancy.%line%&7Place_the_brewer_and_open_to_get_started.%line%%line%&aLearn_more_at_cavepvp.org/fancybrewers), chance:(2)' + - 'cmd:(/givefallertokens %player% 1), display:(hopper 1 &4&lFaller_Tokens %line%&7Type_&c/blueprints_&7to_use_it!), chance:(1.0)' + - 'cmd:(/cr givekey %player% Seasonal 1), display:(131 1 &e&ki&6&lHalloween_Key&e&ki&r %line%&7Right_click_the_&6Halloween_Crate_&7to_obtain_rewards!), chance:(1.5)' + - 'cmd:(/giveitem %player% 322:1 1), display:(322:1 1), chance:(6)' + - 'display:(160:10 1 &7&o), chance:(0), noduplicate:()' + +Cave: + type: KEYCRATE + displayName: '&4&lCave Crate' + holographic: + - '' + - '' + preview: + enabled: true + rows: 1 + buy: + enabled: false + cost: 0 + message: + onOpen: '' + raw: '' + key: + item: 'Tripwire_Hook' + enchantment: '' + name: '&4&lCave Key' + lore: + - '' + - '&7Right click the &4Cave Crate &7to obtain rewards!' + effect: + onOpenEffects: 'witchMagic' + dormantEffects: '' + reward: + minimumRewards: 1 + maximumRewards: 1 + rewards: + - 'display:(160:0 1 &f)' + - 'display:(160:14 1 &f)' + - 'display:(160:7 1 &f)' + - 'display:(160:0 1 &f)' + - 'display:(160:14 1 &f)' + - 'display:(160:0 1 &f)' + - 'display:(160:7 1 &f)' + - 'display:(160:14 1 &f)' + - 'display:(160:0 1 &f)' + - 'display:(160:14 1 &f)' + - 'cmd:(/ability Shockwave 3 %player%), display:(385 3 &4&lShockwave %line%&6❙_&fThrow_this_and_everybody_within%line%&6❙_&c&l10_blocks_&fof_where_it_lands_will_be_launched.%line%%line%&fCan_be_found_in_the_&4&lCave_Crate&f!), chance:(20)' + - 'cmd:(/ability WitchEffect 3 %player%), display:(383:65 3 &5&lWitch_Effect %line%&6❙_&fSpawn_a_witch_that_give_you_the_passive%line%&6❙_&fbard_effects:_strength,_regeneration,%line%&6❙_&fand_resistance.%line%%line%&fCan_be_found_in_the_&4&lCave_Crate&f!), chance:(20)' + - 'cmd:(/ability Combo 3 %player%), display:(38:0 3 &a&lCombo_Ability %line%&6❙_&fGet_a_second_of_strength_II_for_the%line%&6❙_&famount_of_hits_dealt_within_10_seconds.%line%%line%&fCan_be_found_in_the_&4&lCave_Crate&f!), chance:(20)' + - 'cmd:(/ability SpinBot 3 %player%), display:(stick 3 &3&lSpin_Bot %line%&6❙_&fHit_a_player_&c&l3_times_&fand_every%line%&6❙_&fhit_for_&e&l10_seconds_&fhas_a_chance%line%&6❙_&fof_rotating_their_head.%line%%line%&fCan_be_found_in_the_&4&lCave_Crate&f!), chance:(20)' + - 'cmd:(/ability phoenixmode 3 %player%), display:(emerald 3 &4&lPhoenix_Mode %line%&6❙_&fClick_to_create_a_cloud_of_particles.%line%&6❙_&fInside_the_cloud,_enemies_deal_&c&l-20%_&fdamage%line%&6❙_&fto_you_and_you_deal_&c&l+20%_&fdamage_to_enemies.%line%%line%&fCan_be_found_in_the_&4&lCave_Crate&f!), chance:(20)' + - 'cmd:(/ability ItemCounter 3 %player%), display:(345 3 &c&lItem_Counter %line%&6❙_&fHit_an_enemy_to_discover_how_many%line%&6❙_&fhealth_potions_and_ability_items_they_have!%line%%line%&fCan_be_found_in_the_&4&lCave_Crate&f!), chance:(20)' + - 'cmd:(/ability Tazer 3 %player%), display:(318 3 &d&lTazer %line%&6❙_&fHit_a_player_and_for_the_next%line%&6❙_&e&l5_seconds_&fthey_will_not_be_able_to%line%&6❙_&fmove_or_take_knockback.%line%%line%&fCan_be_found_in_the_&4&lCave_Crate&f!), chance:(0)' + - 'display:(160:14 1 &f)' + - 'display:(160:0 1 &f)' + - 'display:(160:14 1 &f)' + - 'display:(160:7 1 &f)' + - 'display:(160:0 1 &f)' + - 'display:(160:14 1 &f)' + - 'display:(160:0 1 &f)' + - 'display:(160:7 1 &f)' + - 'display:(160:14 1 &f)' + - 'display:(160:0 1 &f)' +Seasonal: + type: KEYCRATE + displayName: '&e&ki&6&lHalloween Crate&e&ki' + holographic: + - '' + - '' + preview: + enabled: true + rows: 1 + buy: + enabled: false + cost: 0 + message: + onOpen: '' + raw: '' + key: + item: 'Tripwire_Hook' + enchantment: '' + name: '&e&ki&6&l Halloween Keys &e&ki' + lore: + - '' + - '&7Right click the &6&lHalloween Crate &7to obtain rewards' + effect: + onOpenEffects: 'reddust' + dormantEffects: '' + reward: + minimumRewards: 2 + maximumRewards: 2 + rewards: + - 'display:(160:14 1 &7&o), chance:(0), noduplicate:()' + - 'display:(160:14 1 &7&o), chance:(0), noduplicate:()' + - 'item:(310 1 &e&ki&6&lHalloween&e&ki&r_&7┃_&fHelmet &cHellForged_IV%line%&cImplants_V%line%&cMermaid_III%line%&cRecover_I%line%&cFireResistance_I 0:2;34:3), chance:(5)' + - 'item:(311 1 &e&ki&6&lHalloween&e&ki&r_&7┃_&fChestplate &cHellForged_IV%line%&cRecover_I%line%&cFireResistance_I 0:2;34:3), chance:(5)' + - 'item:(312 1 &e&ki&6&lHalloween&e&ki&r_&7┃_&fLeggings &cHellForged_IV%line%&cRecover_I%line%&cFireResistance_I 0:2;34:3), chance:(5)' + - 'item:(313 1 &e&ki&6&lHalloween&e&ki&r_&7┃_&fBoots &cSpeed_II%line%&cHellForged_IV%line%&cRecover_I%line%&cFireResistance_I 0:2;34:3;2:4), chance:(5)' + - 'item:(276 1 &e&ki&6&lHalloween&e&ki&r_&7┃_&fSword 16:2;34:3;21:3), chance:(5)' + - 'display:(160:14 1 &7&o), chance:(0), noduplicate:()' + - 'display:(160:14 1 &7&o), chance:(0), noduplicate:()' + - 'display:(160:14 1 &7&o), chance:(0), noduplicate:()' + - 'cmd:(/ability MedKit 5 %player%), display:(paper 5 &a&lMed_Kit %line%&6❙_&fRight_Click_to_receive_Resistance_3,%line%&6❙_&fRegeneration_3,_and_4_Absorption%line%&6❙_&fHearts_for_5_seconds!%line%%line%&fCan_be_found_in_the_&e&ki&6&lHalloween&e&ki&r_Crate&f!), chance:(2)' + - 'cmd:(/ability AntiBlockup 5 %player%), display:(369 5 &6&lAnti_Blockup %line%&6❙_&fWhen_you_hit_a_player_with_this%line%&6❙_&c&l3_times_&fthey_may_not_block_up_for_&e&l15_seconds&f.%line%%line%&fCan_be_found_in_the_&e&ki&6&lHalloween&e&ki&r_Crate&f!), chance:(2)' + - 'cmd:(/ability Eggport 8 %player%), display:(344 8 &d&lEggport %line%&6❙_&fSwitch_places_with_your%line%&6❙_&fenemy_that_are_within_&c&l15_blocks&f!%line%%line%&fCan_be_found_in_the_&e&ki&6&lHalloween&e&ki&r_Crate&f!), chance:(2)' + - 'cmd:(/crowbar %player%), display:(293 1 &cCrowbar &f%line%&eCan_Break:%line%&f_-_&bEnd_Portals:_&e1%line%&f_-_&bSpawners:_&e1), chance:(1.5)' + - 'cmd:(/giveitem %player% 120 1), display:(120 1), chance:(2)' + - 'item:(278 1 &e&ki&6&lHalloween&e&ki&r_&7┃_&fPickaxe 32:5;34:3;35:3), chance:(5)' + - 'item:(261 1 &e&ki&6&lHalloween&e&ki&r_&7┃_&fBow 48:5;34:4;50:1;51:1), chance:(5)' + - 'display:(160:14 1 &7&o), chance:(0), noduplicate:()' + - 'display:(160:14 1 &7&o), chance:(0), noduplicate:()' + - 'display:(160:14 1 &7&o), chance:(0), noduplicate:()' + - 'cmd:(/cr givekey %player% Seasonal 3), display:(131 3 &e&ki&6&l_Halloween_Key_&e&ki %line%&7Right_click_the_&e&ki&6&lHalloween_Crate&e&ki&7_to_obtain_rewards!), chance:(0.5)' + - 'cmd:(/permission add %player% crazyenchantments.gkitz.diamond), cmd:(/sbc &4&lCrate &8┃ &f%player% &7has found a &b&lDiamond Kit &7from a &e&ki&6&l Halloween Key &e&ki&7.), display:(310 1 &b&lDiamond_Kit_&7[30_Days] &c0.3%_chance 34:10), chance:(0.2)' + - 'cmd:(/vouchers addrank %player% Cave 30d &4&lCave Rank [30 Days]), cmd:(/raw &f), cmd:(/raw &4&lCrate &8┃ &f%player% &7has just won &c&k! &4&lCave Rank &c&k! &7from a &e&ki&4&l Halloween Key &e&ki&7.),cmd:(/raw &f), display:(351:1 1 &c&k!&4&l_Cave_Rank_&c&k!&7_[30_Days] 34:10), chance:(0.0)' + - 'cmd:(/permission add %player% crazyenchantments.gkitz.archer), cmd:(/sbc &4&lCrate &8┃ &f%player% &7has found a &d&lArcher Kit &7from a &e&ki&4&l Halloween Key &e&ki&7.), display:(298 1 &d&lArcher_Kit_&7[30_Days] &c0.3%_chance 34:10), chance:(0.2)' + - 'cmd:(/crates give %player% Seasonal 1), display:(130 1 &6&lFall_Lootbox %line%&7Purchasable_on_&fstore.cavepvp.org&7!), chance:(0.25)' + - 'display:(160:14 1 &7&o), chance:(0), noduplicate:()' + - 'display:(160:14 1 &7&o), chance:(0), noduplicate:()' +Perk: + type: KEYCRATE + displayName: '&a&lPerk Crate' + animation: 'CSGO' + holographic: + - '&a&lPerk' + - '&7&oCrate Loot' + preview: + enabled: true + rows: 1 + buy: + enabled: false + cost: 0 + message: + onOpen: '' + raw: '' + key: + item: 'NETHER_STAR' + enchantment: '' + name: '&a&lPerk Key' + lore: + - '' + - '&7Right click the &aPerk Crate &7to obtain rewards!' + effect: + onOpenEffects: 'firework, DRINK' + dormantEffects: '' + dormantRoulette: 'WOOD_CLICK' + onRouletteEnd: 'BAT_TAKEOFF' + reward: + minimumRewards: 1 + maximumRewards: 1 + rewards: + - 'display:(160:0 1 &f)' + - 'display:(160:5 1 &f)' + - 'display:(160:7 1 &f)' + - 'display:(160:0 1 &f)' + - 'display:(160:5 1 &f)' + - 'display:(160:0 1 &f)' + - 'display:(160:7 1 &f)' + - 'display:(160:5 1 &f)' + - 'display:(160:0 1 &f)' + - 'display:(160:5 1 &f)' + - 'display:(160:13 1 &f)' + - 'cmd:(/airdrops give %player% 5), cmd:(/broadcastperkkey %player% &b&l5x Airdrops), display:(130 2 &6&lSeptember_Mystery_Box &7Purchasable_on_&fstore.cavepvp.org&7! &734:5), chance:(1.0)' + - 'cmd:(/vouchers addrank %player% VIP 30d &e&lVIP Status [30 Days]), cmd:(/broadcastperkkey %player% &e&lVIP Status), display:(351:11 1 &e&lVIP_Status_&7[30_Days] 34:5), chance:(0.0)' + - 'cmd:(/vouchers addrank %player% Cave 30d &4&lCave Rank [30 Days]), cmd:(/broadcastperkkey %player% &c&ki&4&l Cave Rank &c&ki), display:(351:1 1 &4&lCave_Rank_&7[30_Days] 34:5), chance:(1.0)' + - 'cmd:(/vouchers addrank %player% Seasonal-Kit 30d &6&lHalloween Kit [30 Days]), cmd:(/broadcastperkkey %player% &6&lHalloween Kit), display:(400 1 &e&ki&6&lHalloween&e&ki&r_Kit_&7[30_Days] 34:5), chance:(0.0)' + - 'cmd:(/crates give %player% Seasonal 5), cmd:(/broadcastperkkey %player% &6&l5x Fall Lootbox), display:(130 5 &6&lFall_Lootbox &7Purchasable_on_&fstore.cavepvp.org&7! &734:5), chance:(1.0)' + - 'display:(160:13 1 &f)' + - 'display:(160:5 1 &f)' + - 'display:(160:7 1 &f)' + - 'display:(160:0 1 &f)' + - 'cmd:(/vouchers addrank %player% Sapphire perm &9&lSapphire Rank [Lifetime]), cmd:(/broadcastperkkey %player% &9&lLifetime Sapphire Rank), display:(351:12 1 &9&lLifetime_Sapphire_Rank 34:5), chance:(0.9)' + - 'cmd:(/vouchers addrank %player% Ravine perm &d&lRavine Rank [Lifetime]), cmd:(/broadcastperkkey %player% &d&lLifetime Ravine Rank), display:(351:9 1 &d&lLifetime_Ravine_Rank 34:5), chance:(0.3)' + - 'cmd:(/vouchers addrank %player% Holiday perm &6&lSpooky Rank [Lifetime]), cmd:(/broadcastperkkey %player% &6&lLifetime Spooky Rank), display:(91 1 &6&lLifetime_Spooky_Rank 34:5), chance:(0.0)' + - 'cmd:(/vouchers addrank %player% Platinum perm &3&lPlatinum Rank [Lifetime]), cmd:(/broadcastperkkey %player% &3&lLifetime Platinum Rank), cmd:(/raw &f), display:(351:6 1 &3&lLifetime_Platinum_Rank 34:5), chance:(0.2)' + - 'cmd:(/vouchers addrank %player% Pearl perm &5&lLifetime Pearl Rank]), cmd:(/broadcastperkkey %player% &5&lLifetime Pearl Rank), display:(351:5 1 &5&lLifetime_Pearl_Rank&7 34:5), chance:(0.9)' + - 'display:(160:0 1 &f)' + - 'display:(160:7 1 &f)' + - 'display:(160:7 1 &f)' + - 'display:(160:0 1 &f)' + - 'cmd:(/vouchers add %player% &a&l$10 Gift Card), display:(diamond 10 &2&l$&a&l10_Gift_Card 34:5), cmd:(/broadcastperkkey %player% &2&l$&a&l10 Gift Card), chance:(0)' + - 'cmd:(/vouchers addamount %player% 10), display:(7 10 &2&l$&a&l10_Store_Voucher 34:5), cmd:(/broadcastperkkey %player% &2&l$&a&l10 Store Voucher), chance:(0)' + - 'cmd:(/vouchers addamount %player% 50), display:(7 50 &2&l$&a&l50_Store_Voucher 34:5), cmd:(/broadcastperkkey %player% &2&l$&a&l50 Store Voucher), chance:(0)' + - 'cmd:(/vouchers addamount %player% 25), display:(7 25 &2&l$&a&l25_Store_Voucher 34:5), cmd:(/broadcastperkkey %player% &2&l$&a&l25 Store Voucher), chance:(0)' + - 'cmd:(/vouchers add %player% &a&l$25 Gift Card), display:(diamond 25 &2&l$&a&l25_Gift_Card 34:5), cmd:(/broadcastperkkey %player% &2&l$&a&l25 Gift Card), chance:(0)' + - 'display:(160:0 1 &f)' + - 'display:(160:7 1 &f)' + - 'display:(160:5 1 &f)' + - 'display:(160:13 1 &f)' + - 'cmd:(/vouchers addrank %player% Sapphire 30d &9&lSapphire Rank [30d]), cmd:(/broadcastperkkey %player% &9&lSapphire Rank), display:(351:12 1 &9&lSapphire_Rank_&7[30_Days]), chance:(4)' + - 'cmd:(/vouchers addrank %player% Ravine 30d &d&lRavine Rank [30d]), cmd:(/broadcastperkkey %player% &d&lRavine Rank), display:(351:9 1 &d&lRavine_Rank_&7[30_Days]), chance:(2)' + - 'cmd:(/vouchers addrank %player% Holiday 30d &6&lSpooky Rank [30d]), cmd:(/broadcastperkkey %player% &6&lSpooky Rank), display:(91 1 &6&lSpooky_Rank_&7[30_Days]), chance:(0.8)' + - 'cmd:(/vouchers addrank %player% Platinum 30d &3&lPlatinum Rank [30d]), cmd:(/broadcastperkkey %player% &3&lPlatinum Rank), display:(351:6 1 &3&lPlatinum_Rank_&7[30_Days]), chance:(3)' + - 'cmd:(/vouchers addrank %player% Pearl 30d &5&lPearl Rank [30d]), cmd:(/broadcastperkkey %player% &5&lPearl Rank), display:(351:5 1 &5&lPearl_Rank_&7[30_Days]), chance:(5)' + - 'display:(160:13 1 &f)' + - 'display:(160:5 1 &f)' + - 'display:(160:0 1 &f)' + - 'display:(160:5 1 &f)' + - 'display:(160:7 1 &f)' + - 'display:(160:0 1 &f)' + - 'display:(160:5 1 &f)' + - 'display:(160:0 1 &f)' + - 'display:(160:7 1 &f)' + - 'display:(160:5 1 &f)' + - 'display:(160:0 1 &f)' +KOTH: + type: KEYCRATE + displayName: '&4&lKOTH Key' + holographic: + - '&4&lKOTH' + - '&7&oCrate Loot' + preview: + enabled: true + rows: 1 + buy: + enabled: false + cost: 0 + message: + onOpen: '' + raw: '' + key: + item: '371' + enchantment: '34:1' + name: '&4&lKOTH Key' + lore: + - '' + - '&7Right click the &cKOTH Crate &7to obtain rewards!' + effect: + onOpenEffects: 'happyVillager' + dormantEffects: '' + reward: + minimumRewards: 2 + maximumRewards: 3 + rewards: + - 'display:(160:14 1 &f)' + - 'display:(160:7 1 &f)' + - 'display:(160:14 1 &f)' + - 'display:(160:7 1 &f)' + - 'display:(160:14 1 &f)' + - 'display:(160:7 1 &f)' + - 'display:(160:14 1 &f)' + - 'display:(160:7 1 &f)' + - 'display:(160:14 1 &f)' + - 'display:(160:7 1 &f)' + - 'item:(276 1 &c&lKOTH_Sharpness 16:3;34:5;21:5),cmd:(/rawbc &f%player% &7has found a &c&oKOTH &fSharpness &7from a &4&lKOTH &7Crate.), chance:(0.5)' + - 'item:(276 1 &c&lKOTH_Fire 16:3;20:2;34:5),cmd:(/rawbc &f%player% &7has found a &c&oKOTH Fire &7from a &4&lKOTH &7Crate.), chance:(0.5)' + - 'item:(261 1 &c&lKOTH_Bow 48:5;34:4;50:1;51:1),cmd:(/rawbc &f%player% &7has found a &c&oKOTH Bow &7from a &4&lKOTH &7Crate.), chance:(8)' + - 'cmd:(/rawbc &f%player% &7has found 6x &5&lItem Keys &7from a &4&lKOTH &7Crate.), cmd:(/cr givekey %player% Items 6),display:(131 6 &76x_&5&lItem_Keys &c0.3%_chance 34:10), chance:(7)' + - 'item:(278 1 &c&lKOTH_Pickaxe 32:5;34:5;35:4),cmd:(/rawbc &f%player% &7has found a &c&oKOTH Pickaxe &7from a &4&lKOTH &7Crate.), chance:(8)' + - 'item:(175 2 &c&lKOTH_Knockback 19:1),cmd:(/rawbc &f%player% &7has found 2x &c&oKOTH Knockbacks &7from a &4&lKOTH &7Crate.), chance:(10)' + - 'cmd:(/giveitem %player% 120 2),cmd:(/rawbc &f%player% &7has found 2x &5&lEnd Portal Frame &7from a &4&lKOTH &7Crate.),display:(120 2), chance:(5)' + - 'display:(160:7 1 &f)' + - 'display:(160:14 1 &f)' + - 'cmd:(/giveitem %player% emeraldblock 64),cmd:(/rawbc &f%player% &7has found 64x &a&lEmerald Blocks &7from a &4&lKOTH &7Crate.),display:(emerald_block 64), chance:(6)' + - 'cmd:(/giveitem %player% diamondblock 64),cmd:(/rawbc &f%player% &7has found 64x &b&lDiamond Blocks &7from a &4&lKOTH &7Crate.),display:(diamond_block 64), chance:(6)' + - 'cmd:(/giveitem %player% 322:1 4),cmd:(/rawbc &f%player% &7has found 4x &6&lEnchanted Golden Apples &7from a &4&lKOTH &7Crate.),display:(322:1 4), chance:(4)' + - 'cmd:(/cr givekey %player% Perk 1), cmd:(/rawbc &f%player% &7has found 1x &d&lPerk Key &7from a &4&lKOTH &7Crate.), display:(399 1 &71x_&c&lPerk_&7Key &c0.05%_chance 34:10), chance:(0.01)' + - 'cmd:(/giveitem %player% 322 64),cmd:(/rawbc &f%player% &7has found 64x &6&lCrapples &7from a &4&lKOTH &7Crate.),display:(322 64), chance:(6)' + - 'cmd:(/giveitem %player% ironblock 64),cmd:(/rawbc &f%player% &7has found 64x &7&lIron Blocks &7from a &4&lKOTH &7Crate.),display:(iron_block 64), chance:(6)' + - 'cmd:(/giveitem %player% goldblock 64),cmd:(/rawbc &f%player% &7has found 64x &6&lGold Blocks &7from a &4&lKOTH &7Crate.),display:(gold_block 64), chance:(6)' + - 'display:(160:14 1 &f)' + - 'display:(160:7 1 &f)' + - 'display:(160:14 1 &f)' + - 'display:(160:7 1 &f)' + - 'display:(160:14 1 &f)' + - 'display:(160:7 1 &f)' + - 'display:(160:14 1 &f)' + - 'display:(160:7 1 &f)' + - 'display:(160:14 1 &f)' + - 'display:(160:7 1 &f)' + + +Citadel: + type: KEYCRATE + displayName: '&5&lCitadel Crate' + holographic: + - '&5&lCitadel' + - '&7&oCrate Loot' + preview: + enabled: true + rows: 1 + buy: + enabled: false + cost: 0 + message: + onOpen: '' + raw: '' + key: + item: '371' + enchantment: '34:1' + name: '&5&lCitadel Key' + lore: + - '' + - '&7Right click the &5Citadel Crate &7to obtain rewards!' + effect: + onOpenEffects: 'largeexplode' + dormantEffects: '' + reward: + minimumRewards: 1 + maximumRewards: 1 + rewards: + - 'display:(160:10 1 &f)' + - 'display:(160:2 1 &f)' + - 'display:(160:10 1 &f)' + - 'display:(160:2 1 &f)' + - 'display:(160:10 1 &f)' + - 'display:(160:2 1 &f)' + - 'display:(160:10 1 &f)' + - 'display:(160:2 1 &f)' + - 'display:(160:10 1 &f)' + - 'display:(160:2 1 &f)' + - 'display:(160:10 1 &f)' + - 'cmd:(/rawbc &f%player% &7has won a &5&lCitadel Helmet &7from the &5&lCitadel &7Crate.), item:(diamond_helmet 1 &5&lCitadel_Helmet &cHellForged_IV%line%&cImplants_V%line%&cMermaid_III%line%&cRecover_I%line%&cFireResistance_I 0:3;34:5;1:5;3:5;4:5), chance:(10)' + - 'cmd:(/rawbc &f%player% &7has won a &5&lCitadel Chestplate &7from the &5&lCitadel &7Crate.), item:(diamond_chestplate 1 &5&lCitadel_Chestplate &cHellForged_IV%line%&cRecover_I%line%&cFireResistance_I 0:3;34:5;1:5;3:5;4:5), chance:(10)' + - 'cmd:(/rawbc &f%player% &7has won a &5&lCitadel Leggings &7from the &5&lCitadel &7Crate.), item:(diamond_leggings 1 &5&lCitadel_Leggings &cHellForged_IV%line%&cRecover_I%line%&cFireResistance_I 0:3;34:5;1:5;3:5;4:5), chance:(10)' + - 'cmd:(/rawbc &f%player% &7has won a &5&lCitadel Boots &7from the &5&lCitadel &7Crate.), item:(diamond_boots 1 &5&lCitadel_Boots &cSpeed_II%line%&cHellForged_IV%line%&cRecover_I%line%&cFireResistance_I 0:3;34:5;1:5;3:5;4:5), chance:(10)' + - 'cmd:(/rawbc &f%player% &7has found 4x &6&lEnchanted Golden Apples &7from the &5&lCitadel &7Crate.), cmd:(/giveitem %player% 322:1 8), display:(322:1 8), chance:(4)' + - 'display:(160:10 1 &f)' + - 'display:(160:2 1 &f)' + - 'display:(160:10 1 &f)' + - 'display:(160:2 1 &f)' + - 'cmd:(/rawbc &f%player% &7has won a &5&lCitadel Bard Helmet &7from the &5&lCitadel &7Crate.), item:(gold_helmet 1 &5&lCitadel_Bard_Helmet &cHellForged_IV%line%&cImplants_V%line%&cMermaid_III%line%&cRecover_I%line%&cFireResistance_I 0:3;34:5;1:5;3:5;4:5), chance:(10)' + - 'cmd:(/rawbc &f%player% &7has won a &5&lCitadel Bard Chestplate &7from the &5&lCitadel &7Crate.), item:(gold_chestplate 1 &5&lCitadel_Bard_Chestplate &cHellForged_IV%line%&cRecover_I%line%&cFireResistance_I 0:3;34:5;1:5;3:5;4:5), chance:(10)' + - 'cmd:(/rawbc &f%player% &7has won a &5&lCitadel Bard Leggings &7from the &5&lCitadel &7Crate.), item:(gold_leggings 1 &5&lCitadel_Bard_Leggings &cHellForged_IV%line%&cRecover_I%line%&cFireResistance_I 0:3;34:5;1:5;3:5;4:5), chance:(10)' + - 'cmd:(/rawbc &f%player% &7has won a &5&lCitadel Bard Boots &7from the &5&lCitadel &7Crate.), item:(gold_boots 1 &5&lCitadel_Bard_Boots &cHellForged_IV%line%&cRecover_I%line%&cFireResistance_I 0:3;34:5;1:5;3:5;4:5), chance:(10)' + - 'item:(276 1 &5&lCitadel_Sharpness 16:3;34:5;21:5),cmd:(/rawbc &f%player% &7has found a &5&lCitadel &fSharpness &7from the &5&lCitadel &7Crate.), chance:(5)' + - 'display:(160:2 1 &f)' + - 'display:(160:10 1 &f)' + - 'display:(160:2 1 &f)' + - 'display:(160:10 1 &f)' + - 'cmd:(/rawbc &f%player% &7has won a &5&lCitadel Archer Helmet &7from the &5&lCitadel &7Crate.), item:(leather_helmet 1 &5&lCitadel_Archer_Helmet &cHellForged_IV%line%&cImplants_V%line%&cMermaid_III%line%&cRecover_I%line%&cFireResistance_I 0:3;34:5;1:5;3:5;4:5), chance:(10)' + - 'cmd:(/rawbc &f%player% &7has won a &5&lCitadel Archer Chestplate &7from the &5&lCitadel &7Crate.), item:(leather_chestplate 1 &5&lCitadel_Archer_Chestplate &cHellForged_IV%line%&cRecover_I%line%&cFireResistance_I 0:3;34:5;1:5;3:5;4:5), chance:(10)' + - 'cmd:(/rawbc &f%player% &7has won a &5&lCitadel Archer Leggings &7from the &5&lCitadel &7Crate.), item:(leather_leggings 1 &5&lCitadel_Archer_Leggings &cHellForged_IV%line%&cRecover_I%line%&cFireResistance_I 0:3;34:5;1:5;3:5;4:5), chance:(10)' + - 'cmd:(/rawbc &f%player% &7has won a &5&lCitadel Archer Boots &7from the &5&lCitadel &7Crate.), item:(leather_boots 1 &5&lCitadel_Archer_Boots &cHellForged_IV%line%&cRecover_I%line%&cFireResistance_I 0:3;34:5;1:5;3:5;4:5), chance:(10)' + - 'item:(276 1 &5&lCitadel_Fire 16:3;20:3;34:5),cmd:(/rawbc &f%player% &7has found a &5&lCitadel Fire &7from the &5&lCitadel &7Crate.), chance:(5)' + - 'display:(160:10 1 &f)' + - 'display:(160:2 1 &f)' + - 'display:(160:10 1 &f)' + - 'display:(160:2 1 &f)' + - 'cmd:(/rawbc &f%player% &7has won a &5&lCitadel Rogue Helmet &7from the &5&lCitadel &7Crate.), item:(chainmail_helmet 1 &5&lCitadel_Rogue_Helmet &cHellForged_IV%line%&cImplants_V%line%&cMermaid_III%line%&cRecover_I%line%&cFireResistance_I 0:3;34:5;1:5;3:5;4:5), chance:(10)' + - 'cmd:(/rawbc &f%player% &7has won a &5&lCitadel Rogue Chestplate &7from the &5&lCitadel &7Crate.), item:(chainmail_chestplate 1 &5&lCitadel_Rogue_Chestplate &cHellForged_IV%line%&cRecover_I%line%&cFireResistance_I 0:3;34:5;1:5;3:5;4:5), chance:(10)' + - 'cmd:(/rawbc &f%player% &7has won a &5&lCitadel Rogue Leggings &7from the &5&lCitadel &7Crate.), item:(chainmail_leggings 1 &5&lCitadel_Rogue_Leggings &cHellForged_IV%line%&cRecover_I%line%&cFireResistance_I 0:3;34:5;1:5;3:5;4:5), chance:(10)' + - 'cmd:(/rawbc &f%player% &7has won a &5&lCitadel Rogue Boots &7from the &5&lCitadel &7Crate.), item:(chainmail_boots 1 &5&lCitadel_Rogue_Boots &cHellForged_IV%line%&cRecover_I%line%&cFireResistance_I 0:3;34:5;1:5;3:5;4:5), chance:(10)' + - 'cmd:(/rawbc &f%player% &7has found 64x &6&lGolden Apples &7from a &5&lCitadel &7Crate.), cmd:(/giveitem %player% 322 64), display:(322 64), chance:(10)' + - 'display:(160:2 1 &f)' + - 'display:(160:10 1 &f)' + - 'display:(160:2 1 &f)' + - 'display:(160:10 1 &f)' + - 'display:(160:2 1 &f)' + - 'display:(160:10 1 &f)' + - 'display:(160:2 1 &f)' + - 'display:(160:10 1 &f)' + - 'display:(160:2 1 &f)' + - 'display:(160:10 1 &f)' + - 'display:(160:2 1 &f)' + +Airdrop: + type: KEYCRATE + displayName: '&b&lAirdrop Rewards' + preview: + enabled: true + rows: 3 + buy: + enabled: false + cost: 0 + message: + onOpen: '' + raw: '' + key: + item: 'Tripwire_Hook' + enchantment: '' + name: '&d&lGamble &7Key' + lore: + - '' + - '&7&oOpen this key at &aSpawn &7&oto redeem the loot!' + effect: + onOpenEffects: 'largeexplode' + dormantEffects: '' + reward: + minimumRewards: 1 + maximumRewards: 1 + rewards: + - 'display:(160:0 1 &f)' + - 'display:(160:3 1 &f)' + - 'display:(160:7 1 &f)' + - 'display:(160:0 1 &f)' + - 'display:(160:11 1 &f)' + - 'display:(160:0 1 &f)' + - 'display:(160:7 1 &f)' + - 'display:(160:3 1 &f)' + - 'display:(160:0 1 &f)' + - 'display:(160:3 1 &f)' + - 'display:(160:11 1 &f)' + - 'display:(351:1 1 &4&lCave_Rank_&7[7_Days] 34:5)' + - 'display:(7 5 &2&l$&a&l5&a&l_Buycraft_Voucher 34:5), cmd:(/giveitem dirt 64 %player%), chance(100)' + - 'display:(7 50 &2&l$&a&l50&a&l_Buycraft_Voucher 34:5)' + - 'display:(7 25 &2&l$&a&l25&a&l_Buycraft_Voucher 34:5)' + - 'display:(91 1 &6&lSpooky_Rank_&7[30_Days] 34:5)' + - 'display:(160:11 1 &f)' + - 'display:(160:3 1 &f)' + - 'display:(160:3 1 &f)' + - 'display:(160:11 1 &f)' + - 'display:(emerald_block 32)' + - 'display:(diamond_block 32)' + - 'display:(322:1 2)' + - 'display:(gold_block 32)' + - 'display:(iron_block 32)' + - 'display:(160:11 1 &f)' + - 'display:(160:3 1 &f)' + - 'display:(160:0 1 &f)' + - 'display:(160:3 1 &f)' + - 'display:(160:7 1 &f)' + - 'display:(160:0 1 &f)' + - 'display:(160:11 1 &f)' + - 'display:(160:0 1 &f)' + - 'display:(160:7 1 &f)' + - 'display:(160:3 1 &f)' + - 'display:(160:0 1 &f)' + - 'display:(160:3 1 &f)' + - 'display:(276 1 &b&lAirdrop&7_Sword 16:2;20:2;34:5)' + - 'display:(310 1 &b&lAirdrop&7_Helmet &cAll_custom_enchants 0:2;34:4)' + - 'display:(311 1 &b&lAirdrop&7_Chestplate &cAll_custom_enchants 0:2;34:4)' + - 'display:(312 1 &b&lAirdrop&7_Leggings &cAll_custom_enchants 0:2;34:4)' + - 'display:(313 1 &b&lAirdrop&7_Boots &cAll_custom_enchants 0:2;34:4;2:4)' + - 'display:(261 1 &b&lAirdrop&7_Bow 48:5;34:5;50:1;51:1)' + - 'display:(322 64)' + - 'display:(160:3 1 &f)' + - 'display:(160:3 1 &f)' + - 'display:(160:3 1 &f)' + - 'display:(351:14 1 &6&lPortable_Bard &7Right_Click_to_chose_the_effect_you_want.%line%&7When_you_chose_the_effect_you_want,_you_will_be_given_an%line%&7item_where_you_should_right_click_it_when_you_want_to_give%line%&7you_and_your_team_the_effect_for_5_seconds.%line%%line%&fCan_be_found_in_&b&lAirdrops&f!)' + - 'display:(46 5 &4&lTNT_Minecart &7Right_Click_to_spawn_a_TNT_Minecart%line%&750_blocks_above_your_head!%line%%line%&fCan_be_found_in_&b&lAirdrops&f!)' + - 'display:(watch 5 &6&lTime_Warp &7Right_Click_to_go_back_to_where_you%line%&7pearled_from_15_seconds_ago.%line%%line%&fCan_be_found_in_&b&lAirdrops&f!)' + - 'display:(399 1 &b&lNinja_Star &7Teleport_to_the_last%line%&7person_who_hit_you_within_30_seconds.%line%%line%&fCan_be_found_in_&b&lAirdrops&f!)' + - 'display:(346 1 &6&lGrapple &7Hook_the_block_you_like_to%line%&7move_towards_and_then_release_to_get_sent!%line%%line%&fCan_be_found_in_&b&lAirdrops&f!)' + - 'display:(160:3 1 &f)' + - 'display:(160:3 1 &f)' + - 'display:(160:0 1 &f)' + - 'display:(160:3 1 &f)' + - 'display:(160:7 1 &f)' + - 'display:(160:0 1 &f)' + - 'display:(160:11 1 &f)' + - 'display:(160:0 1 &f)' + - 'display:(160:7 1 &f)' + - 'display:(160:3 1 &f)' + - 'display:(160:0 1 &f)' + +Lootbox: + type: KEYCRATE + displayName: '&6&lFall Lootbox' + preview: + enabled: true + rows: 3 + buy: + enabled: false + cost: 0 + message: + onOpen: '' + raw: '' + key: + item: 'Tripwire_Hook' + enchantment: '' + name: '&d&lGamble &7Key' + lore: + - '' + - '&7&oOpen this key at &aSpawn &7&oto redeem the loot!' + effect: + onOpenEffects: 'largeexplode' + dormantEffects: '' + reward: + minimumRewards: 1 + maximumRewards: 1 + rewards: + - 'display:(160:4 1 &f)' + - 'display:(160:1 1 &f)' + - 'display:(160:1 1 &f)' + - 'display:(160:1 1 &f)' + - 'display:(160:1 1 &f)' + - 'display:(160:1 1 &f)' + - 'display:(160:1 1 &f)' + - 'display:(160:1 1 &f)' + - 'display:(160:4 1 &f)' + - 'display:(160:1 1 &f)' + - 'display:(160:1 1 &f)' + - 'display:(351:11 30 &e&lVIP_Subscription_&7[30_Days] 34:5)' + - 'display:(91 14 &6&lSpooky_Rank_&7[14_Days] 34:5)' + - 'display:(351:1 7 &4&lCave_Rank_&7[7_Days] 34:5)' + - 'display:(7 10 &2&l$&a&l10&a&l_Buycraft_Voucher 34:5)' + - 'display:(7 5 &2&l$&a&l5&a&l_Buycraft_Voucher 34:5), cmd:(/giveitem dirt 64 %player%), chance(100)' + - 'display:(160:1 1 &f)' + - 'display:(160:1 1 &f)' + - 'display:(160:1 1 &f)' + - 'display:(400 30 &6&lHalloween_Kit_&7[30_Days] 34:5)' + - 'display:(emerald_block 16)' + - 'display:(diamond_block 16)' + - 'cmd:(/crowbar %player%), display:(293 1 &cCrowbar &f%line%&eCan_Break:%line%&f_-_&bEnd_Portals:_&e1%line%&f_-_&bSpawners:_&e1), chance:(1.5)' + - 'display:(gold_block 16)' + - 'display:(iron_block 16)' + - 'display:(watch 1 &6&lBattle_Pass_Premium 34:5)' + - 'display:(160:1 1 &f)' + - 'display:(160:1 1 &f)' + - 'display:(322 64)' + - 'display:(310 1 &6&lFall_&7┃_&fHelmet &cAll_custom_enchants 0:2;34:4)' + - 'display:(311 1 &6&lFall_&7┃_&fChestplate &cAll_custom_enchants 0:2;34:4)' + - 'display:(312 1 &6&lFall_&7┃_&fLeggings &cAll_custom_enchants 0:2;34:4)' + - 'display:(313 1 &6&lFall_&7┃_&fBoots &cAll_custom_enchants 0:2;34:4;2:4)' + - 'display:(276 1 &6&lFall_&7┃_&fSword 16:2;20:2;34:5)' + - 'display:(261 1 &6&lFall_&7┃_&fBow 48:5;34:5;50:1;51:1)' + - 'display:(160:1 1 &f)' + - 'display:(160:1 1 &f)' + - 'display:(160:1 1 &f)' + - 'display:(266 8 &6&lMidas_Touch &7Right_click_to_activate_and_for_15_seconds%line%&7a_3x3_of_gold_blocks_appear_under_you.%line%&7You_break/place/interact_with.%line%&7blocks_on_top_of_these_gold_blocks.%line%%line%&fCan_be_found_in_the_&6&lFall_Lootbox&f!)' + - 'display:(344 16 &d&lEggport &7Switch_places_with_your%line%&7enemy_that_are_within_15_Blocks!%line%%line%&fCan_be_found_in_the_&6&lFall_Lootbox&f!)' + - 'display:(322:1 1)' + - 'display:(paper 8 &a&lMed_Kit &7Right_Click_to_receive_Resistance_3,%line%&7Regeneration_3,_and_4_Absorption%line%&7Hearts_for_5_seconds!%line%%line%&fCan_be_found_in_the_&6&lFall_Lootbox&f!)' + - 'display:(369 8 &6&lAnti_Blockup &7Hit_an_enemy_3_times_and_they_may%line%&7no_longer_place/break_blocks%line%&7or_use_fencegates!%line%%line%&fCan_be_found_in_the_&6&lFall_Lootbox&f!), chance:(20)' + - 'display:(160:1 1 &f)' + - 'display:(160:1 1 &f)' + - 'display:(160:4 1 &f)' + - 'display:(160:1 1 &f)' + - 'display:(160:1 1 &f)' + - 'display:(160:1 1 &f)' + - 'display:(160:1 1 &f)' + - 'display:(160:1 1 &f)' + - 'display:(160:1 1 &f)' + - 'display:(160:1 1 &f)' + - 'display:(160:4 1 &f)' + +#OWNER CRATES + +iMakeMcVids: + type: KEYCRATE + displayName: '&c&liMakeMcVids Crate' + holographic: + - '&c&liMakeMcVids' + - '&7&oCrate Loot' + preview: + enabled: true + rows: 1 + buy: + enabled: false + cost: 0 + message: + onOpen: '' + raw: '' + key: + item: '351:1' + enchantment: '34:1' + name: '&c&liMakeMcVids Key' + lore: + - '' + - '&7Right click the &ciMakeMcVids Crate &7to obtain rewards!' + effect: + onOpenEffects: 'flame' + dormantEffects: '' + reward: + minimumRewards: 3 + maximumRewards: 3 + rewards: + - 'display:(160:14 1 &7&o), chance:(0), noduplicate:()' + - 'display:(160:6 1 &7&o), chance:(0), noduplicate:()' + - 'item:(310 1 &c&liMakeMcVids_&7┃_&fHelmet &cHellForged_IV%line%&cImplants_V%line%&cMermaid_III%line%&cRecover_I%line%&cFireResistance_I 0:2;34:5), chance:(5)' + - 'item:(311 1 &c&liMakeMcVids_&7┃_&fChestplate &cHellForged_IV%line%&cRecover_I%line%&cFireResistance_I 0:2;34:5), chance:(5)' + - 'item:(312 1 &c&liMakeMcVids_&7┃_&fLeggings &cHellForged_IV%line%&cRecover_I%line%&cFireResistance_I 0:2;34:5), chance:(5)' + - 'item:(313 1 &c&liMakeMcVids_&7┃_&fBoots &cSpeed_II%line%&cHellForged_IV%line%&cRecover_I%line%&cFireResistance_I 0:2;34:5;2:5), chance:(5)' + - 'item:(276 1 &c&liMakeMcVids_&7┃_&fSword 16:2;34:5;21:5), chance:(5)' + - 'display:(160:6 1 &7&o), chance:(0), noduplicate:()' + - 'display:(160:14 1 &7&o), chance:(0), noduplicate:()' + - 'display:(160:6 1 &7&o), chance:(0), noduplicate:()' + - 'cmd:(/giveitem %player% 322:1 1),display:(322:1 1), chance:(2.5)' + - 'cmd:(/giveitem %player% 322 32),display:(322 32), chance:(6)' + - 'cmd:(/airdrops give %player% 1), cmd:(/rawbc &f%player% &7has found a &b&lAirdrop &7from a &c&liMakeMcVids &7Crate.), display:(dropper 1 &b&lAirdrop &c0.5%_chance 34:10), chance:(0.1)' + - 'cmd:(/cr givekey %player% iMakeMcVids 3), cmd:(/rawbc &f%player% &7has found &c&l3x iMakeMcVids Keys &7from an &c&liMakeMcVids &7Crate.), display:(351:1 3 &c&liMakeMcVids_&7┃_&fKeys &7Right_click_the_&ciMakeMcVids_&7to_obtain_rewards! 34:5), chance:(0.7)' + - 'cmd:(/ownerclickablekit give &c&liMakeMcVids %player%), cmd:(/rawbc &f%player% &7has found a &c&lClickable Kit &7from a &c&liMakeMcVids &7Crate.), display:(340 1 &c&liMakeMcVids_&7┃_&fClickable_Kit &7Right_click_to_receive_the_&ciMakeMcVids_&7Kit!), chance:(0.1)' + - 'cmd:(/ability antipearl 3 %player%), display:(381 3 &c&lAnti_Pearl_2.0 %line%&6❙_&fHit_a_player_to_put_them_on_enderpearl_cooldown.%line%&6❙_&fRight_Click_to_remove_your_enderpearl_cooldown.%line%%line%&fCan_be_found_in_the_&c&liMakeMcVids_Crate&f!), chance:(2)' + - 'cmd:(/ability antipearl 6 %player%), display:(381 6 &c&lAnti_Pearl_2.0 %line%&6❙_&fHit_a_player_to_put_them_on_enderpearl_cooldown.%line%&6❙_&fRight_Click_to_remove_your_enderpearl_cooldown.%line%%line%&fCan_be_found_in_the_&c&liMakeMcVids_Crate&f!), chance:(2)' + - 'display:(160:6 1 &7&o), chance:(0), noduplicate:()' + - 'display:(160:14 1 &7&o), chance:(0), noduplicate:()' + - 'display:(160:6 1 &7&o), chance:(0), noduplicate:()' + - 'cmd:(/giveitem %player% emeraldblock 32),display:(emerald_block 32), chance:(10)' + - 'cmd:(/giveitem %player% diamondblock 32),display:(diamond_block 32), chance:(10)' + - 'cmd:(/bukkit:give %player% minecraft:skull 1 3 {SkullOwner:"iMakeMcVids"}),display:(397:3 1 &c&liMakeMcVids_&7┃_&fHead), chance:(0.1)' + - 'cmd:(/giveitem %player% goldblock 32),display:(gold_block 32), chance:(10)' + - 'cmd:(/giveitem %player% ironblock 32),display:(iron_block 32), chance:(10)' + - 'display:(160:6 1 &7&o), chance:(0), noduplicate:()' + - 'display:(160:14 1 &7&o), chance:(0), noduplicate:()' + +NotRamix: + type: KEYCRATE + displayName: '&9&lNotRamix Crate' + holographic: + - '&9&lNotRamix' + - '&7&oCrate Loot' + preview: + enabled: true + rows: 1 + buy: + enabled: false + cost: 0 + message: + onOpen: '' + raw: '' + key: + item: '351:12' + enchantment: '34:1' + name: '&9&lNotRamix Key' + lore: + - '' + - '&7Right click the &9NotRamix Crate &7to obtain rewards!' + effect: + onOpenEffects: 'HAPPYVILLAGER' + dormantEffects: '' + reward: + minimumRewards: 3 + maximumRewards: 3 + rewards: + - 'display:(160:11 1 &7&o), chance:(0), noduplicate:()' + - 'display:(160:3 1 &7&o), chance:(0), noduplicate:()' + - 'item:(310 1 &9&lNotRamix_&7┃_&fHelmet &cHellForged_IV%line%&cImplants_V%line%&cMermaid_III%line%&cRecover_I%line%&cFireResistance_I 0:2;34:5), chance:(5)' + - 'item:(311 1 &9&lNotRamix_&7┃_&fChestplate &cHellForged_IV%line%&cRecover_I%line%&cFireResistance_I 0:2;34:5), chance:(5)' + - 'item:(312 1 &9&lNotRamix_&7┃_&fLeggings &cHellForged_IV%line%&cRecover_I%line%&cFireResistance_I 0:2;34:5), chance:(5)' + - 'item:(313 1 &9&lNotRamix_&7┃_&fBoots &cSpeed_II%line%&cHellForged_IV%line%&cRecover_I%line%&cFireResistance_I 0:2;34:5;2:5), chance:(5)' + - 'item:(276 1 &9&lNotRamix_&7┃_&fSword 16:2;34:5;21:5), chance:(5)' + - 'display:(160:3 1 &7&o), chance:(0), noduplicate:()' + - 'display:(160:11 1 &7&o), chance:(0), noduplicate:()' + - 'display:(160:3 1 &7&o), chance:(0), noduplicate:()' + - 'cmd:(/giveitem %player% 322:1 1),display:(322:1 1), chance:(2.5)' + - 'cmd:(/giveitem %player% 322 32),display:(322 32), chance:(6)' + - 'cmd:(/airdrops give %player% 1), cmd:(/rawbc &f%player% &7has found a &b&lAirdrop &7from a &9&lNotRamix &7Crate.), display:(dropper 1 &b&lAirdrop &c0.5%_chance 34:10), chance:(0.1)' + - 'cmd:(/cr givekey %player% NotRamix 3), cmd:(/rawbc &f%player% &7has found &a&l3x NotRamix Keys &7from an &9&lNotRamix &7Crate.), display:(351:4 3 &9&lNotRamix_&7┃_&fKeys &7Right_click_the_&9NotRamix_&7to_obtain_rewards! 34:5), chance:(0.7)' + - 'cmd:(/ownerclickablekit give &9&lNotRamix %player%), cmd:(/rawbc &f%player% &7has found a &a&lClickable Kit &7from a &9&lNotRamix &7Crate.), display:(340 1 &9&lNotRamix_&7┃_&fClickable_Kit &7Right_click_to_receive_the_&9NotRamix_&7Kit!), chance:(0.1)' + - 'cmd:(/ability hulksmash 3 %player%), display:(336 3 &2&lHulk_Smash %line%&6❙_&fRight_Click_to_be_launched,_when%line%&6❙_&fyou_land_all_players_within_a_&c&l5x5_&fradius%line%&6❙_&fwill_take_damage_and_will_be_launched_in_the_air.%line%%line%&fCan_be_found_in_the_&9&lNotRamix_Crate&f!), chance:(2)' + - 'cmd:(/ability hulksmash 6 %player%), display:(336 6 &2&lHulk_Smash %line%&6❙_&fRight_Click_to_be_launched,_when%line%&6❙_&fyou_land_all_players_within_a_&c&l5x5_&fradius%line%&6❙_&fwill_take_damage_and_will_be_launched_in_the_air.%line%%line%&fCan_be_found_in_the_&9&lNotRamix_Crate&f!), chance:(1)' + - 'display:(160:3 1 &7&o), chance:(0), noduplicate:()' + - 'display:(160:11 1 &7&o), chance:(0), noduplicate:()' + - 'display:(160:3 1 &7&o), chance:(0), noduplicate:()' + - 'cmd:(/giveitem %player% emeraldblock 32),display:(emerald_block 32), chance:(10)' + - 'cmd:(/giveitem %player% diamondblock 32),display:(diamond_block 32), chance:(10)' + - 'cmd:(/bukkit:give %player% minecraft:skull 1 3 {SkullOwner:"NotRamix"}),display:(397:3 1 &9&lNotRamix_&7┃_&fHead), chance:(0.1)' + - 'cmd:(/giveitem %player% goldblock 32),display:(gold_block 32), chance:(10)' + - 'cmd:(/giveitem %player% ironblock 32),display:(iron_block 32), chance:(10)' + - 'display:(160:3 1 &7&o), chance:(0), noduplicate:()' + - 'display:(160:11 1 &7&o), chance:(0), noduplicate:()' +Dylan: + type: KEYCRATE + displayName: '&a&lDylan Crate' + holographic: + - '&a&lDylan' + - '&7&oCrate Loot' + preview: + enabled: true + rows: 1 + buy: + enabled: false + cost: 0 + message: + onOpen: '' + raw: '' + key: + item: '351:10' + enchantment: '34:1' + name: '&a&lDylan Key' + lore: + - '' + - '&7Right click the &aDylan Crate &7to obtain rewards!' + effect: + onOpenEffects: 'HAPPYVILLAGER' + dormantEffects: '' + reward: + minimumRewards: 3 + maximumRewards: 3 + rewards: + - 'display:(160:13 1 &7&o), chance:(0), noduplicate:()' + - 'display:(160:5 1 &7&o), chance:(0), noduplicate:()' + - 'item:(310 1 &a&lDylan_&7┃_&fHelmet &cHellForged_IV%line%&cImplants_V%line%&cMermaid_III%line%&cRecover_I%line%&cFireResistance_I 0:2;34:5), chance:(5)' + - 'item:(311 1 &a&lDylan_&7┃_&fChestplate &cHellForged_IV%line%&cRecover_I%line%&cFireResistance_I 0:2;34:5), chance:(5)' + - 'item:(312 1 &a&lDylan_&7┃_&fLeggings &cHellForged_IV%line%&cRecover_I%line%&cFireResistance_I 0:2;34:5), chance:(5)' + - 'item:(313 1 &a&lDylan_&7┃_&fBoots &cSpeed_II%line%&cHellForged_IV%line%&cRecover_I%line%&cFireResistance_I 0:2;34:5;2:5), chance:(5)' + - 'item:(276 1 &a&lDylan_&7┃_&fSword 16:2;34:5;21:5), chance:(5)' + - 'display:(160:5 1 &7&o), chance:(0), noduplicate:()' + - 'display:(160:13 1 &7&o), chance:(0), noduplicate:()' + - 'display:(160:5 1 &7&o), chance:(0), noduplicate:()' + - 'cmd:(/giveitem %player% 322:1 1),display:(322:1 1), chance:(2.5)' + - 'cmd:(/giveitem %player% 322 32),display:(322 32), chance:(6)' + - 'cmd:(/airdrops give %player% 1), cmd:(/rawbc &f%player% &7has found a &b&lAirdrop &7from a &a&lDylan &7Crate.), display:(dropper 1 &b&lAirdrop &c0.5%_chance 34:10), chance:(0.1)' + - 'cmd:(/cr givekey %player% Dylan 3), cmd:(/rawbc &f%player% &7has found &a&l3x Dylan Keys &7from an &a&lDylan &7Crate.), display:(351:10 3 &a&lDylan_&7┃_&fKeys &7Right_click_the_&aDylan_Crate_&7to_obtain_rewards! 34:5), chance:(0.7)' + - 'cmd:(/ownerclickablekit give &a&lDylan %player%), cmd:(/rawbc &f%player% &7has found a &a&lClickable Kit &7from a &a&lDylan &7Crate.), display:(340 1 &a&lDylan_&7┃_&fClickable_Kit &7Right_click_to_receive_the_&aDylan_&7Kit!), chance:(0.1)' + - 'cmd:(/ability Combo 3 %player%), display:(38:0 3 &a&lCombo_Ability %line%&6❙_&fGet_a_second_of_strength_II_for_the%line%&6❙_&famount_of_hits_dealt_within_10_seconds.%line%%line%&fCan_be_found_in_the_&a&lDylan_Crate&f!), chance:(1)' + - 'cmd:(/ability Combo 6 %player%), display:(38:0 6 &a&lCombo_Ability %line%&6❙_&fGet_a_second_of_strength_II_for_the%line%&6❙_&famount_of_hits_dealt_within_10_seconds.%line%%line%&fCan_be_found_in_the_&a&lDylan_Crate&f!), chance:(0.5)' + - 'display:(160:5 1 &7&o), chance:(0), noduplicate:()' + - 'display:(160:13 1 &7&o), chance:(0), noduplicate:()' + - 'display:(160:5 1 &7&o), chance:(0), noduplicate:()' + - 'cmd:(/giveitem %player% emeraldblock 32),display:(emerald_block 32), chance:(10)' + - 'cmd:(/giveitem %player% diamondblock 32),display:(diamond_block 32), chance:(10)' + - 'cmd:(/bukkit:give %player% minecraft:skull 1 3 {SkullOwner:"Dylan"}),display:(397:3 1 &a&lDylan''s_Head), chance:(0.1)' + - 'cmd:(/giveitem %player% goldblock 32),display:(gold_block 32), chance:(10)' + - 'cmd:(/giveitem %player% ironblock 32),display:(iron_block 32), chance:(10)' + - 'display:(160:5 1 &7&o), chance:(0), noduplicate:()' + - 'display:(160:13 1 &7&o), chance:(0), noduplicate:()' +Resucting: + type: KEYCRATE + displayName: '&4&lResucting Crate' + holographic: + - '&4&lResucting' + - '&7&oCrate Loot' + preview: + enabled: true + rows: 1 + buy: + enabled: false + cost: 0 + message: + onOpen: '' + raw: '' + key: + item: '351:1' + enchantment: '34:1' + name: '&4&lResucting Key' + lore: + - '' + - '&7Right click the &4Resucting Crate &7to obtain rewards!' + effect: + onOpenEffects: 'heart' + dormantEffects: '' + reward: + minimumRewards: 3 + maximumRewards: 3 + rewards: + - 'display:(160:7 1 &7&o), chance:(0), noduplicate:()' + - 'display:(160:14 1 &7&o), chance:(0), noduplicate:()' + - 'item:(310 1 &4&lResucting_&7┃_&fHelmet &cHellForged_IV%line%&cImplants_V%line%&cMermaid_III%line%&cRecover_I%line%&cFireResistance_I 0:2;34:5), chance:(5)' + - 'item:(311 1 &4&lResucting_&7┃_&fChestplate &cHellForged_IV%line%&cRecover_I%line%&cFireResistance_I 0:2;34:5), chance:(5)' + - 'item:(312 1 &4&lResucting_&7┃_&fLeggings &cHellForged_IV%line%&cRecover_I%line%&cFireResistance_I 0:2;34:5), chance:(5)' + - 'item:(313 1 &4&lResucting_&7┃_&fBoots &cSpeed_II%line%&cHellForged_IV%line%&cRecover_I%line%&cFireResistance_I 0:2;34:5;2:5), chance:(5)' + - 'item:(276 1 &4&lResucting_&7┃_&fSword 16:2;34:5;21:5), chance:(5)' + - 'display:(160:14 1 &7&o), chance:(0), noduplicate:()' + - 'display:(160:7 1 &7&o), chance:(0), noduplicate:()' + - 'display:(160:14 1 &7&o), chance:(0), noduplicate:()' + - 'cmd:(/giveitem %player% 322:1 1),display:(322:1 1), chance:(2.5)' + - 'cmd:(/giveitem %player% 322 32),display:(322 32), chance:(6)' + - 'cmd:(/airdrops give %player% 1), cmd:(/rawbc &f%player% &7has found a &b&lAirdrop &7from a &4&lResucting &7Crate.), display:(dropper 1 &b&lAirdrop &a0.5%_chance 34:10), chance:(0.1)' + - 'cmd:(/cr givekey %player% Resucting 3), cmd:(/rawbc &f%player% &7has found &4&l3x Resucting Keys &7from an &4&lResucting &7Crate.), display:(351:1 3 &4&lResucting_&7┃_&fKeys &7Right_click_the_&4Resucting_&7to_obtain_rewards! 34:5), chance:(0.7)' + - 'cmd:(/ownerclickablekit give &4&lResucting %player%), cmd:(/rawbc &f%player% &7has found a &4&lClickable Kit &7from a &4&lResucting &7Crate.), display:(340 1 &4&lResucting_&7┃_&fClickable_Kit &7Right_click_to_receive_the_&4Resucting_&7Kit!), chance:(0.1)' + - 'cmd:(/ability phoenixmode 3 %player%), display:(emerald 3 &4&lPhoenix_Mode %line%&6❙_&fClick_to_create_a_cloud_of_particles.%line%&6❙_&fInside_the_cloud,_enemies_deal_&c&l-20%_&fdamage%line%&6❙_&fto_you_and_you_deal_&c&l+20%_&fdamage_to_enemies.%line%%line%&fCan_be_found_in_the_&4&lResucting_Crate&f!), chance:(2)' + - 'cmd:(/ability phoenixmode 6 %player%), display:(emerald 6 &4&lPhoenix_Mode %line%&6❙_&fClick_to_create_a_cloud_of_particles.%line%&6❙_&fInside_the_cloud,_enemies_deal_&c&l-20%_&fdamage%line%&6❙_&fto_you_and_you_deal_&c&l+20%_&fdamage_to_enemies.%line%%line%&fCan_be_found_in_the_&4&lResucting_Crate&f!), chance:(1)' + - 'display:(160:14 1 &7&o), chance:(0), noduplicate:()' + - 'display:(160:7 1 &7&o), chance:(0), noduplicate:()' + - 'display:(160:14 1 &7&o), chance:(0), noduplicate:()' + - 'cmd:(/giveitem %player% emeraldblock 32),display:(emerald_block 32), chance:(10)' + - 'cmd:(/giveitem %player% diamondblock 32),display:(diamond_block 32), chance:(10)' + - 'cmd:(/bukkit:give %player% minecraft:skull 1 3 {SkullOwner:"Resucting"}),display:(397:3 1 &4&lResucting_&7┃_&fHead), chance:(0.1)' + - 'cmd:(/giveitem %player% goldblock 32),display:(gold_block 32), chance:(10)' + - 'cmd:(/giveitem %player% ironblock 32),display:(iron_block 32), chance:(10)' + - 'display:(160:14 1 &7&o), chance:(0), noduplicate:()' + - 'display:(160:7 1 &7&o), chance:(0), noduplicate:()' + +Headed: + type: KEYCRATE + displayName: '&3&lHeaded Crate' + holographic: + - '&3&lHeaded Crate' + preview: + enabled: true + rows: 3 + buy: + enabled: false + cost: 0 + message: + onOpen: '' + broadcast: '' + key: + item: '131' + enchantment: '34:1' + name: '&3&lHeaded Key' + lore: + - '&7Right click a &3Headed Crate &7to receive rewards!' + effect: + onOpenEffects: 'SPELL' + dormantEffects: '' + reward: + minimumRewards: 3 + maximumRewards: 3 + rewards: + - 'display:(160:11 1 &7&o), chance:(0), noduplicate:()' + - 'display:(160:3 1 &7&o), chance:(0), noduplicate:()' + - 'item:(310 1 &3&lHeaded_&7┃_&fHelmet &cHellForged_IV%line%&cImplants_V%line%&cMermaid_III%line%&cRecover_I%line%&cFireResistance_I 0:2;34:5), chance:(5)' + - 'item:(311 1 &3&lHeaded_&7┃_&fChestplate &cHellForged_IV%line%&cRecover_I%line%&cFireResistance_I 0:2;34:5), chance:(5)' + - 'item:(312 1 &3&lHeaded_&7┃_&fLeggings &cHellForged_IV%line%&cRecover_I%line%&cFireResistance_I 0:2;34:5), chance:(5)' + - 'item:(313 1 &3&lHeaded_&7┃_&fBoots &cSpeed_II%line%&cHellForged_IV%line%&cRecover_I%line%&cFireResistance_I 0:2;34:5;2:5), chance:(5)' + - 'item:(276 1 &3&lHeaded_&7┃_&fSword 16:2;34:5;21:5), chance:(5)' + - 'display:(160:3 1 &7&o), chance:(0), noduplicate:()' + - 'display:(160:11 1 &7&o), chance:(0), noduplicate:()' + - 'display:(160:3 1 &7&o), chance:(0), noduplicate:()' + - 'cmd:(/giveitem %player% 322:1 1),display:(322:1 1), chance:(2.5)' + - 'cmd:(/giveitem %player% 322 32),display:(322 32), chance:(6)' + - 'cmd:(/airdrops give %player% 1), cmd:(/rawbc &f%player% &7has found a &b&lAirdrop &7from a &3&lHeaded &7Crate.), display:(dropper 1 &b&lAirdrop &a0.5%_chance 34:10), chance:(0.1)' + - 'cmd:(/cr givekey %player% Headed 3), cmd:(/rawbc &f%player% &7has found &3&l3x Headed Keys &7from an &3&lHeaded &7Crate.), display:(351:6 3 &3&lHeaded_&7┃_&fKeys &7Right_click_the_&3Headed_&7to_obtain_rewards! 34:5), chance:(0.7)' + - 'cmd:(/ownerclickablekit give &3&lHeaded %player%), cmd:(/rawbc &f%player% &7has found a &3&lClickable Kit &7from a &3&lHeaded &7Crate.), display:(340 1 &3&lHeaded_&7┃_&fClickable_Kit &7Right_click_to_receive_the_&3Headed_&7Kit!), chance:(0.1)' + - 'cmd:(/ability Scrambler 3 %player%), display:(349:2 3 &9&lScrambler %line%&6❙_&fHit_a_player_3_times_to%line%&6❙_&fscramble_their_hotbar!%line%%line%&fCan_be_found_in_the_&9&lHeaded_Crate&f), chance:(2)' + - 'cmd:(/ability Scrambler 6 %player%), display:(349:2 6 &9&lScrambler %line%&6❙_&fHit_a_player_3_times_to%line%&6❙_&fscramble_their_hotbar!%line%%line%&fCan_be_found_in_the_&9&lHeaded_Crate&f), chance:(1)' + - 'display:(160:3 1 &7&o), chance:(0), noduplicate:()' + - 'display:(160:11 1 &7&o), chance:(0), noduplicate:()' + - 'display:(160:3 1 &7&o), chance:(0), noduplicate:()' + - 'cmd:(/giveitem %player% emeraldblock 32),display:(emerald_block 32), chance:(10)' + - 'cmd:(/giveitem %player% diamondblock 32),display:(diamond_block 32), chance:(10)' + - 'cmd:(/bukkit:give %player% minecraft:skull 1 3 {SkullOwner:"Headed"}),display:(397:3 1 &3&lHeaded_&7┃_&fHead), chance:(0.1)' + - 'cmd:(/giveitem %player% goldblock 32),display:(gold_block 32), chance:(10)' + - 'cmd:(/giveitem %player% ironblock 32),display:(iron_block 32), chance:(10)' + - 'display:(160:3 1 &7&o), chance:(0), noduplicate:()' + - 'display:(160:11 1 &7&o), chance:(0), noduplicate:()' +New: + type: KEYCRATE + displayName: '&4&l??? Crate' + holographic: + - '&4&l???' + - '&7&oCrate Loot' + preview: + enabled: true + rows: 1 + buy: + enabled: false + cost: 0 + message: + onOpen: '' + raw: '' + key: + item: 'Tripwire_Hook' + enchantment: '' + name: '&4&l??? Key' + lore: + - '' + - '&7Right click the &4??? Crate &7to obtain rewards!' + effect: + onOpenEffects: 'witchMagic' + dormantEffects: '' + reward: + minimumRewards: 1 + maximumRewards: 1 + rewards: + - 'display:(160:14 1 &f)' + - 'display:(160:14 1 &f)' + - 'display:(160:14 1 &f)' + - 'display:(160:14 1 &f)' + - 'display:(160:14 1 &f)' + - 'display:(160:14 1 &f)' + - 'display:(160:14 1 &f)' + - 'display:(160:14 1 &f)' + - 'display:(160:14 1 &f)' + - 'display:(160:14 1 &f)' + - 'display:(160:14 1 &f)' + - 'cmd:(/ability AttackDogs 2 %player%), display:(paper 1 &4&l??? &7Big_announcement_coming_today%line%&715_minutes_into_SOTW!_Check_our_twitter!%line%%line%&ahttps://twitter.com/CavePvPorg), chance:(100)' + - 'cmd:(/ability AttackDogs 2 %player%), display:(paper 1 &4&l??? &7Big_announcement_coming_today%line%&715_minutes_into_SOTW!_Check_our_twitter!%line%%line%&ahttps://twitter.com/CavePvPorg), chance:(100)' + - 'cmd:(/ability AttackDogs 2 %player%), display:(paper 1 &4&l??? &7Big_announcement_coming_today%line%&715_minutes_into_SOTW!_Check_our_twitter!%line%%line%&ahttps://twitter.com/CavePvPorg), chance:(100)' + - 'cmd:(/ability AttackDogs 2 %player%), display:(paper 1 &4&l??? &7Big_announcement_coming_today%line%&715_minutes_into_SOTW!_Check_our_twitter!%line%%line%&ahttps://twitter.com/CavePvPorg), chance:(100)' + - 'cmd:(/ability AttackDogs 2 %player%), display:(paper 1 &4&l??? &7Big_announcement_coming_today%line%&715_minutes_into_SOTW!_Check_our_twitter!%line%%line%&ahttps://twitter.com/CavePvPorg), chance:(100)' + - 'display:(160:14 1 &f)' + - 'display:(160:14 1 &f)' + - 'display:(160:14 1 &f)' + - 'display:(160:14 1 &f)' + - 'display:(160:14 1 &f)' + - 'display:(160:14 1 &f)' + - 'display:(160:14 1 &f)' + - 'display:(160:14 1 &f)' + - 'display:(160:14 1 &f)' + - 'display:(160:14 1 &f)' + - 'display:(160:14 1 &f)' + +# PARTNER CRATES + +Partner: + type: KEYCRATE + displayName: '&d&lPartner Crate' + holographic: + - '&d&lPartner Crate' + preview: + enabled: true + rows: 3 + buy: + enabled: false + cost: 0 + message: + onOpen: '&aSuccessfully opened a &d&lPartner Crate&a!' + broadcast: '' + key: + item: '131' + enchantment: '34:1' + name: '&d&lPartner Key' + lore: + - '&7Right click a &dPartner Crate &7to receive rewards!' + effect: + onOpenEffects: '' + dormantEffects: '' + reward: + minimumRewards: 3 + maximumRewards: 3 + rewards: + - 'display:(160:2 1 &7&o), chance:(0), noduplicate:()' + - 'display:(160:6 1 &7&o), chance:(0), noduplicate:()' + - 'item:(310 1 &d&lPartner_&7┃_&fHelmet &cHellForged_IV%line%&cImplants_V%line%&cMermaid_III%line%&cRecover_I%line%&cFireResistance_I 0:2;34:5), chance:(5)' + - 'item:(311 1 &d&lPartner_&7┃_&fChestplate &cHellForged_IV%line%&cRecover_I%line%&cFireResistance_I 0:2;34:5), chance:(5)' + - 'item:(312 1 &d&lPartner_&7┃_&fLeggings &cHellForged_IV%line%&cRecover_I%line%&cFireResistance_I 0:2;34:5), chance:(5)' + - 'item:(313 1 &d&lPartner_&7┃_&fBoots &cSpeed_II%line%&cHellForged_IV%line%&cRecover_I%line%&cFireResistance_I 0:2;34:5;2:5), chance:(5)' + - 'item:(276 1 &d&lPartner_&7┃_&fSword 16:2;34:5;21:5), chance:(5)' + - 'display:(160:6 1 &7&o), chance:(0), noduplicate:()' + - 'display:(160:2 1 &7&o), chance:(0), noduplicate:()' + - 'display:(160:6 1 &7&o), chance:(0), noduplicate:()' + - 'cmd:(/giveitem %player% 322 16),display:(322 16), chance:(6)' + - 'cmd:(/ability ReverseCard 3 %player%), display:(empty_map 3 &6&lReverse_Card %line%&6❙_&fHit_a_player_three_times.%line%&6❙_&f&fFor_&e&l12_seconds&f,_you_can_click%line%&6❙_&fany_block_they_click_with_and_you%line%&6❙_&fcan_break_any_block_they_place.%line%%line%&fCan_be_found_in_the_&d&lPartner_&fCrate!), chance:(2)' + - 'cmd:(/ability MidasTouch 3 %player%), display:(gold_ingot 3 &6&lMidas_Touch %line%&6❙_&fClick_to_activate_and_for_&e&l15_seconds%line%&6❙_&fa_3x3_of_gold_blocks_appear_under_you.%line%&6❙_&fYou_cannot_break/place/interact_with.%line%&6❙_&fblocks_on_top_of_these_gold_blocks.%line%%line%&fCan_be_found_in_the_&d&lPartner_&fCrate!), chance:(2)' + - 'cmd:(/cr givekey %player% Partner 3), cmd:(/rawbc &f%player% &7has found &d&l3x Partner Keys &7from an &d&lPartner &7Crate.), display:(351:9 3 &d&lPartner_&7┃_&fKeys &7Right_click_the_&dPartner_&7to_obtain_rewards! 34:5), chance:(0.7)' + - 'cmd:(/ability Spider 3 %player%), display:(spider_eye 3 &5&lSpider_Ability %line%&6❙_&fRight_Click_to_activate_and_for_15_seconds,_all_hits%line%&6❙_&fdealt_have_a_25%_chance_of_putting_a_cobweb_underneath_the_enemy.%line%%line%&fCan_be_found_in_the_&d&lPartner_&fCrate!), chance:(2)' + - 'cmd:(/ability Invisibility 3 %player%), display:(351 3 &3&lInvisibility %line%&6❙_&fWhen_you_right_click_this_item%line%&6❙_&fyour_armor_will_no_longer_be_visible.%line%%line%&fCan_be_found_in_the_&d&lPartner_&fCrate!), chance:(2)' + - 'cmd:(/giveitem %player% 322 32),display:(322 32), chance:(6)' + - 'display:(160:6 1 &7&o), chance:(0), noduplicate:()' + - 'display:(160:2 1 &7&o), chance:(0), noduplicate:()' + - 'display:(160:6 1 &7&o), chance:(0), noduplicate:()' + - 'cmd:(/giveitem %player% emeraldblock 8),display:(emerald_block 8), chance:(10)' + - 'cmd:(/giveitem %player% diamondblock 8),display:(diamond_block 8), chance:(10)' + - 'cmd:(/crates give %player% Seasonal 1), cmd:(/rawbc &f%player% &7has found a &b&lAirdrop &7from a &d&lPartner &7Crate.), display:(ender_chest 1 &6&lFall_Lootbox 34:10), chance:(0.1)' + - 'cmd:(/giveitem %player% goldblock 8),display:(gold_block 8), chance:(10)' + - 'cmd:(/giveitem %player% ironblock 8),display:(iron_block 8), chance:(10)' + - 'display:(160:6 1 &7&o), chance:(0), noduplicate:()' + - 'display:(160:2 1 &7&o), chance:(0), noduplicate:()' + \ No newline at end of file diff --git a/Configs + Precompiled/config/CrateReloaded/lang/l_bg.properties b/Configs + Precompiled/config/CrateReloaded/lang/l_bg.properties new file mode 100644 index 0000000..834d812 --- /dev/null +++ b/Configs + Precompiled/config/CrateReloaded/lang/l_bg.properties @@ -0,0 +1,117 @@ + +# Credit: using-xenforo @Spigot + +################## +#- Help -# +################## + +# Unknown Command +help.user=%gray%------------------- %prefix%%gray%-------------------\ +\n%light_purple%CrateReloaded %green%??? %light_purple%??????????? ????? %green%? %light_purple%????? ??? ?????? \ +%green%????? ? ???????!\ +\n%white%/crate list %green%?? ?? ?????? ??????? ? ?????!\ +\n%white%/crate info %green%?? ?? ?????? ?????????? ?? ???!\ +\n%gray%----------------------------------------------------- + +# Info Command +info.user=%gray%----------------------- %prefix%%gray%----------------------\ +\n%green%??? ?? ???????: %white%%cratename%\ +\n%green%??? ?? ???????: %white%%cratetype%\ +\n%green%?????? ?? ???: %white%%cratebuy%\ +\n%green%???? ?? ??????????: %white%%cratecost%\ +\n%gray%----------------------------------------------------- + +# List Command +list.user=%gray%----------------------- %prefix%%gray%----------------------\ +\n%green%?????? ??? ?????: %white%%list%\ +\n%gray%-----------------------------------------------------\ + +################## +#- Commands -# +################## + +# No Permission +command.permission.none=%prefix%??? ?????? ????? ?? ?????????? ???? ???????. + +# Unknown Command +command.unknown.notfound=%prefix%????????? ?? ? ????????. + +# Incorrect Usage +command.incorrect.usage=%prefix%?????????? ?????????? + +# Player only command +command.playeronly.usage=%prefix%???? ?????? ????? ?? ????????? ???? ???????. + +# Incorrect Parameters +command.incorrect.parameters=%prefix%?????????? ????????? +# Incorrect Arguments +command.incorrect.arguments=%prefix%?????????? ???? ????????? %green% + +# Argument must be numbers +command.incorrect.numbers=%prefix%??????????? ?????? ?? ??? ????? + +####################### +#- Crate/Keys -# +####################### + +# Incorrect crate crateName +crate.incorrect.name=%prefix%?????????? ??? ?? ????? + +# Player is offline, unable to receive items +crate.player.offline=%prefix%??????? ?????? ?? ? ? ???????, ?? ?? ?????? ?????. + +# Received a crate +crate.player.recieved=%prefix%??? ????????? ?????. + +# Unable to buy crate +crate.player.unabletobuy=%prefix%??? ?? ??????? ?? ?????? ?????. ????????? ???? ????? ?????????? ????, ? ???? ??????? ?? ???????. + +# Select a crate +crate.player.noselection=%prefix%???? ???????? ?????. + +# You cannot give a key crate. +crate.player.nogivekeycrate=%prefix%??? ?? ?????? ?? ?????? ????? ? ????, ???? ?????? ???? ????? ????. + +# No Key +crate.player.nokey=%prefix%?????? ?? ???? ?? ?? ???????? ???? ?????. + +# Received a key +crate.player.keyrecieved=%prefix%??? ????????? ???? + +# Unable to set key crate +crate.key.createerror=%prefix%?? ??????? ?? ??????? ??????? ? ????. + +# Successfully created a key crate +crate.key.createsuccess=%prefix%??? ????????? ????? ? ???? ?? ???? ?????! + +# Unable to remove key crate +crate.key.removeerror=%prefix%?? ??????? ?? ????????? ??????? ? ????. + +# Successfully remove a key crate +crate.key.removesuccess=%prefix%??? ??????????? ????? ? ???? ?? ???? ?????! + +# Not a keycrate +crate.key.notankey=%prefix%???? ?? ? ????? ? ????! + +# Unable to use the key here +crate.key.unabletouse=%prefix%?? ?????? ?? ?????????? ????? ???. + +# You don't have the right key +crate.key.wrongkey=%prefix%??? ?????? ???? ?? ??????? %cratename%! + +################## +#- Money -# +################## + +# -UNUSED- Replaced by crate.player.unabletobuy +money.notenough=%prefix%??? ?????? ?????????? ????, ?? ?? ?????? ???? ?????. + +# Transaction Complete +money.transaction.complete=%prefix%???????????? ?????????! ??????? ?? %money%. + +################## +#- Error -# +################## + +# Number Error +error.excp.numberformat=%prefix%????????? ?????????, ???????? ?? ?????. \ No newline at end of file diff --git a/Configs + Precompiled/config/CrateReloaded/lang/l_en.properties b/Configs + Precompiled/config/CrateReloaded/lang/l_en.properties new file mode 100644 index 0000000..61f6a4f --- /dev/null +++ b/Configs + Precompiled/config/CrateReloaded/lang/l_en.properties @@ -0,0 +1,128 @@ +################## +#- Help -# +################## + +# Unknown Command +help.user=%gray%----------------------- %prefix%%gray%----------------------\ +\n%light_purple%CrateReloaded %green%features %light_purple%MysteryCrates %green%to %light_purple%Supply Crates \ +%green%filled with prizes and rewards!\ +\n%white%/crate list %green%to view what crates there are!\ +\n%white%/crate info %green%to view the crates info!\ +\n%white%/crate commands %green%to view the commands!\ + +# Info Command +info.user=%gray%----------------------- %prefix%%gray%----------------------\ +\n%green%Crate Name: %white%%cratename%\ +\n%green%Crate Type: %white%%cratetype%\ +\n%green%Buyable: %white%%cratebuy%\ +\n%green%Buy Price: %white%%cratecost%\ + +# List Command +list.user=%gray%----------------------- %prefix%%gray%----------------------\ +\n%green%Current Crates: %white%%list%\ + +################## +#- Commands -# +################## + +# No Permission +command.permission.none=%prefix%You do not have permission to use this command. + +# Unknown Command +command.unknown.notfound=%prefix%Command not found. + +# Incorrect Usage +command.incorrect.usage=%prefix%Incorrect Usage + +# Player only command +command.playeronly.usage=%prefix%Only players are able to use this command. + +# Incorrect Parameters +command.incorrect.parameters=%prefix%Incorrect Parameters. + +# Incorrect Arguments +command.incorrect.arguments=%prefix%Incorrect number of arguments %green% + +# Argument must be numbers +command.incorrect.numbers=%prefix%Argument must have numbers + +####################### +#- Crate/Keys -# +####################### + +# Incorrect crate crateName +crate.incorrect.name=%prefix%Incorrect crate name + +# Player is offline, unable to receive items +crate.player.offline=%prefix%Player must be online to receive items. + +# Received a crate +crate.player.recieved=%prefix%You have received a crate. + +# Unable to buy crate +crate.player.unabletobuy=%prefix%You were unable to buy a crate. Check if you have enough money or if the crate is for sale. + +# Select a crate +crate.player.noselection=%prefix%Please select a crate! + +# You cannot give a key crate. +crate.player.nogivekeycrate=%prefix%You cannot give a keycrate, please give a key instead! + +# No Key +crate.player.nokey=%prefix%You need a key to open this crate! + +# Received a key +crate.player.keyrecieved=%prefix%You have received a key! + +# Unable to set key crate +crate.key.createerror=%prefix%Unable to set key Crate. + +# Successfully created a key crate +crate.key.createsuccess=%prefix%You have set a key crate at this location! + +# Unable to remove key crate +crate.key.removeerror=%prefix%Unable to remove key Crate! + +# Successfully remove a key crate +crate.key.removesuccess=%prefix%You have removed a key crate at this location! + +# Not a keycrate +crate.key.notankey=%prefix%That is not a key crate! + +# Unable to use the key here +crate.key.unabletouse=%prefix%You cannot use this key here! + +# You don't have the right key +crate.key.wrongkey=%prefix%You do not have a %cratename%&7! + +# You don't have the right key +crate.keys.wrongkey=%prefix%You do not have the correct key! + +# When a player attempts to craft a key +crafting.unable=%prefix%Please do not craft your key! + +# When a player attempts to interact with crate/keys in creative +crafting.creative=%prefix%You cannot perform this action in creative! + +# +crate.reward.none=%prefix%Unable to find anymore rewards! + +# Cooldown +crate.cooldown=%prefix%Cooldown: %cooldown% sec(s) + +################## +#- Money -# +################## + +# -UNUSED- Replaced by crate.player.unabletobuy +money.notenough=%prefix%You do not have enough money to buy this crate. + +# Transaction Complete +money.transaction.complete=%prefix%Transaction Complete! You have %money% left! + +################## +#- Error -# +################## + +# Number Error +error.excp.numberformat=%prefix%Received a value other than a number! \ No newline at end of file diff --git a/Configs + Precompiled/config/CrateReloaded/lang/l_es.properties b/Configs + Precompiled/config/CrateReloaded/lang/l_es.properties new file mode 100644 index 0000000..bef5173 --- /dev/null +++ b/Configs + Precompiled/config/CrateReloaded/lang/l_es.properties @@ -0,0 +1,110 @@ + +################## +#- Help -# +################## + +# Unknown Command +help.user=%gray%------------------- %prefix%%gray%-------------------\ +\n%light_purple%CrateReloaded %green%features %light_purple%MysteryCrates %green%to %light_purple%Supply Crates \ +%green%filled with prizes and rewards!\ +\n%white%/crate list %green%to view what crates there are!\ +\n%white%/crate info %green%to view the crates info!\ +\n%gray%----------------------------------------------------- + +# Info Command +info.user=%gray%----------------------- %prefix%%gray%----------------------\ +\n%green%Nombre de crate: %white%%cratename%\ +\n%green%Tipo de crate: %white%%cratetype%\ +\n%green%En venta: %white%%cratebuy%\ +\n%green%Precio de venta: %white%%cratecost%\ +\n%gray%----------------------------------------------------- + +# List Command +list.user=%gray%----------------------- %prefix%%gray%----------------------\ +\n%green%Crates Actuales: %white%%list%\ +\n%gray%-----------------------------------------------------\ + +################## +#- Commands -# +################## + +# No Permission +command.permission.none=%prefix%No tienes permiso para usar este comando. + +# Unknown Command +command.unknown.notfound=%prefix%Comando no encontrado. + +# Incorrect Usage +command.incorrect.usage=%prefix%Uso incorrecto + +# Player only command +command.playeronly.usage=%prefix%Solo los jugadores pueden ejecutar este comando. + +# Incorrect Parameters +command.incorrect.parameters=%prefix%Parametros erroneos + +# Incorrect Arguments +command.incorrect.arguments=%prefix%Numero de argumentos erroneo %green% + +# Argument must be numbers +command.incorrect.numbers=%prefix%Los argumentos tienen que ser numericos + +####################### +#- Crate/Keys -# +####################### + +# Incorrect crate crateName +crate.incorrect.name=%prefix%Nombre de crate incorrecto + +# Player is offline, unable to receive items +crate.player.offline=%prefix%El jugador tiene que estar conectado para recibir los items. + +# Received a crate +crate.player.recieved=%prefix%Has recibido un crate. + +# Unable to buy crate +crate.player.unabletobuy=%prefix%No puedes comprar un crate. Comprueba si tienes suficiente dinero o el crate esta a la venta. +# Select a crate +crate.player.noselection=%prefix%Por favor, selecciona un crate. + +# You cannot give a key crate. +crate.player.nogivekeycrate=%prefix%No puedes dar una crate de llave, tienes que dar la llave. + +# No Key +crate.player.nokey=%prefix%Necesitas una llave para abrir este crate. + +# Received a key +crate.player.keyrecieved=%prefix%Has recibido una llave + +# Unable to set key crate +crate.key.createerror=%prefix%No se ha podido establecer un crate de llave. + +# Successfully created a key crate +crate.key.createsuccess=%prefix%Has establecido un crate de llave en esta localizacion! + +# Unable to remove key crate +crate.key.removeerror=%prefix%No se ha podido eliminar el crate de llave. + +# Successfully remove a key crate +crate.key.removesuccess=%prefix%Has eliminado el crate de llave de esta localizacion! + +# Not a keycrate +crate.key.notankey=%prefix%Esto no es un crate de llave! + +# Unable to use the key here +crate.key.unabletouse=%prefix%No puedes usar una llave aqui. + +# You don't have the right key +crate.key.wrongkey=%prefix%"No tienes una llave "%cratename%"! +################## +#- Money -# +################## +# -UNUSED- Replaced by crate.player.unabletobuy +money.notenough=%prefix%No tienes suficiente dinero para comprar este crate. +# Transaction Complete +money.transaction.complete=%prefix%Transaccion completa, te queda %money% de dinero. +################## +#- Error -# +################## +# Number Error +error.excp.numberformat=%prefix%Recibido un valor no numerico. \ No newline at end of file diff --git a/Configs + Precompiled/config/CrateReloaded/lang/l_fi.properties b/Configs + Precompiled/config/CrateReloaded/lang/l_fi.properties new file mode 100644 index 0000000..947b5c2 --- /dev/null +++ b/Configs + Precompiled/config/CrateReloaded/lang/l_fi.properties @@ -0,0 +1,119 @@ + +# Credit: Favoo @Spigot +# Tukea @Github + +################## +#- Help -# +################## + +# Unknown Command +help.user=%gray%------------------- %prefix%%gray%-------------------\ +\n%light_purple%CrateReloaded %green%sis?lt?? %light_purple%Mysteeriavaimista %light_purple%Toimituslaatikkoihin \ +%green%t?ytettyin? voitoilla ja palkinnoilla!\ +\n%white%/crate list %green%n?hd?ksesi, mit? laatikkoja on olemassa!\ +\n%white%/crate info %green%n?ytt??ksesi tietoa laatikosta!\ +\n%gray%----------------------------------------------------- + +# Info Command +info.user=%gray%----------------------- %prefix%%gray%----------------------\ +\n%green%Laatikon nimi: %white%%cratename%\ +\n%green%Laatikon tyyppi: %white%%cratetype%\ +\n%green%Ostettavissa: %white%%cratebuy%\ +\n%green%Mill? hinnalla ostettavissa: %white%%cratecost%\ +\n%gray%----------------------------------------------------- + +# List Command +list.user=%gray%----------------------- %prefix%%gray%----------------------\ +\n%green%Laatikot nyt: %white%%list%\ +\n%gray%-----------------------------------------------------\ + +################## +#- Komennot -# +################## + +# Ei oikeuksia +command.permission.none=%prefix% Sinulla ei ole oikeuksia tuohon komentoon. + +# +command.unknown.notfound=%prefix%Emme l?yt?neet komentoasi. Kirjoititko sen v??rin vai onko sit? edes koskaan ollut olemassa? + +# Incorrect Usage +command.incorrect.usage=%prefix%Mit? tarkoitit? K?ytit v??rin komentoa! + +# Player only command +command.playeronly.usage=%prefix%T?m? komento on tarkoitettu vain pelaajille, eik? sinulle, konsoli! + +# Incorrect Parameters +command.incorrect.parameters=%prefix%V??r?t parametrit! + +# Incorrect Arguments +command.incorrect.arguments=%prefix%V??r? numero argumentteja! %green% + +# Argument must be numbers +command.incorrect.numbers=%prefix%Argumenttejen pit?? olla numeroita! + +####################### +#- Crate/Keys -# +####################### + +# Incorrect crate crateName +crate.incorrect.name=%prefix%Incorrect crate name + +# Player is offline, unable to receive items +crate.player.offline=%prefix%Pelaajan pit?? olla paikalla, jotta h?n voi saada tavaroita. + +# Received a crate +crate.player.recieved=%prefix%Sait laatikon. + +# Unable to buy crate +crate.player.unabletobuy=%prefix%Et voinut ostaa avainta. Katso, onko sinulla tarpeeksi rahaa ja onko laatikko saatavilla. + +# Select a crate +crate.player.noselection=%prefix%Valitse laatikko, kiitos. + +# You cannot give a key crate. +crate.player.nogivekeycrate=%prefix%Et voi antaa avainlaatikkoa, voisitko antaa avaimen mielummin. + +# No Key +crate.player.nokey=Tarvitset avaimen avataksesi t?m?n! + +# Received a key +crate.player.keyrecieved=%prefix%Sait juuri avaimen. + +# Unable to set key crate +crate.key.createerror=%prefix%Ei voitu asettaa avainlaatikkoa. + +# Successfully created a key crate +crate.key.createsuccess=%prefix%Laitoit avainlaatikon t?h?n paikkaan! + +# Unable to remove key crate +crate.key.removeerror=%prefix%Ei voitu poistaa avainlaatikkoa. + +# Successfully remove a key crate +crate.key.removesuccess=%prefix%Poistit avainlaatikon t?st? paikasta! + +# Not a keycrate +crate.key.notankey=%prefix%T?m? ei ole avainlaatikko! + +# Unable to use the key here +crate.key.unabletouse=%prefix%Et voi k?ytt?? avainta t?ss?! + +# You don't have the right key +crate.key.wrongkey=%prefix%Sinulla ei ole %cratename%-avainta! + +################## +#- Money -# +################## + +# -UNUSED- Replaced by crate.player.unabletobuy +money.notenough=%prefix%Sinulla ei ole tarpeeksi rahaa t?m?n tavaran ostoon. + +# Transaction Complete +money.transaction.complete=%prefix%Ostit avaimen, maksu suoritettu. + +################## +#- Error -# +################## + +# Number Error +error.excp.numberformat=%prefix%Saatiin arvo, joka ei ole numero. \ No newline at end of file diff --git a/Configs + Precompiled/config/CrateReloaded/lang/l_fr.properties b/Configs + Precompiled/config/CrateReloaded/lang/l_fr.properties new file mode 100644 index 0000000..7fa3dbf --- /dev/null +++ b/Configs + Precompiled/config/CrateReloaded/lang/l_fr.properties @@ -0,0 +1,118 @@ +############################################ +#- Traduction Française -# +#- Heroiik62 -# +############################################ + +################## +#- Aide -# +################## + +# Commande d'aide +help.user=%dark_grey%----------------------- %prefix%%dark_grey%----------------------\ +\n%red%Aide sur les caisses de loot.\ +\n%white%/crate list %green%pour voir les caisse disponibles!\ +\n%white%/crate info %green%pour voir les infos!\ +\n%dark_grey%----------------------------------------------------- + +# Commande d'info +info.user=%dark_grey%----------------------- %prefix%%dark_grey%----------------------\ +\nNom: %cratename%\ +\nType: %cratetype%\ +\nAchetable?: %cratebuy%\ +\nPrix: %cratecost%\ +\n%dark_grey%----------------------------------------------------- + +# Liste des commandes +list.user=%dark_grey%----------------------- %prefix%%dark_grey%----------------------\ +\n%list%\ +\n%dark_grey%-----------------------------------------------------\ + +################### +#- Commandes -# +################### + +# Pas la permission +command.permission.none=%prefix%Vous n'avez pas la permission d'utiliser cette commande. + +# Commande inconnue +command.unknown.notfound=%prefix%Commande non trouvée. + +# Mauvais Usage +command.incorrect.usage=%prefix%Usage incorrect + +# Commande pour joueur +command.playeronly.usage=%prefix%Seulement les joueurs peuvent utiliser cette commande. + +# Paramètres incorrects +command.incorrect.parameters=%prefix%Paramètres incorrects + +# Arguments incorrects +command.incorrect.arguments=%prefix%Le nombre d'arguments est incorrect + +# Les arguments doivent êtres des nombres +command.incorrect.numbers=%prefix%Les arguments doivent être des nombres + +####################### +#- Caisse/Clés -# +####################### + +# Nom de caisse incorrect +crate.incorrect.name=%prefix%Nom de la caisse incorrect + +# Joueur hors ligne +crate.player.offline=%prefix%Le joueur doit être en ligne pour recevoir des items. + +# Reç une caisse +crate.player.recieved=%prefix%Vous avez reçu une caisse. + +# Impossible d'acheter une caisse +crate.player.unabletobuy=%prefix%Vous ne pouvez pas acheter de caisses. Assurez-vous d'avoir assez d'argent ou que la caisse est en vente. + +# Selection d'une caisse +crate.player.noselection=%prefix%Veuillez sélectionner une caisse. + +# Cette clé n'est pas pour ce coffre +crate.player.nogivekeycrate=%prefix%Vous ne pouvez pas donner de clé à cette caisse, donnez une clé à la place. + +# Nécéssite une clé +crate.player.nokey=%prefix%Vous devez avoir une clé pour ouvrir ceci. + +# Reçu une clé +crate.player.keyrecieved=%prefix%Vous venez de recevoir une clé + +# Impossible de définir cette clé +crate.key.createerror=%prefix%Impossible de définir une clé de caisse ici. + +# Cette clé a bien été crée +crate.key.createsuccess=%prefix%Vous venez de définir une clé de caisse à cet emplacement! + +# Impossible de supprimer cette clé de caisse +crate.key.removeerror=%prefix%Impossible de supprimer la clé de cette caisse. + +# Clé de caisse supprimé +crate.key.removesuccess=%prefix%Vous venez de supprimer la clé reliée à cette caisse! + +# Ce n'est pas une clé +crate.key.notankey=%prefix%Ceci n'est pas une clé de caisse! + +# Impossible d'utiliser la clé ici +crate.key.unabletouse=%prefix%Vous ne pouvez pas utiliser cette clé ici. Vérifier bien son nom. + +# You don't have the right key +crate.key.wrongkey=%prefix%You do not have a %cratename% key! +################## +#- Argent -# +################## + +# -INUTILISE- Remplacé par crate.player.unabletobuy +money.notenough=%prefix%Vous n'avez pas assez d'argent pour acheter cette caisse. + +# Transaction effectué +money.transaction.complete=%prefix%Transaction Complétée! Il vous reste: %money% . + +################### +#- Erreur -# +################### + +# Erreur de nombre +error.excp.numberformat=%prefix%J'ai reçu une valeur au lieu d'un nombre, veuillez vérifier de nouveau svp. \ No newline at end of file diff --git a/Configs + Precompiled/config/CrateReloaded/npc.yml b/Configs + Precompiled/config/CrateReloaded/npc.yml new file mode 100644 index 0000000..e69de29 diff --git a/Configs + Precompiled/config/CrateReloaded/storage.yml b/Configs + Precompiled/config/CrateReloaded/storage.yml new file mode 100644 index 0000000..e69de29 diff --git a/Configs + Precompiled/config/EasyBackup/config.yml b/Configs + Precompiled/config/EasyBackup/config.yml new file mode 100644 index 0000000..b4fc356 --- /dev/null +++ b/Configs + Precompiled/config/EasyBackup/config.yml @@ -0,0 +1,51 @@ +backupSchedule: +- DAY HOUR:MINUTE PM +- 2:00 AM +- 4:00 AM +- 6:00 AM +- 8:00 AM +- 10:00 AM +- 12:00 AM +- 2:00 PM +- 4:00 PM +- 6:00 PM +- 8:00 PM +- 10:00 PM +- 12:00 PM +- 1:00 AM +- 3:00 AM +- 5:00 AM +- 7:00 AM +- 9:00 AM +- 11:00 AM +- 1:00 PM +- 3:00 PM +- 5:00 PM +- 7:00 PM +- 9:00 PM +- 11:00 PM +- Mon Tue Wed Thur Fri Sat Sun 2:30 +maxBackupsBeforeErase: 24 +compressionLevel_1-10: 3 +slowdownWhenServerLags: true +showSlowdownMessage: true +debug: false +name: backup_%time% +extension: zip +exemptFolders: +- example/this/folder/wont/backup +- example/folder +- example/file.yml +saveFolder: backups/saves +allowInGameCommands: false +notifyAdmins: true +ftp: + enable: false + hostname: ftp.example.com + port: 21 + protocol: sftp + username: user + password: password + saveLocation: '' + deleteAfterSuccess: false + maxBackupsBeforeErase: 4 diff --git a/Configs + Precompiled/config/EasyBackup/language.yml b/Configs + Precompiled/config/EasyBackup/language.yml new file mode 100644 index 0000000..f0b1904 --- /dev/null +++ b/Configs + Precompiled/config/EasyBackup/language.yml @@ -0,0 +1,73 @@ +noPerm: '&4You do not have permission to do /backup.' +help: + '1': '&b&lUsage:' + '2': '&a/backup create &7-&e Creates backup' + '3': '&a/backup cancel &7-&e Cancels any backup in progress' + '4': '&a/backup info &7-&e Check if a backup is in progress and get other info' + '5': '&a/backup reload &7-&e Reloads the config' + '6': '&a/backup restore &7-&e Restores a backup' +restore: + info: '&cRestoring a backup can fail, so a backup will be made before attempting + to restore. ONLY the files in the backup you are restoring will be restored. Any + new files, or exempt files will be removed.' + choose: '&6Backups you can restore: &7' + noBackups: '&cThere are no backups in your backup folder.' + currentcolor: '&7' + noExist: '&cThat backup file does not exist.' + backupInProgress: '&cA backup is currently in progress.' + restoreInProgress: '&cRestore already in progress' + backupName: RestoreBackup_%time% + failed: '&cFailed to restore backup.' + begin: '&aRestoring!' + backupComplete: '&aRestore backup complete, stopping server in 30 seconds to complete + the restore. Do not start the server until restoring is complete! When the file + ''restore_log.txt'' appears in your server folder, the restore process has completed.' + restoreInProgressAll: '&cA restore process is in progress. EasyBackup commands disabled. + DO NOT RESTART YOUR SERVER WHILE RESTORING.' +info: + backupSchedule: '&6Backup schedule: &7' + delay: '&6Backup Delay (Hours): &7' + maxbk: '&6Max backups: &7' + backingup: '&6Backing up: &7' + percent: '&6Backup percent: &7' + compression: '&6Compression: &7' + current: '&6Current files in backup folder:' + currentcolor: '&7' +noCancel: '&cThere is no backup to cancel.' +inProgress: '&cA backup is in already progress.' +reloaded: '&aConfig reloaded.' +failedReload: '&cFAILED TO RELOAD CONFIG - Error message sent to console.' +startFrom: '&6[EasyBackup] &fStarting server backup from: ' +savingTo: '&6[EasyBackup] &fSaving to: ' +backupSaved: '&6[EasyBackup] &fBackup saved!' +failedToSaveBk: '&6[EasyBackup] &cFAILED TO SAVE BACKUP!' +debug: + zipping: '&6[EasyBackup] &fZipping file: &7' + zippingFolder: '&6[EasyBackup] &fZipping folder: &7' +failedToZipFile: '&6[EasyBackup] &cFAILED TO ZIP FILE: &7' +failedToZipFolder: '&6[EasyBackup] &cFAILED TO ZIP FOLDER: &7' +backupStarted: '&aBackup started.' +savedPercent: '&6[EasyBackup] &9Backup: &7%percent%% %mb% / %totalmb% mb saved.' +canceledBk: '&aCanceled backup.' +slowDown: '&6[EasyBackup] &cBackup slowing down since server is lagging.' +speedUp: '&6[EasyBackup] &fBackup has returned back to max speed.' +noInGameCommands: '&cIn game commands have been disabed by the EasyBackup config.' +ftp: + start: '&6Starting FTP upload.' + folder: '&6Created FTP folder.' + finished: '&6Finished FTP upload!' + failed: '&cFTP UPLOAD FAILED!' + loginFailed: '&cFTP LOGIN FAILED.' + login: '&6Logged into FTP server.' + connectFailed: '&cFTP CONNECTION FAILED.' + percent: '&fFTP Backup percent: &7' + timeout: '&cFTP connection timed out.' + trySSH: '&6Attempting to connect to ftp via SSH.' + connectedSSH: '&6Connection established!' + loadingDir: '&6Loading FTP save directory.' + beginSSH: '&6Starting SSH upload!' + deleteAfter: '&fDeleting local backup file.' + failedDelete: '&cFailed to delete local backup file!' + successDelete: '&aLocal backup file deleted! Backup complete!' + tryProtocol: '&6Using protocol: ' + fileLoadFail: '&cFailed to load backup file. Is it being used by another program?' diff --git a/Configs + Precompiled/config/Entity/entities/Abilities.json b/Configs + Precompiled/config/Entity/entities/Abilities.json new file mode 100644 index 0000000..0a9b059 --- /dev/null +++ b/Configs + Precompiled/config/Entity/entities/Abilities.json @@ -0,0 +1,85 @@ +{ + "type": "NPC", + "name": "Abilities", + "location": { + "world": "Spawn", + "x": -5.5, + "y": 70.0, + "z": 6.5, + "yaw": 225.0, + "pitch": -0.0 + }, + "commands": [ + "abilityitems" + ], + "equipment": [ + null, + null, + null, + null, + null + ], + "faces": false, + "hologram": { + "name": "NPC_Abilities_HOLOGRAM", + "location": { + "world": "Spawn", + "x": -5.5, + "y": 72.095, + "z": 6.5, + "yaw": 225.0, + "pitch": -0.0 + }, + "lines": [ + { + "type": "TEXT", + "text": "§a* §lREVAMPED §a*", + "location": { + "world": "Spawn", + "x": -5.5, + "y": 72.325, + "z": 6.5, + "yaw": 225.0, + "pitch": -0.0 + } + }, + { + "type": "TEXT", + "text": "§4§lAbility Items", + "location": { + "world": "Spawn", + "x": -5.5, + "y": 72.095, + "z": 6.5, + "yaw": 225.0, + "pitch": -0.0 + } + }, + { + "type": "TEXT", + "text": "§f§ostore.cavepvp.org", + "location": { + "world": "Spawn", + "x": -5.5, + "y": 71.865, + "z": 6.5, + "yaw": 225.0, + "pitch": -0.0 + } + } + ], + "animations": [], + "visibility": "VISIBLE" + }, + "signature": "TJxws2nJAr2J4jjD0Qn+eYkXw1vb6NudT8QmwsB3qNOMR0d/6JmL8u6bP4xM7AEh/Td11DypLpCUfqvTm5/Bts7QCd+yRZf2e4LCAhAucT9QaR+PEg0LVt4szVPvszUCEIMRMtSFclWY/6hxE4vFEqUJXLwSPtDkzFYCHMjTclhccbcaRXwkZM+D6hdrgUP27hHvQr2vcwKo7FJlkTCjf1T29iHXbrimNxIMAVfXoQO94h19vYys0vVzkeEKsAmtaLKnvp8UW/umMXBM0YqvZLHHaYHNcn0hHomZbZfwO4BR1T5u51R/RcQlXoEZxTmU/1kJt5WPTlZ0yZCOFbhl9NwZ78rbcIfsXsf046wTovi3x/BDIBLWShABv6IDSuFCAhx8n9goyoJf8egfOcPv0EHvfHwgmnd7a6YbzK+oyQAtleMbQVKVr13MwltpZyzXCyp+5Jy4pEtlOfQKyLFd9J32V+PgM49IOfD274OIF8btrGoy3heav5Nk+BPFO80tp+sa72E32DDweA/QBxwxw/b6GzG/OVCj3vNut8eiaz44zdsBBy696jpbKLqHZNrPvtVaNvgBdH0T1Ug3fjFUJl89CQJnnl2rX8xrJcI+y/yNrBNOyNxAE0Di1AWJMNE5a74r60jtCb/g2T0HEIeISxX2EnrL83HhmG8ruLGqx9M=", + "skinUsername": "iMakeMcVids", + "swing": true, + "tabVisibility": "HIDDEN", + "tagVisibility": "HIDDEN", + "texture": "ewogICJ0aW1lc3RhbXAiIDogMTY0NzEwOTQ5ODUyOCwKICAicHJvZmlsZUlkIiA6ICJkYWQ4NDQxZmRlY2U0OTlkYTg5NDc0Y2YzYmQ2M2Q0YSIsCiAgInByb2ZpbGVOYW1lIiA6ICJpTWFrZU1jVmlkcyIsCiAgInNpZ25hdHVyZVJlcXVpcmVkIiA6IHRydWUsCiAgInRleHR1cmVzIiA6IHsKICAgICJTS0lOIiA6IHsKICAgICAgInVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS9lOTg0ZTdjYzE0MThhY2JlYzJhZTVmNjUwN2JiY2ZmMjU2ZWEyODZkMjhkNjk3ODFjNzU2MzZkZTNlMTllZmUwIgogICAgfQogIH0KfQ==", + "animations": [ + "Rings_DARK_GRAY", + "Rings_DARK_RED" + ], + "visibility": "VISIBLE" +} \ No newline at end of file diff --git a/Configs + Precompiled/config/Entity/entities/BattlePass.json b/Configs + Precompiled/config/Entity/entities/BattlePass.json new file mode 100644 index 0000000..89c04dc --- /dev/null +++ b/Configs + Precompiled/config/Entity/entities/BattlePass.json @@ -0,0 +1,86 @@ +{ + "type": "NPC", + "name": "BattlePass", + "location": { + "world": "Spawn", + "x": -5.5, + "y": 70.0, + "z": -5.5, + "yaw": 217.28561, + "pitch": -0.0 + }, + "commands": [ + "bp" + ], + "equipment": [ + null, + null, + null, + null, + null + ], + "faces": false, + "hologram": { + "name": "NPC_BattlePass_HOLOGRAM", + "location": { + "world": "Spawn", + "x": -5.5, + "y": 72.095, + "z": -5.5, + "yaw": 217.28561, + "pitch": -0.0 + }, + "lines": [ + { + "type": "TEXT", + "text": "&a* &a&lREVAMPED &a*", + "location": { + "world": "Spawn", + "x": -5.5, + "y": 72.325, + "z": -5.5, + "yaw": 217.28561, + "pitch": -0.0 + } + }, + { + "type": "TEXT", + "text": "&6&lBattle Pass", + "location": { + "world": "Spawn", + "x": -5.5, + "y": 72.095, + "z": -5.5, + "yaw": 217.28561, + "pitch": -0.0 + } + }, + { + "type": "TEXT", + "text": "§f§ostore.cavepvp.org", + "location": { + "world": "Spawn", + "x": -5.5, + "y": 71.865, + "z": -5.5, + "yaw": 217.28561, + "pitch": -0.0 + } + } + ], + "animations": [], + "visibility": "VISIBLE" + }, + "signature": "UKL73mwIp2SpejoDRqpHQMWbGJ6NSWs6ZaFY3HWuqAswrc/cUTAMx+zTi8e8RpW20vfLe/26HDXRxXoJ0Zp5LiZvWvEB4h4x3Q86n2iD1NURikbUGK1HZFk9T3qLemNAD0lO+3XvAMdl/IFwHxY90N6LMzAGcbhYmwo7o+gtaee4V+tGYaHfY5dHaJ69Vnemb7N7VDM2cQRXlxRtX/pPzX/4JdLNoSIEusgedZkDLRW7pZuZK5oQBmXWHIOjMMW2ygxTfsGRd1OMOIHy8ErlAs6V0n4lmv7uj+RQ+WZU2UELtgFAy1X7TYs1OdnZDrrZd/uqtyZgKD4wu+2Ai182psk/WE8sQwKC4GdWRWq/qnlUU1AHRZNik19o/JWTWJessJgs76QpuB4QsimTEM2Wfxvpmog8joV7/5sizlPDVT5UvHAg3uPgI6mM6rlXl8cyrgHlQJakAmteSeYSMBgZI1nAVuqUsPmCUMm2habsae8+PDgkY/JtdqIVslJmwJtjBTuAxFevj/E3vi//lF+KPEaWq6CDvI1hXdGS6RJZZfJwVfEUGkqiu+IsPYdg6jG7M4DBWKs3EwIjeLka23MePi9IqLuAIGbhs+yrSH+mYHuEt51rMsH6GCgBB5+OMPVskCR2tTreC/aO8/Jg5M9MPxpr5kKzNql86FGH03ydrNw=", + "skinUsername": "Rayzo", + "swing": true, + "tabVisibility": "HIDDEN", + "tagVisibility": "HIDDEN", + "texture": "ewogICJ0aW1lc3RhbXAiIDogMTY2NTk1MzczNzA1NywKICAicHJvZmlsZUlkIiA6ICJjNTgwNmIzMmE0ZTA0MDViYjM4MjExMjUwZGZlNWQ3YiIsCiAgInByb2ZpbGVOYW1lIiA6ICJSYXl6byIsCiAgInNpZ25hdHVyZVJlcXVpcmVkIiA6IHRydWUsCiAgInRleHR1cmVzIiA6IHsKICAgICJTS0lOIiA6IHsKICAgICAgInVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS9lNDNiMmJhOTU4MWY3YTAzNGVhMWQzMWNkZDU4MGM3NzViZGY5ODMxNjJkM2IyNzBkZTRiNDUyOTdmMTU4NjZlIgogICAgfQogIH0KfQ==", + "animations": [ + "Rings_YELLOW", + "Rings_GREEN", + "Rings_DARK_GREEN" + ], + "visibility": "VISIBLE" +} \ No newline at end of file diff --git a/Configs + Precompiled/config/Entity/entities/Free-Rank.json b/Configs + Precompiled/config/Entity/entities/Free-Rank.json new file mode 100644 index 0000000..c1311bd --- /dev/null +++ b/Configs + Precompiled/config/Entity/entities/Free-Rank.json @@ -0,0 +1,80 @@ +{ + "type": "NPC", + "name": "Free-Rank", + "location": { + "world": "Spawn", + "x": 6.5, + "y": 70.0, + "z": 6.5, + "yaw": 137.81062, + "pitch": -0.0 + }, + "commands": [], + "equipment": [ + null, + null, + null, + null, + null + ], + "faces": false, + "hologram": { + "name": "NPC_Free-Rank_HOLOGRAM", + "location": { + "world": "Spawn", + "x": 6.5, + "y": 72.095, + "z": 6.5, + "yaw": 137.81062, + "pitch": -0.0 + }, + "lines": [ + { + "type": "TEXT", + "text": "§2§l*§a§l NEW §2§l*", + "location": { + "world": "Spawn", + "x": 6.5, + "y": 72.325, + "z": 6.5, + "yaw": 137.81062, + "pitch": -0.0 + } + }, + { + "type": "TEXT", + "text": "&7&lFree Rank", + "location": { + "world": "Spawn", + "x": 6.5, + "y": 72.095, + "z": 6.5, + "yaw": 137.81062, + "pitch": -0.0 + } + }, + { + "type": "TEXT", + "text": "§f§o/freerank", + "location": { + "world": "Spawn", + "x": 6.5, + "y": 71.865, + "z": 6.5, + "yaw": 137.81062, + "pitch": -0.0 + } + } + ], + "animations": [], + "visibility": "VISIBLE" + }, + "signature": "okxu7hE3mrGIIs4rqXHGMb7coSo2x6bhYRz0MFZXSzajk9cxJBElLDnQ9rJMBz4LlZCrtkgteRUBhAqotLMRjFT2DTWjfQ3DzKzhoW/cyJ+kYrSWESalT1WeA2DrdnTxs5B/AC6pakXNtNP+vfwBjGqmctkmBg5MLk8IZYLt4laG44vIVsBW6pMwBTgSWgrq8U+/4xkPuL4O44HthRl3bVNPKlAfc2WgPWNmSHbYMyalpVRVU7RR7BWKCDRQeAX6PKo3XhSmmMCsSMx+DqoB8dlKrc+0EtSUcqTlUuGwM18xyE+GdTQ5g5vxr+njpMh1ur+sH6gmjdmNlYGQgLZjLppOzUPEoCpLEZoAHdn1ee4OKiMSP4Gd5UT3c5AB8ihy6fGf3qHgVNvt/cclKUYdBEuwrmg+aXf8bQgwUEQ+DMISrXnSCrZP6jTNhK71swE8ai4u29LcPPmnmVaFPZlkIEVvWVpd+sqtZZotH9PwjOXwQ6KCzbzdYxTZ+C7NhzNLFgpbChuSUXJr3/Qc1gA4j2KR67/XaKSq9ccuTux6WsdoTGdSMUm71vIITkrnMrxLA4hySbvmHB8lGN0IBZXL7tayrfiSHme0uORcOHNV8lZC9eTJUVZ4LVKTE0L4qlXFIVL/K4/y6OlAdzdGRkSwBmoobKxMMr+qrUG86GkQmeA=", + "skinUsername": "SamHCF", + "swing": true, + "tabVisibility": "HIDDEN", + "tagVisibility": "HIDDEN", + "texture": "ewogICJ0aW1lc3RhbXAiIDogMTY1ODkxMTM1MjQ5MCwKICAicHJvZmlsZUlkIiA6ICI3N2YwNTdjN2RiZDc0NjBiOGUwMTViYzg4NmVmOWFiMCIsCiAgInByb2ZpbGVOYW1lIiA6ICJTYW1IQ0YiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOGI2NmQxMDg5MGEyOTgzYmM1MzhmYTUwYzNmZDcxMDJhZTIzZGU0ODI4YjAxOTYxMzA1NmY1Y2Q4NjE2NzMwNSIKICAgIH0KICB9Cn0=", + "animations": [], + "visibility": "VISIBLE" +} \ No newline at end of file diff --git a/Configs + Precompiled/config/Entity/entities/FreeKits.json b/Configs + Precompiled/config/Entity/entities/FreeKits.json new file mode 100644 index 0000000..a1cf947 --- /dev/null +++ b/Configs + Precompiled/config/Entity/entities/FreeKits.json @@ -0,0 +1,82 @@ +{ + "type": "NPC", + "name": "FreeKits", + "location": { + "world": "Spawn", + "x": 6.5, + "y": 70.0, + "z": -5.5, + "yaw": 142.52457, + "pitch": -0.0 + }, + "commands": [ + "freekits" + ], + "equipment": [ + null, + null, + null, + null, + null + ], + "faces": false, + "hologram": { + "name": "NPC_FreeKits_HOLOGRAM", + "location": { + "world": "Spawn", + "x": 6.5, + "y": 72.095, + "z": -5.5, + "yaw": 142.52457, + "pitch": -0.0 + }, + "lines": [ + { + "type": "TEXT", + "text": "&4&lFree Kits", + "location": { + "world": "Spawn", + "x": 6.5, + "y": 72.325, + "z": -5.5, + "yaw": 142.52457, + "pitch": -0.0 + } + }, + { + "type": "TEXT", + "text": "&7Claim 4 free kits!", + "location": { + "world": "Spawn", + "x": 6.5, + "y": 72.095, + "z": -5.5, + "yaw": 142.52457, + "pitch": -0.0 + } + }, + { + "type": "TEXT", + "text": "&f&o/freekits", + "location": { + "world": "Spawn", + "x": 6.5, + "y": 71.865, + "z": -5.5, + "yaw": 142.52457, + "pitch": -0.0 + } + } + ], + "animations": [], + "visibility": "VISIBLE" + }, + "signature": "JdJ3KKtNySIJG8YdIR9BRcWDafImEBIjxvoXY4y6XFf4YwLQaLMuBRqetQw7aps2ekoYdaeWOizvVLmNTIbjcxrvAPIbb5raFAx67vpZztobepZTYOrIu8Jdsq0w/8z/adLwwreUHBXNFO47NUGW3yWTH2f86k/DxVHQbTC51pDL9DqV4WZdHNS/KWg4ecn4d1Pbv5XFuB/6G0qYL8VoMXPXbfitL4R4nVNBD7058x6j99pDlB7Civa/GnBvJcE6EKW0uC74hIkFOS8Z+w5SWAJItFhNyDJrfe1B1iOevpOXYHWBK5r68Ewjf0Xn4XLARwuTr7O95J5KuTzhgV/xE6icjEPjuTL7QTgADKlAjNp1D1mSojLj5GaRt4QgxpH1z0D1URvgNnkQcIN0LwaF8Mu5Opi7YDiF358bPBvsNAF7vzj1v2h2hv/Sg2UBvsx3ACfKiEVYLgdL9xqniYaGzUxxuAP1K2GLs3mm8xofriVNMflTd0xoyejMEmhq0rE3WzXK6XAgMo7JYwTLqbCu0F3RRuzu1bOOkmyw6LVkWZq+sZqMIL/J0cibKq/TsD824QdA0W6ePJwx0KjiUCSKMmKx43vhz9F3klf72KcC/lG7BtRx13Quj5vvHaVy+6XT8BebTZiZL3ZGRJ+P1gDzhSDHNTWmlVnPiE8XSaCbC48=", + "skinUsername": "CrustyDawg", + "swing": true, + "tabVisibility": "HIDDEN", + "tagVisibility": "HIDDEN", + "texture": "ewogICJ0aW1lc3RhbXAiIDogMTY2NTk1Mzc0NDA1NywKICAicHJvZmlsZUlkIiA6ICI0MjcyMzM3ZDEzMWE0ZDc2ODFiMGJhZTYwMDYzMTU5YiIsCiAgInByb2ZpbGVOYW1lIiA6ICJDcnVzdHlEYXdnIiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlL2Y2ZmJhODU2OGRmODc1Yjc5N2U5MWY1ZDYzZWQ5MzJhODM0NmRlNmU1ZDg1ZWU4ZTdkNjYyYTQ4YzUzYWUyYzgiCiAgICB9CiAgfQp9", + "animations": [], + "visibility": "VISIBLE" +} \ No newline at end of file diff --git a/Configs + Precompiled/config/Entity/entities/Nether-Hologram.json b/Configs + Precompiled/config/Entity/entities/Nether-Hologram.json new file mode 100644 index 0000000..00bfcf8 --- /dev/null +++ b/Configs + Precompiled/config/Entity/entities/Nether-Hologram.json @@ -0,0 +1,112 @@ +{ + "type": "HOLOGRAM", + "name": "Nether-Hologram", + "location": { + "world": "world_nether", + "x": 400.30728886259743, + "y": 35.50000004768371, + "z": -106.45934098021321, + "yaw": -96.75005, + "pitch": 90.0 + }, + "lines": [ + { + "type": "TEXT", + "text": "§4§lNether Outpost", + "location": { + "world": "world_nether", + "x": 400.30728886259743, + "y": 36.880000047683694, + "z": -106.45934098021321, + "yaw": -96.75005, + "pitch": 90.0 + } + }, + { + "type": "TEXT", + "text": "§8§m------------------------------", + "location": { + "world": "world_nether", + "x": 400.30728886259743, + "y": 36.6500000476837, + "z": -106.45934098021321, + "yaw": -96.75005, + "pitch": 90.0 + } + }, + { + "type": "TEXT", + "text": "§7Status: §f§aNeutral", + "location": { + "world": "world_nether", + "x": 400.30728886259743, + "y": 36.4200000476837, + "z": -106.45934098021321, + "yaw": -96.75005, + "pitch": 90.0 + } + }, + { + "type": "TEXT", + "text": "§7Controller: §cNone", + "location": { + "world": "world_nether", + "x": 400.30728886259743, + "y": 36.190000047683704, + "z": -106.45934098021321, + "yaw": -96.75005, + "pitch": 90.0 + } + }, + { + "type": "TEXT", + "text": "§7Attackers: §cNone", + "location": { + "world": "world_nether", + "x": 400.30728886259743, + "y": 35.96000004768371, + "z": -106.45934098021321, + "yaw": -96.75005, + "pitch": 90.0 + } + }, + { + "type": "TEXT", + "text": "§7Percentage: §f§c0.00%", + "location": { + "world": "world_nether", + "x": 400.30728886259743, + "y": 35.73000004768371, + "z": -106.45934098021321, + "yaw": -96.75005, + "pitch": 90.0 + } + }, + { + "type": "TEXT", + "text": "§7[§a§c■■■■■■■■■■■■■■■■■■■■■■■■ §7]", + "location": { + "world": "world_nether", + "x": 400.30728886259743, + "y": 35.50000004768371, + "z": -106.45934098021321, + "yaw": -96.75005, + "pitch": 90.0 + } + }, + { + "type": "TEXT", + "text": "§8§m------------------------------", + "location": { + "world": "world_nether", + "x": 400.30728886259743, + "y": 35.270000047683716, + "z": -106.45934098021321, + "yaw": -96.75005, + "pitch": 90.0 + } + } + ], + "animations": [], + "visibility": "VISIBLE" +} \ No newline at end of file diff --git a/Configs + Precompiled/config/Entity/entities/Road-Hologram.json b/Configs + Precompiled/config/Entity/entities/Road-Hologram.json new file mode 100644 index 0000000..3e41c5a --- /dev/null +++ b/Configs + Precompiled/config/Entity/entities/Road-Hologram.json @@ -0,0 +1,112 @@ +{ + "type": "HOLOGRAM", + "name": "Road-Hologram", + "location": { + "world": "world", + "x": 0.5, + "y": 73.0, + "z": 1199.5, + "yaw": 0.0, + "pitch": 0.0 + }, + "lines": [ + { + "type": "TEXT", + "text": "§6§lRoad Outpost", + "location": { + "world": "world", + "x": 0.5, + "y": 74.38000000000002, + "z": 1199.5, + "yaw": 0.0, + "pitch": 0.0 + } + }, + { + "type": "TEXT", + "text": "§8§m------------------------------", + "location": { + "world": "world", + "x": 0.5, + "y": 74.15000000000002, + "z": 1199.5, + "yaw": 0.0, + "pitch": 0.0 + } + }, + { + "type": "TEXT", + "text": "§7Status: §f§aNeutral", + "location": { + "world": "world", + "x": 0.5, + "y": 73.92000000000002, + "z": 1199.5, + "yaw": 0.0, + "pitch": 0.0 + } + }, + { + "type": "TEXT", + "text": "§7Controller: §cNone", + "location": { + "world": "world", + "x": 0.5, + "y": 73.69000000000001, + "z": 1199.5, + "yaw": 0.0, + "pitch": 0.0 + } + }, + { + "type": "TEXT", + "text": "§7Attackers: §cNone", + "location": { + "world": "world", + "x": 0.5, + "y": 73.46000000000001, + "z": 1199.5, + "yaw": 0.0, + "pitch": 0.0 + } + }, + { + "type": "TEXT", + "text": "§7Percentage: §f§c0.00%", + "location": { + "world": "world", + "x": 0.5, + "y": 73.23, + "z": 1199.5, + "yaw": 0.0, + "pitch": 0.0 + } + }, + { + "type": "TEXT", + "text": "§7[§a§c■■■■■■■■■■■■■■■■■■■■■■■■ §7]", + "location": { + "world": "world", + "x": 0.5, + "y": 73.0, + "z": 1199.5, + "yaw": 0.0, + "pitch": 0.0 + } + }, + { + "type": "TEXT", + "text": "§8§m------------------------------", + "location": { + "world": "world", + "x": 0.5, + "y": 72.77, + "z": 1199.5, + "yaw": 0.0, + "pitch": 0.0 + } + } + ], + "animations": [], + "visibility": "VISIBLE" +} \ No newline at end of file diff --git a/Configs + Precompiled/config/Entity/entities/Shop.json b/Configs + Precompiled/config/Entity/entities/Shop.json new file mode 100644 index 0000000..0eddd0f --- /dev/null +++ b/Configs + Precompiled/config/Entity/entities/Shop.json @@ -0,0 +1,70 @@ +{ + "type": "NPC", + "name": "Shop", + "location": { + "world": "Spawn", + "x": 19.5, + "y": 70.0, + "z": 24.5, + "yaw": 134.44087, + "pitch": -0.9341512 + }, + "commands": [ + "shop" + ], + "equipment": [ + null, + null, + null, + null, + null + ], + "faces": false, + "hologram": { + "name": "NPC_Shop_HOLOGRAM", + "location": { + "world": "Spawn", + "x": 19.5, + "y": 72.095, + "z": 24.5, + "yaw": 134.44087, + "pitch": -0.9341512 + }, + "lines": [ + { + "type": "TEXT", + "text": "&a&lShop", + "location": { + "world": "Spawn", + "x": 19.5, + "y": 72.095, + "z": 24.5, + "yaw": 134.44087, + "pitch": -0.9341512 + } + }, + { + "type": "TEXT", + "text": "&f&o/shop", + "location": { + "world": "Spawn", + "x": 19.5, + "y": 71.865, + "z": 24.5, + "yaw": 134.44087, + "pitch": -0.9341512 + } + } + ], + "animations": [], + "visibility": "VISIBLE" + }, + "signature": "HESzvfiHe+/l2XuNFD2w/2FuzhulByq29oSZxpOqib04ErtsBN3EsMKpxNxfGshQ9FRxVkP6pcPd6yuHHfkLJu1h+IvbIQtIHZNN2CZ7cP3X+YkaDWkEt3iiYT04datEfqfY0mv5AxHD9AHnrpv38LyKYxzNp21iIpUqw89gatqGZH4MYOpC6iOhWksFjmSKR+FfD7wpA+/6S7UtuNqv97YPT/U24bwF3RfMfazdmnqE3F0OxPRakUcE3zFw54f/9UHoU4CzbsGt3tYTdbntZwc//UWT79Ej0T9u242shYiie4TgL9ai+8lycPyJBoFRr6b39LPho+rYVar0jb5mH2Dev8UM/Dji9/R4JS7XqURg/9ooOACGME4xDNqy5HmqNkNkGSHapWijn75uDXHehuwlLM/2S6N/DIPB8VrrV6J6yyCVuSpOhiXmYB290IDjg0vjfEG6I9ft9EGUp3iioibBVMvzoSIClolYxajwZRm6vPA57D3hjj4vMhuALD7kujMA9HT9yxNdDvgje00wb7gs9XDTSURq7OUY7j72Ktxona3oTNAcHJGut+eq8eFS3VYlZVTJf78awu9yo85ai0OqTXt2TlXW7VIuHtbkkUHY22vqr0H7ej92kv+KEoY0pXPleE9wGIXkA6+sZRU0YXwm9KkovNywNXsl/IeF2KI=", + "skinUsername": "tracklol", + "swing": true, + "tabVisibility": "HIDDEN", + "tagVisibility": "HIDDEN", + "texture": "ewogICJ0aW1lc3RhbXAiIDogMTY2NTk1Mzc4Mzc0NywKICAicHJvZmlsZUlkIiA6ICIzYmQ1MzA2ZjNlODM0YTM0YTNlNzUyMDdhMmM2ZTYwYiIsCiAgInByb2ZpbGVOYW1lIiA6ICJ0cmFja2xvbCIsCiAgInNpZ25hdHVyZVJlcXVpcmVkIiA6IHRydWUsCiAgInRleHR1cmVzIiA6IHsKICAgICJTS0lOIiA6IHsKICAgICAgInVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS9iMmE5M2I4MjZiMzc1ZGIyY2ZmOTljODBjMDhjYmZjMWFiY2IwMTA5MDYwZGYxZmFmYWNkZjAwM2VmMDBmMGQiLAogICAgICAibWV0YWRhdGEiIDogewogICAgICAgICJtb2RlbCIgOiAic2xpbSIKICAgICAgfQogICAgfQogIH0KfQ==", + "animations": [], + "visibility": "VISIBLE" +} \ No newline at end of file diff --git a/Configs + Precompiled/config/Entity/entities/Vote.json b/Configs + Precompiled/config/Entity/entities/Vote.json new file mode 100644 index 0000000..da14fdc --- /dev/null +++ b/Configs + Precompiled/config/Entity/entities/Vote.json @@ -0,0 +1,82 @@ +{ + "type": "NPC", + "name": "Vote", + "location": { + "world": "Spawn", + "x": 22.5, + "y": 70.0, + "z": 19.5, + "yaw": 123.824356, + "pitch": -0.0 + }, + "commands": [ + "vote" + ], + "equipment": [ + null, + null, + null, + null, + null + ], + "faces": false, + "hologram": { + "name": "NPC_Vote_HOLOGRAM", + "location": { + "world": "Spawn", + "x": 22.5, + "y": 72.095, + "z": 19.5, + "yaw": 123.824356, + "pitch": -0.0 + }, + "lines": [ + { + "type": "TEXT", + "text": "&a&lVote", + "location": { + "world": "Spawn", + "x": 22.5, + "y": 72.325, + "z": 19.5, + "yaw": 123.824356, + "pitch": -0.0 + } + }, + { + "type": "TEXT", + "text": "§7Vote daily for free keys!", + "location": { + "world": "Spawn", + "x": 22.5, + "y": 72.095, + "z": 19.5, + "yaw": 123.824356, + "pitch": -0.0 + } + }, + { + "type": "TEXT", + "text": "&f&o/vote", + "location": { + "world": "Spawn", + "x": 22.5, + "y": 71.865, + "z": 19.5, + "yaw": 123.824356, + "pitch": -0.0 + } + } + ], + "animations": [], + "visibility": "VISIBLE" + }, + "signature": "P4NhSjT/Wnnw97b4Oo7J3AJ4ZfSuF65zEwsP8HGtvT/YWZw1LwtQYSrbWdLcmTwap7PjQ2IGZNGpLUEMQMzlHN7UxAuHZ1Vkc7m506VVNfM+os6Ml1s/jfF8TCSvOzBtBirlOhXb5eFF1oNJfYp008GGva7dmCF4LAzInf24Ft5NLSjJ2JJgV394Ve6caRldloct+ltOik/ZWN35uAiFTnMLLG7DjzQrah+G3LTNUJPmrTRP9ppk42G5ei7i2nAHoreN7bGUS/L7cfIqr4iL+b04ohd1g/JYtBWv9p1EV7P5n5ictOtCNV7yvLJbxdbKfuVBzXZ2vPCBfEOE5gLxCs+45iC/E/H+FWulCkLQfXV2yOob0VoIrysbuKlIU8jwsMLgUqSpz51xbV7paoZyh1o4CAvaLFwsjpq1hF4uN6PrQwYuXRhbpB9kLbirqLfzUdB25OxEa59AxELXNH6wVamscaIfFY0oXbs5NbU4KIwlDNgOmR3xc39e9h9++qhVNA+1IH+8Qdd9kt82VMOV4nPAKIu7h8YKxKa0tEB2EF8jCPWWMQoBtWotbHd/SNmGr+f+/HmxObKB2t4Vw4indyK5GAQmlLn78CqWN6+JihmNjjdP8C8qngnX5XaZKQCNc2g6ZvN2PpaxU1Flifp0DnSJIF3cO0kDQqsC6TeBlLs=", + "skinUsername": "iLikeToGlitqh", + "swing": true, + "tabVisibility": "HIDDEN", + "tagVisibility": "HIDDEN", + "texture": "ewogICJ0aW1lc3RhbXAiIDogMTY2NTk1Mzc2NjE0NywKICAicHJvZmlsZUlkIiA6ICJlZWUzNTg1ZGU2NDg0MDk4YmE2ODdlZGNmZDBiMTgwOCIsCiAgInByb2ZpbGVOYW1lIiA6ICJpTGlrZVRvR2xpdHFoIiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzE3MzllMzU4YWJiOTc4YWM4ZmYxOWFkZjdlNzliNWVjY2U4ZmIzMTAwMGJmNDJjOTJjYjA5N2ExMWY3NGNmMzMiLAogICAgICAibWV0YWRhdGEiIDogewogICAgICAgICJtb2RlbCIgOiAic2xpbSIKICAgICAgfQogICAgfQogIH0KfQ==", + "animations": [], + "visibility": "VISIBLE" +} \ No newline at end of file diff --git a/Configs + Precompiled/config/Entity/entities/cave-rank.json b/Configs + Precompiled/config/Entity/entities/cave-rank.json new file mode 100644 index 0000000..e465aaf --- /dev/null +++ b/Configs + Precompiled/config/Entity/entities/cave-rank.json @@ -0,0 +1,84 @@ +{ + "type": "NPC", + "name": "cave-rank", + "location": { + "world": "Spawn", + "x": 26.5, + "y": 70.0, + "z": -5.5, + "yaw": 89.927216, + "pitch": -0.0 + }, + "commands": [ + "viewcategory cave rank" + ], + "equipment": [ + null, + null, + null, + null, + null + ], + "faces": false, + "hologram": { + "name": "NPC_cave-rank_HOLOGRAM", + "location": { + "world": "Spawn", + "x": 26.5, + "y": 72.095, + "z": -5.5, + "yaw": 89.927216, + "pitch": -0.0 + }, + "lines": [ + { + "type": "TEXT", + "text": "§f", + "location": { + "world": "Spawn", + "x": 26.5, + "y": 72.325, + "z": -5.5, + "yaw": 89.927216, + "pitch": -0.0 + } + }, + { + "type": "TEXT", + "text": "§4§lCave Rank", + "location": { + "world": "Spawn", + "x": 26.5, + "y": 72.095, + "z": -5.5, + "yaw": 89.927216, + "pitch": -0.0 + } + }, + { + "type": "TEXT", + "text": "&oClick to view", + "location": { + "world": "Spawn", + "x": 26.5, + "y": 71.865, + "z": -5.5, + "yaw": 89.927216, + "pitch": -0.0 + } + } + ], + "animations": [], + "visibility": "VISIBLE" + }, + "signature": "Az4eJZ6I8m4TzSfCurk1opQw/gbse9sDLe9SE/tNcQB1B6TCw7xHe3cx0sVurTrAoGdPDBBgQZMxM62JgAkAhA5LL+F7xvbtz9ZV2ACA5tF3iuR+zvozrrEGPZDvg6e694p8tN0tOB6S3v7OocyakFV1dlTaMfurhbWkqpsZvYEh9roUhiz7xJn7mTpWHoiB1Ap+j4ewUpnDeqS0zMckNXWEMCf0iUNkWVWWmTnIJoTGSowI2UvG6RI0OGbvwAjyCOLZZ8BoJZ3dO8ypUxZ4NosNHNhzMGpeXBUyf/QryDJ7kZM+l6s+QLXPSqQeWjnMfs2vVWBWxXTmZovWGzg6cRkibAuV5qXyg/Md1uXWcoBFYrVJAY/1FlfALnWpOUjhOgaS/CA8XJsEGECa2iVDC64dCk/2R7Uwvk7AZrv1rKi8uXuOls7dNMUJgwG2m+4HAhMoP+xK+909XiWu3q0WKpBUK+xqtOC1xx2kXWyP2cHrz1WPCvyXoPqBsaEwPnSvRTFCTdqSe/ZBvCBZ9T6SgBcoUBimc4NTv4bOuyQmUdtYjXlPjH0tL/FaoasfwdQWdq5G1lNMnMC2F/A3LPfwgwNLYIzCoXKLmzt2875PD9Nnu52L72VljGUUa9/t0e7HwoptOEDdZNXCjTgp38lzeTCByKsdH5pAbGwXsf5TD6w=", + "skinUsername": "staticdaddy", + "swing": true, + "tabVisibility": "HIDDEN", + "tagVisibility": "HIDDEN", + "texture": "ewogICJ0aW1lc3RhbXAiIDogMTY1MzcxNTk4NTE2NCwKICAicHJvZmlsZUlkIiA6ICJhMzk1YjVmYzIyYTg0ZTAyYjhhMTE1YjlkYzYwZjk1ZiIsCiAgInByb2ZpbGVOYW1lIiA6ICJTdGF0aWNEYWRkeSIsCiAgInNpZ25hdHVyZVJlcXVpcmVkIiA6IHRydWUsCiAgInRleHR1cmVzIiA6IHsKICAgICJTS0lOIiA6IHsKICAgICAgInVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS9mOTU2MjA3NzYzNTgyNTk4YzVlMjI1NDE3MDBmNjhlNmIwMjQ2ZWI1NTE2YWY0MDQwMzNlOTg5NjY0NDgzYzZlIgogICAgfSwKICAgICJDQVBFIiA6IHsKICAgICAgInVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS8yMzQwYzBlMDNkZDI0YTExYjE1YThiMzNjMmE3ZTllMzJhYmIyMDUxYjI0ODFkMGJhN2RlZmQ2MzVjYTdhOTMzIgogICAgfQogIH0KfQ==", + "animations": [ + "Rings_DARK_RED" + ], + "visibility": "VISIBLE" +} \ No newline at end of file diff --git a/Configs + Precompiled/config/Entity/entities/coins.json b/Configs + Precompiled/config/Entity/entities/coins.json new file mode 100644 index 0000000..169f43b --- /dev/null +++ b/Configs + Precompiled/config/Entity/entities/coins.json @@ -0,0 +1,130 @@ +{ + "type": "NPC", + "name": "coins", + "location": { + "world": "Spawn", + "x": 0.5, + "y": 70.0, + "z": 0.5, + "yaw": 183.77856, + "pitch": -1.1162077 + }, + "commands": [ + "coinshop" + ], + "equipment": [ + { + "type": "DOUBLE_PLANT", + "amount": 1, + "durability": 0, + "metadata": {} + }, + { + "type": "LEATHER_HELMET", + "amount": 1, + "durability": 0, + "metadata": { + "color": 15066419 + } + }, + { + "type": "LEATHER_CHESTPLATE", + "amount": 1, + "durability": 0, + "metadata": { + "color": 15066419 + } + }, + { + "type": "LEATHER_LEGGINGS", + "amount": 1, + "durability": 0, + "metadata": { + "color": 15066419 + } + }, + { + "type": "LEATHER_BOOTS", + "amount": 1, + "durability": 0, + "metadata": { + "color": 15066419 + } + } + ], + "faces": false, + "hologram": { + "name": "NPC_coins_HOLOGRAM", + "location": { + "world": "Spawn", + "x": 0.5, + "y": 72.095, + "z": 0.5, + "yaw": 183.77856, + "pitch": -1.1162077 + }, + "lines": [ + { + "type": "TEXT", + "text": "&a&l* NEW *", + "location": { + "world": "Spawn", + "x": 0.5, + "y": 72.555, + "z": 0.5, + "yaw": 183.77856, + "pitch": -1.1162077 + } + }, + { + "type": "TEXT", + "text": "&6&lCoin Shop", + "location": { + "world": "Spawn", + "x": 0.5, + "y": 72.325, + "z": 0.5, + "yaw": 183.77856, + "pitch": -1.1162077 + } + }, + { + "type": "TEXT", + "text": "&7Click to view the Coin Shop", + "location": { + "world": "Spawn", + "x": 0.5, + "y": 72.095, + "z": 0.5, + "yaw": 183.77856, + "pitch": -1.1162077 + } + }, + { + "type": "TEXT", + "text": "&f&ostore.cavepvp.org", + "location": { + "world": "Spawn", + "x": 0.5, + "y": 71.865, + "z": 0.5, + "yaw": 183.77856, + "pitch": -1.1162077 + } + } + ], + "animations": [], + "visibility": "VISIBLE" + }, + "signature": "p/6wgsr8veWi4tTOIGEdbzcb/Z8/48e7iTvnE5e5UD1odkaay2jJG4Ve6bHSUA+X/3GolPxQHyzEPhb8OPiRixK0EkeLtInKiNnUmwyo+H4YTeQcWvtap3SChMnMch9kJf2Q3wXtc5XbvM+Hg8cYscqOcBhW/k/WcbI57LiHaY4yaaH6ePf1xlaQZ95lTs8vhMYobpDu0hU23eSU6RA1bp+R0W+w6NlxizAfYh2p4wRWcZQgzN5BomkymSXi5Fq1IPf6RPOavVwHww/9T3oFq5nSrJf56xTsHPgRnxAy/rs7FdGYOdRJoWORD4+lC3DdNtDwsTbz4UpAwpIo0nBOQwfrop/F92YouX+FQKH9lLVPCP2PTVS9rwZ+oTR9nsnZpu87DxWz8z1VwfrDUOQWUKbH+EZkTyK4D+mWnXQ+zqTUR6LrdIvlwEOJtaQLN23uwG1cpJYRjPWYTQL7eW9ImLzFcaj1bogllziKhqqzUUptlV3hHPYYUAbM4xGmxkESAsqHIc+dtJoeBvx2I0qWn5j0vv7RI81RZxqsL1xjjpXkAjQg7NapXnnDdIMcoyT9kfY0eJs9xdUXq6ZAH5io7xkN3auPDuvm8Whx0SAIhZ/AAAyt7qs8VLEkFLheuE9bOPv7Ea6tWlL7CJ+8jETdUdOF1A6jEbv2vPlIDCAEamM=", + "skinUsername": "SimplyTrash", + "swing": true, + "tabVisibility": "HIDDEN", + "tagVisibility": "HIDDEN", + "texture": "ewogICJ0aW1lc3RhbXAiIDogMTY1NDM3MTM5MDAxMCwKICAicHJvZmlsZUlkIiA6ICIwZjdhNGU5ODdmNTA0NjU0ODMzNGVlMTcxMDkyNWFjZSIsCiAgInByb2ZpbGVOYW1lIiA6ICJTaW1wbHlUcmFzaCIsCiAgInNpZ25hdHVyZVJlcXVpcmVkIiA6IHRydWUsCiAgInRleHR1cmVzIiA6IHsKICAgICJTS0lOIiA6IHsKICAgICAgInVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS8xYzZhMzU5MjBlZDYwMTcwNzAxODg5MjZjNzgzMjkwYmMyNjZlODE4N2ZmNTVmMWNkODMxZjIyNTQ2MThiZjcxIgogICAgfQogIH0KfQ==", + "animations": [ + "Rings_GOLD", + "Rings_YELLOW" + ], + "visibility": "VISIBLE" +} \ No newline at end of file diff --git a/Configs + Precompiled/config/Entity/entities/custom-rank.json b/Configs + Precompiled/config/Entity/entities/custom-rank.json new file mode 100644 index 0000000..7a60fa2 --- /dev/null +++ b/Configs + Precompiled/config/Entity/entities/custom-rank.json @@ -0,0 +1,71 @@ +{ + "type": "NPC", + "name": "custom-rank", + "location": { + "world": "Spawn", + "x": 26.5, + "y": 70.0, + "z": 0.5, + "yaw": 93.11694, + "pitch": -0.0 + }, + "commands": [], + "equipment": [ + null, + null, + null, + null, + null + ], + "faces": false, + "hologram": { + "name": "NPC_custom-rank_HOLOGRAM", + "location": { + "world": "Spawn", + "x": 26.5, + "y": 72.095, + "z": 0.5, + "yaw": 93.11694, + "pitch": -0.0 + }, + "lines": [ + { + "type": "TEXT", + "text": "&e&ki&6&lCustom Rank&e&ki", + "location": { + "world": "Spawn", + "x": 26.5, + "y": 72.095, + "z": 0.5, + "yaw": 93.11694, + "pitch": -0.0 + } + }, + { + "type": "TEXT", + "text": "&f&ostore.cavepvp.org", + "location": { + "world": "Spawn", + "x": 26.5, + "y": 71.865, + "z": 0.5, + "yaw": 93.11694, + "pitch": -0.0 + } + } + ], + "animations": [], + "visibility": "VISIBLE" + }, + "signature": "bXBf7aY/nF9j4gIoTrOByLbo+NLiIMz7BCTZW8WRXikG9uZpSLuzUeqxnPyGbHxMpcmREIz65JZxK97i9F5lI90uOASB3Stw4ltX87aW4A9axkRyKScj08I9Rn+UHKpKTTnbqZs68eFpKWQMLUQYFEnw+NZcLiOSoTBwxWchzYJSyESjrq2caedvvBi2V0c0o/Yr3VrMAQSyFtSzTWyyKx31vZEX49TZ07kmywczlGWfadUaP++C9FY+J2nVuN8Y21t9UE12BvWRldF9BVRylEqzRnkr5Y/P3pQAGD76tzonY10jCa4Hz8l4+WeSPi5/bfWJP3FAnXkQOayRNaMq6B8yhWhUF08CVuRh7kHW9o2URnYZb+QEFs+A5HzOhwunLyQiyYbilrgfw4lCId5hJSuLxUFrh7cKKumLycKXKHXdVgbqjjdUlJAYyCB+hp7kmI8R0NqHXltyrXZS8/3qEO/lzzZtURUyINlpRyMTiIsJ02p12qd+FhoQMPbFacFaLTTBHV6Mw1/H6zFmNYxzlo2BYqSdOj0T12u69wCvRV1iuFrIrxvhSntqojvf0ZONZSvwVHuuHH4fur9w0+e1/g2wdgSDgWj4OnCu55fb5W4uDvK4/JrSdSEKE1uikxdbcLtV65fi0Vur883qcyeW6Tq1+LbR2JzI2CdxLJGOGtc=", + "skinUsername": "SimplyTrash", + "swing": true, + "tabVisibility": "HIDDEN", + "tagVisibility": "HIDDEN", + "texture": "ewogICJ0aW1lc3RhbXAiIDogMTY2NTk1MjE1NDg5MiwKICAicHJvZmlsZUlkIiA6ICIwZjdhNGU5ODdmNTA0NjU0ODMzNGVlMTcxMDkyNWFjZSIsCiAgInByb2ZpbGVOYW1lIiA6ICJTaW1wbHlUcmFzaCIsCiAgInNpZ25hdHVyZVJlcXVpcmVkIiA6IHRydWUsCiAgInRleHR1cmVzIiA6IHsKICAgICJTS0lOIiA6IHsKICAgICAgInVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS9jMTEwYWY1M2YyZmEyZDdlODIwMWIxODY4Yjc3ZGZiNGJkNmZkZDY5ODRkMmZkYzFhZjZiOTkxMDUzM2RhOWY4IgogICAgfQogIH0KfQ==", + "animations": [ + "Rings_YELLOW", + "Rings_GOLD" + ], + "visibility": "VISIBLE" +} \ No newline at end of file diff --git a/Configs + Precompiled/config/Entity/entities/diamond-rank.json b/Configs + Precompiled/config/Entity/entities/diamond-rank.json new file mode 100644 index 0000000..18391c4 --- /dev/null +++ b/Configs + Precompiled/config/Entity/entities/diamond-rank.json @@ -0,0 +1,70 @@ +{ + "type": "NPC", + "name": "diamond-rank", + "location": { + "world": "Spawn", + "x": 51.5, + "y": 69.0, + "z": -7.5, + "yaw": -0.7115123, + "pitch": 0.028377593 + }, + "commands": [ + "viewproduct lifetime-diamond" + ], + "equipment": [ + null, + null, + null, + null, + null + ], + "faces": false, + "hologram": { + "name": "NPC_diamond-rank_HOLOGRAM", + "location": { + "world": "Spawn", + "x": 51.5, + "y": 71.0, + "z": -7.5, + "yaw": -0.7115123, + "pitch": 0.028377593 + }, + "lines": [ + { + "type": "TEXT", + "text": "&b&lDiamond Rank", + "location": { + "world": "Spawn", + "x": 51.5, + "y": 71.0, + "z": -7.5, + "yaw": -0.7115123, + "pitch": 0.028377593 + } + }, + { + "type": "TEXT", + "text": "&oClick to view", + "location": { + "world": "Spawn", + "x": 51.5, + "y": 70.77, + "z": -7.5, + "yaw": -0.7115123, + "pitch": 0.028377593 + } + } + ], + "animations": [], + "visibility": "VISIBLE" + }, + "signature": "ntXi79FhD1+A1lpzabbwDhU26pky8zP3sDvuOC1BSNYftJQzjp0TY5W4FcxXwy8yKpfpR9GitQn1BoqI/Xr5Qyeff+bHgfWMG4pMn8bjirhx9E6ck7nMmc89rE+5x+yJZM98nYJxgZcF5owUU84yNFUv6k1JLDt8XboSSs+Wq4FAUVDs7J/JR5NspIiqe7iP/Ffv+FqjLOIiNfKZYkhq/smvdSn6eqejI5gCaxKfELlIIOZwhPJPe/eoFP6RPPxpDXFHnfT5Uu8sxDAXpTMGksW1Fyfs5zqzhUamMBWVhz2I008SUNRK3aFwPan4ddFB8zTUurKoBwDVMBVprbc8BZB6qt5CRXpJg/M4OrPi186pAv35JO4NHb/LGpBTa2Vh6EMeFucKEO7cUhCQJ/Qx455XNsg9kZI2A63Yd0uiOnYYBoNXoZUisCFmc1T9wKfime7/J43mPJ4kPhm7bIrXN90+bNGuIrNvh+N3qzcbp0A4tFQ+GLrf6JOSV8/WZuj/JGicpLb4IeMQ8IpqStMKw5MPgBDs6XGrcCPfBETD284W/fsj8BJUYPT603twkALc4Af3iB9PpNq+qc5tcXe4FwUHx5ohn31FA8H8bDE/nXlSJraNrkma948jJ22A4g2ujf3RGKuF/EC89QHvsJHZqeL5Jg+zPeZ3lz7xy/sdCJY=", + "skinUsername": "BurningTax75", + "swing": true, + "tabVisibility": "HIDDEN", + "tagVisibility": "HIDDEN", + "texture": "ewogICJ0aW1lc3RhbXAiIDogMTY1MzcxNDQ4MzE0MiwKICAicHJvZmlsZUlkIiA6ICIzMzA5NzEzZTY0YzI0NjcyYjU5MmFlNGY5ZmM2OTZiZSIsCiAgInByb2ZpbGVOYW1lIiA6ICJCdXJuaW5nVGF4NzUiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvN2U3MDc0MDIxNGFhMjg4NTIzNjUzZjRhMzFjOTAxNjVmMmE0NmQzYWQxZTdmMThkZTdkODA0NDM1ZmI5NGYxYyIKICAgIH0KICB9Cn0=", + "animations": [], + "visibility": "VISIBLE" +} \ No newline at end of file diff --git a/Configs + Precompiled/config/Entity/entities/emerald-rank.json b/Configs + Precompiled/config/Entity/entities/emerald-rank.json new file mode 100644 index 0000000..5a5d0fa --- /dev/null +++ b/Configs + Precompiled/config/Entity/entities/emerald-rank.json @@ -0,0 +1,70 @@ +{ + "type": "NPC", + "name": "emerald-rank", + "location": { + "world": "Spawn", + "x": 37.5, + "y": 69.0, + "z": 6.5, + "yaw": 180.22023, + "pitch": 2.1000037 + }, + "commands": [ + "viewproduct lifetime-emerald" + ], + "equipment": [ + null, + null, + null, + null, + null + ], + "faces": false, + "hologram": { + "name": "NPC_emerald-rank_HOLOGRAM", + "location": { + "world": "Spawn", + "x": 37.5, + "y": 71.0, + "z": 6.5, + "yaw": 180.22023, + "pitch": 2.1000037 + }, + "lines": [ + { + "type": "TEXT", + "text": "&a&lEmerald Rank", + "location": { + "world": "Spawn", + "x": 37.5, + "y": 71.0, + "z": 6.5, + "yaw": 180.22023, + "pitch": 2.1000037 + } + }, + { + "type": "TEXT", + "text": "&f&oClick to view", + "location": { + "world": "Spawn", + "x": 37.5, + "y": 70.77, + "z": 6.5, + "yaw": 180.22023, + "pitch": 2.1000037 + } + } + ], + "animations": [], + "visibility": "VISIBLE" + }, + "signature": "wg5dLBikPS/gljybCTLTao9KGZPQO51PgELnFNWVqmkxs2EFg86m8cF75oSjEDossa5Bmp9cOp+ngJOWFRo90Yt71rblgkAyObkz9qZ0YBMSsJ7mb/UH7crcnjp25Om/DvVJotuCFv17N/n7MLi7tMTSm0frOVRLDPeZa75HWedZST5ctfCckU9kDiK3vESNyaEAFp+0222lp4W6vudr1wg0yET78zcLa4lLIjIoFzYVXPJpmxptnyFTgfqt3RtAAz5DQn6g0C7039VjSAjlFUg/Kd5X291OEiZIAPpJkw1mIMuYeI71jnSH82MqWs1E/xzWPBjkZQ1kt7oCcsk2J3m0embs4BQPsKyCHhc5HkrZ/yHQgh7O6YINMlYdRwViTKINplpaVZEggkSqBUOxuuO+pzOmiRmDYzwAhMQhYthGXm4eBP93stYnviMhiUwAg6/Ft9x7Pbft8588vdYYX6rslPzewWFYIbtSoNSWj1SGC1Laz3sLLqqF0Rxheff294GgxJqG7UjbCs9ifq4vYadWjRYU6yWP/gqqFPsPocdCMmWWwAIVoj1ItJEdHvkgrfkLRlB/ZN06vkJ7UcmWIPmsvBAbmYcptoHIkRLKW1H4e9S8xJ3Qzr2nk3+2ELVuvYOwpGz7KZqVlGb4Dg3f7qTpv5aCD4pOIjoiri+aG+E=", + "skinUsername": "EmeraldSuffers", + "swing": true, + "tabVisibility": "HIDDEN", + "tagVisibility": "HIDDEN", + "texture": "ewogICJ0aW1lc3RhbXAiIDogMTY1MzcxNDM3NDU1NSwKICAicHJvZmlsZUlkIiA6ICIyZjRjN2I5MDFmZDc0YTExOTY0NzIzODhlOWI2Nzg5MCIsCiAgInByb2ZpbGVOYW1lIiA6ICJFbWVyYWxkU3VmZmVycyIsCiAgInNpZ25hdHVyZVJlcXVpcmVkIiA6IHRydWUsCiAgInRleHR1cmVzIiA6IHsKICAgICJTS0lOIiA6IHsKICAgICAgInVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS9jNDU4NjQ3NjE3NmEyNTY0NzM4MThhMTg0OTE1N2U4NDRjNTYzODcyNGJjZjgzMDlmMGQ5ZGYyN2NhOTU5MTYwIgogICAgfQogIH0KfQ==", + "animations": [], + "visibility": "VISIBLE" +} \ No newline at end of file diff --git a/Configs + Precompiled/config/Entity/entities/gold-rank.json b/Configs + Precompiled/config/Entity/entities/gold-rank.json new file mode 100644 index 0000000..9eb5f83 --- /dev/null +++ b/Configs + Precompiled/config/Entity/entities/gold-rank.json @@ -0,0 +1,82 @@ +{ + "type": "NPC", + "name": "gold-rank", + "location": { + "world": "Spawn", + "x": 45.5, + "y": 69.0, + "z": -7.5, + "yaw": 359.93378, + "pitch": 0.028621972 + }, + "commands": [ + "viewproduct lifetime-gold" + ], + "equipment": [ + null, + null, + null, + null, + null + ], + "faces": false, + "hologram": { + "name": "NPC_gold-rank_HOLOGRAM", + "location": { + "world": "Spawn", + "x": 45.5, + "y": 71.0, + "z": -7.5, + "yaw": 359.93378, + "pitch": 0.028621972 + }, + "lines": [ + { + "type": "TEXT", + "text": "&a&lFREE", + "location": { + "world": "Spawn", + "x": 45.5, + "y": 71.23, + "z": -7.5, + "yaw": 359.93378, + "pitch": 0.028621972 + } + }, + { + "type": "TEXT", + "text": "&6&lGold Rank", + "location": { + "world": "Spawn", + "x": 45.5, + "y": 71.0, + "z": -7.5, + "yaw": 359.93378, + "pitch": 0.028621972 + } + }, + { + "type": "TEXT", + "text": "&oClick to view", + "location": { + "world": "Spawn", + "x": 45.5, + "y": 70.77, + "z": -7.5, + "yaw": 359.93378, + "pitch": 0.028621972 + } + } + ], + "animations": [], + "visibility": "VISIBLE" + }, + "signature": "TkJLmRHv/+jEAAW46megHzwt07f4fQgRV5GDXHUV5p31mWcSh+qN6JTLttTRz0GIgNyVpzdpQtZMhCq3eJ3mUH+UEZZVv/Y4WgVzA41sGvvPGjD/w5d10VXVDTb3hzTsYpJ7pTuwHdp1HKmhhTRuAFkqhjaZObzL++c8Q1EiWMo7eaWTfqVtrzrqkSFt5oYpkZrBF2+nZWdwfbDWCvcwd5/VYIMvFxiajzffkMe627+BjwOmmhs0GMNOKUbqG/W/ORuuwrO1pflDNJGL9/oFOIK8Llp2gKvdFVMv0g8BqGFY7kCTamoAVIQPxleepEFZeaDx58EE+PPraS3ugp2GT5ZYQ2hZC1e4XxPbLYnHhy54YJdiPlrmu0djqr/ivIEI8rSIT7p+KK6n7CQ17TMF/mu0x/OVcZOd9cbsrpog5HxcZo7qvhiirPSxbjOjMiX0adnRdMsewNypH9bvRsQTIvtu/3OnpwHElvxDGteM8+C7ydkgmtqer+IfwqclYqOPyOR6Iq0e6Xl3pRyE0x0fuBPday0TgoUWMqKvqG9tsPDyvLkOmYsxKRvdYFiv2zLqLcId22JTgVm9+52pdV5AyaVYYMsVOEVo5a4SJ8LfVki8J2NxG/9KyiV/ppl6UgeGuyrhtxt9VY2gUYxDJneec3BCEVQmohtMoDm5qx/r+mg=", + "skinUsername": "StopOverReacting", + "swing": true, + "tabVisibility": "HIDDEN", + "tagVisibility": "HIDDEN", + "texture": "ewogICJ0aW1lc3RhbXAiIDogMTY1MzcxNDI0NzU3OCwKICAicHJvZmlsZUlkIiA6ICI2NmVjYjZlNzY4ODI0ODAxOTZhNDJmYjBmYTQ2YzUxOCIsCiAgInByb2ZpbGVOYW1lIiA6ICJTdG9wT3ZlclJlYWN0aW5nIiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlL2RhNzc4YWI4Yjk4ZjMyMWJlODUxMDIzODA0MGJjNTY1MzM0N2ZhNTJlZTEwYThiMDYwZGRiNzY2ZTUwN2NjMDIiCiAgICB9CiAgfQp9", + "animations": [], + "visibility": "VISIBLE" +} \ No newline at end of file diff --git a/Configs + Precompiled/config/Entity/entities/holiday-rank.json b/Configs + Precompiled/config/Entity/entities/holiday-rank.json new file mode 100644 index 0000000..a8b148f --- /dev/null +++ b/Configs + Precompiled/config/Entity/entities/holiday-rank.json @@ -0,0 +1,72 @@ +{ + "type": "NPC", + "name": "holiday-rank", + "location": { + "world": "Spawn", + "x": 26.5, + "y": 70.0, + "z": 6.5, + "yaw": 90.0, + "pitch": -0.0 + }, + "commands": [ + "viewproduct lifetime-holiday" + ], + "equipment": [ + null, + null, + null, + null, + null + ], + "faces": false, + "hologram": { + "name": "NPC_holiday-rank_HOLOGRAM", + "location": { + "world": "Spawn", + "x": 26.5, + "y": 72.095, + "z": 6.5, + "yaw": 90.0, + "pitch": -0.0 + }, + "lines": [ + { + "type": "TEXT", + "text": "§6§lSpooky Rank", + "location": { + "world": "Spawn", + "x": 26.5, + "y": 72.095, + "z": 6.5, + "yaw": 90.0, + "pitch": -0.0 + } + }, + { + "type": "TEXT", + "text": "&f&oClick to view", + "location": { + "world": "Spawn", + "x": 26.5, + "y": 71.865, + "z": 6.5, + "yaw": 90.0, + "pitch": -0.0 + } + } + ], + "animations": [], + "visibility": "VISIBLE" + }, + "signature": "wO3D0MH+tCDWzW5RfJdKodsaSdxTl2+UBiiP/hZRhMJ1aSJBLuAVWt794wob+RwfnC5+H2jM5h5ssGJ/cXyUnLiogr0Te90ZXaYuAiV7+yRG0h3bvKHD/jDPuITx/f6ZN7y1SbcQIhvd4KDgtspoNivWuz4GW7Ztb6VtXBMqasc5taUVl2BY/Di/amXgltYzcJwVEGvAFEjNSAj/vX849Wyyo1dk2qb+ZMmvErffSfL0/tAdvca0qov/b/hWqIriDgcQjcgyS7lvu6ygbboblBz0wYEMyWJoEc0GG91UYEnTPZmGDhjDPJ54H8uVqGcdcIN5DWvrHsL/wySo7kyyb78yQtnNpP0q++3X9K/lX8mq4ywTfyk6Hl3zOm80rgeaZf6ZKPT66ByIj6039mErU8XwP9oDkMpyypBHK02OgmysPmNrleaWhgtSGzzIXW25qw3J4lqJQARuHmPLhmD/4zlkPX7ypmIztU80tI/m7BsBVHGZQK65ku8ayZZmYRGXY8VPqedgIscsQiOsHjJJoBes+I0UiIZBuiQBeXlRt+gMAquhoz8TGqU+XZxViGS3CL0BqzCWx/ZR511jmszgkD1xPqXMUEaYHYrq4pVuS+dc+WHb77SvAvL3C3iDQq6Ml4gUgMI7rAogsqNLrk6oz/wDxCblAL9z7koJJ1eFRC8=", + "skinUsername": "golombeczek", + "swing": true, + "tabVisibility": "HIDDEN", + "tagVisibility": "HIDDEN", + "texture": "ewogICJ0aW1lc3RhbXAiIDogMTY2NTk1MjA3OTE3MywKICAicHJvZmlsZUlkIiA6ICJhYzljYzk2NmJhZWQ0MzRiYjEzYTJhMjljMWFiYmRjMCIsCiAgInByb2ZpbGVOYW1lIiA6ICJnb2xvbWJlY3playIsCiAgInNpZ25hdHVyZVJlcXVpcmVkIiA6IHRydWUsCiAgInRleHR1cmVzIiA6IHsKICAgICJTS0lOIiA6IHsKICAgICAgInVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS8xMDEwMjVjMWM4ZmYzMGZhZGIwYjRkY2I5YWVkNWJkZjE1NTA0N2YzMDYyY2FjMDhkYjczN2Q0NTg1ZDFmMzVmIgogICAgfQogIH0KfQ==", + "animations": [ + "Rings_GREEN" + ], + "visibility": "VISIBLE" +} \ No newline at end of file diff --git a/Configs + Precompiled/config/Entity/entities/iron-rank.json b/Configs + Precompiled/config/Entity/entities/iron-rank.json new file mode 100644 index 0000000..f3126dc --- /dev/null +++ b/Configs + Precompiled/config/Entity/entities/iron-rank.json @@ -0,0 +1,82 @@ +{ + "type": "NPC", + "name": "iron-rank", + "location": { + "world": "Spawn", + "x": 37.5, + "y": 69.0, + "z": -5.5, + "yaw": -0.21955574, + "pitch": 0.37111962 + }, + "commands": [ + "freerank" + ], + "equipment": [ + null, + null, + null, + null, + null + ], + "faces": false, + "hologram": { + "name": "NPC_iron-rank_HOLOGRAM", + "location": { + "world": "Spawn", + "x": 37.5, + "y": 71.0, + "z": -5.5, + "yaw": -0.21955574, + "pitch": 0.37111962 + }, + "lines": [ + { + "type": "TEXT", + "text": "§a§lFREE", + "location": { + "world": "Spawn", + "x": 37.5, + "y": 71.23, + "z": -5.5, + "yaw": -0.21955574, + "pitch": 0.37111962 + } + }, + { + "type": "TEXT", + "text": "§7§lIron Rank", + "location": { + "world": "Spawn", + "x": 37.5, + "y": 71.0, + "z": -5.5, + "yaw": -0.21955574, + "pitch": 0.37111962 + } + }, + { + "type": "TEXT", + "text": "&oClick to view", + "location": { + "world": "Spawn", + "x": 37.5, + "y": 70.77, + "z": -5.5, + "yaw": -0.21955574, + "pitch": 0.37111962 + } + } + ], + "animations": [], + "visibility": "VISIBLE" + }, + "signature": "nGIjagYeNTqsfc3LU6jSqSzDjRNSOXJGMvnb0/W1HrMTP4MWuPLFJ7Mi4ujIh64HN94q3sQisbS5SuZAm99gOEPA1bdS7km8qm5HxvIXJGOqTKlaMJWrhGigNMS39vVdXb+4IEx9LERKxfae8HxZpxByjPp4/+7ja4xgQPLQRbJ5oo+ijOt4TsYUt6hhnkZrVTpdBVYKGSf+Z2FH6mqDzXjGJmxZ5Je55O9c8ST3gMmolqbFA1hMSg1YfxmFM+RrN8EOKEuAW94BC31U+aTaATPR2gUeKXm5iNQFdXovwjb9D6au/TUI8+NALOaZjM21AWysI3wkXXlnQZU6uLNwk5PJgulyXMyE/yE5czsNcK/I5Q8y9RADs6DRIHRXi0GrWZelQBCgKQcpFJS7M+Wg4UaZjIf6x5agglhIeBdXfj9KpLRPD3cOLDVEHWQaRbq4zVYh6UNgZDkBBSsM3029h6ug+8O622JIUDcccm6F4u8ZRbWxoAdF3/6iqs5l5kBzTUlnmgSbGv87qilVCysSQ4EpwBBBMAegrwkY/7LK4LvehZriKn7hJwEg/ozojTveUrJTwmQ+xy7MRq++OuZAy7HMsRnHx0+pgkNBjuFbE6N8bsi1u1SohN+9SX/PvPKOZrOi1hnddUjJsIV+1q1AIuoIFWRocVeVyXlIuQeP518=", + "skinUsername": "legionL", + "swing": true, + "tabVisibility": "HIDDEN", + "tagVisibility": "HIDDEN", + "texture": "ewogICJ0aW1lc3RhbXAiIDogMTY1MzcxNDIyODMyMSwKICAicHJvZmlsZUlkIiA6ICI0OTlhNmM0NThhYzY0YWMwYWUzYWQ0M2FiM2NiMDIyOCIsCiAgInByb2ZpbGVOYW1lIiA6ICJMZWdpb25MIiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzkyZDUyNjM0NmFlMmZjMmE5YTFmZDZmOTcyZTljZDhkMjZhZjQ3Yjc4ZmYyODhkOTlkZDVlN2ZmNTQ4NDg0OWYiLAogICAgICAibWV0YWRhdGEiIDogewogICAgICAgICJtb2RlbCIgOiAic2xpbSIKICAgICAgfQogICAgfQogIH0KfQ==", + "animations": [], + "visibility": "VISIBLE" +} \ No newline at end of file diff --git a/Configs + Precompiled/config/Entity/entities/pearl-rank.json b/Configs + Precompiled/config/Entity/entities/pearl-rank.json new file mode 100644 index 0000000..49f8dcc --- /dev/null +++ b/Configs + Precompiled/config/Entity/entities/pearl-rank.json @@ -0,0 +1,70 @@ +{ + "type": "NPC", + "name": "pearl-rank", + "location": { + "world": "Spawn", + "x": 45.5, + "y": 69.0, + "z": 8.5, + "yaw": 179.51074, + "pitch": -0.36366004 + }, + "commands": [ + "viewproduct lifetime-pearl" + ], + "equipment": [ + null, + null, + null, + null, + null + ], + "faces": false, + "hologram": { + "name": "NPC_pearl-rank_HOLOGRAM", + "location": { + "world": "Spawn", + "x": 45.5, + "y": 71.0, + "z": 8.5, + "yaw": 179.51074, + "pitch": -0.36366004 + }, + "lines": [ + { + "type": "TEXT", + "text": "&5&lPearl Rank", + "location": { + "world": "Spawn", + "x": 45.5, + "y": 71.0, + "z": 8.5, + "yaw": 179.51074, + "pitch": -0.36366004 + } + }, + { + "type": "TEXT", + "text": "&oClick to view", + "location": { + "world": "Spawn", + "x": 45.5, + "y": 70.77, + "z": 8.5, + "yaw": 179.51074, + "pitch": -0.36366004 + } + } + ], + "animations": [], + "visibility": "VISIBLE" + }, + "signature": "cF1Zd1zj73T3kzTcilSnqAe4s2rhNNuuF2yLlttRKnzSyvW1PqdoWNEWreQqxEZgAlTRE+IznRxBYPUYMcmWLTmlQ3yzKh5lqKXq6tq4GIKg3hBBUPnhI/qMlEtV0D2IHly6FYyMHT6cAhDxui2PITbd/nu02Y1lQWk2lrs1DT/JXDBm82Pgxo3OdZPD6GS0G3wldmGqSdz2L3o1J9D3xCEUpH3mO2r1n53HOcvK6XMMfKb1Dq35LNcqMb/vEbvViW4HLYxUgqWWsbavEuZ5KPk3HslcQUpdr7kDgyPCE9tpX2X38z2DrtRD+8GLzjKOQKehmhicuOHipfzcC611FollrI0nv6T+NNElH5220mLaC81YTGCtEfZM8Yjvwle1z94d3VW9vhOOE8YfnmrU5nmta5PZgjp6vBGvrWVr9naWqjUXWLtNZIyipbMxKiuhf/SHhIfCN4Cq8QXhAzFY3uaCK2CLPVuLOsYPlbAJjtwml6iUAt8d9XSDR4F5Nn7RD1eoSevhNvPUlckus5OWag5vlKCwi4+3cgxK3avbfCbKdTQWJ30KQRXFShI+ulhuxHOtW2+6heYGoaV1Eazf6SyO+OpVpAJF5X5zBZLAm7KXHE09vVxQcr4a4ZMmsPY2Dyt8bDcpeWvKL8frxU3uWZPHNdx5UH96d2LTiHzdnJc=", + "skinUsername": "polygonic", + "swing": true, + "tabVisibility": "HIDDEN", + "tagVisibility": "HIDDEN", + "texture": "ewogICJ0aW1lc3RhbXAiIDogMTY1MzcxNTYxMDA5NSwKICAicHJvZmlsZUlkIiA6ICI4ODdmN2EyOGFlMzM0OTExYWU5ZTc1ZDlmODE2NWFmNyIsCiAgInByb2ZpbGVOYW1lIiA6ICJQb2x5Z29uaWMiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMzczNDNjYWY2YTJmMWNjYjA4MmU0Y2JhOTM2MzhlYjY3YzM3ZDBlM2JmOWU4NDllMjEzMGVmMzRhZDgwNGU0OCIsCiAgICAgICJtZXRhZGF0YSIgOiB7CiAgICAgICAgIm1vZGVsIiA6ICJzbGltIgogICAgICB9CiAgICB9CiAgfQp9", + "animations": [], + "visibility": "VISIBLE" +} \ No newline at end of file diff --git a/Configs + Precompiled/config/Entity/entities/platinum-rank.json b/Configs + Precompiled/config/Entity/entities/platinum-rank.json new file mode 100644 index 0000000..f446f9a --- /dev/null +++ b/Configs + Precompiled/config/Entity/entities/platinum-rank.json @@ -0,0 +1,70 @@ +{ + "type": "NPC", + "name": "platinum-rank", + "location": { + "world": "Spawn", + "x": 56.5, + "y": 69.0, + "z": 3.5, + "yaw": 89.74457, + "pitch": -0.8161538 + }, + "commands": [ + "viewproduct lifetime-platinum" + ], + "equipment": [ + null, + null, + null, + null, + null + ], + "faces": false, + "hologram": { + "name": "NPC_platinum-rank_HOLOGRAM", + "location": { + "world": "Spawn", + "x": 56.5, + "y": 71.0, + "z": 3.5, + "yaw": 89.74457, + "pitch": -0.8161538 + }, + "lines": [ + { + "type": "TEXT", + "text": "&3&lPlatinum Rank", + "location": { + "world": "Spawn", + "x": 56.5, + "y": 71.0, + "z": 3.5, + "yaw": 89.74457, + "pitch": -0.8161538 + } + }, + { + "type": "TEXT", + "text": "&oClick to view", + "location": { + "world": "Spawn", + "x": 56.5, + "y": 70.77, + "z": 3.5, + "yaw": 89.74457, + "pitch": -0.8161538 + } + } + ], + "animations": [], + "visibility": "VISIBLE" + }, + "signature": "c7SU5u6SepNVVUIg44oc4kIVhx2hPVzd+qDaqyE5o2GLteTr7UjM2ErfMuv4ME8rGhz1A9+AQ2X1krkOb43efUXNqcPeaF0xJ5AQLLUjPuxm6w28e6sjJrmiAEcTeBLB8Caxo+NtpqJaXaioHpXr2d6a5MTOKU0KQxeSGldzA3bz2H7ipMaN5MwTRcgMB8yqkMuYH+ZwttPsjyCxktlwBqiKzh0qx+p3P/ekG+skUd3P3j0wMf+9NvlVZODLUi0iwg3wliPMZwqNbeDT2gQS5QxG3E+LPKl7JW412Np7pEWdI5cYuXWl05ptjHywPP7wyjcEXDRTWQs4MbmpEFG5YnoKxTUkNI+ucbDaqLQu0Gh0fxngpqTP/nUl0mDfYbYS7fGc4kfNHIEKwp16KqOsMSYYbtATqX8rAuD6vS9WhPCuDtK2KbwI/yPtQe+jHv1GDtTiLxEDIbkmXcTStgeS+WR8T852z+M3i0SYeYTAst1nhZwlhnH2Mmabn2fndDL7iU6VXN68YQzENGMBASSjtxpIcwKlScKLc7Lcr1LFHYlDIxx2cKT5DhJNf9K9iKprbgd0OBlkEbfvqVnFMpGGr4NGzpEjMJ9QvZj7Mo0zWb2/K7B9W6v2w5Aznmjk1xz/1ectAPkIasLF6G265U2RvRgYJkYQ4imvZhG9I1XkAdo=", + "skinUsername": "minecarted", + "swing": true, + "tabVisibility": "HIDDEN", + "tagVisibility": "HIDDEN", + "texture": "ewogICJ0aW1lc3RhbXAiIDogMTY1MzcxNTQ3NDY0MCwKICAicHJvZmlsZUlkIiA6ICJmOTM1M2MxYjE5ZjM0ZWY0YWRkZjg0MWExZWE5YzQyZCIsCiAgInByb2ZpbGVOYW1lIiA6ICJtaW5lY2FydGVkIiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzg0Yzk5YjAxNWJiYWMyNTgwNjBiYzk1ZDc4OWMyMmFhYTAwMGMxY2U2YWM1ZWE4ZDJhOWQ3ODc5Yzc0NzVlOGMiLAogICAgICAibWV0YWRhdGEiIDogewogICAgICAgICJtb2RlbCIgOiAic2xpbSIKICAgICAgfQogICAgfQogIH0KfQ==", + "animations": [], + "visibility": "VISIBLE" +} \ No newline at end of file diff --git a/Configs + Precompiled/config/Entity/entities/ravine-rank.json b/Configs + Precompiled/config/Entity/entities/ravine-rank.json new file mode 100644 index 0000000..134670c --- /dev/null +++ b/Configs + Precompiled/config/Entity/entities/ravine-rank.json @@ -0,0 +1,70 @@ +{ + "type": "NPC", + "name": "ravine-rank", + "location": { + "world": "Spawn", + "x": 56.5, + "y": 69.0, + "z": -2.5, + "yaw": 89.714615, + "pitch": -0.48428106 + }, + "commands": [ + "viewproduct lifetime-ravine" + ], + "equipment": [ + null, + null, + null, + null, + null + ], + "faces": false, + "hologram": { + "name": "NPC_ravine-rank_HOLOGRAM", + "location": { + "world": "Spawn", + "x": 56.5, + "y": 71.0, + "z": -2.5, + "yaw": 89.714615, + "pitch": -0.48428106 + }, + "lines": [ + { + "type": "TEXT", + "text": "&d&lRavine Rank", + "location": { + "world": "Spawn", + "x": 56.5, + "y": 71.0, + "z": -2.5, + "yaw": 89.714615, + "pitch": -0.48428106 + } + }, + { + "type": "TEXT", + "text": "&oClick to view", + "location": { + "world": "Spawn", + "x": 56.5, + "y": 70.77, + "z": -2.5, + "yaw": 89.714615, + "pitch": -0.48428106 + } + } + ], + "animations": [], + "visibility": "VISIBLE" + }, + "signature": "RulfhJrT6VpUoBeqWUq8J+mlKmRLAudUtctK+6YFeMlZSeGlOZbjXhf1+yZwLBSBk25R3gwIJ8WWPO1gzJOqF6px28KOm61IOcVmGb7m+9nFcpcqHLOoAlOo3zaLl+c0X0oKy6mhQUuyg7Cd38IqdQPT4UpV6S8nyH7Gl9TsvP+ywgYWlEo92JdBEdQh44S0l2KeAembwiyBKuwCr+te5ggg6AT/D+uQojGpE4vJeIyBYbyFc+tcenhitI2NedbEjfn04UBvyf91BDdy1O+poGPUwmPbChbGpQ41kXsevZWxikTphBWJUH7PyU7/PvPOvnAFRYxtte4nr3v3FVEi72AIScsk8MpOdmDbdcXXYk6kj1wi5q53Zj0qZsNyRq88457wdMVxC4j1JUVaVQM3ygu2b9rpIx+5upwQSe7n7gyN6SpLrUCIMZISvkimcDpopyx200ZPZkRGXihxipRhpw4sjHE1rtQkSOB7zlJliD7Q+f45hlN7vfFN0orGDxCd6oxt/ZrJ2WyW6C96XJVUyIUSBzmlodbHHzHYuZWzEK1sD/9f3o/IDM0u00crTdgNivIid93yvBCqJTdAP1tHvKR6FtlHUbEECbtIVIWyMcRqlXpa3zzio/V+/bwjClyJJqZ+/+mxfGCndFwgjiqY3LCYby+8/2gwiBIukInbLDY=", + "skinUsername": "sayeu", + "swing": true, + "tabVisibility": "HIDDEN", + "tagVisibility": "HIDDEN", + "texture": "ewogICJ0aW1lc3RhbXAiIDogMTY1MzcxNTI4NjMwMSwKICAicHJvZmlsZUlkIiA6ICIzNDcyMmYxYWQ2MTU0NjZhYTc5NzljNWVhOWQwZmNiNyIsCiAgInByb2ZpbGVOYW1lIiA6ICJzYXlldSIsCiAgInNpZ25hdHVyZVJlcXVpcmVkIiA6IHRydWUsCiAgInRleHR1cmVzIiA6IHsKICAgICJTS0lOIiA6IHsKICAgICAgInVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS84NDFmOGRlYzlkMWY0MGM3YjdlM2E1Y2M0NDYwNmUyZjlhZjY1ODExNWE1MDk4NGUyOGQ3NjllZDAzMGRlNzk2IgogICAgfSwKICAgICJDQVBFIiA6IHsKICAgICAgInVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS8yMzQwYzBlMDNkZDI0YTExYjE1YThiMzNjMmE3ZTllMzJhYmIyMDUxYjI0ODFkMGJhN2RlZmQ2MzVjYTdhOTMzIgogICAgfQogIH0KfQ==", + "animations": [], + "visibility": "VISIBLE" +} \ No newline at end of file diff --git a/Configs + Precompiled/config/Entity/entities/sapphire-rank.json b/Configs + Precompiled/config/Entity/entities/sapphire-rank.json new file mode 100644 index 0000000..80420d3 --- /dev/null +++ b/Configs + Precompiled/config/Entity/entities/sapphire-rank.json @@ -0,0 +1,70 @@ +{ + "type": "NPC", + "name": "sapphire-rank", + "location": { + "world": "Spawn", + "x": 51.491139493945866, + "y": 69.0, + "z": 8.412863992004295, + "yaw": 180.1745, + "pitch": 0.6321265 + }, + "commands": [ + "viewproduct lifetime-sapphire" + ], + "equipment": [ + null, + null, + null, + null, + null + ], + "faces": false, + "hologram": { + "name": "NPC_sapphire-rank_HOLOGRAM", + "location": { + "world": "Spawn", + "x": 51.491139493945866, + "y": 71.0, + "z": 8.412863992004295, + "yaw": 180.1745, + "pitch": 0.6321265 + }, + "lines": [ + { + "type": "TEXT", + "text": "&9&lSapphire Rank", + "location": { + "world": "Spawn", + "x": 51.491139493945866, + "y": 71.0, + "z": 8.412863992004295, + "yaw": 180.1745, + "pitch": 0.6321265 + } + }, + { + "type": "TEXT", + "text": "&oClick to view", + "location": { + "world": "Spawn", + "x": 51.491139493945866, + "y": 70.77, + "z": 8.412863992004295, + "yaw": 180.1745, + "pitch": 0.6321265 + } + } + ], + "animations": [], + "visibility": "VISIBLE" + }, + "signature": "a8IGILzPfrwjc5M2sjFyFEpo8fNuLq5lE/GbHTNtXWeL2fvG1FewuH7YX1vRFnIcERN4/vTSN045a2gf4F+X1uM9cJThjYtYzjxpPchTikK02MnXOVW9uWz/L2oXgp1RytANOOpDI3FP3pOl+3/aB+20RjRvMs2lKuamXhAhq+bPUwqHhZAajxUH2dkgcxGBECOcPH/+e3m9CYgS2k+n7joMmyiiBHhcuOoj/YlYCDvqNAj9hpFedbexV6ZoQt07WGPzJR4hEETk8x94ZI/3CJRlaTuP5pRFR4hUt71eaSsA4sIFX9E2aF3OsSUGXpb3ELG+ewWdc/WdbQCjYkbtREw/khR0jIEIXs4L4jXFDDpoLvvzhvvw/8sgc9Fi0JM1tlFhrMhtA7oGSjN7wzXZvm5LNnJwx1Qxjrrov+jngGapb21doK4Y+12Fq0zseNzOXw5XA3vgdSC37aycZ2fVl43roBMs/Adc7fr1Yqwwwhzmh5oRSKHPPu7rrmuGKMOEeEgGUS74HaVVms97vgTcX5U05pF7bh1685MOGkWXnJVBjs8mncBRmYRqNTnCXO6MMMHsZbTNLY2lgaj51+QX0R5ZgnLIDykPzhxdk7PperGRfZsEzQq2iLTTMfx1C4JNbEJGIPCmueXHiU8GM0GHX81LZvuyc6sP1OY/KD4C+wc=", + "skinUsername": "baseboys", + "swing": true, + "tabVisibility": "HIDDEN", + "tagVisibility": "HIDDEN", + "texture": "ewogICJ0aW1lc3RhbXAiIDogMTY1MzcxNDk3OTU2MCwKICAicHJvZmlsZUlkIiA6ICI4MWFmYTNjYTBlM2M0Yzg5YTgzZmMyZTU1OWY0NzQ4NyIsCiAgInByb2ZpbGVOYW1lIiA6ICJCYXNlQm95cyIsCiAgInNpZ25hdHVyZVJlcXVpcmVkIiA6IHRydWUsCiAgInRleHR1cmVzIiA6IHsKICAgICJTS0lOIiA6IHsKICAgICAgInVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS9hMDExMDc2OTU4NGM2MjQ5YTJkZTdkYjcxYTU4YTk3ODlhYWI4NTUzZDJjNWNiMGRiMTAzMzhjNTNkNmU2ODkiCiAgICB9CiAgfQp9", + "animations": [], + "visibility": "VISIBLE" +} \ No newline at end of file diff --git a/Configs + Precompiled/config/ExploitFixer/config.yml b/Configs + Precompiled/config/ExploitFixer/config.yml new file mode 100644 index 0000000..d4691be --- /dev/null +++ b/Configs + Precompiled/config/ExploitFixer/config.yml @@ -0,0 +1,170 @@ +# ExploitFixer by LinsaFTW +# Please help by donating, we require funds to continue with the development. +# https://paypal.me/LinsaFTW +# +# INSTALL THE PLUGIN ON ALL BUKKIT SERVERS! +# +# Most of the check use Violations (vls), this a counter to execute different +# actions on diverse levels to allow high customization of the modules. + +# Default language used by the plugin (This changes depending on the client language) +locale: "en" + +# Web link used on the messages +web: "discord.gg/gF36AT3" + +# Shows notifications to console and players with permissions. +notifications: + enabled: true + + # Placeholders: %player% %ping% %check% %vls% + message: "&c&lEF: &e%player% &7(&a%ping%ms&7) &ffailed &6%check% &7(&c%vls% vls&7)" + + # This shows extra information about blocked packets. + debug: false + +# Prevents exploits that occur on different Bukkit events. +events: + # Prevents moving if the chunk is null. (Prevents chunk overloading) + null_chunk: true + + # Prevents players from damaging themselves and consuming ram. + self_damage: true + +# Prevents the use of invalid packets to crash the server. +packets: + enabled: true + + # Amount of vls required to start cancelling packets. + cancel_vls: 100 + + # Amount of vls to reduce per second. + reduce_vls: 60 + + # Cancels packets if the player sending them is offline. + offline: true + + # This will check if integers, floats, doubles and items have a invalid size in packets. + data: + # Vls to add when a packet fails the check. (Set to -1 to disable) + vls: 600 + + # Maximum amount of bytes allowed per packet. (Set to -1 to disable) + bytes: 16000 + + # Maximum amount of bytes allowed per book page. (Set to -1 to disable) + bytes_book: 300 + + # Maximum amount of bytes allowed per sign line. (Set to -1 to disable) + bytes_sign: 47 + + # Packets will add their amount of bytes divided by this number to vl count. + # This is made so big packets add more vls when received. + bytes_divider: 1000 + + # Cancels book packets when a book is not in hand + # Vls to add when a packet fails the check. (Set to -1 to disable) + book: 100 + + # Cancels CustomPayload packets with invalid tags + # Vls to add when a packet fails the check. (Set to -1 to disable) + tag: 600 + + # Checks if players send PacketPlayInWindowClick packets with invalid data. + # Vls to add when a packet fails the check. (Set to -1 to disable) + window_click: 300 + + # Checks if players send PacketPlayInBlockPlace packets with invalid data. + # Vls to add when a packet fails the check. (Set to -1 to disable) + block_place: 300 + + # Checks if players send PacketPlayInBlockDig packets with invalid data. + # Vls to add when a packet fails the check. (Set to -1 to disable) + block_dig: 600 + + # Checks if players send PacketPlayInCreativeSlot packets without creative. + # Vls to add when a packet fails the check. (Set to -1 to disable) + set_creative_slot: 600 + + # Vls to add when a normal packet is sent by a player. + # This option is made to work as a packet limiter feature. + # Unlisted packets are considered as "PacketPlayInOther" by default. + # Remember to take a look at bytes_divider option. + multipliers: + PacketPlayInOther: 0.1 + MC|BSign: 30 + MC|BEdit: 30 + MC|BOpen: 30 + PacketPlayInAutoRecipe: 10 + PacketPlayInUpdateSign: 10 + PacketPlayInAbilities: 0.1 + PacketPlayInArmAnimation: 0.3 + PacketPlayInBlockDig: 0.3 + PacketPlayInBlockPlace: 0.4 + PacketPlayInCustomPayload: 0.04 + PacketPlayInEntityAction: 0.4 + PacketPlayInFlying: 0.05 + PacketPlayInLook: 0.1 + PacketPlayInPositionLook: 0.1 + PacketPlayInPosition: 0.35 + PacketPlayInSetCreativeSlot: 0.1 + PacketPlayInSettings: 0.5 + PacketPlayInTabComplete: 0.2 + PacketPlayInUseEntity: 0.4 + PacketPlayInUseItem: 0.4 + PacketPlayInWindowClick: 0.5 + + # Placeholders: %player% + # Commands to run when a player reachs certain violation level. + violations: + 350: + - "notification" + 600: + - "notification" + - "kick" + +# Removes custom NBT tags from creative items to prevent harm to your server. +# Negative enchant values will be always removed. +itemsfix: + enabled: true + + # Maximum stack size obtainable with creative packets. (-1 to allow anything) + max_stack_size: 64 + + # Maximum enchant level obtainable with creative packets. + # -1 removes all enchants, 0 forces vanilla values + enchant_limit: 0 + + # List of materials that are unobtainable from Creative. + blacklist: + - "END_PORTAL" + - "NETHER_PORTAL" + # - "BARRIER" + # - "COMMAND_BLOCK" + +# Checks if players try to crash/exploit the server with commands. +commands: + enabled: true + + # Commands that are excempt from this server. + commands: + - "//calc" + - "//calculate" + - "//eval" + - "//evaluate" + - "//solve" + - "/hd readtext" + - "/holo readtext" + - "/hologram readtext" + - "/holograms readtext" + - "/holographicdisplays readtext" + - "/pex promote" + - "/pex demote" + - "/promote" + - "/demote" + - "/execute" + + # Placeholders: %player% + punishments: + - "notification" + - "kick" diff --git a/Configs + Precompiled/config/ExploitFixer/locales/en.yml b/Configs + Precompiled/config/ExploitFixer/locales/en.yml new file mode 100644 index 0000000..e41654f --- /dev/null +++ b/Configs + Precompiled/config/ExploitFixer/locales/en.yml @@ -0,0 +1,27 @@ +# English - Credits: LinsaFTW +commands: + reload: "&aPlugin ExploitFixer reloaded!" + help: |- + &aExploitFixer &b%version%&a by &bLinsaFTW&a. + &e /%command% help &7> &bShows available commands. + &e /%command% reload &7> &bReloads the plugin. + &e /%command% notifications &7> &bToggles notifications of the plugin. + &e /%command% stats &7> &bWatch the stats of the plugin. + error: + unknown: "&cUnknown command. Use /exploitfixer help to see available commands!" + permission: "&cYou dont have permission to use this command!" + console: "&cThis command cant be executed from the console!" + notifications: + enable: "&aYou have enabled notifications!" + disable: "&cYou have disabled notifications!" + stats: "&c&lEF: &ePlayers cached: &a%players_cached%&e Players punished: &a%players_punished%" +modules: + custompayload: + kick_message: "&cYou are temporally blocked from this server!\n\n&7Reason: &fToo many CustomPayload packets detected.\n&7Discord: &b&n%web%&r" + commands: + kick_message: "&cYou are temporally blocked from this server!\n\n&7Reason: &fCommand exploit detected.\n&7Discord: &b&n%web%&r" + packets: + kick_message: "&cYou are temporally blocked from this server!\n\n&7Reason: &fPackets exploit detected.\n&7Discord: &b&n%web%&r" + nulladdress: + kick_message: "&cYou are temporally blocked from this server!\n\n&7Reason: &fNull address detected.\n&7Discord: &b&n%web%&r" +mojang_down: "&cMojang servers are down, please come back later!\n\n&7Reason: &fExploitFixer can't check the UUID.\n&7Discord: &b&n%web%&r" \ No newline at end of file diff --git a/Configs + Precompiled/config/ExploitFixer/locales/es.yml b/Configs + Precompiled/config/ExploitFixer/locales/es.yml new file mode 100644 index 0000000..b859bf1 --- /dev/null +++ b/Configs + Precompiled/config/ExploitFixer/locales/es.yml @@ -0,0 +1,27 @@ +# Spanish - Credits: LinsaFTW +commands: + reload: "&aPlugin ExploitFixer recargado!" + help: |- + &aExploitFixer &b%version%&a por &bLinsaFTW&a. + &e /%command% help &7> &bMuestra los comandos disponibles. + &e /%command% reload &7> &bRecarga el plugin. + &e /%command% notifications &7> &bAlterna las notificaciones del plugin. + &e /%command% stats &7> &bMira las estadisticas del plugin. + error: + unknown: "&cComando desconocido. Usa /exploitfixer help para ver comandos disponibles!" + permission: "&cNo tienes permiso para usar ese comando!" + console: "&cEste comando no puede ser usado desde la consola!" + notifications: + enable: "&aHabilitaste las notificaciones!" + disable: "&cDeshabilitaste las notificaciones!" + stats: "&c&lEF: &eJugadores en cache: &a%players_cached%&e Jugadores sancionados: &a%players_punished%" +modules: + custompayload: + kick_message: "&cFuiste bloqueado temporalmente!\n\n&7Razon: &fExploit de CustomPayload detectado.\n&7Discord: &b&n%web%&r" + commands: + kick_message: "&cFuiste bloqueado temporalmente!\n\n&7Razon: &fExploit de Comandos detectado.\n&7Discord: &b&n%web%&r" + packets: + kick_message: "&cFuiste bloqueado temporalmente!\n\n&7Razon: &fExploit de Packets detectado.\n&7Discord: &b&n%web%&r" + nulladdress: + kick_message: "&cFuiste bloqueado temporalmente!\n\n&7Razon: &fExploit de Red nula detectado.\n&7Discord: &b&n%web%&r" +mojang_down: "&cMojang esta apagado, vuelve pronto!\n\n&7Razon: &fExploitFixer no puede confirmar la UUID.\n&7Discord: &b&n%web%&r" \ No newline at end of file diff --git a/Configs + Precompiled/config/ExploitFixer/locales/fr.yml b/Configs + Precompiled/config/ExploitFixer/locales/fr.yml new file mode 100644 index 0000000..61c2a02 --- /dev/null +++ b/Configs + Precompiled/config/ExploitFixer/locales/fr.yml @@ -0,0 +1,27 @@ +# French - Credits: HaVroz +commands: + reload: "&aPlugin Exploitfixer rechargé!" + help: |- + &aExploitFixer &b%version%&a par &bLinsaFTW&a. + &e /%command% help &7> &bAfficher les commandes disponibles. + &e /%command% reload &7> &bRecharger le plugin. + &e /%command% notifications &7> &bActiver/Désactiver les notifications du plugin. + &e /%command% stats &7> &bVoir les statistiques du plugin. + error: + unknown: "&cCommande inconnue. Utilisez /exploitfixer help pour voir les commandes disponibles!" + permission: "&cVous n’avez pas la permission d’utiliser cette commande!" + console: "&cCette commande ne peut pas être exécutée depuis la console!" + notifications: + enable: "&aVous avez activé les notifications!" + disable: "&cVous avez désactivé les notifications!" + stats: "&c&lEF: &eJoueurs caché: &a%players_cached%&e Joueurs sanctionné: &a%players_punished%" +modules: + custompayload: + kick_message: "&cVous êtes temporairement bloqué du serveur!\n\n&7Raison: &fTrop de paquets Custompayload détectés.\n&7Discord: &b&n%web%&r" + commands: + kick_message: "&cVous êtes temporairement bloqué du serveur!\n\n&7Raison: &fExploit de commande détecté.\n&7Discord: &b&n%web%&r" + packets: + kick_message: "&cVous êtes temporairement bloqué du serveur!\n\n&7Raison: &fExploit de Packets détecté.\n&7Discord: &b&n%web%&r" + nulladdress: + kick_message: "&cVous êtes temporairement bloqué du serveur!\n\n&7Raison: &fAdresse nulle détectée.\n&7Discord: &b&n%web%&r" +mojang_down: "&cMojang est désactivé, revenez bientôt!\n\n&7Raison: &fExploitFixer ne peut pas confirmer l'UUID.\n&7Discord: &b&n%web%&r" \ No newline at end of file diff --git a/Configs + Precompiled/config/ExploitFixer/locales/hu.yml b/Configs + Precompiled/config/ExploitFixer/locales/hu.yml new file mode 100644 index 0000000..0f81960 --- /dev/null +++ b/Configs + Precompiled/config/ExploitFixer/locales/hu.yml @@ -0,0 +1,26 @@ +#Hungarian +commands: + reload: "&aAz ExploitFixer sikeresen újraindult!" + help: |- + &aExploitFixer &b%version%&a by &bLinsaFTW&a. + &e /%command% help &7> &bElérhető parancsok. + &e /%command% reload &7> &bPlugin újraindítása. + &e /%command% notifications &7> &bÉrtesítések ki/be kapcsolása. + &e /%command% stats &7> &bA plugin statisztikáinak megtekintése. + error: + unknown: "&cIsmeretlen parancs. Használd a /exploitfixer help parancsot!" + permission: "&cNincs jogod a parancs használatához!" + console: "&cEzt a parancsot nem bírod használni a konzolból!" + notifications: + enable: "&aBekapcsoltad az értesítéseket!" + disable: "&cKikapcsoltad az értesítéseket!" + stats: "&c&lEF: &eJátékosok: &a%players_cached%&e Büntetések: &a%players_punished%" +modules: + custompayload: + kick_message: "&cKi lettél rúgva a szerverről!\n\n&7Reason: &fTúl sok CustomPayload csomagot észleltünk.\n&7Discord: &b&n%discord%&r" + commands: + kick_message: "&cKi lettél rúgva a szerverről!\n\n&7Reason: &fParancs exploitot észleltünk.\n&7Discord: &b&n%discord%&r" + packets: + kick_message: "&cKi lettél rúgva a szerverről!\n\n&7Reason: &fCsomag exploitot észleltünk.\n&7Discord: &b&n%discord%&r" + nulladdress: + kick_message: "&cKi lettél rúgva a szerverről!\n\n&7Reason: &fNull addresst észleltünk.\n&7Discord: &b&n%discord%&r" \ No newline at end of file diff --git a/Configs + Precompiled/config/ExploitFixer/locales/it.yml b/Configs + Precompiled/config/ExploitFixer/locales/it.yml new file mode 100644 index 0000000..8c63bf4 --- /dev/null +++ b/Configs + Precompiled/config/ExploitFixer/locales/it.yml @@ -0,0 +1,27 @@ +# Italian +commands: + reload: "&aPlugin ExploitFixer ricaricato!" + help: |- + &aExploitFixer &b%version%&a da parte di &bLinsaFTW&a. + &e /%command% help &7> &bMostra i commandi disponibili. + &e /%command% reload &7> &bRicarica il plugin. + &e /%command% notifications &7> &bCambia le notifiche del plugin. + &e /%command% stats &7> &bMostra le statistiche del plugin. + error: + unknown: "&cCommando sconosciuto. Usa /exploitfixer help per vedere i commandi disponibili!" + permission: "&cNon hai il permesso per questo commando!" + console: "&cQuesto commando non può essere eseguito dalla console!" + notifications: + enable: "&aHai abilitato le notifiche!" + disable: "&cHai disabilitato le notifiche!" + stats: "&c&lEF: &eGiocatori in cache: &a%players_cached%&e Giocatori puniti: &a%players_punished%" +modules: + custompayload: + kick_message: "&cSei stato temporaneamente bloccato da questo server!\n\n&7Motivo: &fTroppi pacchetti CustomPayload.\n&7Discord: &b&n%web%&r" + commands: + kick_message: "&cSei stato temporaneamente bloccato da questo server!\n\n&7Motivo: &fExploit di commandi rilevati.\n&7Discord: &b&n%web%&r" + packets: + kick_message: "&cSei stato temporaneamente bloccato da questo server!\n\n&7Motivo: &fExploit di pacchetti rilevati.\n&7Discord: &b&n%web%&r" + nulladdress: + kick_message: "&cSei stato temporaneamente bloccato da questo server!\n\n&7Motivo: &fIndirizzo null rilevato.\n&7Discord: &b&n%web%&r" +mojang_down: "&cMojang è disattivato, torna presto!\n\n&7Reason: &fExploitFixer non può confermare l'UUID. \n&7Discord: &b&n%web%&r" \ No newline at end of file diff --git a/Configs + Precompiled/config/ExploitFixer/locales/pt.yml b/Configs + Precompiled/config/ExploitFixer/locales/pt.yml new file mode 100644 index 0000000..3390ce4 --- /dev/null +++ b/Configs + Precompiled/config/ExploitFixer/locales/pt.yml @@ -0,0 +1,27 @@ +# Portuguese - Credits: LucaAzalim +commands: + reload: "&aPlugin ExploitFixer recarregado!" + help: |- + &aExploitFixer &b%version%&a por &bLinsaFTW&a. + &e /%command% help &7> &bComandos disponiveis. + &e /%command% reload &7> &bRecarrega o plugin. + &e /%command% notifications &7> &bAtiva as notificações do plugin. + &e /%command% stats &7> &bVer as estatísticas do plugin. + error: + unknown: "&cComando desconhecido. Use /exploitfixer para ver os comandos disponiveis!" + permission: "&cSem permissão para usar esse comando!" + console: "&cEsse comando não pode ser executado pelo console!" + notifications: + enable: "&cVocê ativou as notificações!" + disable: "&cVocê desativou as notificações!" + stats: "&c&lEF: &eJogadores em cache: &a%players_cached%&e Jogadores punidos: &a%players_punished%" +modules: + custompayload: + kick_message: "&cVocê foi temporariamente bloqueado!\n\n&7Motivo: &fExploit de CustomPayload detectado.\n&7Discord: &b&n%web%&r" + commands: + kick_message: "&cVocê foi temporariamente bloqueado!\n\n&7Motivo: &fExploit de Comandos detectado.\n&7Discord: &b&n%web%&r" + packets: + kick_message: "&cVocê foi temporariamente bloqueado!\n\n&7Motivo: &fExploit de Packets detectado.\n&7Discord: &b&n%web%&r" + nulladdress: + kick_message: "&cVocê foi temporariamente bloqueado!\n\n&7Motivo: &fExploit de Rede nula detectado.\n&7Discord: &b&n%web%&r" +mojang_down: "&cMojang está desligado, volte logo!\n\n&7Motivo: &fExploitFixer não pode confirmar UUID.\n&7Discord: &b&n%web%&r" \ No newline at end of file diff --git a/Configs + Precompiled/config/ExploitFixer/locales/tr.yml b/Configs + Precompiled/config/ExploitFixer/locales/tr.yml new file mode 100644 index 0000000..77da929 --- /dev/null +++ b/Configs + Precompiled/config/ExploitFixer/locales/tr.yml @@ -0,0 +1,27 @@ +# Turkish +commands: + reload: "&aPlugin ExploitFixer yeniden yüklendi!" + help: |- + &aExploitFixer &b%version% &ayazan &bLinsaFTW&a. + &e /%command% help &7> &bMevcut komutları gösterir. + &e /%command% reload &7> &bEklentiyi yükler. + &e /%command% notifications &7> &bEklentinin bildirimlerini değiştirir. + &e /%command% stats &7> &bEklentinin istatistiklerini izleyin. + error: + unknown: "&cBilinmeyen komut. Kullanılabilir komutları görmek için / exploitfixer yardımını kullanın!" + permission: "&cBu komutu kullanma izniniz yok!" + console: "&cBu komut konsoldan yürütülemez!" + notifications: + enable: "&aBildirimleri etkinleştirdiniz!" + disable: "&cBildirimleri devre dışı bıraktınız!" + stats: "&c&lEF: &ePlayers önbelleğe alındı: &a%players_cached%&e Players cezalandırıldı: &a%players_punished%" +modules: + custompayload: + kick_message: "&cBu sunucudan geçici olarak engellendiniz!\n\n&7Reason: &fBirçok CustomPayload paketi algılandı.\n&7Discord: &b&n%web%&r" + commands: + kick_message: "&cBu sunucudan geçici olarak engellendiniz!\n\n&7Reason: &fKomuttan yararlanma algılandı.\n&7Discord: &b&n%web%&r" + packets: + kick_message: "&cBu sunucudan geçici olarak engellendiniz!\n\n&7Reason: &fPackets istismar tespit edildi.\n&7Discord: &b&n%web%&r" + nulladdress: + kick_message: "&cBu sunucudan geçici olarak engellendiniz!\n\n&7Reason: &fNull adres algılandı.\n&7Discord: &b&n%web%&r" +mojang_down: "&cMojang kapalı, kısa süre sonra tekrar gelin!\n\n&7Neden: &fExploitFixer UUID'yi doğrulayamıyor.\n&7Discord: &b&n%web%&r" \ No newline at end of file diff --git a/Configs + Precompiled/config/GAListener/config.yml b/Configs + Precompiled/config/GAListener/config.yml new file mode 100644 index 0000000..c712cec --- /dev/null +++ b/Configs + Precompiled/config/GAListener/config.yml @@ -0,0 +1,208 @@ +# GAListener v1.3.2 +# http://www.minecraft-index.com + +# settings section + +# onlineonly - Only delivers rewards when the player is online. If they are offline it will wait and deliver when they next join the server! +# luckyvote - Enables the lucky voting section, this allows voters to have a random chance to receive additional rewards when they vote. +# permvote - Enables the permission voting section, this allows voters to receive different rewards based upon their permissions. +# cumulative - Enables the cumulative voting section, this allows voters to receive rewards once they have reached a certain number of votes. +# broadcastqueue - Show broadcast message for queued votes. +# broadcastoffline - Show broadcast message for offline queued votes. +# broadcastrecent - Show broadcast message to recent voters (last 24 hours) +# votecommand - Enables the /vote command which will show the message contained in the votemessage section at the bottom of the config. +# rewardcommand - Enables the /rewards command which will show a list of all the cumulative voting rewards. +# joinmessage - Show the message contained in the joinmessage section at the bottom of this config when a player joins the server. +# voteremind - Message players who haven't voted in the last 24 hours. Shows the message contained in the remindmessage section at the bottom of this config. +# remindseconds - How often (in seconds) between each reminder message. +# ratelimit - Ignore votes received within this many seconds since the last vote for the same player on the same site. This should prevent duplicate votes. +# logfile - Log received votes to vote.log file. +# dbMode - Database mode. Use either mysql or sqlite. +# dbFile - Database filename for SQLite. +# dbHost - Database IP / Hostname for MySQL. +# dbPort - Database port for MySQL. +# dbUser - Database username for MySQL. +# dbPass - Database password for MySQL. +# dbName - Database name for MySQL. +# dbPrefix - Database table prefix. + +settings: + onlineonly: true + luckyvote: false + permvote: false + cumulative: false + broadcastqueue: true + broadcastrecent: true + broadcastoffline: false + votecommand: true + rewardcommand: false + joinmessage: false + voteremind: false + remindseconds: 300 + ratelimit: 10 + logfile: false + dbMode: 'sqlite' + dbFile: 'GAL.db' + dbHost: 'localhost' + dbPort: 3306 + dbUser: 'root' + dbPass: '' + dbName: 'GAL' + dbPrefix: '' + +# services section (default is used if service doesn't exist) +# The example below would give 5 diamonds per vote. + +services: + default: + broadcast: '' + playermessage: '{GREEN}Thanks for voting at {service}!' + commands: + - '/sbc &4&lVote &8┃ &f{username} &7has voted and received &b&l3x Rare Keys&7! &f/vote' + - '/cr givekey {username} Rare 3' + #- '/raw &f{username} &6has received another &f&l3x Winter Keys&6! &a&l(DOUBLE VOTE)' + +# luckyvotes section +# The example below would give a 1 in 10 chance of a voter receiving an extra $1000, and a 1 in 50 chance of an extra $1000 and 100XP. + +luckyvotes: + '5': + broadcast: '&f{username} &6got lucky and won an additional &f&l3x Winter Keys&6!' + playermessage: '{GREEN}Thanks for voting 3 times!' + commands: + - '/cr givekey {username} Winter 3' + '10': + broadcast: '&f{username} &6got lucky and won &5&l5x Item Keys&6!' + playermessage: '{GREEN}Thanks for voting 3 times!' + commands: + - '/cr givekey {username} Items 5' + '25': + broadcast: '&f{username} &6got lucky and won &c&l10x Valentines Crates&6!' + playermessage: '{GREEN}Thanks for voting 3 times!' + commands: + - '/crates give {username} Valentines 10' + '50': + broadcast: '&f{username} &6has reached &f3 votes &6and won &5&l10x Item Keys&6, &6&lReinforce Lootboxes&6, &4&lValentines Crates&6!' + playermessage: '{GREEN}Thanks for voting 3 times!' + commands: + - '/crates give {username} Reinforce 10' + + +# permission reward section +# This example would give players with the permission node "gal.double" 10 Diamonds instead of their regular reward. + +perms: + double: + broadcast: '{GREEN}{username} {GOLD}has voted @ {GREEN}{service} {GOLD}and received {GREEN}10 Diamonds!' + playermessage: '{GREEN}Thanks for voting at {AQUA}{service}!' + commands: + - '/give {username} 264 10' + +# cumulative reward section +# This example would give players 20 Diamonds once they have reached a total of 10 votes. + +cumulative: + '3': + broadcast: '&f{username} &6has reached &f3 votes &6and won &5&l3x Item Keys&6!' + playermessage: '{GREEN}Thanks for voting 3 times!' + commands: + - '/cr givekey {username} Items 3' + '5': + broadcast: '&f{username} &6has reached &f5 votes &6and won &4&l3x Valentines Crates&6!' + playermessage: '{GREEN}Thanks for voting 3 times!' + commands: + - '/crates give {username} Valentines 3' + '10': + broadcast: '&f{username} &6has reached &f10 votes &6and won &6&l3x Reinforce Crates&6!' + playermessage: '{GREEN}Thanks for voting 3 times!' + commands: + - '/crates give {username} Reinforce 3' + '20': + broadcast: '&f{username} &6has reached &f3 votes &6and won &5&l10x Item Keys&6, &6&lReinforce Lootboxes&6, &4&lValentines Crates&6!' + playermessage: '{GREEN}Thanks for voting 3 times!' + commands: + - '/cr givekey {username} Items 10' + - '/crates give {username} Valentines 10' + - '/crates give {username} Reinforce 10' + '50': + broadcast: '&f{username} &6has reached &f3 votes &6and won &a&l8x Perk Keys&6!' + playermessage: '{GREEN}Thanks for voting 3 times!' + commands: + - '/cr givekey {username} Perk 8' + '75': + broadcast: '&f{username} &6has reached &f3 votes &6and won &b&l20x Airdrops&6!' + playermessage: '{GREEN}Thanks for voting 3 times!' + commands: + - '/airdrops give {username} 20' + +# Reward top voters on every day set here. Use {username} and {day} to get info about player and day. +# The first number is the day of month > general commands > rank position and rank commands. + +day-reward: + enable: false + '1': # day of month + general-cmds: [] + rank: + '1': #rank in top 10 voters + cmds: + - 'setvip {username} Vip1 20' + '2': + cmds: + - 'setvip {username} Vip1 10' + '3': + cmds: + - 'setvip {username} Vip1 3' + + +# blocked - a list of worlds where rewards should be disabled, they will remain queued until the player is in an allowed world. + +blocked: +- world_blocked + +# Available formatting codes for messages: + +# {service} {servicename} {SERVICE} = service name +# {username} {player} {name} = player username +# {votes} = current vote total +# & = Colour Symbol to enter manual colours / control codes +# {AQUA} {BLACK} {BLUE} {DARK_AQUA} {DARK_BLUE} +# {DARK_GRAY} {DARK_GREEN} {DARK_PURPLE} {DARK_RED} {GOLD} +# {GRAY} {GREEN} {LIGHT_PURPLE} {RED} {WHITE} {YELLOW} {BOLD} +# {ITALIC} {UNDERLINE} {STRIKETHROUGH} {STRIKE} +# {STRIKETHROUGH} {MAGIC} {RESET} + +votemessage: +- '' +- '&4&LVOTING' +- '&7Vote daily for the network to receive various prizes.' +- '' +- '&4&lREWARDS' +- '&7Voting can get you the following:' +- '&4&l┃ &fYou will always get &b&l3x Rare Keys&f.' +- '' +- '&4&lLINKS' +- '&4&l┃ &fhttps://minecraftservers.org/vote/590425' +- '&4&l┃ &fhttps://minecraft-mp.com/server/217111/vote/' +- '&4&l┃ &fhttps://minecraft-server-list.com/server/464678/vote/' +- '' +remindmessage: +- '' + +joinmessage: +- '' + +# Additional formatting codes for below: + +# {TOTAL} = vote total - used for /rewards +# {REWARD} = current rewardmessage as specified in the cumulative reward section - used for /rewards +# {POSITION} = current rank - used for /votetop +# {username} = player name - used for /votetop + +rewardformat: '{GREEN}{TOTAL} Votes {GRAY}- {AQUA}{REWARD}' +votetopformat: '{POSITION}. {GREEN}{username} - {WHITE}{TOTAL}' +rewardheader: +- '{GOLD}---------------- {WHITE}[ {DARK_AQUA}Rewards{WHITE} ] {GOLD}----------------' +votetopheader: +- '{GOLD}---------------- {WHITE}[ {DARK_AQUA}Top Voters{WHITE} ] {GOLD}----------------' +rewardfooter: +- '{AQUA}You currently have {GREEN}{votes} Votes' diff --git a/Configs + Precompiled/config/HCTeams/battle-pass-daily-challenges.json b/Configs + Precompiled/config/HCTeams/battle-pass-daily-challenges.json new file mode 100644 index 0000000..0c12769 --- /dev/null +++ b/Configs + Precompiled/config/HCTeams/battle-pass-daily-challenges.json @@ -0,0 +1 @@ +{"identifier":"945af31a-2df9-49d5-991b-b1f602b8981a","challenges":{"mine-glowstone-16":{"type":"net.frozenorb.foxtrot.gameplay.loot.battlepass.challenge.impl.MineBlockChallenge","properties":{"material":"GLOWSTONE","amount":16,"id":"mine-glowstone-16","name":"Mine 16 Glowstone","experience":5,"daily":true}},"kill-endermen-10":{"type":"net.frozenorb.foxtrot.gameplay.loot.battlepass.challenge.impl.KillEntityChallenge","properties":{"entityType":"ENDERMAN","kills":10,"id":"kill-endermen-10","name":"Kill 10 Endermen","experience":5,"daily":true}},"kill-endermen-20":{"type":"net.frozenorb.foxtrot.gameplay.loot.battlepass.challenge.impl.KillEntityChallenge","properties":{"entityType":"ENDERMAN","kills":20,"id":"kill-endermen-20","name":"Kill 20 Endermen","experience":10,"daily":true}},"kill-creeper-10":{"type":"net.frozenorb.foxtrot.gameplay.loot.battlepass.challenge.impl.KillEntityChallenge","properties":{"entityType":"CREEPER","kills":10,"id":"kill-creeper-10","name":"Kill 10 Creepers","experience":5,"daily":true}},"kill-cows-15":{"type":"net.frozenorb.foxtrot.gameplay.loot.battlepass.challenge.impl.KillEntityChallenge","properties":{"entityType":"COW","kills":15,"id":"kill-cows-15","name":"Kill 15 Cows","experience":5,"daily":true}},"kill-creeper-20":{"type":"net.frozenorb.foxtrot.gameplay.loot.battlepass.challenge.impl.KillEntityChallenge","properties":{"entityType":"CREEPER","kills":20,"id":"kill-creeper-20","name":"Kill 20 Creepers","experience":10,"daily":true}},"kill-players-3":{"type":"net.frozenorb.foxtrot.gameplay.loot.battlepass.challenge.impl.KillEntityChallenge","properties":{"entityType":"PLAYER","kills":3,"id":"kill-players-3","name":"Kill 3 Players","experience":5,"daily":true}},"mine-glowstone-32":{"type":"net.frozenorb.foxtrot.gameplay.loot.battlepass.challenge.impl.MineBlockChallenge","properties":{"material":"GLOWSTONE","amount":32,"id":"mine-glowstone-32","name":"Mine 32 Glowstone","experience":10,"daily":true}}},"expiresAt":1658904656452} \ No newline at end of file diff --git a/Configs + Precompiled/config/HCTeams/citadelInfo.json b/Configs + Precompiled/config/HCTeams/citadelInfo.json new file mode 100644 index 0000000..9dd43e3 --- /dev/null +++ b/Configs + Precompiled/config/HCTeams/citadelInfo.json @@ -0,0 +1,603 @@ +{ + "chests": [ + { + "location": { + "world": "world_nether", + "x": 205.0, + "y": 32.0, + "z": -469.0, + "yaw": 0.0, + "pitch": 0.0 + } + }, + { + "location": { + "world": "world_nether", + "x": 278.0, + "y": 35.0, + "z": -577.0, + "yaw": 0.0, + "pitch": 0.0 + } + }, + { + "location": { + "world": "world_nether", + "x": 106.0, + "y": 34.0, + "z": -546.0, + "yaw": 0.0, + "pitch": 0.0 + } + }, + { + "location": { + "world": "world_nether", + "x": 99.0, + "y": 32.0, + "z": -630.0, + "yaw": 0.0, + "pitch": 0.0 + } + }, + { + "location": { + "world": "world_nether", + "x": 92.0, + "y": 33.0, + "z": -474.0, + "yaw": 0.0, + "pitch": 0.0 + } + }, + { + "location": { + "world": "world_nether", + "x": 221.0, + "y": 31.0, + "z": -635.0, + "yaw": 0.0, + "pitch": 0.0 + } + }, + { + "location": { + "world": "world_nether", + "x": 170.0, + "y": 36.0, + "z": -471.0, + "yaw": 0.0, + "pitch": 0.0 + } + }, + { + "location": { + "world": "world_nether", + "x": 82.0, + "y": 36.0, + "z": -459.0, + "yaw": 0.0, + "pitch": 0.0 + } + }, + { + "location": { + "world": "world_nether", + "x": 135.0, + "y": 32.0, + "z": -632.0, + "yaw": 0.0, + "pitch": 0.0 + } + }, + { + "location": { + "world": "world_nether", + "x": 186.0, + "y": 34.0, + "z": -480.0, + "yaw": 0.0, + "pitch": 0.0 + } + }, + { + "location": { + "world": "world_nether", + "x": 198.0, + "y": 31.0, + "z": -635.0, + "yaw": 0.0, + "pitch": 0.0 + } + }, + { + "location": { + "world": "world_nether", + "x": 58.0, + "y": 34.0, + "z": -568.0, + "yaw": 0.0, + "pitch": 0.0 + } + }, + { + "location": { + "world": "world_nether", + "x": 93.0, + "y": 38.0, + "z": -533.0, + "yaw": 0.0, + "pitch": 0.0 + } + }, + { + "location": { + "world": "world_nether", + "x": 41.0, + "y": 37.0, + "z": -482.0, + "yaw": 0.0, + "pitch": 0.0 + } + }, + { + "location": { + "world": "world_nether", + "x": 44.0, + "y": 34.0, + "z": -489.0, + "yaw": 0.0, + "pitch": 0.0 + } + }, + { + "location": { + "world": "world_nether", + "x": 138.0, + "y": 32.0, + "z": -530.0, + "yaw": 0.0, + "pitch": 0.0 + } + }, + { + "location": { + "world": "world_nether", + "x": 48.0, + "y": 36.0, + "z": -630.0, + "yaw": 0.0, + "pitch": 0.0 + } + }, + { + "location": { + "world": "world_nether", + "x": 126.0, + "y": 34.0, + "z": -535.0, + "yaw": 0.0, + "pitch": 0.0 + } + }, + { + "location": { + "world": "world_nether", + "x": 44.0, + "y": 32.0, + "z": -457.0, + "yaw": 0.0, + "pitch": 0.0 + } + }, + { + "location": { + "world": "world_nether", + "x": 52.0, + "y": 34.0, + "z": -605.0, + "yaw": 0.0, + "pitch": 0.0 + } + }, + { + "location": { + "world": "world_nether", + "x": 160.0, + "y": 32.0, + "z": -585.0, + "yaw": 0.0, + "pitch": 0.0 + } + }, + { + "location": { + "world": "world_nether", + "x": 95.0, + "y": 40.0, + "z": -517.0, + "yaw": 0.0, + "pitch": 0.0 + } + }, + { + "location": { + "world": "world_nether", + "x": 47.0, + "y": 33.0, + "z": -522.0, + "yaw": 0.0, + "pitch": 0.0 + } + } + ], + "loot": [ + { + "type": "SNOW_BALL", + "amount": 4, + "data": 0, + "meta": { + "displayName": "§d§lSwitcher Ball", + "lore": [ + "§7Switch positions with an enemy", + "§7within 8 blocks of you!" + ] + } + }, + { + "type": "INK_SACK", + "amount": 2, + "data": 14, + "meta": { + "displayName": "§d§lPortable Bard", + "lore": [ + "§7Click and choose to receive 5 of", + "§7any right-clickable bard effect!" + ] + } + }, + { + "type": "STICK", + "amount": 3, + "data": 0, + "meta": { + "displayName": "§d§lAnti-Build Stick", + "lore": [ + "§7Hit a player 3 times with this item", + "§7to prevent all block interactions!" + ] + } + }, + { + "type": "RAW_FISH", + "amount": 3, + "data": 3, + "meta": { + "displayName": "§9§lDebuff", + "lore": [ + "§7Hit a player 3 times to double", + "§7debuff them for 20 seconds!" + ] + } + }, + { + "type": "SHEARS", + "amount": 1, + "data": 0, + "enchants": [ + { + "enchantment": "DURABILITY", + "level": 1 + } + ], + "meta": { + "displayName": "§3§lShark Bite", + "lore": [ + "§7Hit an opponent to deal a bleeding effect for 10 seconds" + ] + } + }, + { + "type": "WATCH", + "amount": 3, + "data": 0, + "enchants": [ + { + "enchantment": "DURABILITY", + "level": 1 + } + ], + "meta": { + "displayName": "§d§lPowerup", + "lore": [ + "§7Receive the following effects for 10 seconds:", + "§7- §bSpeed 2", + "§7- §cStrength 1", + "§7- §6Resistance 1", + "§7- §dRegeneration 1" + ] + } + }, + { + "type": "BOW", + "amount": 1, + "data": 0, + "enchants": [ + { + "enchantment": "ARROW_DAMAGE", + "level": 3 + }, + { + "enchantment": "ARROW_INFINITE", + "level": 1 + } + ], + "meta": { + "displayName": "§2§lBow", + "lore": [ + "§7Shoot an enemy and they will be", + "§7poisoned for 5 seconds!" + ] + } + }, + { + "type": "NETHER_STAR", + "amount": 2, + "data": 0, + "enchants": [ + { + "enchantment": "DURABILITY", + "level": 1 + } + ], + "meta": { + "displayName": "§c§lGift", + "lore": [ + "§7Right click to fully heal yourself", + "§7and receive 5 seconds of Strength II" + ] + } + }, + { + "type": "STICK", + "amount": 4, + "data": 0, + "enchants": [ + { + "enchantment": "DURABILITY", + "level": 1 + } + ], + "meta": { + "displayName": "§d§lSwitch Stick", + "lore": [ + "§7Rotates your opponent by 180 degrees" + ] + } + }, + { + "type": "GOLD_INGOT", + "amount": 4, + "data": 0, + "enchants": [ + { + "enchantment": "DURABILITY", + "level": 1 + } + ], + "meta": { + "displayName": "§6§lAnti-Bard", + "lore": [ + "§7Hit an opponent to prevent them from", + "§7receiving bard effects for 1 minute" + ] + } + }, + { + "type": "RAW_FISH", + "amount": 3, + "data": 2, + "enchants": [ + { + "enchantment": "DURABILITY", + "level": 1 + } + ], + "meta": { + "displayName": "§9§lScrambler", + "lore": [ + "§7Hit a player 3 times to", + "§7scramble their hotbar!" + ] + } + }, + { + "type": "DIAMOND_SWORD", + "amount": 1, + "data": 0, + "enchants": [ + { + "enchantment": "DAMAGE_ALL", + "level": 3 + }, + { + "enchantment": "FIRE_ASPECT", + "level": 2 + }, + { + "enchantment": "DURABILITY", + "level": 4 + } + ], + "meta": { + "displayName": "§5§lCitadel Sword", + "lore": [ + "§9Bubble I", + "§eRepair IV", + "§dGrinding V" + ] + } + }, + { + "type": "DIAMOND_HELMET", + "amount": 1, + "data": 0, + "enchants": [ + { + "enchantment": "PROTECTION_ENVIRONMENTAL", + "level": 3 + }, + { + "enchantment": "DURABILITY", + "level": 4 + } + ], + "meta": { + "displayName": "§5§lCitadel Helmet", + "lore": [ + "§eRepair IV", + "§3Saturation V", + "§9Water Breathing III" + ] + } + }, + { + "type": "DIAMOND_CHESTPLATE", + "amount": 1, + "data": 0, + "enchants": [ + { + "enchantment": "PROTECTION_ENVIRONMENTAL", + "level": 3 + }, + { + "enchantment": "DURABILITY", + "level": 4 + } + ], + "meta": { + "displayName": "§5§lCitadel Chestplate", + "lore": [ + "§eRepair IV", + "§cRecover I" + ] + } + }, + { + "type": "DIAMOND_LEGGINGS", + "amount": 1, + "data": 0, + "enchants": [ + { + "enchantment": "PROTECTION_ENVIRONMENTAL", + "level": 3 + }, + { + "enchantment": "DURABILITY", + "level": 4 + } + ], + "meta": { + "displayName": "§5§lCitadel Leggings", + "lore": [ + "§eRepair IV", + "§6Fire Resistance I" + ] + } + }, + { + "type": "DIAMOND_BOOTS", + "amount": 1, + "data": 0, + "enchants": [ + { + "enchantment": "PROTECTION_ENVIRONMENTAL", + "level": 3 + }, + { + "enchantment": "DURABILITY", + "level": 4 + }, + { + "enchantment": "PROTECTION_FALL", + "level": 4 + } + ], + "meta": { + "displayName": "§5§lCitadel Boots", + "lore": [ + "§bSpeed II", + "§eRepair IV" + ] + } + }, + { + "type": "INK_SACK", + "amount": 2, + "data": 10, + "enchants": [ + { + "enchantment": "DURABILITY", + "level": 1 + } + ], + "meta": { + "displayName": "§a§lArmory Key", + "lore": [ + "§7Right click a key chest to obtain rewards!" + ] + } + }, + { + "type": "INK_SACK", + "amount": 2, + "data": 11, + "enchants": [ + { + "enchantment": "DURABILITY", + "level": 1 + } + ], + "meta": { + "displayName": "§6§lWeaponry Key", + "lore": [ + "§7Right click a key chest to obtain rewards!" + ] + } + }, + { + "type": "INK_SACK", + "amount": 2, + "data": 9, + "enchants": [ + { + "enchantment": "DURABILITY", + "level": 1 + } + ], + "meta": { + "displayName": "§d§lAbility Key", + "lore": [ + "§7Right click a key chest to obtain rewards!" + ] + } + }, + { + "type": "INK_SACK", + "amount": 2, + "data": 1, + "enchants": [ + { + "enchantment": "DURABILITY", + "level": 1 + } + ], + "meta": { + "displayName": "§4§lCE Key", + "lore": [ + "§7Right click a key chest to obtain rewards!" + ] + } + } + ] +} \ No newline at end of file diff --git a/Configs + Precompiled/config/HCTeams/config.yml b/Configs + Precompiled/config/HCTeams/config.yml new file mode 100644 index 0000000..e0373b1 --- /dev/null +++ b/Configs + Precompiled/config/HCTeams/config.yml @@ -0,0 +1,260 @@ +Mongo: + Host: '0.0.0.0' + Pass: "" + DBName: 'Fasts' +serverName: Fasts +networkWebsite: cavepvp.org +statsRoot: cavepvp.org/stats +tab: + serverName: '&4&lFasts' + sectionColor: '&4' + infoColor: '&7' +nightmare: + enabled: true + worldName: "NightmareEvent" +glowstoneMountain: true +cavern: false +startingTimer: true +forceInvites: false +squads: false +idleCheck: false +uhcHealing: false +passiveTag: true +allowBoosting: false +waterPlacementInClaims: false +blockRemoval: false +rodPrevention: false +skybridgePrevention: false +reduceArmorDamage: true +blockEntitiesThroughPortals: true +archerTagColor: YELLOW +defaultRelationColor: RED +pvpClasses: + archer: true + bard: true + rogue: true + ranger: false +minerWorld: + regen: + COAL_ORE: 30 + IRON_ORE: 60 + GOLD_ORE: 90 + DIAMOND_ORE: 120 +potions: + REGEN: + splash: false + drinkables: false + SPEED: + splash: true + drinkables: true + FIRE_RESISTANCE: + splash: true + drinkables: true + POISON: + splash: true + drinkables: true + INSTANT_HEAL: + splash: true + drinkables: true + NIGHT_VISION: + splash: true + drinkables: true + WEAKNESS: + splash: false + drinkables: false + STRENGTH: + splash: false + drinkables: false + SLOWNESS: + splash: true + drinkables: true + INSTANT_DAMAGE: + splash: false + drinkables: false + WATER_BREATHING: + splash: true + drinkables: true + INVISIBILITY: + splash: true + drinkables: true +reclaims: + Iron: + priority: 14 + commands: + - cr givekey {player} Rare 3 + - pvp addlives {player} 10 + - sbc &4&lReclaim &8┃ &f{player} &7has reclaimed their &7&lIron Rank&7. + Gold: + priority: 13 + commands: + - cr givekey {player} Rare 5 + - pvp addlives {player} 20 + - sbc &4&lReclaim &8┃ &f{player} &7has reclaimed their &6&lGold Rank&7. + Diamond: + priority: 12 + commands: + - cr givekey {player} Legendary 4 + - cr givekey {player} Rare 8 + - pvp addlives {player} 30 + - sbc &4&lReclaim &8┃ &f{player} &7has reclaimed their &b&lDiamond Rank&7. + Emerald: + priority: 11 + commands: + - cr givekey {player} Legendary 5 + - cr givekey {player} Rare 10 + - pvp addlives {player} 45 + - sbc &4&lReclaim &8┃ &f{player} &7has reclaimed their &a&lEmerald Rank&7. + Pearl: + priority: 10 + commands: + - cr givekey {player} Legendary 6 + - cr givekey {player} Rare 12 + - pvp addlives {player} 60 + - sbc &4&lReclaim &8┃ &f{player} &7has reclaimed their &5&lPearl Rank&7. + Sapphire: + priority: 9 + commands: + - cr givekey {player} Legendary 7 + - cr givekey {player} Rare 14 + - pvp addlives {player} 70 + - sbc &4&lReclaim &8┃ &f{player} &7has reclaimed their &9&LSapphire Rank&7. + Platinum: + priority: 8 + commands: + - crates give {player} Seasonal 1 + - crates give {player} Reinforce 1 + - cr givekey {player} Legendary 10 + - cr givekey {player} Rare 15 + - pvp addlives {player} 80 + - sbc &4&lReclaim &8┃ &f{player} &7has reclaimed their &3&lPlatinum Rank&7. + Ravine: + priority: 7 + commands: + - airdrops give {player} 1 + - crates give {player} Seasonal 2 + - crates give {player} Reinforce 2 + - cr givekey {player} Legendary 10 + - cr givekey {player} Rare 20 + - pvp addlives {player} 100 + - sbc &4&lReclaim &8┃ &f{player} &7has reclaimed their &d&lRavine Rank&7. + Chat-Mod: + priority: 7 + commands: + - airdrops give {player} 1 + - crates give {player} Seasonal 2 + - crates give {player} Reinforce 2 + - cr givekey {player} Legendary 10 + - cr givekey {player} Rare 20 + - pvp addlives {player} 100 + - sbc &4&lReclaim &8┃ &f{player} &7has reclaimed their &d&lChat-Mod Rank&7. + YouTuber: + priority: 7 + commands: + - airdrops give {player} 1 + - crates give {player} Seasonal 2 + - crates give {player} Reinforce 2 + - cr givekey {player} Legendary 10 + - cr givekey {player} Rare 20 + - pvp addlives {player} 100 + - sbc &4&lReclaim &8┃ &f{player} &7has reclaimed their &c&lYou&f&lTube Rank&7. + Streamer: + priority: 7 + commands: + - airdrops give {player} 1 + - crates give {player} Seasonal 2 + - crates give {player} Reinforce 2 + - cr givekey {player} Legendary 10 + - cr givekey {player} Rare 20 + - pvp addlives {player} 100 + - sbc &4&lReclaim &8┃ &f{player} &7has reclaimed their &5&lStreamer Rank&7. + Famous: + priority: 6 + commands: + - airdrops give {player} 2 + - crates give {player} Seasonal 2 + - crates give {player} Reinforce 2 + - cr givekey {player} Legendary 10 + - cr givekey {player} Rare 20 + - pvp addlives {player} 100 + - sbc &4&lReclaim &8┃ &f{player} &7has reclaimed their &d&oFamous Rank&7. + Holiday: + priority: 5 + commands: + - airdrops give {player} 3 + - crates give {player} Seasonal 4 + - crates give {player} Reinforce 4 + - cr givekey {player} Seasonal 3 + - cr givekey {player} Cave 4 + - cr givekey {player} Legendary 12 + - cr givekey {player} Rare 24 + - pvp addlives {player} 150 + - sbc &4&lReclaim &8┃ &f{player} &7has reclaimed their &6&lSummer Rank&7. + Builder: + priority: 4 + commands: + - airdrops give {player} 3 + - crates give {player} Seasonal 3 + - crates give {player} Reinforce 3 + - cr givekey {player} Seasonal 3 + - cr givekey {player} Cave 3 + - cr givekey {player} Legendary 12 + - cr givekey {player} Rare 24 + - pvp addlives {player} 150 + - sbc &4&lReclaim &8┃ &f{player} &7has reclaimed their &2&lBuilder Rank&7. + Cave: + priority: 3 + commands: + - airdrops give {player} 5 + - crates give {player} Seasonal 5 + - crates give {player} Reinforce 5 + - cr givekey {player} Seasonal 5 + - cr givekey {player} Cave 5 + - cr givekey {player} Legendary 15 + - cr givekey {player} Rare 30 + - pvp addlives {player} 150 + - sbc &4&lReclaim &8┃ &f{player} &7has reclaimed their &4&lCave Rank&7. + Custom: + priority: 2 + commands: + - mcrate give {player} Seasonal 3 + - airdrops give {player} 12 + - crates give {player} Seasonal 12 + - crates give {player} Reinforce 12 + - cr givekey {player} Seasonal 24 + - cr givekey {player} Rare 48 + - addbasetokens {player} 1 + - addfallertokens {player} 1 + - pvp addlives {player} 150 + - sbc &4&lReclaim &8┃ &f{player} &7has reclaimed their &6&lCustom Rank&7. + Partner: + priority: 1 + commands: + - coin purchase {player} MANUAL 5000 PARTNER-RECLAIM 0.0 + - mcrate give {player} Seasonal 2 + - airdrops give {player} 5 + - crates give {player} Reinforce 5 + - crates give {player} Seasonal 5 + - cr givekey {player} Seasonal 5 + - cr givekey {player} {player} 15 + - pvp addlives {player} 150 + - sbc &4&lReclaim &8┃ &f{player} &7has reclaimed their &d&lPartner Rank&7. + Owner: + priority: 0 + commands: + - coin purchase {player} MANUAL 5000 PARTNER-RECLAIM 0.0 + - mcrate give {player} Seasonal 2 + - airdrops give {player} 5 + - crates give {player} Reinforce 5 + - crates give {player} Seasonal 5 + - cr givekey {player} Seasonal 5 + - cr givekey {player} {player} 15 + - pvp addlives {player} 150 + - sbc &4&lReclaim &8┃ &f{player} &7has reclaimed their &4&lOwner Rank&7. + VIP: + priority: 99 + commands: + - airdrop give {player} 5 + - crates give {player} Reinforce 5 + - crates give {player} Seasonal 5 + - crate givekey {player} Cave 10 + - sbc &4&lReclaim &8┃ &f{player} &7has redeemed their &e&lVIP Subscription &7perks. diff --git a/Configs + Precompiled/config/HCTeams/data/airdrops.yml b/Configs + Precompiled/config/HCTeams/data/airdrops.yml new file mode 100644 index 0000000..191994c --- /dev/null +++ b/Configs + Precompiled/config/HCTeams/data/airdrops.yml @@ -0,0 +1,368 @@ +rewards: + reward_1: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: BEDROCK + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §2§l$§a§l25 §9§lPAY§3§lPAL + enchants: + DURABILITY: 1000 + chance: 0.0 + command: none + giveItem: false + reward_2: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: BEDROCK + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §a§l14d Spring Rank + enchants: + DURABILITY: 1000 + chance: 0.0 + command: vouchers addrank {player} Holiday 14d {displayName} + giveItem: false + reward_3: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: BEDROCK + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §c§l7d §4§lCave §c§lRank + enchants: + DURABILITY: 1000 + chance: 0.0 + command: vouchers addrank {player} Cave 7d {displayName} + giveItem: false + reward_4: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: BEDROCK + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §2$§a5 Buycraft Voucher + enchants: + DURABILITY: 1000 + chance: 0.1 + command: vouchers addamount {player} 5 + giveItem: false + reward_5: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: BEDROCK + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §2$§a10 Store Voucher + enchants: + DURABILITY: 1000 + chance: 0.0 + command: vouchers addamount {player} 10 + giveItem: false + reward_6: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: BEDROCK + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §2$§a25 Store Voucher + enchants: + DURABILITY: 1000 + chance: 0.0 + command: vouchers addamount {player} 25 + giveItem: false + reward_7: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: BEDROCK + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §2$§a50 Store Voucher + enchants: + DURABILITY: 1000 + chance: 0.0 + command: vouchers addamount {player} 50 + giveItem: false + reward_8: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: BEDROCK + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §4§kiiii§2§l $§a§l100 Store Voucher §4§kiiii + enchants: + DURABILITY: 1000 + chance: 0.0 + command: vouchers addamount {player} 100 + giveItem: false + reward_9: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: BEDROCK + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §2$§a75 Store Voucher + enchants: + DURABILITY: 1000 + chance: 0.0 + command: vouchers addamount {player} 75 + giveItem: false + reward_10: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: DROPPER + amount: 2 + chance: 0.0 + command: airdrops give {player} 2 + giveItem: false + reward_11: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_HELMET + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §b§lAirdrop §7┃ §fHelmet + lore: + - §cHellForged III + - §cImplants V + - §cMermaid III + - §cRecover I + - §cFireResistance I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 4 + chance: 5.0 + command: none + giveItem: true + reward_12: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_CHESTPLATE + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §b§lAirdrop §7┃ §fChestplate + lore: + - §cHellForged III + - §cRecover I + - §cFireResistance I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 4 + chance: 5.0 + command: none + giveItem: true + reward_13: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_LEGGINGS + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §b§lAirdrop §7┃ §fLeggings + lore: + - §cHellForged III + - §cRecover I + - §cFireResistance I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 4 + chance: 5.0 + command: none + giveItem: true + reward_14: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_BOOTS + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §b§lAirdrop §7┃ §fBoots + lore: + - §cSpeed II + - §cHellForged III + - §cRecover I + - §cFireResistance I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 4 + PROTECTION_FALL: 4 + chance: 5.0 + command: none + giveItem: true + reward_15: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_SWORD + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §b§lAirdrop §7┃ §fSword + enchants: + DAMAGE_ALL: 2 + DURABILITY: 5 + LOOT_BONUS_MOBS: 5 + chance: 6.0 + command: none + giveItem: true + reward_16: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: BOW + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §b§lAirdrop §7┃ §fBow + enchants: + ARROW_DAMAGE: 5 + ARROW_FIRE: 1 + DURABILITY: 5 + ARROW_INFINITE: 1 + chance: 5.0 + command: none + giveItem: true + reward_17: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: GOLDEN_APPLE + damage: 1 + amount: 2 + chance: 1.0 + command: none + giveItem: true + reward_18: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: GOLDEN_APPLE + amount: 64 + chance: 6.0 + command: none + giveItem: true + reward_19: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_BLOCK + amount: 32 + chance: 8.0 + command: none + giveItem: true + reward_20: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: IRON_BLOCK + amount: 32 + chance: 8.0 + command: none + giveItem: true + reward_21: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: GOLD_BLOCK + amount: 32 + chance: 8.0 + command: none + giveItem: true + reward_22: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: EMERALD_BLOCK + amount: 32 + chance: 8.0 + command: none + giveItem: true + reward_23: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: EXPLOSIVE_MINECART + amount: 5 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §4§lTNT Minecart + lore: + - '' + - §6❙ §fRight Click to spawn a TNT Minecart + - §6❙ §c§l50 blocks §fabove your head! + - '' + - §fCan be found in an §b§lAirdrop§f! + chance: 5.0 + command: none + giveItem: true + reward_24: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: NETHER_STAR + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §b§lNinja Star + lore: + - '' + - §6❙ §fTeleport to the last person that + - §6❙ §fhit you within the last §e§l30 seconds§f! + - '' + - §fCan be found in an §b§lAirdrop§f! + chance: 5.0 + command: none + giveItem: true + reward_25: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: INK_SACK + damage: 14 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lPortable Bard + lore: + - '' + - §6❙ §fReceive §c§l5 §fportable bard effects! + - '' + - §fCan be found in an §b§lAirdrop§f! + chance: 5.0 + command: none + giveItem: true + reward_26: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: WATCH + amount: 5 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lTime Warp + lore: + - '' + - §6❙ §fTravel back to where + - §6❙ §fyou last threw a pearl! + - '' + - §fCan be found in an §b§lAirdrop§f! + chance: 5.0 + command: none + giveItem: true + reward_27: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: FISHING_ROD + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lGrapple + lore: + - §7Hook the block you'd like to + - §7move towards and then release to get sent! + - '' + - §fCan be found in an §b§lAir Drop§f! + chance: 5.0 + command: none + giveItem: true diff --git a/Configs + Precompiled/config/HCTeams/data/battle-pass-daily-challenges.json b/Configs + Precompiled/config/HCTeams/data/battle-pass-daily-challenges.json new file mode 100644 index 0000000..0c44829 --- /dev/null +++ b/Configs + Precompiled/config/HCTeams/data/battle-pass-daily-challenges.json @@ -0,0 +1 @@ +{"identifier":"bd46dc8a-07f5-4627-a0e0-8c6186f2bc7f","challenges":{"mine-glowstone-16":{"type":"net.frozenorb.foxtrot.gameplay.loot.battlepass.challenge.impl.MineBlockChallenge","properties":{"material":"GLOWSTONE","amount":16,"id":"mine-glowstone-16","name":"Mine 16 Glowstone","experience":5,"daily":true}},"kill-cows-30":{"type":"net.frozenorb.foxtrot.gameplay.loot.battlepass.challenge.impl.KillEntityChallenge","properties":{"entityType":"COW","kills":30,"id":"kill-cows-30","name":"Kill 30 Cows","experience":10,"daily":true}},"kill-endermen-10":{"type":"net.frozenorb.foxtrot.gameplay.loot.battlepass.challenge.impl.KillEntityChallenge","properties":{"entityType":"ENDERMAN","kills":10,"id":"kill-endermen-10","name":"Kill 10 Endermen","experience":5,"daily":true}},"kill-players-5":{"type":"net.frozenorb.foxtrot.gameplay.loot.battlepass.challenge.impl.KillEntityChallenge","properties":{"entityType":"PLAYER","kills":5,"id":"kill-players-5","name":"Kill 5 Players","experience":10,"daily":true}},"kill-creeper-10":{"type":"net.frozenorb.foxtrot.gameplay.loot.battlepass.challenge.impl.KillEntityChallenge","properties":{"entityType":"CREEPER","kills":10,"id":"kill-creeper-10","name":"Kill 10 Creepers","experience":5,"daily":true}},"kill-cows-15":{"type":"net.frozenorb.foxtrot.gameplay.loot.battlepass.challenge.impl.KillEntityChallenge","properties":{"entityType":"COW","kills":15,"id":"kill-cows-15","name":"Kill 15 Cows","experience":5,"daily":true}},"kill-players-3":{"type":"net.frozenorb.foxtrot.gameplay.loot.battlepass.challenge.impl.KillEntityChallenge","properties":{"entityType":"PLAYER","kills":3,"id":"kill-players-3","name":"Kill 3 Players","experience":5,"daily":true}},"mine-glowstone-32":{"type":"net.frozenorb.foxtrot.gameplay.loot.battlepass.challenge.impl.MineBlockChallenge","properties":{"material":"GLOWSTONE","amount":32,"id":"mine-glowstone-32","name":"Mine 32 Glowstone","experience":10,"daily":true}}},"expiresAt":1679086299054} \ No newline at end of file diff --git a/Configs + Precompiled/config/HCTeams/data/black-market.yml b/Configs + Precompiled/config/HCTeams/data/black-market.yml new file mode 100644 index 0000000..5c99ae4 --- /dev/null +++ b/Configs + Precompiled/config/HCTeams/data/black-market.yml @@ -0,0 +1,172 @@ +rewards: + reward_1: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: GOLD_INGOT + amount: 3 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §e§lSoul Stone + lore: + - §7Upon going below 2 hearts, you will be instantly + - §7healed and given Resistance III for 5 seconds. + - '' + - §fCan be found in the §6§lNew Years Mystery Box§f! + price: 20 + command: none + giveItem: true + maximumAmount: 20 + reward_2: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: INK_SACK + damage: 5 + amount: 3 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §5§lPower Stone + lore: + - §7Right Click to receive Strength 2, Resistance 3 + - §7Regeneration 3 for 10 seconds. Within those + - §710 seconds you may not use any sort of potions. + - '' + - §fCan be found in the §6§lNew Years Mystery Box§f! + price: 20 + command: none + giveItem: true + maximumAmount: 20 + reward_3: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: INK_SACK + damage: 14 + amount: 3 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §e§lMind Stone + lore: + - §7Hit a player to rotate their + - §7head 180 degrees and give them + - §7Blindness X, Slowness III and + - §7Nausea III for 8 seconds. + - '' + - §fCan be found in the §6§lNew Years Mystery Box§f! + price: 20 + command: none + giveItem: true + maximumAmount: 20 + reward_4: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: REDSTONE + amount: 3 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §c§lReality Stone + lore: + - §7Right Click to teleport to the player + - §7that YOU last hit within a 30 second period. + - '' + - §fCan be found in the §6§lNew Years Mystery Box§f! + price: 20 + command: none + giveItem: true + maximumAmount: 20 + reward_5: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: INK_SACK + damage: 4 + amount: 3 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §9§lSpace Stone + lore: + - §7Click to get launched + - §7forward and into the air! + - '' + - §fCan be found in the §6§lNew Years Mystery Box§f! + price: 20 + command: none + giveItem: true + maximumAmount: 20 + reward_6: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: INK_SACK + damage: 10 + amount: 3 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §a§lTime Stone + lore: + - §7Right Click to receive Strength 2 and Speed 3 + - §7for 10 seconds. After the effects are over you + - §7will be teleported back to your starting location. + - '' + - §fCan be found in the §6§lNew Years Mystery Box§f! + price: 20 + command: none + giveItem: true + maximumAmount: 20 + reward_7: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: STICK + amount: 3 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §b§lSwitch Stick + lore: + - §7Hit a player to turn their head 180 degrees. + - '' + - §fCan be found in the §5§lItems §fCrate! + price: 20 + command: none + giveItem: true + maximumAmount: 20 + reward_8: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: MONSTER_EGG + damage: 66 + amount: 3 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §5§lWitch Effect + lore: + - §7Spawn a witch that give you passive + - '§7bard effects: strength, regeneration,' + - §7and resistance. + - '' + - §fCan be found in the §5§lItems §fCrate! + price: 20 + command: none + giveItem: true + maximumAmount: 20 + reward_9: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: RED_ROSE + amount: 3 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §4§lCombo + lore: + - §7Get a second of strength II for the + - §7amount of hits dealt within 10 seconds. + - '' + - §fCan be found in the §5§lItems §fCrate! + price: 20 + command: none + giveItem: true + maximumAmount: 20 diff --git a/Configs + Precompiled/config/HCTeams/data/boosters.yml b/Configs + Precompiled/config/HCTeams/data/boosters.yml new file mode 100644 index 0000000..07a946c --- /dev/null +++ b/Configs + Precompiled/config/HCTeams/data/boosters.yml @@ -0,0 +1,57 @@ +boosterBalance: + d1a380c7-74b4-47d6-a7b5-339818da5a30: + Frenzy: 1 + d342cf11-aff3-4bbc-bef7-a597b2ba90c4: + Frenzy: 3 + c23e80e1-1ed1-3454-a8c0-19db489e361c: + Frenzy: 1 + f436a5a8-d088-4777-b11a-d20e10d48724: + Frenzy: 1 + dc1692e2-c9f0-4fdd-aa23-65dd609d69ff: + Frenzy: 1 + 4a163c5d-f616-4338-9dbf-074db545ab15: + Frenzy: 6 + 35140b3e-d043-4802-9d88-5c3a8638246d: + Frenzy: 3 + a51b9c88-004b-4882-a404-2bf2023d209c: + Frenzy: 2 + 1bb65a83-011a-4cbf-9c57-d07c35792c90: + Frenzy: 1 + d030d8d1-df50-4ed9-85e8-11300be2f8c6: + Frenzy: 4 + aafc8458-73ca-44ba-918d-755eb542a0d2: + Frenzy: 1 + 51916132-1ac0-4667-8e24-e487b7ad0dd3: + Frenzy: 12 + 13e8b4c4-3a11-496a-b795-151ad03fedfa: + Frenzy: 1 + 2a4c51af-3d63-404d-aac5-a3c601c3f46c: + Frenzy: 1 + f79e8218-6b86-49c0-9bab-9328ba5760f6: + Frenzy: 1 + f542c13a-13a9-4d9f-af8f-bc6a51996e56: + Frenzy: 1 + a30cdf80-fbfb-4b03-84a8-e9bbefe5d927: + Frenzy: 1 + 21b57d62-9fc9-4f40-9e50-d1bae837f7e9: + Frenzy: 1 + e1da5a84-d1e1-4f0a-b513-06494a200064: + Frenzy: 2 + ab1758f6-fa96-45ef-afa4-8b5a12707efa: + Frenzy: 2 + 207d1016-c40b-463b-bf66-a9867ee2ee35: + Frenzy: 1 + a75512f0-7af7-480a-ab8b-d7440f05b5bc: + Frenzy: 2 + 5addba73-689e-4ab5-94a5-56ed7aaaf91f: + Frenzy: 1 + 10fcd790-cb4f-4a1b-b780-522e24ae62c0: + Frenzy: 1 + c9cdcee7-f814-4b60-8b13-42e5a0827d91: + Frenzy: 2 + 6afc1942-d60c-4c23-a92b-767fcf6de194: + Frenzy: 1 + 547d52a3-157d-495b-8c31-f47d4aea6220: + Frenzy: 4 + c353fe06-5b90-4d5d-8e2b-802f19322050: + Frenzy: 2 diff --git a/Configs + Precompiled/config/HCTeams/data/carepackage.yml b/Configs + Precompiled/config/HCTeams/data/carepackage.yml new file mode 100644 index 0000000..018a574 --- /dev/null +++ b/Configs + Precompiled/config/HCTeams/data/carepackage.yml @@ -0,0 +1,495 @@ +items: + '1': + ==: org.bukkit.inventory.ItemStack + type: DROPPER + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §b§lAir Drop + lore: + - §7Obtainable at §fstore.cavepvp.org§7. + - '' + - §ePlace this down to designate a location for the drop! + '2': + ==: org.bukkit.inventory.ItemStack + type: BEACON + amount: 3 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lReinforce Lootbox + lore: + - §7Unlocked at §fstore.cavepvp.org + - '' + - §c§lEND REWARDS + - §8┃ §4§lLEGENDARY §4Cave §7Rank + - §8┃ §4§lLEGENDARY §6Santa §7Rank + - §8┃ §4§lLEGENDARY §dRavine §7Rank + - §8┃ §4§lLEGENDARY §2$§a50 §7Buycraft Voucher + - §8┃ §4§lLEGENDARY §2$§a25 §7Buycraft Voucher + - §8┃ §4§lLEGENDARY §ePremium Battle Pass + - §8┃ §5§lRARE §77d §e§lVIP §7Subscription + - §8┃ §5§lRARE §72x §c§lPerk §7Keys + - §8┃ §5§lRARE §2$§a10 §7Buycraft Voucher + - §8┃ §d§lUNCOMMON §73x §b§lAirdrops + - §8┃ §d§lUNCOMMON §7Permanent §6§l2022 §7Kit + - §8┃ §a§lCOMMON §75x §5§lItem §7Keys + - §8┃ §a§lCOMMON §75x §6§l2022 §7Keys + - §8┃ §a§lCOMMON §7Random Clickable Kit + - §8┃ §a§lCOMMON §56x §7End Portal Frames + - §8┃ §a§lCOMMON §616x §7God Apples + - §8┃ §a§lCOMMON §e64x §7Golden Apples + - '' + - §c§lREWARDS + - §8┃ §c§lRARE §cFire §7Sword + - §8┃ §d§lUNCOMMON §bDiamond §7Helmet + - §8┃ §d§lUNCOMMON §bDiamond §7Chestplate + - §8┃ §d§lUNCOMMON §bDiamond §7Leggings + - §8┃ §d§lUNCOMMON §bDiamond §7Boots + - §8┃ §d§lUNCOMMON §bDiamond §7Looting Sword + - §8┃ §a§lCOMMON §6Gold §7Helmet + - §8┃ §a§lCOMMON §6Gold §7Chestplate + - §8┃ §a§lCOMMON §6Gold §7Leggings + - §8┃ §a§lCOMMON §6Gold §7Boots + - §8┃ §a§lCOMMON §dLeather §7Helmet + - §8┃ §a§lCOMMON §dLeather §7Chestplate + - §8┃ §a§lCOMMON §dLeather §7Leggings + - §8┃ §a§lCOMMON §dLeather §7Boots + '3': + ==: org.bukkit.inventory.ItemStack + type: ENDER_CHEST + amount: 3 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §f§ki§6§l 2022 §e§lLootbox §f§ki + lore: + - §7Unlocked at §fstore.cavepvp.org + - '' + - §c§lEND REWARDS + - §8┃ §4§lLEGENDARY §4Cave §7Rank + - §8┃ §4§lLEGENDARY §62022 §7Rank + - §8┃ §4§lLEGENDARY §dRavine §7Rank + - §8┃ §4§lLEGENDARY §2$§a50 §7Buycraft Voucher + - §8┃ §4§lLEGENDARY §2$§a25 §7Buycraft Voucher + - §8┃ §4§lLEGENDARY §ePremium Battle Pass + - §8┃ §5§lRARE §77d §e§lVIP §7Subscription + - §8┃ §5§lRARE §72x §a§lPerk §7Keys + - §8┃ §5§lRARE §2$§a10 §7Buycraft Voucher + - §8┃ §d§lUNCOMMON §73x §b§lAirdrops + - §8┃ §d§lUNCOMMON §7Permanent §6§l2022 §7Kit + - §8┃ §a§lCOMMON §75x §5§lItem §7Keys + - §8┃ §a§lCOMMON §75x §6§l2022 §7Keys + - §8┃ §a§lCOMMON §7Random Clickable Kit + - '' + - §2§lREWARDS + - §8┃ §5§lRARE §62022 §7Bow + - §8┃ §5§lRARE §c1x §7Crowbar + - §8┃ §d§lUNCOMMON §52x §7End Portal Frames + - §8┃ §d§lUNCOMMON §6§l3x §7God Apple + - §8┃ §d§lUNCOMMON §d32x §7Ender Pearls + - §8┃ §d§lUNCOMMON §632x §7Golden Apple + - §8┃ §d§lUNCOMMON §62022 §7Sword + - §8┃ §d§lUNCOMMON §62022 §7Helmet + - §8┃ §d§lUNCOMMON §62022 §7Chestplate + - §8┃ §d§lUNCOMMON §62022 §7Leggings + - §8┃ §d§lUNCOMMON §62022 §7Boots + - §8┃ §d§lUNCOMMON §62022 §7Pickaxe + - §8┃ §a§lCOMMON §d64x §7Random Valuable Blocks + - §8┃ §a§lCOMMON §864x §7Gun Powder + - §8┃ §a§lCOMMON §e64x §7Glowstone Blocks + - §8┃ §a§lCOMMON §464x §7Nether Wart + - §8┃ §a§lCOMMON §c64x §7Glistering Melons + '4': + ==: org.bukkit.inventory.ItemStack + type: TRIPWIRE_HOOK + amount: 15 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §f§ki§6§l 2022 §e§lKey §f§ki + lore: + - '' + - §7Right click the §6§l2022 §e§lCrate §7to obtain rewards + '5': + ==: org.bukkit.inventory.ItemStack + type: TRIPWIRE_HOOK + amount: 15 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §5§lItems Key + lore: + - '' + - §7Right click the §5Items Crate §7to obtain rewards! + '6': + ==: org.bukkit.inventory.ItemStack + type: INK_SACK + damage: 1 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §4§lSimplyTrash Key + lore: + - '' + - §7Right click the §4SimplyTrash Crate §7to obtain rewards! + enchants: + DURABILITY: 1 + '7': + ==: org.bukkit.inventory.ItemStack + type: INK_SACK + damage: 4 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §9§lDrePvP Key + lore: + - '' + - §7Right click the §9DrePvP Crate §7to obtain rewards! + enchants: + DURABILITY: 1 + '8': + ==: org.bukkit.inventory.ItemStack + type: INK_SACK + damage: 10 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §a§lDylan Key + lore: + - '' + - §7Right click the §aDylan Crate §7to obtain rewards! + enchants: + DURABILITY: 1 + '9': + ==: org.bukkit.inventory.ItemStack + type: TRIPWIRE_HOOK + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §3§lHeaded Key + lore: + - §7Right click a §3Headed Crate §7to receive rewards! + enchants: + DURABILITY: 1 + '10': + ==: org.bukkit.inventory.ItemStack + type: INK_SACK + damage: 1 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §c§liMakeMcVids Key + lore: + - '' + - §7Right click the §ciMakeMcVids Crate §7to obtain rewards! + enchants: + DURABILITY: 1 + '11': + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_SWORD + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §c§l§nCarepackage§7 Sword + enchants: + DAMAGE_ALL: 2 + DAMAGE_UNDEAD: 4 + DURABILITY: 4 + DAMAGE_ARTHROPODS: 5 + LOOT_BONUS_MOBS: 4 + '12': + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_HELMET + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §c§l§nCarepackage§7 Helmet + lore: + - §cHellForged IV + - §cImplants V + - §cMermaid III + - §cRecover I + - §cFireResistance I + - §cGreed I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 4 + PROTECTION_EXPLOSIONS: 4 + '13': + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_CHESTPLATE + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §c§l§nCarepackage§7 Chestplate + lore: + - §cHellForged IV + - §cRecover I + - §cFireResistance I + - §cFury I + - §cSwift I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 4 + PROTECTION_EXPLOSIONS: 4 + '14': + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_LEGGINGS + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §c§l§nCarepackage§7 Leggings + lore: + - §cHellForged IV + - §cRecover I + - §cFireResistance I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 4 + PROTECTION_EXPLOSIONS: 4 + '15': + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_BOOTS + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §c§l§nCarepackage§7 Boots + lore: + - §cSpeed II + - §cHellForged IV + - §cRecover I + - §cFireResistance I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 4 + PROTECTION_FALL: 4 + PROTECTION_EXPLOSIONS: 4 + '16': + ==: org.bukkit.inventory.ItemStack + type: BOOK + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §4§lEnchant Book + lore: + - '§4§l┃ §fEnchant: §cGlowing IV' + - '§4§l┃ §fApplicable to: §cHelmet, Chestplate, Leggings, Boots' + - '§4§l┃ §fLevel: §c§a§lCommon' + - '' + - §cDouble Click this book on the armor you want to put it on! + '17': + ==: org.bukkit.inventory.ItemStack + type: BOOK + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §4§lEnchant Book + lore: + - '§4§l┃ §fEnchant: §cFireResistance I' + - '§4§l┃ §fApplicable to: §cHelmet, Chestplate, Leggings, Boots' + - '§4§l┃ §fLevel: §c§a§lCommon' + - '' + - §cDouble Click this book on the armor you want to put it on! + '18': + ==: org.bukkit.inventory.ItemStack + type: BOOK + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §4§lEnchant Book + lore: + - '§4§l┃ §fEnchant: §cMermaid III' + - '§4§l┃ §fApplicable to: §cHelmet' + - '§4§l┃ §fLevel: §c§a§lCommon' + - '' + - §cDouble Click this book on the armor you want to put it on! + '19': + ==: org.bukkit.inventory.ItemStack + type: BOOK + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §4§lEnchant Book + lore: + - '§4§l┃ §fEnchant: §cImplants V' + - '§4§l┃ §fApplicable to: §cHelmet, Chestplate, Leggings, Boots' + - '§4§l┃ §fLevel: §c§5§lRare' + - '' + - §cDouble Click this book on the armor you want to put it on! + '20': + ==: org.bukkit.inventory.ItemStack + type: BOOK + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §4§lEnchant Book + lore: + - '§4§l┃ §fEnchant: §cHellForged IV' + - '§4§l┃ §fApplicable to: §cHelmet, Chestplate, Leggings, Boots' + - '§4§l┃ §fLevel: §c§5§lRare' + - '' + - §cDouble Click this book on the armor you want to put it on! + '21': + ==: org.bukkit.inventory.ItemStack + type: BOOK + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §4§lEnchant Book + lore: + - '§4§l┃ §fEnchant: §cSpeed II' + - '§4§l┃ §fApplicable to: §cBoots' + - '§4§l┃ §fLevel: §c§5§lRare' + - '' + - §cDouble Click this book on the armor you want to put it on! + '22': + ==: org.bukkit.inventory.ItemStack + type: BOOK + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §4§lEnchant Book + lore: + - '§4§l┃ §fEnchant: §cFury I' + - '§4§l┃ §fApplicable to: §cHelmet, Chestplate, Leggings, Boots' + - '§4§l┃ §fLevel: §c§6§lLegendary' + - '' + - §cDouble Click this book on the armor you want to put it on! + '23': + ==: org.bukkit.inventory.ItemStack + type: BOOK + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §4§lEnchant Book + lore: + - '§4§l┃ §fEnchant: §cInvisibility I' + - '§4§l┃ §fApplicable to: §cChestplate' + - '§4§l┃ §fLevel: §c§6§lLegendary' + - '' + - §cDouble Click this book on the armor you want to put it on! + '24': + ==: org.bukkit.inventory.ItemStack + type: BOOK + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §4§lEnchant Book + lore: + - '§4§l┃ §fEnchant: §cGreed I' + - '§4§l┃ §fApplicable to: §cHelmet, Chestplate, Leggings, Boots' + - '§4§l┃ §fLevel: §c§6§lLegendary' + - '' + - §cDouble Click this book on the armor you want to put it on! + '25': + ==: org.bukkit.inventory.ItemStack + type: BOOK + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §4§lEnchant Book + lore: + - '§4§l┃ §fEnchant: §cFarmer I' + - '§4§l┃ §fApplicable to: §cHelmet, Chestplate, Leggings, Boots' + - '§4§l┃ §fLevel: §c§d§lMythical' + - '' + - §cDouble Click this book on the armor you want to put it on! + '26': + ==: org.bukkit.inventory.ItemStack + type: BOOK + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §4§lEnchant Book + lore: + - '§4§l┃ §fEnchant: §cSwift I' + - '§4§l┃ §fApplicable to: §cHelmet, Chestplate, Leggings, Boots' + - '§4§l┃ §fLevel: §c§d§lMythical' + - '' + - §cDouble Click this book on the armor you want to put it on! + '27': + ==: org.bukkit.inventory.ItemStack + type: BOOK + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §4§lEnchant Book + lore: + - '§4§l┃ §fEnchant: §cResistor I' + - '§4§l┃ §fApplicable to: §cHelmet, Chestplate, Leggings, Boots' + - '§4§l┃ §fLevel: §c§d§lMythical' + - '' + - §cDouble Click this book on the armor you want to put it on! + '28': + ==: org.bukkit.inventory.ItemStack + type: BOOK + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lClickable Kit + lore: + - §7Right Click to use the §fRavine §7kit. + '29': + ==: org.bukkit.inventory.ItemStack + type: BOOK + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lClickable Kit + lore: + - §7Right Click to use the §fUltimateArcher §7kit. + '30': + ==: org.bukkit.inventory.ItemStack + type: BOOK + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lClickable Kit + lore: + - §7Right Click to use the §fiMake §7kit. + '31': + ==: org.bukkit.inventory.ItemStack + type: BOOK + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lClickable Kit + lore: + - §7Right Click to use the §fDiamond §7kit. + '32': + ==: org.bukkit.inventory.ItemStack + type: BOOK + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lClickable Kit + lore: + - §7Right Click to use the §fBard §7kit. + '33': + ==: org.bukkit.inventory.ItemStack + type: BOOK + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lClickable Kit + lore: + - §7Right Click to use the §fDylan §7kit. + '34': + ==: org.bukkit.inventory.ItemStack + type: BOOK + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lClickable Kit + lore: + - §7Right Click to use the §fArcher §7kit. + '35': + ==: org.bukkit.inventory.ItemStack + type: BOOK + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lClickable Kit + lore: + - §7Right Click to use the §fUltimateMiner §7kit. diff --git a/Configs + Precompiled/config/HCTeams/data/cavenite.yml b/Configs + Precompiled/config/HCTeams/data/cavenite.yml new file mode 100644 index 0000000..e69de29 diff --git a/Configs + Precompiled/config/HCTeams/data/crates/Dylan.yml b/Configs + Precompiled/config/HCTeams/data/crates/Dylan.yml new file mode 100644 index 0000000..b2c0778 --- /dev/null +++ b/Configs + Precompiled/config/HCTeams/data/crates/Dylan.yml @@ -0,0 +1,381 @@ +id: Dylan +displayName: §a§lDylan Lootbox +material: ENDER_CHEST +fireworkColor: 16711680 +lore: +- §7Unlocked at §fstore.cavepvp.org +- '' +- §2§lEND REWARDS §7(1 item) +- §8• §4§lLEGENDARY §4Cave §7Rank +- §8• §4§lLEGENDARY §cCupid §7Rank +- §8• §4§lLEGENDARY §2$§a25 §7Buycraft Voucher +- §8• §4§lLEGENDARY §2$§a5 §7Buycraft Voucher +- §8• §4§lLEGENDARY §ePremium Battle Pass +- §8• §c§lRARE §73x §c§lCupid Mystery Box +- §8• §c§lRARE §75x §b§lAirdrops +- §8• §d§lUNCOMMON §730-day §a§lDylan §7Kit +- §8• §d§lUNCOMMON §710x §a§lDylan §7Keys +- §8• §a§lCOMMON §a§lDylan §7Clickable Kit +- '' +- §2§lREWARDS §7(9 items) +- §8• §c§lRARE §61x §7Crowbar +- §8• §c§lRARE §61x §7Random Spawner +- §8• §c§lRARE §54x §7End Portal Frames +- §8• §d§lUNCOMMON §65x §7God Apples +- §8• §d§lUNCOMMON §d32x §7Ender Pearls +- §8• §d§lUNCOMMON §664x §7Golden Apples +- §8• §d§lUNCOMMON §aDylan §7Fire Sword +- §8• §d§lUNCOMMON §aDylan §7Helmet +- §8• §d§lUNCOMMON §aDylan §7Chestplate +- §8• §d§lUNCOMMON §aDylan §7Leggings +- §8• §d§lUNCOMMON §aDylan §7Boots +- §8• §d§lUNCOMMON §aDylan §7Pickaxe +- §8• §a§lCOMMON §a64x §7Emerald Blocks +- §8• §a§lCOMMON §b64x §7Diamond Blocks +- §8• §a§lCOMMON §664x §7Gold Blocks +- §8• §a§lCOMMON §7§l64x §7Iron Blocks +- §8• §a§lCOMMON §8§l64x §7Gun Powder +- §8• §a§lCOMMON §e§l64x §7Glowstone Blocks +- §8• §a§lCOMMON §c§l64x §7Glistering Melons +- §8• §a§lCOMMON §c§l64x §7Nether Wart +items: + DIAMOND_BLOCK_1: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_BLOCK + amount: 64 + chance: 10.0 + giveItem: true + broadcast: false + EMERALD_BLOCK_2: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: EMERALD_BLOCK + amount: 64 + chance: 10.0 + giveItem: true + broadcast: false + GOLD_BLOCK_3: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: GOLD_BLOCK + amount: 64 + chance: 10.0 + giveItem: true + broadcast: false + IRON_BLOCK_4: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: IRON_BLOCK + amount: 64 + chance: 10.0 + giveItem: true + broadcast: false + DIAMOND_HELMET_5: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_HELMET + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §a§lDylan §7┃ §fHelmet + lore: + - §cHellForged IV + - §cImplants V + - §cMermaid III + - §cRecover I + - §cFireResistance I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 5 + PROTECTION_EXPLOSIONS: 5 + chance: 8.0 + giveItem: true + broadcast: false + DIAMOND_CHESTPLATE_6: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_CHESTPLATE + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §a§lDylan §7┃ §fChestplate + lore: + - §cHellForged IV + - §cImplants V + - §cMermaid III + - §cRecover I + - §cFireResistance I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 5 + PROTECTION_EXPLOSIONS: 5 + chance: 8.0 + giveItem: true + broadcast: false + DIAMOND_LEGGINGS_7: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_LEGGINGS + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §a§lDylan §7┃ §fLeggings + lore: + - §cHellForged IV + - §cImplants V + - §cMermaid III + - §cRecover I + - §cFireResistance I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 5 + PROTECTION_EXPLOSIONS: 5 + chance: 8.0 + giveItem: true + broadcast: false + DIAMOND_BOOTS_8: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_BOOTS + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §a§lDylan §7┃ §fBoots + lore: + - §cHellForged IV + - §cImplants V + - §cMermaid III + - §cRecover I + - §cFireResistance I + - §cSpeed II + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 5 + PROTECTION_FALL: 4 + chance: 8.0 + giveItem: true + broadcast: false + DIAMOND_PICKAXE_9: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_PICKAXE + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §a§lDylan §7┃ §fPickaxe + enchants: + DIG_SPEED: 6 + DURABILITY: 3 + LOOT_BONUS_BLOCKS: 3 + chance: 9.0 + giveItem: true + broadcast: false + GOLDEN_APPLE_10: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: GOLDEN_APPLE + damage: 1 + amount: 5 + chance: 2.0 + giveItem: true + broadcast: false + GOLDEN_APPLE_11: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: GOLDEN_APPLE + amount: 64 + chance: 4.0 + giveItem: true + broadcast: false + ENDER_PEARL_12: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: ENDER_PEARL + amount: 32 + chance: 4.0 + giveItem: true + broadcast: false + DIAMOND_SWORD_13: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_SWORD + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §a§lDylan §7┃ §fSword + enchants: + DAMAGE_ALL: 2 + DURABILITY: 5 + FIRE_ASPECT: 2 + chance: 7.0 + giveItem: true + broadcast: false + DIAMOND_HOE_14: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_HOE + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §cCrowbar + lore: + - '' + - '§7Can Break:' + - '§f - §bEnd Portals: §e{§96§e}' + - '§f - §bSpawners: §e{§91§e}' + chance: 3.0 + giveItem: true + broadcast: false + ENDER_PORTAL_FRAME_15: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: ENDER_PORTAL_FRAME + amount: 2 + chance: 3.0 + giveItem: true + broadcast: false + SULPHUR_16: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: SULPHUR + amount: 32 + chance: 0.0 + giveItem: true + broadcast: false + GLOWSTONE_DUST_17: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: GLOWSTONE_DUST + amount: 32 + chance: 0.0 + giveItem: true + broadcast: false + NETHER_STALK_18: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: NETHER_STALK + amount: 32 + chance: 15.0 + giveItem: true + broadcast: false + SPECKLED_MELON_19: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: SPECKLED_MELON + amount: 32 + chance: 15.0 + giveItem: true + broadcast: false + BEDROCK_20: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: BEDROCK + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §2$§a5 Buycraft Voucher + enchants: + DURABILITY: 1000 + chance: 0.2 + command: vouchers addamount {player} 5 + giveItem: false + broadcast: true + BEDROCK_21: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: BEDROCK + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §2$§a25 Buycraft Voucher + enchants: + DURABILITY: 1000 + chance: 0.001 + command: vouchers addamount {player} 25 + giveItem: false + broadcast: true + BEDROCK_22: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: BEDROCK + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §a§l30-day Dylan Kit + enchants: + DURABILITY: 1000 + chance: 0.05 + command: vouchers addrank {player} Dylan-Kit 30d {displayName} + giveItem: false + broadcast: true + BEDROCK_23: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: BEDROCK + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §4§l7-day Cave Rank + enchants: + DURABILITY: 1000 + chance: 0.1 + command: vouchers addrank {player} Cave 7d {displayName} + giveItem: false + broadcast: true + BEDROCK_24: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: BEDROCK + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §4§l14-day Cupid Rank + enchants: + DURABILITY: 1000 + chance: 0.1 + command: vouchers addrank {player} Holiday 14d {displayName} + giveItem: false + broadcast: true + DROPPER_25: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: DROPPER + amount: 3 + chance: 2.0 + command: airdrops give {player} 3 + giveItem: false + broadcast: true + BEDROCK_26: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: BEDROCK + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §e§lPremium Battle Pass + enchants: + DURABILITY: 1000 + chance: 0.0 + command: bp setpremium {name} + giveItem: false + broadcast: true + INK_SACK_27: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: INK_SACK + damage: 1 + amount: 5 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §a§lDylan Key + lore: + - '' + - §7Right click the §aDylan Crate §7to obtain rewards! + enchants: + DURABILITY: 1 + chance: 8.0 + command: cr givekey {player} Dylan 3 + giveItem: false + broadcast: false diff --git a/Configs + Precompiled/config/HCTeams/data/crates/Reinforce.yml b/Configs + Precompiled/config/HCTeams/data/crates/Reinforce.yml new file mode 100644 index 0000000..623318a --- /dev/null +++ b/Configs + Precompiled/config/HCTeams/data/crates/Reinforce.yml @@ -0,0 +1,47 @@ +id: Reinforce +displayName: §6§lReinforce Lootbox +material: BEACON +fireworkColor: 16711680 +lore: +- §7Unlocked at §fstore.cavepvp.org +- '' +- §c§lEND REWARDS +- §8┃ §4§lLEGENDARY §4Cave §7Rank +- §8┃ §4§lLEGENDARY §aSpring §7Rank +- §8┃ §4§lLEGENDARY §dRavine §7Rank +- §8┃ §4§lLEGENDARY §2$§a50 §7Buycraft Voucher +- §8┃ §4§lLEGENDARY §2$§a25 §7Buycraft Voucher +- §8┃ §4§lLEGENDARY §ePremium Battle Pass +- §8┃ §5§lRARE §77d §e§lVIP §7Subscription +- §8┃ §5§lRARE §72x §c§lPerk §7Keys +- §8┃ §5§lRARE §2$§a10 §7Buycraft Voucher +- §8┃ §d§lUNCOMMON §73x §b§lAirdrops +- §8┃ §a§lCOMMON §7Random Clickable Kit +- §8┃ §a§lCOMMON §56x §7End Portal Frames +- §8┃ §a§lCOMMON §616x §7God Apples +- §8┃ §a§lCOMMON §e64x §7Golden Apples +- '' +- §c§lREWARDS +- §8┃ §c§lRARE §cFire §7Sword +- §8┃ §d§lUNCOMMON §bDiamond §7Helmet +- §8┃ §d§lUNCOMMON §bDiamond §7Chestplate +- §8┃ §d§lUNCOMMON §bDiamond §7Leggings +- §8┃ §d§lUNCOMMON §bDiamond §7Boots +- §8┃ §d§lUNCOMMON §bDiamond §7Looting Sword +- §8┃ §a§lCOMMON §6Gold §7Helmet +- §8┃ §a§lCOMMON §6Gold §7Chestplate +- §8┃ §a§lCOMMON §6Gold §7Leggings +- §8┃ §a§lCOMMON §6Gold §7Boots +- §8┃ §a§lCOMMON §dLeather §7Helmet +- §8┃ §a§lCOMMON §dLeather §7Chestplate +- §8┃ §a§lCOMMON §dLeather §7Leggings +- §8┃ §a§lCOMMON §dLeather §7Boots +items: + GOLDEN_APPLE_1: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: GOLDEN_APPLE + amount: 16 + chance: 6.0 + giveItem: true + broadcast: false diff --git a/Configs + Precompiled/config/HCTeams/data/crates/Seasonal.yml b/Configs + Precompiled/config/HCTeams/data/crates/Seasonal.yml new file mode 100644 index 0000000..f4c6254 --- /dev/null +++ b/Configs + Precompiled/config/HCTeams/data/crates/Seasonal.yml @@ -0,0 +1,281 @@ +id: Seasonal +displayName: §e§ki§6§l Fall Lootbox §e§ki +material: ENDER_CHEST +fireworkColor: 16711680 +lore: +- §7Unlocked at §fstore.cavepvp.org +- '' +- §6§lFINAL REWARDS +- ' &7➡ §4Cave Rank' +- ' &7➡ §6Spooky Rank' +- ' &7➡ §6Premium Battle Pass' +- ' &7➡ §e§lVIP Subscription' +- ' &7➡ §6§lHalloween Kit' +- ' &7➡ §2$§a10 Buycraft Voucher' +- ' &7➡ §2$§a5 Buycraft Voucher' +- ' &7➡ §a§l2x Perk Keys' +- ' &7➡ §b§l3x Airdrops' +- ' &7➡ §6§l5x Halloween Keys' +- ' &7➡ §cRandom Clickable Kit' +- '' +- §6§lNORMAL REWARDS +- ' &7➡ §d16x Eggports' +- ' &7➡ §68x Anti-Blockup' +- ' &7➡ §a8x Med Kit' +- ' &7➡ §68x Midas Touch' +- ' &7➡ §cCrowbar' +- ' &7➡ §6§lGod Apple' +- ' &7➡ §632x Golden Apple' +- ' &7➡ §4OP Bow' +- ' &7➡ §bDiamond Sword' +- ' &7➡ §bDiamond Helmet' +- ' &7➡ §bDiamond Chestplate' +- ' &7➡ §bDiamond Leggings' +- ' &7➡ §bDiamond Boots' +- ' &7➡ §bDiamond Pickaxe' +- ' &7➡ §d16x Random Valuable Blocks' +- ' &7➡ §832x Gun Powder' +- ' &7➡ §e32x Glowstone Blocks' +- ' &7➡ §432x Nether Wart' +- ' &7➡ §c32x Glistering Melons' +items: + DIAMOND_BLOCK_1: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_BLOCK + amount: 16 + chance: 10.0 + giveItem: true + broadcast: false + EMERALD_BLOCK_2: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: EMERALD_BLOCK + amount: 16 + chance: 10.0 + giveItem: true + broadcast: false + GOLD_BLOCK_3: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: GOLD_BLOCK + amount: 16 + chance: 10.0 + giveItem: true + broadcast: false + IRON_BLOCK_4: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: IRON_BLOCK + amount: 16 + chance: 10.0 + giveItem: true + broadcast: false + SPECKLED_MELON_5: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: SPECKLED_MELON + amount: 32 + chance: 10.0 + giveItem: true + broadcast: false + NETHER_STALK_6: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: NETHER_STALK + amount: 32 + chance: 10.0 + giveItem: true + broadcast: false + GLOWSTONE_DUST_7: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: GLOWSTONE_DUST + amount: 32 + chance: 5.0 + giveItem: true + broadcast: false + SULPHUR_8: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: SULPHUR + amount: 32 + chance: 5.0 + giveItem: true + broadcast: false + DIAMOND_HELMET_9: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_HELMET + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lFall §7┃ §fHelmet + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 5 + chance: 7.0 + giveItem: true + broadcast: false + DIAMOND_CHESTPLATE_10: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_CHESTPLATE + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lFall §7┃ §fChestplate + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 5 + chance: 7.0 + giveItem: true + broadcast: false + DIAMOND_LEGGINGS_11: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_LEGGINGS + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lFall §7┃ §fLeggings + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 5 + chance: 7.0 + giveItem: true + broadcast: false + DIAMOND_BOOTS_12: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_BOOTS + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lFall §7┃ §fBoots + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 5 + PROTECTION_FALL: 4 + chance: 7.0 + giveItem: true + broadcast: false + DIAMOND_SWORD_13: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_SWORD + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lFall §7┃ §fSword + enchants: + DAMAGE_ALL: 2 + DURABILITY: 5 + chance: 7.0 + giveItem: true + broadcast: false + BOW_14: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: BOW + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lFall §7┃ §fBow + enchants: + ARROW_DAMAGE: 5 + DURABILITY: 5 + ARROW_FIRE: 1 + ARROW_INFINITE: 1 + chance: 7.0 + giveItem: true + broadcast: false + ENDER_PEARL_15: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: ENDER_PEARL + amount: 16 + chance: 5.0 + giveItem: true + broadcast: false + GOLDEN_APPLE_16: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: GOLDEN_APPLE + damage: 1 + chance: 1.0 + giveItem: true + broadcast: false + GOLDEN_APPLE_17: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: GOLDEN_APPLE + amount: 32 + chance: 4.0 + giveItem: true + broadcast: false + BEDROCK_18: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: BEDROCK + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §4§l14-day Cave Rank + enchants: + DURABILITY: 1000 + chance: 0.0 + command: vouchers addrank {player} Cave 14d {displayName} + giveItem: false + broadcast: false + BEDROCK_19: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: BEDROCK + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §2$§a10 Buycraft Voucher + enchants: + DURABILITY: 1000 + chance: 0.0 + command: vouchers addamount {player} 10 + giveItem: false + broadcast: true + APPLE_20: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: APPLE + amount: 5 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lHalloween Candy + lore: + - '' + - §6❙ §fRight Click to receive Strength II, + - §6❙ §fRegeneration II, and Resistance III + - §6❙ §ffor §e§l8 seconds§f! + - '' + - §fCan be found in the §e§ki§6§lHalloween Lootbox§e§ki§f! + chance: 5.0 + giveItem: true + broadcast: false + STICK_21: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: STICK + amount: 5 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §5§lBroom Stick + lore: + - '' + - §6❙ §fRight Click to receive Speed III, + - §6❙ §fJump Boost VI for §e§l10 seconds§f! + - '' + - §fCan be found in the §e§ki§6§lHalloween Lootbox§e§ki§f! + chance: 5.0 + giveItem: true + broadcast: false diff --git a/Configs + Precompiled/config/HCTeams/data/crates/iMakeMcVids.yml b/Configs + Precompiled/config/HCTeams/data/crates/iMakeMcVids.yml new file mode 100644 index 0000000..fb59944 --- /dev/null +++ b/Configs + Precompiled/config/HCTeams/data/crates/iMakeMcVids.yml @@ -0,0 +1,356 @@ +id: iMakeMcVids +displayName: §c§liMakeMcVids Lootbox +material: ENDER_CHEST +fireworkColor: 16711680 +lore: +- §7Unlocked at §fstore.cavepvp.org +- '' +- §c§lFINAL REWARDS +- ' &7➡ §4Cave Rank' +- ' &7➡ §2$§a10 Buycraft Voucher' +- ' &7➡ §6Premium Battle Pass' +- ' &7➡ §b3x Airdrops' +- ' &7➡ §ciMakeMcVids Kit' +- ' &7➡ §c5x iMakeMcVids Keys' +- ' &7➡ §ciMakeMcVids Clickable Kit' +- '' +- §c§lNORMAL REWARDS +- ' &7➡ §35x Invisibility' +- ' &7➡ §45x TNT Minecart' +- ' &7➡ §65x Debuff Fish' +- ' &7➡ §c5x Anti-Pearl' +- ' &7➡ §c1x Crowbar' +- ' &7➡ §62x God Apples' +- ' &7➡ §d16x Ender Pearls' +- ' &7➡ §632x Golden Apples' +- ' &7➡ §bDiamond Sword' +- ' &7➡ §bDiamond Helmet' +- ' &7➡ §bDiamond Chestplate' +- ' &7➡ §bDiamond Leggings' +- ' &7➡ §bDiamond Boots' +- ' &7➡ §bDiamond Pickaxe' +- ' &7➡ §a16x Emerald Blocks' +- ' &7➡ §b16x Diamond Blocks' +- ' &7➡ §616x Gold Blocks' +- ' &7➡ §716x Iron Blocks' +- ' &7➡ §832x Gun Powder' +- ' &7➡ §e32x Glowstone Blocks' +- ' &7➡ §432x Nether Wart' +- ' &7➡ §c32x Glistering Melons' +items: + DIAMOND_BLOCK_1: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_BLOCK + amount: 16 + chance: 10.0 + giveItem: true + broadcast: false + EMERALD_BLOCK_2: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: EMERALD_BLOCK + amount: 16 + chance: 10.0 + giveItem: true + broadcast: false + GOLD_BLOCK_3: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: GOLD_BLOCK + amount: 16 + chance: 10.0 + giveItem: true + broadcast: false + IRON_BLOCK_4: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: IRON_BLOCK + amount: 16 + chance: 10.0 + giveItem: true + broadcast: false + DIAMOND_HELMET_5: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_HELMET + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §c§liMakeMcVids §7┃ §fHelmet + lore: + - §cHellForged IV + - §cImplants V + - §cMermaid III + - §cRecover I + - §cFireResistance I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 5 + PROTECTION_EXPLOSIONS: 5 + chance: 7.0 + giveItem: true + broadcast: false + DIAMOND_CHESTPLATE_6: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_CHESTPLATE + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §c§liMakeMcVids §7┃ §fChestplate + lore: + - §cHellForged IV + - §cImplants V + - §cMermaid III + - §cRecover I + - §cFireResistance I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 5 + PROTECTION_EXPLOSIONS: 5 + chance: 7.0 + giveItem: true + broadcast: false + DIAMOND_LEGGINGS_7: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_LEGGINGS + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §c§liMakeMcVids §7┃ §fLeggings + lore: + - §cHellForged IV + - §cImplants V + - §cMermaid III + - §cRecover I + - §cFireResistance I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 5 + PROTECTION_EXPLOSIONS: 5 + chance: 7.0 + giveItem: true + broadcast: false + DIAMOND_BOOTS_8: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_BOOTS + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §c§liMakeMcVids §7┃ §fBoots + lore: + - §cHellForged IV + - §cImplants V + - §cMermaid III + - §cRecover I + - §cFireResistance I + - §cSpeed II + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 5 + PROTECTION_FALL: 4 + chance: 7.0 + giveItem: true + broadcast: false + DIAMOND_PICKAXE_9: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_PICKAXE + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §c§liMakeMcVids §7┃ §fPickaxe + enchants: + DIG_SPEED: 6 + DURABILITY: 3 + LOOT_BONUS_BLOCKS: 3 + chance: 7.0 + giveItem: true + broadcast: false + GOLDEN_APPLE_10: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: GOLDEN_APPLE + damage: 1 + amount: 2 + chance: 2.0 + giveItem: true + broadcast: false + GOLDEN_APPLE_11: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: GOLDEN_APPLE + amount: 32 + chance: 4.0 + giveItem: true + broadcast: false + ENDER_PEARL_12: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: ENDER_PEARL + amount: 16 + chance: 4.0 + giveItem: true + broadcast: false + DIAMOND_SWORD_13: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_SWORD + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §c§liMakeMcVids §7┃ §fSword + enchants: + DAMAGE_ALL: 2 + DURABILITY: 5 + FIRE_ASPECT: 2 + chance: 7.0 + giveItem: true + broadcast: false + DIAMOND_HOE_14: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_HOE + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §cCrowbar + lore: + - '' + - '§7Can Break:' + - '§f - §bEnd Portals: §e{§96§e}' + - '§f - §bSpawners: §e{§91§e}' + chance: 3.0 + giveItem: true + broadcast: false + SULPHUR_15: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: SULPHUR + amount: 32 + chance: 5.0 + giveItem: true + broadcast: false + GLOWSTONE_DUST_16: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: GLOWSTONE_DUST + amount: 32 + chance: 5.0 + giveItem: true + broadcast: false + NETHER_STALK_17: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: NETHER_STALK + amount: 32 + chance: 10.0 + giveItem: true + broadcast: false + SPECKLED_MELON_18: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: SPECKLED_MELON + amount: 32 + chance: 10.0 + giveItem: true + broadcast: false + BEDROCK_19: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: BEDROCK + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §2$§a10 Buycraft Voucher + enchants: + DURABILITY: 1000 + chance: 0.2 + command: vouchers addamount {player} 10 + giveItem: false + broadcast: true + BEDROCK_20: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: BEDROCK + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §c§l14-day iMakeMcVids Kit + enchants: + DURABILITY: 1000 + chance: 0.1 + command: vouchers addrank {player} iMake-Kit 14d {displayName} + giveItem: false + broadcast: true + BEDROCK_21: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: BEDROCK + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §4§l7-day Cave Rank + enchants: + DURABILITY: 1000 + chance: 0.1 + command: vouchers addrank {player} Cave 7d {displayName} + giveItem: false + broadcast: true + INK_SACK_22: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: INK_SACK + damage: 1 + amount: 5 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §c§liMakeMcVids Key + lore: + - '' + - §7Right click the §ciMakeMcVids Crate §7to obtain rewards! + enchants: + DURABILITY: 1 + chance: 8.0 + giveItem: true + broadcast: false + EYE_OF_ENDER_23: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: EYE_OF_ENDER + amount: 5 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §c§lAnti Pearl 2.0 + lore: + - §7Hit a player to put them on enderpearl cooldown. + - §7Right Click to remove your enderpearl cooldown. + - '' + - §fCan be found in the §c§liMakeMcVids Lootbox§f! + chance: 5.0 + command: ability antipearl 5 {name} + giveItem: false + broadcast: false + INK_SACK_24: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: INK_SACK + amount: 5 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §3§lInvisibility + lore: + - §7When you right click this item + - §7your armor will no longer be visible. + - '' + - §fCan be found in the §c§liMakeMcVids Lootbox§f! + chance: 5.0 + command: ability invisibility 5 {name} + giveItem: false + broadcast: false diff --git a/Configs + Precompiled/config/HCTeams/data/custom-timers.yml b/Configs + Precompiled/config/HCTeams/data/custom-timers.yml new file mode 100644 index 0000000..4ebfe18 --- /dev/null +++ b/Configs + Precompiled/config/HCTeams/data/custom-timers.yml @@ -0,0 +1,2 @@ +timers: + '&d&l2x Points': 1679011231654 diff --git a/Configs + Precompiled/config/HCTeams/data/glowmtn.json b/Configs + Precompiled/config/HCTeams/data/glowmtn.json new file mode 100644 index 0000000..5f460de --- /dev/null +++ b/Configs + Precompiled/config/HCTeams/data/glowmtn.json @@ -0,0 +1,5045 @@ +{ + "glowstone": [ + { + "x": 186.0, + "y": 5.0, + "z": 146.0 + }, + { + "x": 186.0, + "y": 7.0, + "z": 146.0 + }, + { + "x": 187.0, + "y": 5.0, + "z": 146.0 + }, + { + "x": 187.0, + "y": 6.0, + "z": 146.0 + }, + { + "x": 187.0, + "y": 7.0, + "z": 145.0 + }, + { + "x": 187.0, + "y": 7.0, + "z": 146.0 + }, + { + "x": 188.0, + "y": 5.0, + "z": 148.0 + }, + { + "x": 188.0, + "y": 6.0, + "z": 148.0 + }, + { + "x": 188.0, + "y": 7.0, + "z": 146.0 + }, + { + "x": 188.0, + "y": 7.0, + "z": 147.0 + }, + { + "x": 188.0, + "y": 7.0, + "z": 148.0 + }, + { + "x": 189.0, + "y": 6.0, + "z": 145.0 + }, + { + "x": 189.0, + "y": 6.0, + "z": 146.0 + }, + { + "x": 189.0, + "y": 6.0, + "z": 147.0 + }, + { + "x": 189.0, + "y": 7.0, + "z": 146.0 + }, + { + "x": 189.0, + "y": 7.0, + "z": 148.0 + }, + { + "x": 190.0, + "y": 5.0, + "z": 146.0 + }, + { + "x": 190.0, + "y": 5.0, + "z": 147.0 + }, + { + "x": 190.0, + "y": 6.0, + "z": 146.0 + }, + { + "x": 211.0, + "y": 44.0, + "z": 216.0 + }, + { + "x": 211.0, + "y": 45.0, + "z": 216.0 + }, + { + "x": 211.0, + "y": 46.0, + "z": 216.0 + }, + { + "x": 211.0, + "y": 47.0, + "z": 216.0 + }, + { + "x": 211.0, + "y": 48.0, + "z": 216.0 + }, + { + "x": 211.0, + "y": 49.0, + "z": 216.0 + }, + { + "x": 211.0, + "y": 51.0, + "z": 216.0 + }, + { + "x": 211.0, + "y": 52.0, + "z": 216.0 + }, + { + "x": 211.0, + "y": 53.0, + "z": 216.0 + }, + { + "x": 211.0, + "y": 54.0, + "z": 216.0 + }, + { + "x": 211.0, + "y": 55.0, + "z": 216.0 + }, + { + "x": 211.0, + "y": 56.0, + "z": 216.0 + }, + { + "x": 212.0, + "y": 44.0, + "z": 214.0 + }, + { + "x": 212.0, + "y": 44.0, + "z": 215.0 + }, + { + "x": 212.0, + "y": 44.0, + "z": 216.0 + }, + { + "x": 212.0, + "y": 44.0, + "z": 217.0 + }, + { + "x": 212.0, + "y": 44.0, + "z": 218.0 + }, + { + "x": 212.0, + "y": 45.0, + "z": 214.0 + }, + { + "x": 212.0, + "y": 45.0, + "z": 215.0 + }, + { + "x": 212.0, + "y": 45.0, + "z": 216.0 + }, + { + "x": 212.0, + "y": 45.0, + "z": 217.0 + }, + { + "x": 212.0, + "y": 45.0, + "z": 218.0 + }, + { + "x": 212.0, + "y": 46.0, + "z": 214.0 + }, + { + "x": 212.0, + "y": 46.0, + "z": 215.0 + }, + { + "x": 212.0, + "y": 46.0, + "z": 216.0 + }, + { + "x": 212.0, + "y": 46.0, + "z": 217.0 + }, + { + "x": 212.0, + "y": 46.0, + "z": 218.0 + }, + { + "x": 212.0, + "y": 47.0, + "z": 214.0 + }, + { + "x": 212.0, + "y": 47.0, + "z": 215.0 + }, + { + "x": 212.0, + "y": 47.0, + "z": 216.0 + }, + { + "x": 212.0, + "y": 47.0, + "z": 217.0 + }, + { + "x": 212.0, + "y": 47.0, + "z": 218.0 + }, + { + "x": 212.0, + "y": 48.0, + "z": 214.0 + }, + { + "x": 212.0, + "y": 48.0, + "z": 215.0 + }, + { + "x": 212.0, + "y": 48.0, + "z": 216.0 + }, + { + "x": 212.0, + "y": 48.0, + "z": 217.0 + }, + { + "x": 212.0, + "y": 48.0, + "z": 218.0 + }, + { + "x": 212.0, + "y": 49.0, + "z": 214.0 + }, + { + "x": 212.0, + "y": 49.0, + "z": 215.0 + }, + { + "x": 212.0, + "y": 49.0, + "z": 216.0 + }, + { + "x": 212.0, + "y": 49.0, + "z": 217.0 + }, + { + "x": 212.0, + "y": 49.0, + "z": 218.0 + }, + { + "x": 212.0, + "y": 50.0, + "z": 214.0 + }, + { + "x": 212.0, + "y": 50.0, + "z": 215.0 + }, + { + "x": 212.0, + "y": 50.0, + "z": 217.0 + }, + { + "x": 212.0, + "y": 50.0, + "z": 218.0 + }, + { + "x": 212.0, + "y": 51.0, + "z": 214.0 + }, + { + "x": 212.0, + "y": 51.0, + "z": 215.0 + }, + { + "x": 212.0, + "y": 51.0, + "z": 216.0 + }, + { + "x": 212.0, + "y": 51.0, + "z": 217.0 + }, + { + "x": 212.0, + "y": 51.0, + "z": 218.0 + }, + { + "x": 212.0, + "y": 52.0, + "z": 214.0 + }, + { + "x": 212.0, + "y": 52.0, + "z": 215.0 + }, + { + "x": 212.0, + "y": 52.0, + "z": 216.0 + }, + { + "x": 212.0, + "y": 52.0, + "z": 217.0 + }, + { + "x": 212.0, + "y": 52.0, + "z": 218.0 + }, + { + "x": 212.0, + "y": 53.0, + "z": 214.0 + }, + { + "x": 212.0, + "y": 53.0, + "z": 215.0 + }, + { + "x": 212.0, + "y": 53.0, + "z": 216.0 + }, + { + "x": 212.0, + "y": 53.0, + "z": 217.0 + }, + { + "x": 212.0, + "y": 53.0, + "z": 218.0 + }, + { + "x": 212.0, + "y": 54.0, + "z": 214.0 + }, + { + "x": 212.0, + "y": 54.0, + "z": 215.0 + }, + { + "x": 212.0, + "y": 54.0, + "z": 216.0 + }, + { + "x": 212.0, + "y": 54.0, + "z": 217.0 + }, + { + "x": 212.0, + "y": 54.0, + "z": 218.0 + }, + { + "x": 212.0, + "y": 55.0, + "z": 214.0 + }, + { + "x": 212.0, + "y": 55.0, + "z": 215.0 + }, + { + "x": 212.0, + "y": 55.0, + "z": 216.0 + }, + { + "x": 212.0, + "y": 55.0, + "z": 217.0 + }, + { + "x": 212.0, + "y": 55.0, + "z": 218.0 + }, + { + "x": 212.0, + "y": 56.0, + "z": 214.0 + }, + { + "x": 212.0, + "y": 56.0, + "z": 215.0 + }, + { + "x": 212.0, + "y": 56.0, + "z": 216.0 + }, + { + "x": 212.0, + "y": 56.0, + "z": 217.0 + }, + { + "x": 212.0, + "y": 56.0, + "z": 218.0 + }, + { + "x": 213.0, + "y": 44.0, + "z": 213.0 + }, + { + "x": 213.0, + "y": 44.0, + "z": 214.0 + }, + { + "x": 213.0, + "y": 44.0, + "z": 215.0 + }, + { + "x": 213.0, + "y": 44.0, + "z": 216.0 + }, + { + "x": 213.0, + "y": 44.0, + "z": 217.0 + }, + { + "x": 213.0, + "y": 44.0, + "z": 218.0 + }, + { + "x": 213.0, + "y": 44.0, + "z": 219.0 + }, + { + "x": 213.0, + "y": 45.0, + "z": 213.0 + }, + { + "x": 213.0, + "y": 45.0, + "z": 214.0 + }, + { + "x": 213.0, + "y": 45.0, + "z": 215.0 + }, + { + "x": 213.0, + "y": 45.0, + "z": 216.0 + }, + { + "x": 213.0, + "y": 45.0, + "z": 217.0 + }, + { + "x": 213.0, + "y": 45.0, + "z": 218.0 + }, + { + "x": 213.0, + "y": 45.0, + "z": 219.0 + }, + { + "x": 213.0, + "y": 46.0, + "z": 213.0 + }, + { + "x": 213.0, + "y": 46.0, + "z": 214.0 + }, + { + "x": 213.0, + "y": 46.0, + "z": 215.0 + }, + { + "x": 213.0, + "y": 46.0, + "z": 216.0 + }, + { + "x": 213.0, + "y": 46.0, + "z": 217.0 + }, + { + "x": 213.0, + "y": 46.0, + "z": 218.0 + }, + { + "x": 213.0, + "y": 46.0, + "z": 219.0 + }, + { + "x": 213.0, + "y": 47.0, + "z": 213.0 + }, + { + "x": 213.0, + "y": 47.0, + "z": 214.0 + }, + { + "x": 213.0, + "y": 47.0, + "z": 215.0 + }, + { + "x": 213.0, + "y": 47.0, + "z": 216.0 + }, + { + "x": 213.0, + "y": 47.0, + "z": 217.0 + }, + { + "x": 213.0, + "y": 47.0, + "z": 218.0 + }, + { + "x": 213.0, + "y": 47.0, + "z": 219.0 + }, + { + "x": 213.0, + "y": 48.0, + "z": 213.0 + }, + { + "x": 213.0, + "y": 48.0, + "z": 214.0 + }, + { + "x": 213.0, + "y": 48.0, + "z": 215.0 + }, + { + "x": 213.0, + "y": 48.0, + "z": 216.0 + }, + { + "x": 213.0, + "y": 48.0, + "z": 217.0 + }, + { + "x": 213.0, + "y": 48.0, + "z": 218.0 + }, + { + "x": 213.0, + "y": 48.0, + "z": 219.0 + }, + { + "x": 213.0, + "y": 49.0, + "z": 213.0 + }, + { + "x": 213.0, + "y": 49.0, + "z": 214.0 + }, + { + "x": 213.0, + "y": 49.0, + "z": 215.0 + }, + { + "x": 213.0, + "y": 49.0, + "z": 216.0 + }, + { + "x": 213.0, + "y": 49.0, + "z": 217.0 + }, + { + "x": 213.0, + "y": 49.0, + "z": 218.0 + }, + { + "x": 213.0, + "y": 49.0, + "z": 219.0 + }, + { + "x": 213.0, + "y": 50.0, + "z": 213.0 + }, + { + "x": 213.0, + "y": 50.0, + "z": 214.0 + }, + { + "x": 213.0, + "y": 50.0, + "z": 215.0 + }, + { + "x": 213.0, + "y": 50.0, + "z": 217.0 + }, + { + "x": 213.0, + "y": 50.0, + "z": 218.0 + }, + { + "x": 213.0, + "y": 50.0, + "z": 219.0 + }, + { + "x": 213.0, + "y": 51.0, + "z": 213.0 + }, + { + "x": 213.0, + "y": 51.0, + "z": 214.0 + }, + { + "x": 213.0, + "y": 51.0, + "z": 215.0 + }, + { + "x": 213.0, + "y": 51.0, + "z": 216.0 + }, + { + "x": 213.0, + "y": 51.0, + "z": 217.0 + }, + { + "x": 213.0, + "y": 51.0, + "z": 218.0 + }, + { + "x": 213.0, + "y": 51.0, + "z": 219.0 + }, + { + "x": 213.0, + "y": 52.0, + "z": 213.0 + }, + { + "x": 213.0, + "y": 52.0, + "z": 214.0 + }, + { + "x": 213.0, + "y": 52.0, + "z": 215.0 + }, + { + "x": 213.0, + "y": 52.0, + "z": 216.0 + }, + { + "x": 213.0, + "y": 52.0, + "z": 217.0 + }, + { + "x": 213.0, + "y": 52.0, + "z": 218.0 + }, + { + "x": 213.0, + "y": 52.0, + "z": 219.0 + }, + { + "x": 213.0, + "y": 53.0, + "z": 213.0 + }, + { + "x": 213.0, + "y": 53.0, + "z": 214.0 + }, + { + "x": 213.0, + "y": 53.0, + "z": 215.0 + }, + { + "x": 213.0, + "y": 53.0, + "z": 216.0 + }, + { + "x": 213.0, + "y": 53.0, + "z": 217.0 + }, + { + "x": 213.0, + "y": 53.0, + "z": 218.0 + }, + { + "x": 213.0, + "y": 53.0, + "z": 219.0 + }, + { + "x": 213.0, + "y": 54.0, + "z": 213.0 + }, + { + "x": 213.0, + "y": 54.0, + "z": 214.0 + }, + { + "x": 213.0, + "y": 54.0, + "z": 215.0 + }, + { + "x": 213.0, + "y": 54.0, + "z": 216.0 + }, + { + "x": 213.0, + "y": 54.0, + "z": 217.0 + }, + { + "x": 213.0, + "y": 54.0, + "z": 218.0 + }, + { + "x": 213.0, + "y": 54.0, + "z": 219.0 + }, + { + "x": 213.0, + "y": 55.0, + "z": 213.0 + }, + { + "x": 213.0, + "y": 55.0, + "z": 214.0 + }, + { + "x": 213.0, + "y": 55.0, + "z": 215.0 + }, + { + "x": 213.0, + "y": 55.0, + "z": 216.0 + }, + { + "x": 213.0, + "y": 55.0, + "z": 217.0 + }, + { + "x": 213.0, + "y": 55.0, + "z": 218.0 + }, + { + "x": 213.0, + "y": 55.0, + "z": 219.0 + }, + { + "x": 213.0, + "y": 56.0, + "z": 213.0 + }, + { + "x": 213.0, + "y": 56.0, + "z": 214.0 + }, + { + "x": 213.0, + "y": 56.0, + "z": 215.0 + }, + { + "x": 213.0, + "y": 56.0, + "z": 216.0 + }, + { + "x": 213.0, + "y": 56.0, + "z": 217.0 + }, + { + "x": 213.0, + "y": 56.0, + "z": 218.0 + }, + { + "x": 213.0, + "y": 56.0, + "z": 219.0 + }, + { + "x": 214.0, + "y": 44.0, + "z": 212.0 + }, + { + "x": 214.0, + "y": 44.0, + "z": 213.0 + }, + { + "x": 214.0, + "y": 44.0, + "z": 214.0 + }, + { + "x": 214.0, + "y": 44.0, + "z": 215.0 + }, + { + "x": 214.0, + "y": 44.0, + "z": 216.0 + }, + { + "x": 214.0, + "y": 44.0, + "z": 217.0 + }, + { + "x": 214.0, + "y": 44.0, + "z": 218.0 + }, + { + "x": 214.0, + "y": 44.0, + "z": 219.0 + }, + { + "x": 214.0, + "y": 44.0, + "z": 220.0 + }, + { + "x": 214.0, + "y": 45.0, + "z": 212.0 + }, + { + "x": 214.0, + "y": 45.0, + "z": 213.0 + }, + { + "x": 214.0, + "y": 45.0, + "z": 214.0 + }, + { + "x": 214.0, + "y": 45.0, + "z": 215.0 + }, + { + "x": 214.0, + "y": 45.0, + "z": 216.0 + }, + { + "x": 214.0, + "y": 45.0, + "z": 217.0 + }, + { + "x": 214.0, + "y": 45.0, + "z": 218.0 + }, + { + "x": 214.0, + "y": 45.0, + "z": 219.0 + }, + { + "x": 214.0, + "y": 45.0, + "z": 220.0 + }, + { + "x": 214.0, + "y": 46.0, + "z": 212.0 + }, + { + "x": 214.0, + "y": 46.0, + "z": 213.0 + }, + { + "x": 214.0, + "y": 46.0, + "z": 214.0 + }, + { + "x": 214.0, + "y": 46.0, + "z": 215.0 + }, + { + "x": 214.0, + "y": 46.0, + "z": 216.0 + }, + { + "x": 214.0, + "y": 46.0, + "z": 217.0 + }, + { + "x": 214.0, + "y": 46.0, + "z": 218.0 + }, + { + "x": 214.0, + "y": 46.0, + "z": 219.0 + }, + { + "x": 214.0, + "y": 46.0, + "z": 220.0 + }, + { + "x": 214.0, + "y": 47.0, + "z": 212.0 + }, + { + "x": 214.0, + "y": 47.0, + "z": 213.0 + }, + { + "x": 214.0, + "y": 47.0, + "z": 214.0 + }, + { + "x": 214.0, + "y": 47.0, + "z": 215.0 + }, + { + "x": 214.0, + "y": 47.0, + "z": 216.0 + }, + { + "x": 214.0, + "y": 47.0, + "z": 217.0 + }, + { + "x": 214.0, + "y": 47.0, + "z": 218.0 + }, + { + "x": 214.0, + "y": 47.0, + "z": 219.0 + }, + { + "x": 214.0, + "y": 47.0, + "z": 220.0 + }, + { + "x": 214.0, + "y": 48.0, + "z": 212.0 + }, + { + "x": 214.0, + "y": 48.0, + "z": 213.0 + }, + { + "x": 214.0, + "y": 48.0, + "z": 214.0 + }, + { + "x": 214.0, + "y": 48.0, + "z": 215.0 + }, + { + "x": 214.0, + "y": 48.0, + "z": 216.0 + }, + { + "x": 214.0, + "y": 48.0, + "z": 217.0 + }, + { + "x": 214.0, + "y": 48.0, + "z": 218.0 + }, + { + "x": 214.0, + "y": 48.0, + "z": 219.0 + }, + { + "x": 214.0, + "y": 48.0, + "z": 220.0 + }, + { + "x": 214.0, + "y": 49.0, + "z": 212.0 + }, + { + "x": 214.0, + "y": 49.0, + "z": 213.0 + }, + { + "x": 214.0, + "y": 49.0, + "z": 214.0 + }, + { + "x": 214.0, + "y": 49.0, + "z": 215.0 + }, + { + "x": 214.0, + "y": 49.0, + "z": 216.0 + }, + { + "x": 214.0, + "y": 49.0, + "z": 217.0 + }, + { + "x": 214.0, + "y": 49.0, + "z": 218.0 + }, + { + "x": 214.0, + "y": 49.0, + "z": 219.0 + }, + { + "x": 214.0, + "y": 49.0, + "z": 220.0 + }, + { + "x": 214.0, + "y": 50.0, + "z": 212.0 + }, + { + "x": 214.0, + "y": 50.0, + "z": 213.0 + }, + { + "x": 214.0, + "y": 50.0, + "z": 214.0 + }, + { + "x": 214.0, + "y": 50.0, + "z": 215.0 + }, + { + "x": 214.0, + "y": 50.0, + "z": 217.0 + }, + { + "x": 214.0, + "y": 50.0, + "z": 218.0 + }, + { + "x": 214.0, + "y": 50.0, + "z": 219.0 + }, + { + "x": 214.0, + "y": 50.0, + "z": 220.0 + }, + { + "x": 214.0, + "y": 51.0, + "z": 212.0 + }, + { + "x": 214.0, + "y": 51.0, + "z": 213.0 + }, + { + "x": 214.0, + "y": 51.0, + "z": 214.0 + }, + { + "x": 214.0, + "y": 51.0, + "z": 215.0 + }, + { + "x": 214.0, + "y": 51.0, + "z": 216.0 + }, + { + "x": 214.0, + "y": 51.0, + "z": 217.0 + }, + { + "x": 214.0, + "y": 51.0, + "z": 218.0 + }, + { + "x": 214.0, + "y": 51.0, + "z": 219.0 + }, + { + "x": 214.0, + "y": 51.0, + "z": 220.0 + }, + { + "x": 214.0, + "y": 52.0, + "z": 212.0 + }, + { + "x": 214.0, + "y": 52.0, + "z": 213.0 + }, + { + "x": 214.0, + "y": 52.0, + "z": 214.0 + }, + { + "x": 214.0, + "y": 52.0, + "z": 215.0 + }, + { + "x": 214.0, + "y": 52.0, + "z": 216.0 + }, + { + "x": 214.0, + "y": 52.0, + "z": 217.0 + }, + { + "x": 214.0, + "y": 52.0, + "z": 218.0 + }, + { + "x": 214.0, + "y": 52.0, + "z": 219.0 + }, + { + "x": 214.0, + "y": 52.0, + "z": 220.0 + }, + { + "x": 214.0, + "y": 53.0, + "z": 212.0 + }, + { + "x": 214.0, + "y": 53.0, + "z": 213.0 + }, + { + "x": 214.0, + "y": 53.0, + "z": 214.0 + }, + { + "x": 214.0, + "y": 53.0, + "z": 215.0 + }, + { + "x": 214.0, + "y": 53.0, + "z": 216.0 + }, + { + "x": 214.0, + "y": 53.0, + "z": 217.0 + }, + { + "x": 214.0, + "y": 53.0, + "z": 218.0 + }, + { + "x": 214.0, + "y": 53.0, + "z": 219.0 + }, + { + "x": 214.0, + "y": 53.0, + "z": 220.0 + }, + { + "x": 214.0, + "y": 54.0, + "z": 212.0 + }, + { + "x": 214.0, + "y": 54.0, + "z": 213.0 + }, + { + "x": 214.0, + "y": 54.0, + "z": 214.0 + }, + { + "x": 214.0, + "y": 54.0, + "z": 215.0 + }, + { + "x": 214.0, + "y": 54.0, + "z": 216.0 + }, + { + "x": 214.0, + "y": 54.0, + "z": 217.0 + }, + { + "x": 214.0, + "y": 54.0, + "z": 218.0 + }, + { + "x": 214.0, + "y": 54.0, + "z": 219.0 + }, + { + "x": 214.0, + "y": 54.0, + "z": 220.0 + }, + { + "x": 214.0, + "y": 55.0, + "z": 212.0 + }, + { + "x": 214.0, + "y": 55.0, + "z": 213.0 + }, + { + "x": 214.0, + "y": 55.0, + "z": 214.0 + }, + { + "x": 214.0, + "y": 55.0, + "z": 215.0 + }, + { + "x": 214.0, + "y": 55.0, + "z": 216.0 + }, + { + "x": 214.0, + "y": 55.0, + "z": 217.0 + }, + { + "x": 214.0, + "y": 55.0, + "z": 218.0 + }, + { + "x": 214.0, + "y": 55.0, + "z": 219.0 + }, + { + "x": 214.0, + "y": 55.0, + "z": 220.0 + }, + { + "x": 214.0, + "y": 56.0, + "z": 212.0 + }, + { + "x": 214.0, + "y": 56.0, + "z": 213.0 + }, + { + "x": 214.0, + "y": 56.0, + "z": 214.0 + }, + { + "x": 214.0, + "y": 56.0, + "z": 215.0 + }, + { + "x": 214.0, + "y": 56.0, + "z": 216.0 + }, + { + "x": 214.0, + "y": 56.0, + "z": 217.0 + }, + { + "x": 214.0, + "y": 56.0, + "z": 218.0 + }, + { + "x": 214.0, + "y": 56.0, + "z": 219.0 + }, + { + "x": 214.0, + "y": 56.0, + "z": 220.0 + }, + { + "x": 215.0, + "y": 44.0, + "z": 212.0 + }, + { + "x": 215.0, + "y": 44.0, + "z": 213.0 + }, + { + "x": 215.0, + "y": 44.0, + "z": 214.0 + }, + { + "x": 215.0, + "y": 44.0, + "z": 215.0 + }, + { + "x": 215.0, + "y": 44.0, + "z": 216.0 + }, + { + "x": 215.0, + "y": 44.0, + "z": 217.0 + }, + { + "x": 215.0, + "y": 44.0, + "z": 218.0 + }, + { + "x": 215.0, + "y": 44.0, + "z": 219.0 + }, + { + "x": 215.0, + "y": 44.0, + "z": 220.0 + }, + { + "x": 215.0, + "y": 45.0, + "z": 212.0 + }, + { + "x": 215.0, + "y": 45.0, + "z": 213.0 + }, + { + "x": 215.0, + "y": 45.0, + "z": 214.0 + }, + { + "x": 215.0, + "y": 45.0, + "z": 215.0 + }, + { + "x": 215.0, + "y": 45.0, + "z": 216.0 + }, + { + "x": 215.0, + "y": 45.0, + "z": 217.0 + }, + { + "x": 215.0, + "y": 45.0, + "z": 218.0 + }, + { + "x": 215.0, + "y": 45.0, + "z": 219.0 + }, + { + "x": 215.0, + "y": 45.0, + "z": 220.0 + }, + { + "x": 215.0, + "y": 46.0, + "z": 212.0 + }, + { + "x": 215.0, + "y": 46.0, + "z": 213.0 + }, + { + "x": 215.0, + "y": 46.0, + "z": 214.0 + }, + { + "x": 215.0, + "y": 46.0, + "z": 215.0 + }, + { + "x": 215.0, + "y": 46.0, + "z": 216.0 + }, + { + "x": 215.0, + "y": 46.0, + "z": 217.0 + }, + { + "x": 215.0, + "y": 46.0, + "z": 218.0 + }, + { + "x": 215.0, + "y": 46.0, + "z": 219.0 + }, + { + "x": 215.0, + "y": 46.0, + "z": 220.0 + }, + { + "x": 215.0, + "y": 47.0, + "z": 212.0 + }, + { + "x": 215.0, + "y": 47.0, + "z": 213.0 + }, + { + "x": 215.0, + "y": 47.0, + "z": 214.0 + }, + { + "x": 215.0, + "y": 47.0, + "z": 215.0 + }, + { + "x": 215.0, + "y": 47.0, + "z": 216.0 + }, + { + "x": 215.0, + "y": 47.0, + "z": 217.0 + }, + { + "x": 215.0, + "y": 47.0, + "z": 218.0 + }, + { + "x": 215.0, + "y": 47.0, + "z": 219.0 + }, + { + "x": 215.0, + "y": 47.0, + "z": 220.0 + }, + { + "x": 215.0, + "y": 48.0, + "z": 212.0 + }, + { + "x": 215.0, + "y": 48.0, + "z": 213.0 + }, + { + "x": 215.0, + "y": 48.0, + "z": 214.0 + }, + { + "x": 215.0, + "y": 48.0, + "z": 215.0 + }, + { + "x": 215.0, + "y": 48.0, + "z": 216.0 + }, + { + "x": 215.0, + "y": 48.0, + "z": 217.0 + }, + { + "x": 215.0, + "y": 48.0, + "z": 218.0 + }, + { + "x": 215.0, + "y": 48.0, + "z": 219.0 + }, + { + "x": 215.0, + "y": 48.0, + "z": 220.0 + }, + { + "x": 215.0, + "y": 49.0, + "z": 212.0 + }, + { + "x": 215.0, + "y": 49.0, + "z": 213.0 + }, + { + "x": 215.0, + "y": 49.0, + "z": 214.0 + }, + { + "x": 215.0, + "y": 49.0, + "z": 215.0 + }, + { + "x": 215.0, + "y": 49.0, + "z": 216.0 + }, + { + "x": 215.0, + "y": 49.0, + "z": 217.0 + }, + { + "x": 215.0, + "y": 49.0, + "z": 218.0 + }, + { + "x": 215.0, + "y": 49.0, + "z": 219.0 + }, + { + "x": 215.0, + "y": 49.0, + "z": 220.0 + }, + { + "x": 215.0, + "y": 50.0, + "z": 212.0 + }, + { + "x": 215.0, + "y": 50.0, + "z": 213.0 + }, + { + "x": 215.0, + "y": 50.0, + "z": 214.0 + }, + { + "x": 215.0, + "y": 50.0, + "z": 215.0 + }, + { + "x": 215.0, + "y": 50.0, + "z": 217.0 + }, + { + "x": 215.0, + "y": 50.0, + "z": 218.0 + }, + { + "x": 215.0, + "y": 50.0, + "z": 219.0 + }, + { + "x": 215.0, + "y": 50.0, + "z": 220.0 + }, + { + "x": 215.0, + "y": 51.0, + "z": 212.0 + }, + { + "x": 215.0, + "y": 51.0, + "z": 213.0 + }, + { + "x": 215.0, + "y": 51.0, + "z": 214.0 + }, + { + "x": 215.0, + "y": 51.0, + "z": 215.0 + }, + { + "x": 215.0, + "y": 51.0, + "z": 216.0 + }, + { + "x": 215.0, + "y": 51.0, + "z": 217.0 + }, + { + "x": 215.0, + "y": 51.0, + "z": 218.0 + }, + { + "x": 215.0, + "y": 51.0, + "z": 219.0 + }, + { + "x": 215.0, + "y": 51.0, + "z": 220.0 + }, + { + "x": 215.0, + "y": 52.0, + "z": 212.0 + }, + { + "x": 215.0, + "y": 52.0, + "z": 213.0 + }, + { + "x": 215.0, + "y": 52.0, + "z": 214.0 + }, + { + "x": 215.0, + "y": 52.0, + "z": 215.0 + }, + { + "x": 215.0, + "y": 52.0, + "z": 216.0 + }, + { + "x": 215.0, + "y": 52.0, + "z": 217.0 + }, + { + "x": 215.0, + "y": 52.0, + "z": 218.0 + }, + { + "x": 215.0, + "y": 52.0, + "z": 219.0 + }, + { + "x": 215.0, + "y": 52.0, + "z": 220.0 + }, + { + "x": 215.0, + "y": 53.0, + "z": 212.0 + }, + { + "x": 215.0, + "y": 53.0, + "z": 213.0 + }, + { + "x": 215.0, + "y": 53.0, + "z": 214.0 + }, + { + "x": 215.0, + "y": 53.0, + "z": 215.0 + }, + { + "x": 215.0, + "y": 53.0, + "z": 216.0 + }, + { + "x": 215.0, + "y": 53.0, + "z": 217.0 + }, + { + "x": 215.0, + "y": 53.0, + "z": 218.0 + }, + { + "x": 215.0, + "y": 53.0, + "z": 219.0 + }, + { + "x": 215.0, + "y": 53.0, + "z": 220.0 + }, + { + "x": 215.0, + "y": 54.0, + "z": 212.0 + }, + { + "x": 215.0, + "y": 54.0, + "z": 213.0 + }, + { + "x": 215.0, + "y": 54.0, + "z": 214.0 + }, + { + "x": 215.0, + "y": 54.0, + "z": 215.0 + }, + { + "x": 215.0, + "y": 54.0, + "z": 216.0 + }, + { + "x": 215.0, + "y": 54.0, + "z": 217.0 + }, + { + "x": 215.0, + "y": 54.0, + "z": 218.0 + }, + { + "x": 215.0, + "y": 54.0, + "z": 219.0 + }, + { + "x": 215.0, + "y": 54.0, + "z": 220.0 + }, + { + "x": 215.0, + "y": 55.0, + "z": 212.0 + }, + { + "x": 215.0, + "y": 55.0, + "z": 213.0 + }, + { + "x": 215.0, + "y": 55.0, + "z": 214.0 + }, + { + "x": 215.0, + "y": 55.0, + "z": 215.0 + }, + { + "x": 215.0, + "y": 55.0, + "z": 216.0 + }, + { + "x": 215.0, + "y": 55.0, + "z": 217.0 + }, + { + "x": 215.0, + "y": 55.0, + "z": 218.0 + }, + { + "x": 215.0, + "y": 55.0, + "z": 219.0 + }, + { + "x": 215.0, + "y": 55.0, + "z": 220.0 + }, + { + "x": 215.0, + "y": 56.0, + "z": 212.0 + }, + { + "x": 215.0, + "y": 56.0, + "z": 213.0 + }, + { + "x": 215.0, + "y": 56.0, + "z": 214.0 + }, + { + "x": 215.0, + "y": 56.0, + "z": 215.0 + }, + { + "x": 215.0, + "y": 56.0, + "z": 216.0 + }, + { + "x": 215.0, + "y": 56.0, + "z": 217.0 + }, + { + "x": 215.0, + "y": 56.0, + "z": 218.0 + }, + { + "x": 215.0, + "y": 56.0, + "z": 219.0 + }, + { + "x": 215.0, + "y": 56.0, + "z": 220.0 + }, + { + "x": 216.0, + "y": 44.0, + "z": 211.0 + }, + { + "x": 216.0, + "y": 44.0, + "z": 212.0 + }, + { + "x": 216.0, + "y": 44.0, + "z": 213.0 + }, + { + "x": 216.0, + "y": 44.0, + "z": 214.0 + }, + { + "x": 216.0, + "y": 44.0, + "z": 215.0 + }, + { + "x": 216.0, + "y": 44.0, + "z": 216.0 + }, + { + "x": 216.0, + "y": 44.0, + "z": 217.0 + }, + { + "x": 216.0, + "y": 44.0, + "z": 218.0 + }, + { + "x": 216.0, + "y": 44.0, + "z": 219.0 + }, + { + "x": 216.0, + "y": 44.0, + "z": 220.0 + }, + { + "x": 216.0, + "y": 44.0, + "z": 221.0 + }, + { + "x": 216.0, + "y": 45.0, + "z": 211.0 + }, + { + "x": 216.0, + "y": 45.0, + "z": 212.0 + }, + { + "x": 216.0, + "y": 45.0, + "z": 213.0 + }, + { + "x": 216.0, + "y": 45.0, + "z": 214.0 + }, + { + "x": 216.0, + "y": 45.0, + "z": 215.0 + }, + { + "x": 216.0, + "y": 45.0, + "z": 216.0 + }, + { + "x": 216.0, + "y": 45.0, + "z": 217.0 + }, + { + "x": 216.0, + "y": 45.0, + "z": 218.0 + }, + { + "x": 216.0, + "y": 45.0, + "z": 219.0 + }, + { + "x": 216.0, + "y": 45.0, + "z": 220.0 + }, + { + "x": 216.0, + "y": 45.0, + "z": 221.0 + }, + { + "x": 216.0, + "y": 46.0, + "z": 211.0 + }, + { + "x": 216.0, + "y": 46.0, + "z": 212.0 + }, + { + "x": 216.0, + "y": 46.0, + "z": 213.0 + }, + { + "x": 216.0, + "y": 46.0, + "z": 214.0 + }, + { + "x": 216.0, + "y": 46.0, + "z": 215.0 + }, + { + "x": 216.0, + "y": 46.0, + "z": 216.0 + }, + { + "x": 216.0, + "y": 46.0, + "z": 217.0 + }, + { + "x": 216.0, + "y": 46.0, + "z": 218.0 + }, + { + "x": 216.0, + "y": 46.0, + "z": 219.0 + }, + { + "x": 216.0, + "y": 46.0, + "z": 220.0 + }, + { + "x": 216.0, + "y": 46.0, + "z": 221.0 + }, + { + "x": 216.0, + "y": 47.0, + "z": 211.0 + }, + { + "x": 216.0, + "y": 47.0, + "z": 212.0 + }, + { + "x": 216.0, + "y": 47.0, + "z": 213.0 + }, + { + "x": 216.0, + "y": 47.0, + "z": 214.0 + }, + { + "x": 216.0, + "y": 47.0, + "z": 215.0 + }, + { + "x": 216.0, + "y": 47.0, + "z": 216.0 + }, + { + "x": 216.0, + "y": 47.0, + "z": 217.0 + }, + { + "x": 216.0, + "y": 47.0, + "z": 218.0 + }, + { + "x": 216.0, + "y": 47.0, + "z": 219.0 + }, + { + "x": 216.0, + "y": 47.0, + "z": 220.0 + }, + { + "x": 216.0, + "y": 47.0, + "z": 221.0 + }, + { + "x": 216.0, + "y": 48.0, + "z": 211.0 + }, + { + "x": 216.0, + "y": 48.0, + "z": 212.0 + }, + { + "x": 216.0, + "y": 48.0, + "z": 213.0 + }, + { + "x": 216.0, + "y": 48.0, + "z": 214.0 + }, + { + "x": 216.0, + "y": 48.0, + "z": 215.0 + }, + { + "x": 216.0, + "y": 48.0, + "z": 216.0 + }, + { + "x": 216.0, + "y": 48.0, + "z": 217.0 + }, + { + "x": 216.0, + "y": 48.0, + "z": 218.0 + }, + { + "x": 216.0, + "y": 48.0, + "z": 219.0 + }, + { + "x": 216.0, + "y": 48.0, + "z": 220.0 + }, + { + "x": 216.0, + "y": 48.0, + "z": 221.0 + }, + { + "x": 216.0, + "y": 49.0, + "z": 211.0 + }, + { + "x": 216.0, + "y": 49.0, + "z": 212.0 + }, + { + "x": 216.0, + "y": 49.0, + "z": 213.0 + }, + { + "x": 216.0, + "y": 49.0, + "z": 214.0 + }, + { + "x": 216.0, + "y": 49.0, + "z": 215.0 + }, + { + "x": 216.0, + "y": 49.0, + "z": 216.0 + }, + { + "x": 216.0, + "y": 49.0, + "z": 217.0 + }, + { + "x": 216.0, + "y": 49.0, + "z": 218.0 + }, + { + "x": 216.0, + "y": 49.0, + "z": 219.0 + }, + { + "x": 216.0, + "y": 49.0, + "z": 220.0 + }, + { + "x": 216.0, + "y": 49.0, + "z": 221.0 + }, + { + "x": 216.0, + "y": 50.0, + "z": 211.0 + }, + { + "x": 216.0, + "y": 50.0, + "z": 212.0 + }, + { + "x": 216.0, + "y": 50.0, + "z": 213.0 + }, + { + "x": 216.0, + "y": 50.0, + "z": 214.0 + }, + { + "x": 216.0, + "y": 50.0, + "z": 215.0 + }, + { + "x": 216.0, + "y": 50.0, + "z": 217.0 + }, + { + "x": 216.0, + "y": 50.0, + "z": 218.0 + }, + { + "x": 216.0, + "y": 50.0, + "z": 219.0 + }, + { + "x": 216.0, + "y": 50.0, + "z": 220.0 + }, + { + "x": 216.0, + "y": 50.0, + "z": 221.0 + }, + { + "x": 216.0, + "y": 51.0, + "z": 211.0 + }, + { + "x": 216.0, + "y": 51.0, + "z": 212.0 + }, + { + "x": 216.0, + "y": 51.0, + "z": 213.0 + }, + { + "x": 216.0, + "y": 51.0, + "z": 214.0 + }, + { + "x": 216.0, + "y": 51.0, + "z": 215.0 + }, + { + "x": 216.0, + "y": 51.0, + "z": 216.0 + }, + { + "x": 216.0, + "y": 51.0, + "z": 217.0 + }, + { + "x": 216.0, + "y": 51.0, + "z": 218.0 + }, + { + "x": 216.0, + "y": 51.0, + "z": 219.0 + }, + { + "x": 216.0, + "y": 51.0, + "z": 220.0 + }, + { + "x": 216.0, + "y": 51.0, + "z": 221.0 + }, + { + "x": 216.0, + "y": 52.0, + "z": 211.0 + }, + { + "x": 216.0, + "y": 52.0, + "z": 212.0 + }, + { + "x": 216.0, + "y": 52.0, + "z": 213.0 + }, + { + "x": 216.0, + "y": 52.0, + "z": 214.0 + }, + { + "x": 216.0, + "y": 52.0, + "z": 215.0 + }, + { + "x": 216.0, + "y": 52.0, + "z": 216.0 + }, + { + "x": 216.0, + "y": 52.0, + "z": 217.0 + }, + { + "x": 216.0, + "y": 52.0, + "z": 218.0 + }, + { + "x": 216.0, + "y": 52.0, + "z": 219.0 + }, + { + "x": 216.0, + "y": 52.0, + "z": 220.0 + }, + { + "x": 216.0, + "y": 52.0, + "z": 221.0 + }, + { + "x": 216.0, + "y": 53.0, + "z": 211.0 + }, + { + "x": 216.0, + "y": 53.0, + "z": 212.0 + }, + { + "x": 216.0, + "y": 53.0, + "z": 213.0 + }, + { + "x": 216.0, + "y": 53.0, + "z": 214.0 + }, + { + "x": 216.0, + "y": 53.0, + "z": 215.0 + }, + { + "x": 216.0, + "y": 53.0, + "z": 216.0 + }, + { + "x": 216.0, + "y": 53.0, + "z": 217.0 + }, + { + "x": 216.0, + "y": 53.0, + "z": 218.0 + }, + { + "x": 216.0, + "y": 53.0, + "z": 219.0 + }, + { + "x": 216.0, + "y": 53.0, + "z": 220.0 + }, + { + "x": 216.0, + "y": 53.0, + "z": 221.0 + }, + { + "x": 216.0, + "y": 54.0, + "z": 211.0 + }, + { + "x": 216.0, + "y": 54.0, + "z": 212.0 + }, + { + "x": 216.0, + "y": 54.0, + "z": 213.0 + }, + { + "x": 216.0, + "y": 54.0, + "z": 214.0 + }, + { + "x": 216.0, + "y": 54.0, + "z": 215.0 + }, + { + "x": 216.0, + "y": 54.0, + "z": 216.0 + }, + { + "x": 216.0, + "y": 54.0, + "z": 217.0 + }, + { + "x": 216.0, + "y": 54.0, + "z": 218.0 + }, + { + "x": 216.0, + "y": 54.0, + "z": 219.0 + }, + { + "x": 216.0, + "y": 54.0, + "z": 220.0 + }, + { + "x": 216.0, + "y": 54.0, + "z": 221.0 + }, + { + "x": 216.0, + "y": 55.0, + "z": 211.0 + }, + { + "x": 216.0, + "y": 55.0, + "z": 212.0 + }, + { + "x": 216.0, + "y": 55.0, + "z": 213.0 + }, + { + "x": 216.0, + "y": 55.0, + "z": 214.0 + }, + { + "x": 216.0, + "y": 55.0, + "z": 215.0 + }, + { + "x": 216.0, + "y": 55.0, + "z": 216.0 + }, + { + "x": 216.0, + "y": 55.0, + "z": 217.0 + }, + { + "x": 216.0, + "y": 55.0, + "z": 218.0 + }, + { + "x": 216.0, + "y": 55.0, + "z": 219.0 + }, + { + "x": 216.0, + "y": 55.0, + "z": 220.0 + }, + { + "x": 216.0, + "y": 55.0, + "z": 221.0 + }, + { + "x": 216.0, + "y": 56.0, + "z": 211.0 + }, + { + "x": 216.0, + "y": 56.0, + "z": 212.0 + }, + { + "x": 216.0, + "y": 56.0, + "z": 213.0 + }, + { + "x": 216.0, + "y": 56.0, + "z": 214.0 + }, + { + "x": 216.0, + "y": 56.0, + "z": 215.0 + }, + { + "x": 216.0, + "y": 56.0, + "z": 216.0 + }, + { + "x": 216.0, + "y": 56.0, + "z": 217.0 + }, + { + "x": 216.0, + "y": 56.0, + "z": 218.0 + }, + { + "x": 216.0, + "y": 56.0, + "z": 219.0 + }, + { + "x": 216.0, + "y": 56.0, + "z": 220.0 + }, + { + "x": 216.0, + "y": 56.0, + "z": 221.0 + }, + { + "x": 217.0, + "y": 44.0, + "z": 212.0 + }, + { + "x": 217.0, + "y": 44.0, + "z": 213.0 + }, + { + "x": 217.0, + "y": 44.0, + "z": 214.0 + }, + { + "x": 217.0, + "y": 44.0, + "z": 215.0 + }, + { + "x": 217.0, + "y": 44.0, + "z": 216.0 + }, + { + "x": 217.0, + "y": 44.0, + "z": 217.0 + }, + { + "x": 217.0, + "y": 44.0, + "z": 218.0 + }, + { + "x": 217.0, + "y": 44.0, + "z": 219.0 + }, + { + "x": 217.0, + "y": 44.0, + "z": 220.0 + }, + { + "x": 217.0, + "y": 45.0, + "z": 212.0 + }, + { + "x": 217.0, + "y": 45.0, + "z": 213.0 + }, + { + "x": 217.0, + "y": 45.0, + "z": 214.0 + }, + { + "x": 217.0, + "y": 45.0, + "z": 215.0 + }, + { + "x": 217.0, + "y": 45.0, + "z": 216.0 + }, + { + "x": 217.0, + "y": 45.0, + "z": 217.0 + }, + { + "x": 217.0, + "y": 45.0, + "z": 218.0 + }, + { + "x": 217.0, + "y": 45.0, + "z": 219.0 + }, + { + "x": 217.0, + "y": 45.0, + "z": 220.0 + }, + { + "x": 217.0, + "y": 46.0, + "z": 212.0 + }, + { + "x": 217.0, + "y": 46.0, + "z": 213.0 + }, + { + "x": 217.0, + "y": 46.0, + "z": 214.0 + }, + { + "x": 217.0, + "y": 46.0, + "z": 215.0 + }, + { + "x": 217.0, + "y": 46.0, + "z": 216.0 + }, + { + "x": 217.0, + "y": 46.0, + "z": 217.0 + }, + { + "x": 217.0, + "y": 46.0, + "z": 218.0 + }, + { + "x": 217.0, + "y": 46.0, + "z": 219.0 + }, + { + "x": 217.0, + "y": 46.0, + "z": 220.0 + }, + { + "x": 217.0, + "y": 47.0, + "z": 212.0 + }, + { + "x": 217.0, + "y": 47.0, + "z": 213.0 + }, + { + "x": 217.0, + "y": 47.0, + "z": 214.0 + }, + { + "x": 217.0, + "y": 47.0, + "z": 215.0 + }, + { + "x": 217.0, + "y": 47.0, + "z": 216.0 + }, + { + "x": 217.0, + "y": 47.0, + "z": 217.0 + }, + { + "x": 217.0, + "y": 47.0, + "z": 218.0 + }, + { + "x": 217.0, + "y": 47.0, + "z": 219.0 + }, + { + "x": 217.0, + "y": 47.0, + "z": 220.0 + }, + { + "x": 217.0, + "y": 48.0, + "z": 212.0 + }, + { + "x": 217.0, + "y": 48.0, + "z": 213.0 + }, + { + "x": 217.0, + "y": 48.0, + "z": 214.0 + }, + { + "x": 217.0, + "y": 48.0, + "z": 215.0 + }, + { + "x": 217.0, + "y": 48.0, + "z": 216.0 + }, + { + "x": 217.0, + "y": 48.0, + "z": 217.0 + }, + { + "x": 217.0, + "y": 48.0, + "z": 218.0 + }, + { + "x": 217.0, + "y": 48.0, + "z": 219.0 + }, + { + "x": 217.0, + "y": 48.0, + "z": 220.0 + }, + { + "x": 217.0, + "y": 49.0, + "z": 212.0 + }, + { + "x": 217.0, + "y": 49.0, + "z": 213.0 + }, + { + "x": 217.0, + "y": 49.0, + "z": 214.0 + }, + { + "x": 217.0, + "y": 49.0, + "z": 215.0 + }, + { + "x": 217.0, + "y": 49.0, + "z": 216.0 + }, + { + "x": 217.0, + "y": 49.0, + "z": 217.0 + }, + { + "x": 217.0, + "y": 49.0, + "z": 218.0 + }, + { + "x": 217.0, + "y": 49.0, + "z": 219.0 + }, + { + "x": 217.0, + "y": 49.0, + "z": 220.0 + }, + { + "x": 217.0, + "y": 50.0, + "z": 212.0 + }, + { + "x": 217.0, + "y": 50.0, + "z": 213.0 + }, + { + "x": 217.0, + "y": 50.0, + "z": 214.0 + }, + { + "x": 217.0, + "y": 50.0, + "z": 215.0 + }, + { + "x": 217.0, + "y": 50.0, + "z": 217.0 + }, + { + "x": 217.0, + "y": 50.0, + "z": 218.0 + }, + { + "x": 217.0, + "y": 50.0, + "z": 219.0 + }, + { + "x": 217.0, + "y": 50.0, + "z": 220.0 + }, + { + "x": 217.0, + "y": 51.0, + "z": 212.0 + }, + { + "x": 217.0, + "y": 51.0, + "z": 213.0 + }, + { + "x": 217.0, + "y": 51.0, + "z": 214.0 + }, + { + "x": 217.0, + "y": 51.0, + "z": 215.0 + }, + { + "x": 217.0, + "y": 51.0, + "z": 216.0 + }, + { + "x": 217.0, + "y": 51.0, + "z": 217.0 + }, + { + "x": 217.0, + "y": 51.0, + "z": 218.0 + }, + { + "x": 217.0, + "y": 51.0, + "z": 219.0 + }, + { + "x": 217.0, + "y": 51.0, + "z": 220.0 + }, + { + "x": 217.0, + "y": 52.0, + "z": 212.0 + }, + { + "x": 217.0, + "y": 52.0, + "z": 213.0 + }, + { + "x": 217.0, + "y": 52.0, + "z": 214.0 + }, + { + "x": 217.0, + "y": 52.0, + "z": 215.0 + }, + { + "x": 217.0, + "y": 52.0, + "z": 216.0 + }, + { + "x": 217.0, + "y": 52.0, + "z": 217.0 + }, + { + "x": 217.0, + "y": 52.0, + "z": 218.0 + }, + { + "x": 217.0, + "y": 52.0, + "z": 219.0 + }, + { + "x": 217.0, + "y": 52.0, + "z": 220.0 + }, + { + "x": 217.0, + "y": 53.0, + "z": 212.0 + }, + { + "x": 217.0, + "y": 53.0, + "z": 213.0 + }, + { + "x": 217.0, + "y": 53.0, + "z": 214.0 + }, + { + "x": 217.0, + "y": 53.0, + "z": 215.0 + }, + { + "x": 217.0, + "y": 53.0, + "z": 216.0 + }, + { + "x": 217.0, + "y": 53.0, + "z": 217.0 + }, + { + "x": 217.0, + "y": 53.0, + "z": 218.0 + }, + { + "x": 217.0, + "y": 53.0, + "z": 219.0 + }, + { + "x": 217.0, + "y": 53.0, + "z": 220.0 + }, + { + "x": 217.0, + "y": 54.0, + "z": 212.0 + }, + { + "x": 217.0, + "y": 54.0, + "z": 213.0 + }, + { + "x": 217.0, + "y": 54.0, + "z": 214.0 + }, + { + "x": 217.0, + "y": 54.0, + "z": 215.0 + }, + { + "x": 217.0, + "y": 54.0, + "z": 216.0 + }, + { + "x": 217.0, + "y": 54.0, + "z": 217.0 + }, + { + "x": 217.0, + "y": 54.0, + "z": 218.0 + }, + { + "x": 217.0, + "y": 54.0, + "z": 219.0 + }, + { + "x": 217.0, + "y": 54.0, + "z": 220.0 + }, + { + "x": 217.0, + "y": 55.0, + "z": 212.0 + }, + { + "x": 217.0, + "y": 55.0, + "z": 213.0 + }, + { + "x": 217.0, + "y": 55.0, + "z": 214.0 + }, + { + "x": 217.0, + "y": 55.0, + "z": 215.0 + }, + { + "x": 217.0, + "y": 55.0, + "z": 216.0 + }, + { + "x": 217.0, + "y": 55.0, + "z": 217.0 + }, + { + "x": 217.0, + "y": 55.0, + "z": 218.0 + }, + { + "x": 217.0, + "y": 55.0, + "z": 219.0 + }, + { + "x": 217.0, + "y": 55.0, + "z": 220.0 + }, + { + "x": 217.0, + "y": 56.0, + "z": 212.0 + }, + { + "x": 217.0, + "y": 56.0, + "z": 213.0 + }, + { + "x": 217.0, + "y": 56.0, + "z": 214.0 + }, + { + "x": 217.0, + "y": 56.0, + "z": 215.0 + }, + { + "x": 217.0, + "y": 56.0, + "z": 216.0 + }, + { + "x": 217.0, + "y": 56.0, + "z": 217.0 + }, + { + "x": 217.0, + "y": 56.0, + "z": 218.0 + }, + { + "x": 217.0, + "y": 56.0, + "z": 219.0 + }, + { + "x": 217.0, + "y": 56.0, + "z": 220.0 + }, + { + "x": 218.0, + "y": 44.0, + "z": 212.0 + }, + { + "x": 218.0, + "y": 44.0, + "z": 213.0 + }, + { + "x": 218.0, + "y": 44.0, + "z": 214.0 + }, + { + "x": 218.0, + "y": 44.0, + "z": 215.0 + }, + { + "x": 218.0, + "y": 44.0, + "z": 216.0 + }, + { + "x": 218.0, + "y": 44.0, + "z": 217.0 + }, + { + "x": 218.0, + "y": 44.0, + "z": 218.0 + }, + { + "x": 218.0, + "y": 44.0, + "z": 219.0 + }, + { + "x": 218.0, + "y": 44.0, + "z": 220.0 + }, + { + "x": 218.0, + "y": 45.0, + "z": 212.0 + }, + { + "x": 218.0, + "y": 45.0, + "z": 213.0 + }, + { + "x": 218.0, + "y": 45.0, + "z": 214.0 + }, + { + "x": 218.0, + "y": 45.0, + "z": 215.0 + }, + { + "x": 218.0, + "y": 45.0, + "z": 216.0 + }, + { + "x": 218.0, + "y": 45.0, + "z": 217.0 + }, + { + "x": 218.0, + "y": 45.0, + "z": 218.0 + }, + { + "x": 218.0, + "y": 45.0, + "z": 219.0 + }, + { + "x": 218.0, + "y": 45.0, + "z": 220.0 + }, + { + "x": 218.0, + "y": 46.0, + "z": 212.0 + }, + { + "x": 218.0, + "y": 46.0, + "z": 213.0 + }, + { + "x": 218.0, + "y": 46.0, + "z": 214.0 + }, + { + "x": 218.0, + "y": 46.0, + "z": 215.0 + }, + { + "x": 218.0, + "y": 46.0, + "z": 216.0 + }, + { + "x": 218.0, + "y": 46.0, + "z": 217.0 + }, + { + "x": 218.0, + "y": 46.0, + "z": 218.0 + }, + { + "x": 218.0, + "y": 46.0, + "z": 219.0 + }, + { + "x": 218.0, + "y": 46.0, + "z": 220.0 + }, + { + "x": 218.0, + "y": 47.0, + "z": 212.0 + }, + { + "x": 218.0, + "y": 47.0, + "z": 213.0 + }, + { + "x": 218.0, + "y": 47.0, + "z": 214.0 + }, + { + "x": 218.0, + "y": 47.0, + "z": 215.0 + }, + { + "x": 218.0, + "y": 47.0, + "z": 216.0 + }, + { + "x": 218.0, + "y": 47.0, + "z": 217.0 + }, + { + "x": 218.0, + "y": 47.0, + "z": 218.0 + }, + { + "x": 218.0, + "y": 47.0, + "z": 219.0 + }, + { + "x": 218.0, + "y": 47.0, + "z": 220.0 + }, + { + "x": 218.0, + "y": 48.0, + "z": 212.0 + }, + { + "x": 218.0, + "y": 48.0, + "z": 213.0 + }, + { + "x": 218.0, + "y": 48.0, + "z": 214.0 + }, + { + "x": 218.0, + "y": 48.0, + "z": 215.0 + }, + { + "x": 218.0, + "y": 48.0, + "z": 216.0 + }, + { + "x": 218.0, + "y": 48.0, + "z": 217.0 + }, + { + "x": 218.0, + "y": 48.0, + "z": 218.0 + }, + { + "x": 218.0, + "y": 48.0, + "z": 219.0 + }, + { + "x": 218.0, + "y": 48.0, + "z": 220.0 + }, + { + "x": 218.0, + "y": 49.0, + "z": 212.0 + }, + { + "x": 218.0, + "y": 49.0, + "z": 213.0 + }, + { + "x": 218.0, + "y": 49.0, + "z": 214.0 + }, + { + "x": 218.0, + "y": 49.0, + "z": 215.0 + }, + { + "x": 218.0, + "y": 49.0, + "z": 216.0 + }, + { + "x": 218.0, + "y": 49.0, + "z": 217.0 + }, + { + "x": 218.0, + "y": 49.0, + "z": 218.0 + }, + { + "x": 218.0, + "y": 49.0, + "z": 219.0 + }, + { + "x": 218.0, + "y": 49.0, + "z": 220.0 + }, + { + "x": 218.0, + "y": 50.0, + "z": 212.0 + }, + { + "x": 218.0, + "y": 50.0, + "z": 213.0 + }, + { + "x": 218.0, + "y": 50.0, + "z": 214.0 + }, + { + "x": 218.0, + "y": 50.0, + "z": 215.0 + }, + { + "x": 218.0, + "y": 50.0, + "z": 217.0 + }, + { + "x": 218.0, + "y": 50.0, + "z": 218.0 + }, + { + "x": 218.0, + "y": 50.0, + "z": 219.0 + }, + { + "x": 218.0, + "y": 50.0, + "z": 220.0 + }, + { + "x": 218.0, + "y": 51.0, + "z": 212.0 + }, + { + "x": 218.0, + "y": 51.0, + "z": 213.0 + }, + { + "x": 218.0, + "y": 51.0, + "z": 214.0 + }, + { + "x": 218.0, + "y": 51.0, + "z": 215.0 + }, + { + "x": 218.0, + "y": 51.0, + "z": 216.0 + }, + { + "x": 218.0, + "y": 51.0, + "z": 217.0 + }, + { + "x": 218.0, + "y": 51.0, + "z": 218.0 + }, + { + "x": 218.0, + "y": 51.0, + "z": 219.0 + }, + { + "x": 218.0, + "y": 51.0, + "z": 220.0 + }, + { + "x": 218.0, + "y": 52.0, + "z": 212.0 + }, + { + "x": 218.0, + "y": 52.0, + "z": 213.0 + }, + { + "x": 218.0, + "y": 52.0, + "z": 214.0 + }, + { + "x": 218.0, + "y": 52.0, + "z": 215.0 + }, + { + "x": 218.0, + "y": 52.0, + "z": 216.0 + }, + { + "x": 218.0, + "y": 52.0, + "z": 217.0 + }, + { + "x": 218.0, + "y": 52.0, + "z": 218.0 + }, + { + "x": 218.0, + "y": 52.0, + "z": 219.0 + }, + { + "x": 218.0, + "y": 52.0, + "z": 220.0 + }, + { + "x": 218.0, + "y": 53.0, + "z": 212.0 + }, + { + "x": 218.0, + "y": 53.0, + "z": 213.0 + }, + { + "x": 218.0, + "y": 53.0, + "z": 214.0 + }, + { + "x": 218.0, + "y": 53.0, + "z": 215.0 + }, + { + "x": 218.0, + "y": 53.0, + "z": 216.0 + }, + { + "x": 218.0, + "y": 53.0, + "z": 217.0 + }, + { + "x": 218.0, + "y": 53.0, + "z": 218.0 + }, + { + "x": 218.0, + "y": 53.0, + "z": 219.0 + }, + { + "x": 218.0, + "y": 53.0, + "z": 220.0 + }, + { + "x": 218.0, + "y": 54.0, + "z": 212.0 + }, + { + "x": 218.0, + "y": 54.0, + "z": 213.0 + }, + { + "x": 218.0, + "y": 54.0, + "z": 214.0 + }, + { + "x": 218.0, + "y": 54.0, + "z": 215.0 + }, + { + "x": 218.0, + "y": 54.0, + "z": 216.0 + }, + { + "x": 218.0, + "y": 54.0, + "z": 217.0 + }, + { + "x": 218.0, + "y": 54.0, + "z": 218.0 + }, + { + "x": 218.0, + "y": 54.0, + "z": 219.0 + }, + { + "x": 218.0, + "y": 54.0, + "z": 220.0 + }, + { + "x": 218.0, + "y": 55.0, + "z": 212.0 + }, + { + "x": 218.0, + "y": 55.0, + "z": 213.0 + }, + { + "x": 218.0, + "y": 55.0, + "z": 214.0 + }, + { + "x": 218.0, + "y": 55.0, + "z": 215.0 + }, + { + "x": 218.0, + "y": 55.0, + "z": 216.0 + }, + { + "x": 218.0, + "y": 55.0, + "z": 217.0 + }, + { + "x": 218.0, + "y": 55.0, + "z": 218.0 + }, + { + "x": 218.0, + "y": 55.0, + "z": 219.0 + }, + { + "x": 218.0, + "y": 55.0, + "z": 220.0 + }, + { + "x": 218.0, + "y": 56.0, + "z": 212.0 + }, + { + "x": 218.0, + "y": 56.0, + "z": 213.0 + }, + { + "x": 218.0, + "y": 56.0, + "z": 214.0 + }, + { + "x": 218.0, + "y": 56.0, + "z": 215.0 + }, + { + "x": 218.0, + "y": 56.0, + "z": 216.0 + }, + { + "x": 218.0, + "y": 56.0, + "z": 217.0 + }, + { + "x": 218.0, + "y": 56.0, + "z": 218.0 + }, + { + "x": 218.0, + "y": 56.0, + "z": 219.0 + }, + { + "x": 218.0, + "y": 56.0, + "z": 220.0 + }, + { + "x": 219.0, + "y": 44.0, + "z": 213.0 + }, + { + "x": 219.0, + "y": 44.0, + "z": 214.0 + }, + { + "x": 219.0, + "y": 44.0, + "z": 215.0 + }, + { + "x": 219.0, + "y": 44.0, + "z": 216.0 + }, + { + "x": 219.0, + "y": 44.0, + "z": 217.0 + }, + { + "x": 219.0, + "y": 44.0, + "z": 218.0 + }, + { + "x": 219.0, + "y": 44.0, + "z": 219.0 + }, + { + "x": 219.0, + "y": 45.0, + "z": 213.0 + }, + { + "x": 219.0, + "y": 45.0, + "z": 214.0 + }, + { + "x": 219.0, + "y": 45.0, + "z": 215.0 + }, + { + "x": 219.0, + "y": 45.0, + "z": 216.0 + }, + { + "x": 219.0, + "y": 45.0, + "z": 217.0 + }, + { + "x": 219.0, + "y": 45.0, + "z": 218.0 + }, + { + "x": 219.0, + "y": 45.0, + "z": 219.0 + }, + { + "x": 219.0, + "y": 46.0, + "z": 213.0 + }, + { + "x": 219.0, + "y": 46.0, + "z": 214.0 + }, + { + "x": 219.0, + "y": 46.0, + "z": 215.0 + }, + { + "x": 219.0, + "y": 46.0, + "z": 216.0 + }, + { + "x": 219.0, + "y": 46.0, + "z": 217.0 + }, + { + "x": 219.0, + "y": 46.0, + "z": 218.0 + }, + { + "x": 219.0, + "y": 46.0, + "z": 219.0 + }, + { + "x": 219.0, + "y": 47.0, + "z": 213.0 + }, + { + "x": 219.0, + "y": 47.0, + "z": 214.0 + }, + { + "x": 219.0, + "y": 47.0, + "z": 215.0 + }, + { + "x": 219.0, + "y": 47.0, + "z": 216.0 + }, + { + "x": 219.0, + "y": 47.0, + "z": 217.0 + }, + { + "x": 219.0, + "y": 47.0, + "z": 218.0 + }, + { + "x": 219.0, + "y": 47.0, + "z": 219.0 + }, + { + "x": 219.0, + "y": 48.0, + "z": 213.0 + }, + { + "x": 219.0, + "y": 48.0, + "z": 214.0 + }, + { + "x": 219.0, + "y": 48.0, + "z": 215.0 + }, + { + "x": 219.0, + "y": 48.0, + "z": 216.0 + }, + { + "x": 219.0, + "y": 48.0, + "z": 217.0 + }, + { + "x": 219.0, + "y": 48.0, + "z": 218.0 + }, + { + "x": 219.0, + "y": 48.0, + "z": 219.0 + }, + { + "x": 219.0, + "y": 49.0, + "z": 213.0 + }, + { + "x": 219.0, + "y": 49.0, + "z": 214.0 + }, + { + "x": 219.0, + "y": 49.0, + "z": 215.0 + }, + { + "x": 219.0, + "y": 49.0, + "z": 216.0 + }, + { + "x": 219.0, + "y": 49.0, + "z": 217.0 + }, + { + "x": 219.0, + "y": 49.0, + "z": 218.0 + }, + { + "x": 219.0, + "y": 49.0, + "z": 219.0 + }, + { + "x": 219.0, + "y": 50.0, + "z": 213.0 + }, + { + "x": 219.0, + "y": 50.0, + "z": 214.0 + }, + { + "x": 219.0, + "y": 50.0, + "z": 215.0 + }, + { + "x": 219.0, + "y": 50.0, + "z": 217.0 + }, + { + "x": 219.0, + "y": 50.0, + "z": 218.0 + }, + { + "x": 219.0, + "y": 50.0, + "z": 219.0 + }, + { + "x": 219.0, + "y": 51.0, + "z": 213.0 + }, + { + "x": 219.0, + "y": 51.0, + "z": 214.0 + }, + { + "x": 219.0, + "y": 51.0, + "z": 215.0 + }, + { + "x": 219.0, + "y": 51.0, + "z": 216.0 + }, + { + "x": 219.0, + "y": 51.0, + "z": 217.0 + }, + { + "x": 219.0, + "y": 51.0, + "z": 218.0 + }, + { + "x": 219.0, + "y": 51.0, + "z": 219.0 + }, + { + "x": 219.0, + "y": 52.0, + "z": 213.0 + }, + { + "x": 219.0, + "y": 52.0, + "z": 214.0 + }, + { + "x": 219.0, + "y": 52.0, + "z": 215.0 + }, + { + "x": 219.0, + "y": 52.0, + "z": 216.0 + }, + { + "x": 219.0, + "y": 52.0, + "z": 217.0 + }, + { + "x": 219.0, + "y": 52.0, + "z": 218.0 + }, + { + "x": 219.0, + "y": 52.0, + "z": 219.0 + }, + { + "x": 219.0, + "y": 53.0, + "z": 213.0 + }, + { + "x": 219.0, + "y": 53.0, + "z": 214.0 + }, + { + "x": 219.0, + "y": 53.0, + "z": 215.0 + }, + { + "x": 219.0, + "y": 53.0, + "z": 216.0 + }, + { + "x": 219.0, + "y": 53.0, + "z": 217.0 + }, + { + "x": 219.0, + "y": 53.0, + "z": 218.0 + }, + { + "x": 219.0, + "y": 53.0, + "z": 219.0 + }, + { + "x": 219.0, + "y": 54.0, + "z": 213.0 + }, + { + "x": 219.0, + "y": 54.0, + "z": 214.0 + }, + { + "x": 219.0, + "y": 54.0, + "z": 215.0 + }, + { + "x": 219.0, + "y": 54.0, + "z": 216.0 + }, + { + "x": 219.0, + "y": 54.0, + "z": 217.0 + }, + { + "x": 219.0, + "y": 54.0, + "z": 218.0 + }, + { + "x": 219.0, + "y": 54.0, + "z": 219.0 + }, + { + "x": 219.0, + "y": 55.0, + "z": 213.0 + }, + { + "x": 219.0, + "y": 55.0, + "z": 214.0 + }, + { + "x": 219.0, + "y": 55.0, + "z": 215.0 + }, + { + "x": 219.0, + "y": 55.0, + "z": 216.0 + }, + { + "x": 219.0, + "y": 55.0, + "z": 217.0 + }, + { + "x": 219.0, + "y": 55.0, + "z": 218.0 + }, + { + "x": 219.0, + "y": 55.0, + "z": 219.0 + }, + { + "x": 219.0, + "y": 56.0, + "z": 213.0 + }, + { + "x": 219.0, + "y": 56.0, + "z": 214.0 + }, + { + "x": 219.0, + "y": 56.0, + "z": 215.0 + }, + { + "x": 219.0, + "y": 56.0, + "z": 216.0 + }, + { + "x": 219.0, + "y": 56.0, + "z": 217.0 + }, + { + "x": 219.0, + "y": 56.0, + "z": 218.0 + }, + { + "x": 219.0, + "y": 56.0, + "z": 219.0 + }, + { + "x": 220.0, + "y": 44.0, + "z": 214.0 + }, + { + "x": 220.0, + "y": 44.0, + "z": 215.0 + }, + { + "x": 220.0, + "y": 44.0, + "z": 216.0 + }, + { + "x": 220.0, + "y": 44.0, + "z": 217.0 + }, + { + "x": 220.0, + "y": 44.0, + "z": 218.0 + }, + { + "x": 220.0, + "y": 45.0, + "z": 214.0 + }, + { + "x": 220.0, + "y": 45.0, + "z": 215.0 + }, + { + "x": 220.0, + "y": 45.0, + "z": 216.0 + }, + { + "x": 220.0, + "y": 45.0, + "z": 217.0 + }, + { + "x": 220.0, + "y": 45.0, + "z": 218.0 + }, + { + "x": 220.0, + "y": 46.0, + "z": 214.0 + }, + { + "x": 220.0, + "y": 46.0, + "z": 215.0 + }, + { + "x": 220.0, + "y": 46.0, + "z": 216.0 + }, + { + "x": 220.0, + "y": 46.0, + "z": 217.0 + }, + { + "x": 220.0, + "y": 46.0, + "z": 218.0 + }, + { + "x": 220.0, + "y": 47.0, + "z": 214.0 + }, + { + "x": 220.0, + "y": 47.0, + "z": 215.0 + }, + { + "x": 220.0, + "y": 47.0, + "z": 216.0 + }, + { + "x": 220.0, + "y": 47.0, + "z": 217.0 + }, + { + "x": 220.0, + "y": 47.0, + "z": 218.0 + }, + { + "x": 220.0, + "y": 48.0, + "z": 214.0 + }, + { + "x": 220.0, + "y": 48.0, + "z": 215.0 + }, + { + "x": 220.0, + "y": 48.0, + "z": 216.0 + }, + { + "x": 220.0, + "y": 48.0, + "z": 217.0 + }, + { + "x": 220.0, + "y": 48.0, + "z": 218.0 + }, + { + "x": 220.0, + "y": 49.0, + "z": 214.0 + }, + { + "x": 220.0, + "y": 49.0, + "z": 215.0 + }, + { + "x": 220.0, + "y": 49.0, + "z": 216.0 + }, + { + "x": 220.0, + "y": 49.0, + "z": 217.0 + }, + { + "x": 220.0, + "y": 49.0, + "z": 218.0 + }, + { + "x": 220.0, + "y": 50.0, + "z": 214.0 + }, + { + "x": 220.0, + "y": 50.0, + "z": 215.0 + }, + { + "x": 220.0, + "y": 50.0, + "z": 217.0 + }, + { + "x": 220.0, + "y": 50.0, + "z": 218.0 + }, + { + "x": 220.0, + "y": 51.0, + "z": 214.0 + }, + { + "x": 220.0, + "y": 51.0, + "z": 215.0 + }, + { + "x": 220.0, + "y": 51.0, + "z": 216.0 + }, + { + "x": 220.0, + "y": 51.0, + "z": 217.0 + }, + { + "x": 220.0, + "y": 51.0, + "z": 218.0 + }, + { + "x": 220.0, + "y": 52.0, + "z": 214.0 + }, + { + "x": 220.0, + "y": 52.0, + "z": 215.0 + }, + { + "x": 220.0, + "y": 52.0, + "z": 216.0 + }, + { + "x": 220.0, + "y": 52.0, + "z": 217.0 + }, + { + "x": 220.0, + "y": 52.0, + "z": 218.0 + }, + { + "x": 220.0, + "y": 53.0, + "z": 214.0 + }, + { + "x": 220.0, + "y": 53.0, + "z": 215.0 + }, + { + "x": 220.0, + "y": 53.0, + "z": 216.0 + }, + { + "x": 220.0, + "y": 53.0, + "z": 217.0 + }, + { + "x": 220.0, + "y": 53.0, + "z": 218.0 + }, + { + "x": 220.0, + "y": 54.0, + "z": 214.0 + }, + { + "x": 220.0, + "y": 54.0, + "z": 215.0 + }, + { + "x": 220.0, + "y": 54.0, + "z": 216.0 + }, + { + "x": 220.0, + "y": 54.0, + "z": 217.0 + }, + { + "x": 220.0, + "y": 54.0, + "z": 218.0 + }, + { + "x": 220.0, + "y": 55.0, + "z": 214.0 + }, + { + "x": 220.0, + "y": 55.0, + "z": 215.0 + }, + { + "x": 220.0, + "y": 55.0, + "z": 216.0 + }, + { + "x": 220.0, + "y": 55.0, + "z": 217.0 + }, + { + "x": 220.0, + "y": 55.0, + "z": 218.0 + }, + { + "x": 220.0, + "y": 56.0, + "z": 214.0 + }, + { + "x": 220.0, + "y": 56.0, + "z": 215.0 + }, + { + "x": 220.0, + "y": 56.0, + "z": 216.0 + }, + { + "x": 220.0, + "y": 56.0, + "z": 217.0 + }, + { + "x": 220.0, + "y": 56.0, + "z": 218.0 + }, + { + "x": 221.0, + "y": 44.0, + "z": 216.0 + }, + { + "x": 221.0, + "y": 45.0, + "z": 216.0 + }, + { + "x": 221.0, + "y": 46.0, + "z": 216.0 + }, + { + "x": 221.0, + "y": 47.0, + "z": 216.0 + }, + { + "x": 221.0, + "y": 48.0, + "z": 216.0 + }, + { + "x": 221.0, + "y": 49.0, + "z": 216.0 + }, + { + "x": 221.0, + "y": 51.0, + "z": 216.0 + }, + { + "x": 221.0, + "y": 52.0, + "z": 216.0 + }, + { + "x": 221.0, + "y": 53.0, + "z": 216.0 + }, + { + "x": 221.0, + "y": 54.0, + "z": 216.0 + }, + { + "x": 221.0, + "y": 55.0, + "z": 216.0 + }, + { + "x": 221.0, + "y": 56.0, + "z": 216.0 + }, + { + "x": 227.0, + "y": 7.0, + "z": 283.0 + }, + { + "x": 228.0, + "y": 7.0, + "z": 282.0 + }, + { + "x": 228.0, + "y": 7.0, + "z": 283.0 + }, + { + "x": 228.0, + "y": 9.0, + "z": 284.0 + }, + { + "x": 229.0, + "y": 7.0, + "z": 283.0 + }, + { + "x": 229.0, + "y": 7.0, + "z": 284.0 + }, + { + "x": 229.0, + "y": 9.0, + "z": 284.0 + }, + { + "x": 230.0, + "y": 5.0, + "z": 283.0 + }, + { + "x": 230.0, + "y": 6.0, + "z": 283.0 + }, + { + "x": 230.0, + "y": 7.0, + "z": 283.0 + }, + { + "x": 230.0, + "y": 7.0, + "z": 285.0 + }, + { + "x": 230.0, + "y": 8.0, + "z": 283.0 + }, + { + "x": 230.0, + "y": 9.0, + "z": 284.0 + }, + { + "x": 231.0, + "y": 6.0, + "z": 282.0 + }, + { + "x": 231.0, + "y": 6.0, + "z": 283.0 + }, + { + "x": 231.0, + "y": 7.0, + "z": 284.0 + }, + { + "x": 231.0, + "y": 7.0, + "z": 285.0 + }, + { + "x": 231.0, + "y": 8.0, + "z": 283.0 + }, + { + "x": 231.0, + "y": 8.0, + "z": 285.0 + }, + { + "x": 231.0, + "y": 9.0, + "z": 283.0 + }, + { + "x": 231.0, + "y": 9.0, + "z": 284.0 + }, + { + "x": 231.0, + "y": 9.0, + "z": 285.0 + }, + { + "x": 232.0, + "y": 6.0, + "z": 282.0 + }, + { + "x": 232.0, + "y": 7.0, + "z": 285.0 + }, + { + "x": 232.0, + "y": 8.0, + "z": 284.0 + }, + { + "x": 232.0, + "y": 9.0, + "z": 284.0 + }, + { + "x": 233.0, + "y": 6.0, + "z": 285.0 + }, + { + "x": 233.0, + "y": 7.0, + "z": 284.0 + }, + { + "x": 233.0, + "y": 7.0, + "z": 285.0 + }, + { + "x": 233.0, + "y": 7.0, + "z": 286.0 + }, + { + "x": 233.0, + "y": 8.0, + "z": 286.0 + }, + { + "x": 234.0, + "y": 6.0, + "z": 285.0 + }, + { + "x": 261.0, + "y": 16.0, + "z": 229.0 + }, + { + "x": 261.0, + "y": 18.0, + "z": 229.0 + }, + { + "x": 262.0, + "y": 16.0, + "z": 229.0 + }, + { + "x": 262.0, + "y": 17.0, + "z": 229.0 + }, + { + "x": 262.0, + "y": 18.0, + "z": 228.0 + }, + { + "x": 262.0, + "y": 18.0, + "z": 229.0 + }, + { + "x": 263.0, + "y": 16.0, + "z": 231.0 + }, + { + "x": 263.0, + "y": 17.0, + "z": 231.0 + }, + { + "x": 263.0, + "y": 18.0, + "z": 229.0 + }, + { + "x": 263.0, + "y": 18.0, + "z": 230.0 + }, + { + "x": 263.0, + "y": 18.0, + "z": 231.0 + }, + { + "x": 264.0, + "y": 17.0, + "z": 228.0 + }, + { + "x": 264.0, + "y": 17.0, + "z": 229.0 + }, + { + "x": 264.0, + "y": 17.0, + "z": 230.0 + }, + { + "x": 264.0, + "y": 18.0, + "z": 229.0 + }, + { + "x": 264.0, + "y": 18.0, + "z": 231.0 + }, + { + "x": 265.0, + "y": 16.0, + "z": 229.0 + }, + { + "x": 265.0, + "y": 16.0, + "z": 230.0 + }, + { + "x": 265.0, + "y": 17.0, + "z": 229.0 + } + ], + "remaining": 1008 +} \ No newline at end of file diff --git a/Configs + Precompiled/config/HCTeams/data/keyalls.yml b/Configs + Precompiled/config/HCTeams/data/keyalls.yml new file mode 100644 index 0000000..e69de29 diff --git a/Configs + Precompiled/config/HCTeams/data/outpost.yml b/Configs + Precompiled/config/HCTeams/data/outpost.yml new file mode 100644 index 0000000..072dd84 --- /dev/null +++ b/Configs + Precompiled/config/HCTeams/data/outpost.yml @@ -0,0 +1,7 @@ +outposts: + Road: + percentage: 0.0 + Nether: + percentage: 0.0 + End: + percentage: 0.0 diff --git a/Configs + Precompiled/config/HCTeams/data/roadOutpost.json b/Configs + Precompiled/config/HCTeams/data/roadOutpost.json new file mode 100644 index 0000000..036582b --- /dev/null +++ b/Configs + Precompiled/config/HCTeams/data/roadOutpost.json @@ -0,0 +1,472 @@ +{ + "chests": [ + { + "location": { + "world": "world", + "x": -44.0, + "y": 69.0, + "z": 1197.0, + "yaw": 0.0, + "pitch": 0.0 + } + }, + { + "location": { + "world": "world", + "x": 32.0, + "y": 69.0, + "z": 1237.0, + "yaw": 0.0, + "pitch": 0.0 + } + }, + { + "location": { + "world": "world", + "x": 24.0, + "y": 74.0, + "z": 1179.0, + "yaw": 0.0, + "pitch": 0.0 + } + }, + { + "location": { + "world": "world", + "x": 38.0, + "y": 69.0, + "z": 1179.0, + "yaw": 0.0, + "pitch": 0.0 + } + }, + { + "location": { + "world": "world", + "x": 22.0, + "y": 69.0, + "z": 1201.0, + "yaw": 0.0, + "pitch": 0.0 + } + }, + { + "location": { + "world": "world", + "x": -21.0, + "y": 70.0, + "z": 1223.0, + "yaw": 0.0, + "pitch": 0.0 + } + }, + { + "location": { + "world": "world", + "x": -24.0, + "y": 74.0, + "z": 1220.0, + "yaw": 0.0, + "pitch": 0.0 + } + }, + { + "location": { + "world": "world", + "x": 11.0, + "y": 74.0, + "z": 1223.0, + "yaw": 0.0, + "pitch": 0.0 + } + }, + { + "location": { + "world": "world", + "x": -15.0, + "y": 74.0, + "z": 1176.0, + "yaw": 0.0, + "pitch": 0.0 + } + }, + { + "location": { + "world": "world", + "x": 4.0, + "y": 69.0, + "z": 1158.0, + "yaw": 0.0, + "pitch": 0.0 + } + }, + { + "location": { + "world": "world", + "x": -24.0, + "y": 69.0, + "z": 1207.0, + "yaw": 0.0, + "pitch": 0.0 + } + }, + { + "location": { + "world": "world", + "x": 7.0, + "y": 69.0, + "z": 1175.0, + "yaw": 0.0, + "pitch": 0.0 + } + }, + { + "location": { + "world": "world", + "x": -2.0, + "y": 69.0, + "z": 1157.0, + "yaw": 0.0, + "pitch": 0.0 + } + }, + { + "location": { + "world": "world", + "x": -38.0, + "y": 69.0, + "z": 1165.0, + "yaw": 0.0, + "pitch": 0.0 + } + } + ], + "loot": [ + { + "type": "FLINT", + "amount": 5, + "data": 0, + "meta": { + "displayName": "§d§lTazer", + "lore": [ + "", + "§6❙ §fHit a player and for the next", + "§6❙ §e§l5 seconds §fthey will not be able to", + "§6❙ §fmove or take knockback.", + "", + "§fCan be found in the §4§lCave Crate§f!" + ] + } + }, + { + "type": "INK_SACK", + "amount": 5, + "data": 0, + "meta": { + "displayName": "§3§lInvisibility", + "lore": [ + "", + "§6❙ §fWhen you right click this item", + "§6❙ §fyour armor will no longer be visible.", + "", + "§fCan be found in an §b§lAirdrop§f!" + ] + } + }, + { + "type": "PAPER", + "amount": 5, + "data": 0, + "meta": { + "displayName": "§a§lMed Kit", + "lore": [ + "", + "§6❙ §fRight Click to receive Resistance 3,", + "§6❙ §fRegeneration 3, and 4 Absorption", + "§6❙ §fHearts for §e§l5 seconds§f!", + "", + "§fCan be found in the §6§lSummer Crate§f!" + ] + } + }, + { + "type": "INK_SACK", + "amount": 5, + "data": 5, + "meta": { + "displayName": "§5§lPower Stone", + "lore": [ + "", + "§6❙ §fRight Click to receive Strength II,", + "§6❙ §fResistance III and Regeneration III for §e§l10 seconds", + "§6❙ §fDuring that time you may not use any potions!", + "", + "§fCan be found in the §b§lIlluminated Chest§f!" + ] + } + }, + { + "type": "WORKBENCH", + "amount": 5, + "data": 0, + "meta": { + "displayName": "§3§lCrafting Chaos", + "lore": [ + "", + "§6❙ §fHit an enemy and for §e§l10 seconds§f, every", + "§6❙ §fhit you deal has a §c§l15% §fchance of", + "§6❙ §fputting them in a crafting table.", + "", + "§fCan be found in the §3§lHeaded Crate§f!" + ] + } + }, + { + "type": "SNOW_BALL", + "amount": 5, + "data": 0, + "meta": { + "displayName": "§4§lBall Of Rage", + "lore": [ + "", + "§6❙ §fThrow to create a cloud of effects", + "§6❙ §fwhere all teammates within 5 block", + "§6❙ §fradius will be given positive effects.", + "", + "§fCan be found in the §4§lCave Crate§f!" + ] + } + }, + { + "type": "STICK", + "amount": 5, + "data": 0, + "meta": { + "displayName": "§3§lSpin Bot", + "lore": [ + "", + "§6❙ §fHit a player §c§l3 times §fand every", + "§6❙ §fhit for §e§l10 seconds §fhas a chance", + "§6❙ §fof rotating their head", + "", + "§fCan be found in the §d§lPartner Crate§f!" + ] + } + }, + { + "type": "EMERALD", + "amount": 5, + "data": 0, + "meta": { + "displayName": "§4§lPhoenix Mode", + "lore": [ + "", + "§6❙ §fClick to create a cloud of particles.", + "§6❙ §fInside the cloud, enemies deal §c§l-20% §fdamage", + "§6❙ §fto you and you deal §c§l+20% §fdamage to enemies.", + "", + "§fCan be found in the §4§lResucting Crate§f!" + ] + } + }, + { + "type": "SPIDER_EYE", + "amount": 5, + "data": 0, + "meta": { + "displayName": "§e§lSpider Ability", + "lore": [ + "", + "§6❙ §fClick to activate and for the", + "§6❙ §fnext §e§l15 seconds§f, all hits dealt", + "§6❙ §fhave a §c§l25% §fchance of putting a", + "§6❙ §fcobweb underneath the enemy.", + "", + "§fCan be found in the §d§lPartner Crate§f!" + ] + } + }, + { + "type": "GOLD_INGOT", + "amount": 5, + "data": 0, + "meta": { + "displayName": "§6§lMidas Touch", + "lore": [ + "", + "§6❙ §fClick to activate and for §e§l15 seconds", + "§6❙ §fa 3x3 of gold blocks appear under you.", + "§6❙ §fYou cannot break/place/interact with.", + "§6❙ §fblocks on top of these gold blocks.", + "", + "§fCan be found in the §6§lSummer Lootbox§f!" + ] + } + }, + { + "type": "BLAZE_ROD", + "amount": 5, + "data": 0, + "meta": { + "displayName": "§6§lAnti-Blockup", + "lore": [ + "", + "§6❙ §fWhen you hit a player with this", + "§6❙ §c§l3 times §fthey may not block up for §e§l15 seconds§f.", + "", + "§fCan be found in the §6§lSummer Crate§f!" + ] + } + }, + { + "type": "WATCH", + "amount": 5, + "data": 0, + "meta": { + "displayName": "§6§lTime Warp", + "lore": [ + "", + "§6❙ §fTravel back to where", + "§6❙ §fyou last threw a pearl!", + "", + "§fCan be found in an §b§lAirdrop§f!" + ] + } + }, + { + "type": "RED_ROSE", + "amount": 5, + "data": 0, + "meta": { + "displayName": "§a§lCombo Ability", + "lore": [ + "", + "§6❙ §fGet a second of strength II for the", + "§6❙ §famount of hits dealt within §e§l10 seconds§f.", + "", + "§fCan be found in the §a§lDylan Crate§f!" + ] + } + }, + { + "type": "GOLD_INGOT", + "amount": 5, + "data": 0, + "meta": { + "displayName": "§e§lSoul Stone", + "lore": [ + "", + "§6❙ §fUpon going below 2 hearts, you will be instantly", + "§6❙ §fhealed and given Resistance III for §e§l5 seconds§f.", + "", + "§fCan be found in the §b§lIlluminated Chest§f!" + ] + } + }, + { + "type": "NETHER_STAR", + "amount": 5, + "data": 0, + "meta": { + "displayName": "§b§lNinja Star", + "lore": [ + "", + "§6❙ §fTeleport to the last person that", + "§6❙ §fhit you within the last §e§l30 seconds§f!", + "", + "§fCan be found in an §b§lAirdrop§f!" + ] + } + }, + { + "type": "INK_SACK", + "amount": 2, + "data": 14, + "meta": { + "displayName": "§6§lPortable Bard", + "lore": [ + "", + "§6❙ §fReceive §c§l5 §fportable bard effects!", + "", + "§fCan be found in an §b§lAirdrop§f!" + ] + } + }, + { + "type": "REDSTONE", + "amount": 5, + "data": 0, + "meta": { + "displayName": "§c§lReality Stone", + "lore": [ + "", + "§6❙ §fRight Click to teleport to the player", + "§6❙ §fthat you last hit within a §e§l30 second §fperiod.", + "", + "§fCan be found in the §b§lIlluminated Chest§f!" + ] + } + }, + { + "type": "EYE_OF_ENDER", + "amount": 5, + "data": 0, + "meta": { + "displayName": "§c§lAnti Pearl 2.0", + "lore": [ + "", + "§6❙ §fHit a player to put them on enderpearl cooldown.", + "§6❙ §fRight Click to remove your enderpearl cooldown.", + "", + "§fCan be found in the §c§liMakeMcVids Crate§f!" + ] + } + }, + { + "type": "EGG", + "amount": 16, + "data": 0, + "meta": { + "displayName": "§d§lEggport", + "lore": [ + "", + "§6❙ §fSwitch places with your", + "§6❙ §fenemy that are within §c§l15 §fblocks!", + "", + "§fCan be found in the §6§lSummer Crate§f!" + ] + } + }, + { + "type": "MONSTER_EGG", + "amount": 5, + "data": 66, + "meta": { + "displayName": "§5§lWitch Effect", + "lore": [ + "", + "§6❙ §fSpawn a witch that give you passive", + "§6❙ §fbard effects: strength, regeneration,", + "§6❙ §fand resistance.", + "", + "§fCan be found in the §d§lPartner Crate§f!" + ] + } + }, + { + "type": "IRON_BLOCK", + "amount": 5, + "data": 0, + "meta": { + "displayName": "§a§lTank", + "lore": [ + "", + "§6❙ §fEvery potion you splash for", + "§6❙ §e§l15 seconds §fwill fully heal you!", + "", + "§fCan be found in the §d§lPartner Crate§f!" + ] + } + } + ] +} \ No newline at end of file diff --git a/Configs + Precompiled/config/HCTeams/data/tips.yml b/Configs + Precompiled/config/HCTeams/data/tips.yml new file mode 100644 index 0000000..c574048 --- /dev/null +++ b/Configs + Precompiled/config/HCTeams/data/tips.yml @@ -0,0 +1,29 @@ +tips: + id_0: + text: Find out what goes on every day in the map by typing &f/schedule&6! + id_1: + text: Support your favorite content creator by typing &f/redeem [creator]&6 for free keys! + id_2: + text: Want free keys? Type &f/vote &6and vote for us once a day for free keys! + id_3: + text: Want to hide ability cooldowns from your scoreboard? Type &f/settings&6! + id_4: + text: Kill players to obtain gems to purchase upgrades through &f/f upgrades&6. + id_5: + text: Don't like the sale timers covering your scoreboard? Type &f/settings&6! + id_6: + text: Learn about everything on the server by typing &f/help&6! + id_7: + text: Want to run into a faction's base? Type &f/runningin &6to find the closest 1 DTR base to you! + id_8: + text: Customize all name tag colors by typing &f/nametags&6! + id_9: + text: Embarass your opponents with Kill Tags! &f/killtags + id_10: + text: View all of our custom armor classes by typing &f/armorclasses&6! + id_11: + text: Crapples are limited to &c&l12 &6uses both in &cNether &6and &5End&6! + id_12: + text: Capture &lRoad Outpost &6for access to &cregenerating chests &6and a &dreduced partner item &6cooldown. + id_13: + text: View all &5&lOutposts &6and their rewards by typing &f/outpost&6! diff --git a/Configs + Precompiled/config/HCTeams/data/treasureInfo.json b/Configs + Precompiled/config/HCTeams/data/treasureInfo.json new file mode 100644 index 0000000..f538805 --- /dev/null +++ b/Configs + Precompiled/config/HCTeams/data/treasureInfo.json @@ -0,0 +1,491 @@ +{ + "chests": [], + "loot": [ + { + "type": "EMERALD_BLOCK", + "amount": 32, + "data": 0 + }, + { + "type": "DIAMOND_BLOCK", + "amount": 32, + "data": 0 + }, + { + "type": "IRON_BLOCK", + "amount": 32, + "data": 0 + }, + { + "type": "GOLD_BLOCK", + "amount": 32, + "data": 0 + }, + { + "type": "DIAMOND_HOE", + "amount": 1, + "data": 0, + "meta": { + "displayName": "§cCrowbar", + "lore": [ + "", + "§7Can Break:", + "§f - §bEnd Portals: §e{§96§e}", + "§f - §bSpawners: §e{§91§e}" + ] + } + }, + { + "type": "EGG", + "amount": 8, + "data": 0, + "meta": { + "displayName": "§d§lEggport", + "lore": [ + "", + "§6❙ §fSwitch places with your", + "§6❙ §fenemy that are within §c§l15 §fblocks!", + "", + "§fCan be found in the §e§ki§6§lHalloween Crate§e§ki§f!" + ] + } + }, + { + "type": "BLAZE_ROD", + "amount": 3, + "data": 0, + "meta": { + "displayName": "§6§lAnti-Blockup", + "lore": [ + "", + "§6❙ §fWhen you hit a player with this", + "§6❙ §c§l3 times §fthey may not block up for §e§l15 seconds§f.", + "", + "§fCan be found in the §e§ki§6§lHalloween Crate§e§ki§f!" + ] + } + }, + { + "type": "PAPER", + "amount": 3, + "data": 0, + "meta": { + "displayName": "§a§lMed Kit", + "lore": [ + "", + "§6❙ §fRight Click to receive Resistance 3,", + "§6❙ §fRegeneration 3, and 4 Absorption", + "§6❙ §fHearts for §e§l5 seconds§f!", + "", + "§fCan be found in the §e§ki§6§lHalloween Crate§e§ki§f!" + ] + } + }, + { + "type": "INK_SACK", + "amount": 3, + "data": 0, + "meta": { + "displayName": "§3§lInvisibility", + "lore": [ + "", + "§6❙ §fWhen you right click this item", + "§6❙ §fyour armor will no longer be visible.", + "", + "§fCan be found in an §b§lAirdrop§f!" + ] + } + }, + { + "type": "DIAMOND_SWORD", + "amount": 1, + "data": 0, + "enchants": [ + { + "enchantment": "DAMAGE_ALL", + "level": 2 + }, + { + "enchantment": "DURABILITY", + "level": 3 + } + ], + "meta": { + "displayName": "§6§lTreasure §7Sword" + } + }, + { + "type": "DIAMOND_HELMET", + "amount": 1, + "data": 0, + "enchants": [ + { + "enchantment": "PROTECTION_ENVIRONMENTAL", + "level": 2 + }, + { + "enchantment": "DURABILITY", + "level": 3 + } + ], + "meta": { + "displayName": "§6§lTreasure §7Helmet" + } + }, + { + "type": "DIAMOND_CHESTPLATE", + "amount": 1, + "data": 0, + "enchants": [ + { + "enchantment": "PROTECTION_ENVIRONMENTAL", + "level": 2 + }, + { + "enchantment": "DURABILITY", + "level": 3 + } + ], + "meta": { + "displayName": "§6§lTreasure §7Chestplate" + } + }, + { + "type": "DIAMOND_LEGGINGS", + "amount": 1, + "data": 0, + "enchants": [ + { + "enchantment": "PROTECTION_ENVIRONMENTAL", + "level": 2 + }, + { + "enchantment": "DURABILITY", + "level": 3 + } + ], + "meta": { + "displayName": "§6§lTreasure §7Leggings" + } + }, + { + "type": "DIAMOND_BOOTS", + "amount": 1, + "data": 0, + "enchants": [ + { + "enchantment": "PROTECTION_ENVIRONMENTAL", + "level": 2 + }, + { + "enchantment": "DURABILITY", + "level": 3 + }, + { + "enchantment": "PROTECTION_FALL", + "level": 4 + } + ], + "meta": { + "displayName": "§6§lTreasure §7Boots" + } + }, + { + "type": "GOLDEN_APPLE", + "amount": 1, + "data": 1 + }, + { + "type": "GOLDEN_APPLE", + "amount": 16, + "data": 0 + }, + { + "type": "INK_SACK", + "amount": 1, + "data": 14, + "meta": { + "displayName": "§6§lPortable Bard", + "lore": [ + "", + "§6❙ §fReceive §c§l5 §fportable bard effects!", + "", + "§fCan be found in an §b§lAirdrop§f!" + ] + } + }, + { + "type": "MONSTER_EGG", + "amount": 3, + "data": 66, + "meta": { + "displayName": "§5§lWitch Effect", + "lore": [ + "", + "§6❙ §fSpawn a witch that give you passive", + "§6❙ §fbard effects: strength, regeneration,", + "§6❙ §fand resistance.", + "", + "§fCan be found in the §d§lPartner Crate§f!" + ] + } + }, + { + "type": "NETHER_STALK", + "amount": 32, + "data": 0 + }, + { + "type": "SPECKLED_MELON", + "amount": 16, + "data": 0 + }, + { + "type": "GLOWSTONE_DUST", + "amount": 8, + "data": 0 + }, + { + "type": "SULPHUR", + "amount": 8, + "data": 0 + }, + { + "type": "SUGAR", + "amount": 8, + "data": 0 + }, + { + "type": "FERMENTED_SPIDER_EYE", + "amount": 32, + "data": 0 + }, + { + "type": "TRIPWIRE_HOOK", + "amount": 3, + "data": 0, + "meta": { + "displayName": "§e§ki§6§l Halloween Keys §e§ki", + "lore": [ + "", + "§7Right click the §6§lHalloween Crate §7to obtain rewards" + ] + } + }, + { + "type": "TRIPWIRE_HOOK", + "amount": 5, + "data": 0, + "meta": { + "displayName": "§5§lLegendary Key", + "lore": [ + "", + "§7Right click the §5Legendary Crate §7to obtain rewards!" + ] + } + }, + { + "type": "BEACON", + "amount": 1, + "data": 0, + "meta": { + "displayName": "§6§lReinforce Lootbox", + "lore": [ + "§7Unlocked at §fstore.cavepvp.org", + "", + "§c§lEND REWARDS", + "§8┃ §4§lLEGENDARY §4Cave §7Rank", + "§8┃ §4§lLEGENDARY §aSpring §7Rank", + "§8┃ §4§lLEGENDARY §dRavine §7Rank", + "§8┃ §4§lLEGENDARY §2$§a50 §7Buycraft Voucher", + "§8┃ §4§lLEGENDARY §2$§a25 §7Buycraft Voucher", + "§8┃ §4§lLEGENDARY §ePremium Battle Pass", + "§8┃ §5§lRARE §77d §e§lVIP §7Subscription", + "§8┃ §5§lRARE §72x §c§lPerk §7Keys", + "§8┃ §5§lRARE §2$§a10 §7Buycraft Voucher", + "§8┃ §d§lUNCOMMON §73x §b§lAirdrops", + "§8┃ §a§lCOMMON §7Random Clickable Kit", + "§8┃ §a§lCOMMON §56x §7End Portal Frames", + "§8┃ §a§lCOMMON §616x §7God Apples", + "§8┃ §a§lCOMMON §e64x §7Golden Apples", + "", + "§c§lREWARDS", + "§8┃ §c§lRARE §cFire §7Sword", + "§8┃ §d§lUNCOMMON §bDiamond §7Helmet", + "§8┃ §d§lUNCOMMON §bDiamond §7Chestplate", + "§8┃ §d§lUNCOMMON §bDiamond §7Leggings", + "§8┃ §d§lUNCOMMON §bDiamond §7Boots", + "§8┃ §d§lUNCOMMON §bDiamond §7Looting Sword", + "§8┃ §a§lCOMMON §6Gold §7Helmet", + "§8┃ §a§lCOMMON §6Gold §7Chestplate", + "§8┃ §a§lCOMMON §6Gold §7Leggings", + "§8┃ §a§lCOMMON §6Gold §7Boots", + "§8┃ §a§lCOMMON §dLeather §7Helmet", + "§8┃ §a§lCOMMON §dLeather §7Chestplate", + "§8┃ §a§lCOMMON §dLeather §7Leggings", + "§8┃ §a§lCOMMON §dLeather §7Boots" + ] + } + }, + { + "type": "ENDER_CHEST", + "amount": 1, + "data": 0, + "meta": { + "displayName": "§e§ki§6§l Fall Lootbox §e§ki", + "lore": [ + "§7Unlocked at §fstore.cavepvp.org", + "", + "§6§lFINAL REWARDS", + " §7➡ §4Cave Rank", + " §7➡ §6Spooky Rank", + " §7➡ §6Premium Battle Pass", + " §7➡ §e§lVIP Subscription", + " §7➡ §6§lHalloween Kit", + " §7➡ §2$§a10 Buycraft Voucher", + " §7➡ §2$§a5 Buycraft Voucher", + " §7➡ §a§l2x Perk Keys", + " §7➡ §b§l3x Airdrops", + " §7➡ §6§l5x Halloween Keys", + " §7➡ §cRandom Clickable Kit", + "", + "§6§lNORMAL REWARDS", + " §7➡ §d16x Eggports", + " §7➡ §68x Anti-Blockup", + " §7➡ §a8x Med Kit", + " §7➡ §68x Midas Touch", + " §7➡ §cCrowbar", + " §7➡ §6§lGod Apple", + " §7➡ §632x Golden Apple", + " §7➡ §4OP Bow", + " §7➡ §bDiamond Sword", + " §7➡ §bDiamond Helmet", + " §7➡ §bDiamond Chestplate", + " §7➡ §bDiamond Leggings", + " §7➡ §bDiamond Boots", + " §7➡ §bDiamond Pickaxe", + " §7➡ §d16x Random Valuable Blocks", + " §7➡ §832x Gun Powder", + " §7➡ §e32x Glowstone Blocks", + " §7➡ §432x Nether Wart", + " §7➡ §c32x Glistering Melons" + ] + } + }, + { + "type": "DROPPER", + "amount": 1, + "data": 0, + "meta": { + "displayName": "§b§lAir Drop", + "lore": [ + "§7Obtainable at §fstore.cavepvp.org§7.", + "", + "§ePlace this down to designate a location for the drop!" + ] + } + }, + { + "type": "STICK", + "amount": 3, + "data": 0, + "meta": { + "displayName": "§3§lSpin Bot", + "lore": [ + "", + "§6❙ §fHit a player §c§l3 times §fand every", + "§6❙ §fhit for §e§l10 seconds §fhas a chance", + "§6❙ §fof rotating their head", + "", + "§fCan be found in the §d§lPartner Crate§f!" + ] + } + }, + { + "type": "EXPLOSIVE_MINECART", + "amount": 1, + "data": 0, + "meta": { + "displayName": "§4§lTNT Minecart", + "lore": [ + "", + "§6❙ §fRight Click to spawn a TNT Minecart", + "§6❙ §c§l50 blocks §fabove your head!", + "", + "§fCan be found in an §b§lAirdrop§f!" + ] + } + }, + { + "type": "WATCH", + "amount": 3, + "data": 0, + "meta": { + "displayName": "§6§lTime Warp", + "lore": [ + "", + "§6❙ §fTravel back to where", + "§6❙ §fyou last threw a pearl!", + "", + "§fCan be found in an §b§lAirdrop§f!" + ] + } + }, + { + "type": "SNOW_BALL", + "amount": 3, + "data": 0, + "meta": { + "displayName": "§4§lBall Of Rage", + "lore": [ + "", + "§6❙ §fThrow to create a cloud of effects", + "§6❙ §fwhere all teammates within 5 block", + "§6❙ §fradius will be given positive effects.", + "", + "§fCan be found in the §4§lCave Crate§f!" + ] + } + }, + { + "type": "NETHER_STAR", + "amount": 1, + "data": 0, + "meta": { + "displayName": "§b§lNinja Star", + "lore": [ + "", + "§6❙ §fTeleport to the last person that", + "§6❙ §fhit you within the last §e§l30 seconds§f!", + "", + "§fCan be found in an §b§lAirdrop§f!" + ] + } + }, + { + "type": "GOLD_INGOT", + "amount": 3, + "data": 0, + "meta": { + "displayName": "§6§lMidas Touch", + "lore": [ + "", + "§6❙ §fClick to activate and for §e§l15 seconds", + "§6❙ §fa 3x3 of gold blocks appear under you.", + "§6❙ §fYou cannot break/place/interact with.", + "§6❙ §fblocks on top of these gold blocks.", + "", + "§fCan be found in the §6§lSummer Lootbox§f!" + ] + } + } + ], + "centralChest": { + "world": "world_nether", + "x": -70.0, + "y": 39.0, + "z": 641.0, + "yaw": 0.0, + "pitch": 0.0 + } +} \ No newline at end of file diff --git a/Configs + Precompiled/config/HCTeams/data/treasurechests/illuminated.yml b/Configs + Precompiled/config/HCTeams/data/treasurechests/illuminated.yml new file mode 100644 index 0000000..cb94769 --- /dev/null +++ b/Configs + Precompiled/config/HCTeams/data/treasurechests/illuminated.yml @@ -0,0 +1,620 @@ +centralLocation: + ==: net.frozenorb.foxtrot.util.PersistableLocation + worldName: Spawn + x: -20.5 + y: 71.0 + z: 26.5 + yaw: '249.30031' + pitch: '26.550003' +displayName: '&b&lIlluminated Chest' +slot: 15 +maxOpened: 4 +material: BEACON +location: + location_1: + ==: net.frozenorb.foxtrot.util.PersistableLocation + worldName: Spawn + x: -18.0 + y: 71.0 + z: 25.0 + yaw: '0.0' + pitch: '0.0' + location_2: + ==: net.frozenorb.foxtrot.util.PersistableLocation + worldName: Spawn + x: -20.0 + y: 71.0 + z: 23.0 + yaw: '0.0' + pitch: '0.0' + location_3: + ==: net.frozenorb.foxtrot.util.PersistableLocation + worldName: Spawn + x: -22.0 + y: 71.0 + z: 23.0 + yaw: '0.0' + pitch: '0.0' + location_4: + ==: net.frozenorb.foxtrot.util.PersistableLocation + worldName: Spawn + x: -18.0 + y: 71.0 + z: 27.0 + yaw: '0.0' + pitch: '0.0' + location_5: + ==: net.frozenorb.foxtrot.util.PersistableLocation + worldName: Spawn + x: -20.0 + y: 71.0 + z: 29.0 + yaw: '0.0' + pitch: '0.0' + location_6: + ==: net.frozenorb.foxtrot.util.PersistableLocation + worldName: Spawn + x: -22.0 + y: 71.0 + z: 29.0 + yaw: '0.0' + pitch: '0.0' + location_7: + ==: net.frozenorb.foxtrot.util.PersistableLocation + worldName: Spawn + x: -24.0 + y: 71.0 + z: 25.0 + yaw: '0.0' + pitch: '0.0' + location_8: + ==: net.frozenorb.foxtrot.util.PersistableLocation + worldName: Spawn + x: -24.0 + y: 71.0 + z: 27.0 + yaw: '0.0' + pitch: '0.0' +players: + 2a4c51af-3d63-404d-aac5-a3c601c3f46c: 0 + d342cf11-aff3-4bbc-bef7-a597b2ba90c4: 0 + f054225b-78a6-4a59-8687-591f36a27b28: 0 + c2a5ac53-f540-4751-855a-141c9c549e16: 0 + c2629d40-f1a9-4492-9101-165c7b5ca1dd: 0 + 8354c8ac-00b8-4b56-b674-956617f06011: 0 + f436a5a8-d088-4777-b11a-d20e10d48724: 2516 + a75512f0-7af7-480a-ab8b-d7440f05b5bc: 0 + cea5c426-7f41-4d36-89f4-20c688f542dc: 0 + 2eed317f-d4bb-4fe5-a615-8de445ad9b40: 0 + fd093589-e65d-49c8-bfc4-17bf6bce6e96: 0 + 69d354ba-1691-4f69-91ee-741086e3373b: 0 + f4482bf7-9702-4626-bfff-c40e99c6f337: 9 + dde9ed5b-a959-4efb-b0c5-049ab5d63804: 7 + b8dec0a3-eec3-4c22-a10d-ac712f869019: 0 +rewards: + reward_9: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: INK_SACK + damage: 1 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §4§l60d Cave Rank + chance: 0.5 + command: vouchers addrank {player} Cave 60d &4&l60d Cave Rank + giveItem: false + broadcast: true + reward_10: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: INK_SACK + damage: 10 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §a§l75d §2§lSpring §a§lRank + chance: 0.0 + command: vouchers addrank {player} Holiday 75d &a&l75d Spring Rank + giveItem: false + broadcast: true + reward_11: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: GOLD_INGOT + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §2§l$§a§l35 Buycraft Voucher + chance: 15.0 + command: vouchers addamount {player} 35 + giveItem: false + broadcast: true + reward_12: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: EMERALD_ORE + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §2§l$§a§l50 Buycraft Voucher + chance: 0.0 + command: vouchers addamount {player} 50 + giveItem: false + broadcast: true + reward_13: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: EMERALD_BLOCK + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §2§l$§a§l100 Gift Card + chance: 0.0 + command: vouchers add {player} &2$&a100 Gift Card + giveItem: false + broadcast: true + reward_14: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: TRIPWIRE_HOOK + amount: 32 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §4§l32x Random Owner Keys + chance: 5.0 + command: randomownerkeys {player} 32 + giveItem: false + broadcast: false + reward_15: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: BOOK + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §c§l5x Random Clickable Kit + chance: 5.0 + command: randomclickablekit {player} 5 + giveItem: false + broadcast: true + reward_16: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: BLAZE_ROD + amount: 32 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lAnti-Blockup + lore: + - §7When you hit a player with this + - §73 times they may not block up for 15 seconds. + - '' + - §fCan be found in the §4§l3.0 Crate§f! + chance: 5.0 + command: ability antiblockup 32 {player} + giveItem: false + broadcast: false + reward_17: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: PAPER + amount: 32 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §a§lMed Kit + lore: + - §7Right Click to receive Resistance 3, + - §7Regeneration 3, and 4 Absorption + - §7Hearts for 5 seconds! + - '' + - §fCan be found in the §4§l3.0 Crate§f! + chance: 5.0 + command: ability medkit 32 {player} + giveItem: false + broadcast: false + reward_18: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: NETHER_STAR + amount: 16 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §b§lNinja Star + lore: + - §7Teleport to the last + - §7person who hit you within 30 seconds. + - '' + - §fCan be found in an §b§lAirdrop§f! + chance: 5.0 + command: ability ninjastar 16 {player} + giveItem: false + broadcast: false + reward_19: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: TRIPWIRE_HOOK + amount: 32 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §d§lPartner Key + lore: + - §7Right click a §dPartner Crate §7to receive rewards! + enchants: + DURABILITY: 1 + chance: 5.0 + command: none + giveItem: true + broadcast: false + reward_20: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: EMERALD_BLOCK + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §f§ki§a§l SOTW Bundle §f§ki + chance: 10.0 + command: vouchers addbundles {player} SOTW §2§ki§a§l SOTW Bundle §2§ki + giveItem: false + broadcast: true + reward_21: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: REDSTONE_BLOCK + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §f§ki§4§l OP Bundle §f§ki + chance: 0.0 + command: vouchers addbundles {player} Seasonal §f§ki§4§l OP Bundle §f§ki + giveItem: false + broadcast: true + reward_22: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: BEDROCK + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §f§ki§6§l Supreme Fall Bundle §f§ki + chance: 0.0 + command: vouchers addbundles {player} Supreme §f§ki§6§l Supreme Fall Bundle §f§ki + giveItem: false + broadcast: true + reward_23: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: NETHER_STAR + amount: 3 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §a§lPerk Key + lore: + - '' + - §7Right click the §aPerk Crate §7to obtain rewards! + chance: 1.0 + command: none + giveItem: true + broadcast: false + reward_24: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: CHEST + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §a§lGrinder Armor Class + lore: + - '' + - '§aPerks:' + - §a❙ §f2x permanent XP multiplier + - '' + - §aClick to redeem this armor set + chance: 2.5 + command: none + giveItem: true + broadcast: false + reward_25: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: CHEST + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §c§lPyromaniac Armor Class + lore: + - '' + - '§cPerks:' + - §c❙ §fSHIFT + Click to throw shockwaves + - §c❙ §f1% chance of putting them on Fire and giving them Wither I for 8 seconds. + - '' + - §aClick to redeem this armor set + chance: 2.5 + command: none + giveItem: true + broadcast: false + reward_26: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: CHEST + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §5§lTrapper Armor Class + lore: + - '' + - '§5Perks:' + - §5❙ §fTake 10% less damage + - §5❙ §fMed Kits and Portable Resistance last 25% longer + - §5❙ §fSHIFT + Click to put the last player you hit on Ability Item cooldown + - '' + - §aClick to redeem this armor set + chance: 2.5 + command: none + giveItem: true + broadcast: false + reward_27: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: CHEST + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §4§lRaider Armor Class + lore: + - '' + - '§4Perks:' + - §4❙ §fDeal 5% more damage + - §4❙ §f10% Reduced Partner Item cooldown + - §4❙ §fSHIFT + Click to activate Midas Touch for 10 seconds + - '' + - §aClick to redeem this armor set + chance: 2.5 + command: none + giveItem: true + broadcast: false + reward_28: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: CHEST + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §c§lSpider Man Armor Class + lore: + - '' + - '§cPerks:' + - §c❙ §f25% Fall Damage Reduction + - §c❙ §fPermanent Jump Boost II, Speed II, Fire Resistance I + - §c❙ §fSHIFT + Click to put the last player you hit in cobwebs! + - '' + - §aClick to redeem this armor set + chance: 2.5 + command: none + giveItem: true + broadcast: false + reward_29: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: DROPPER + amount: 10 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §b§lAir Drop + lore: + - §7Obtainable at §fstore.cavepvp.org§7. + - '' + - §ePlace this down to designate a location for the drop! + chance: 3.0 + command: none + giveItem: true + broadcast: false + reward_30: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: ENDER_CHEST + amount: 5 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §e§ki§6§l Fall Lootbox §e§ki + lore: + - §7Unlocked at §fstore.cavepvp.org + - '' + - §6§lFINAL REWARDS + - ' §7➡ §4Cave Rank' + - ' §7➡ §6Spooky Rank' + - ' §7➡ §6Premium Battle Pass' + - ' §7➡ §e§lVIP Subscription' + - ' §7➡ §6§lHalloween Kit' + - ' §7➡ §2$§a10 Buycraft Voucher' + - ' §7➡ §2$§a5 Buycraft Voucher' + - ' §7➡ §a§l2x Perk Keys' + - ' §7➡ §b§l3x Airdrops' + - ' §7➡ §6§l5x Halloween Keys' + - ' §7➡ §cRandom Clickable Kit' + - '' + - §6§lNORMAL REWARDS + - ' §7➡ §d16x Eggports' + - ' §7➡ §68x Anti-Blockup' + - ' §7➡ §a8x Med Kit' + - ' §7➡ §68x Midas Touch' + - ' §7➡ §cCrowbar' + - ' §7➡ §6§lGod Apple' + - ' §7➡ §632x Golden Apple' + - ' §7➡ §4OP Bow' + - ' §7➡ §bDiamond Sword' + - ' §7➡ §bDiamond Helmet' + - ' §7➡ §bDiamond Chestplate' + - ' §7➡ §bDiamond Leggings' + - ' §7➡ §bDiamond Boots' + - ' §7➡ §bDiamond Pickaxe' + - ' §7➡ §d16x Random Valuable Blocks' + - ' §7➡ §832x Gun Powder' + - ' §7➡ §e32x Glowstone Blocks' + - ' §7➡ §432x Nether Wart' + - ' §7➡ §c32x Glistering Melons' + chance: 4.0 + command: none + giveItem: true + broadcast: false + reward_31: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: ENDER_CHEST + amount: 3 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §e§ki§6§ki§e§ki§6§l §nOCTOBER MYSTERY BOX§e §ki§6§ki§e§ki + lore: + - §fPurchaseable at §estore.cavepvp.org + - '' + - §e<§m----§6§l ALL REWARDS §e§m----§e> + - §f* §4§lEXTREME §e§ki§6 Custom Rank §e§ki + - §f* §5§lULTIMATE §fCave Rank + - §f* §5§lULTIMATE §fHoliday Rank + - §f* §2§lCASH §2$§a100.00 §fStore Voucher + - §f* §2§lCASH §2$§a50.00 §fStore Voucher + - §f* §2§lCASH §2$§a25.00 §fStore Voucher + - §f* §2§lCASH §2$§a10.00 §fStore Voucher + - §f* §c§lRARE §f5x Air Drop + - §f* §c§lRARE §f10x Fall Lootboxes + - §f* §c§lRARE §f16x Owner Keys + - §f* §c§lRARE §f24x Partner Keys + - §f* §c§lRARE §f32x Halloween Keys + - §f* §c§lRARE §f5x Zeus Hammer + - §f* §c§lRARE §f3x Random Clickable Kits + - '' + - §e<§m----§6§l ALL REWARDS §e§m----§e> + - §f* §c§lRARE §f1x Air Drop + - §f* §c§lRARE §f3x Fall Lootboxes + - §f* §c§lRARE §f5x Halloween Keys + - §f* §c§lRARE §f10x Cave Keys + - §f* §c§lRARE §f16x Legendary Keys + - §f* §c§lRARE §fEvader Custom Enchant + - §f* §c§lRARE §fGuardian Angel Custom Enchant + - §f* §6§lUNCOMMON §fLazy Brewer + - §f* §6§lUNCOMMON §f5x Power Stone + - §f* §6§lUNCOMMON §f5x Reality Stone + - §f* §6§lUNCOMMON §f5x Soul Stone + - §f* §6§lUNCOMMON §f5x Mind Stone + - §f* §6§lUNCOMMON §f5x Time Stone + - §f* §6§lUNCOMMON §f1x September Helmet + - §f* §6§lUNCOMMON §f1x September Chestplate + - §f* §6§lUNCOMMON §f1x September Leggings + - §f* §6§lUNCOMMON §f1x September Boots + - §f* §6§lUNCOMMON §f1x September Sword + - §f* §6§lUNCOMMON §f1x September Pickaxe + - §f* §6§lUNCOMMON §f1x September Bow + - §f* §a§lCOMMON §f64x Random Valuables + - §f* §a§lCOMMON §f2x Crowbar + - §f* §a§lCOMMON §f6x GOD Apples + - §f* §a§lCOMMON §f32x Golden Apples + - §f* §a§lCOMMON §f128x Ender Pearl + chance: 2.0 + command: none + giveItem: true + broadcast: false + reward_32: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: GOLD_INGOT + amount: 10 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §e§lSoul Stone + lore: + - '' + - §6❙ §fUpon going below 2 hearts, you will be instantly + - §6❙ §fhealed and given Resistance III for §e§l5 seconds§f. + - '' + - §fCan be found in the §6§lOctober Mystery Box§f! + chance: 4.0 + command: none + giveItem: true + broadcast: false + reward_33: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: INK_SACK + damage: 5 + amount: 10 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §5§lPower Stone + lore: + - '' + - §6❙ §fRight Click to receive Strength II, + - §6❙ §fResistance III and Regeneration III for §e§l10 seconds + - §6❙ §fDuring that time you may not use any potions! + - '' + - §fCan be found in the §6§lOctober Mystery Box§f! + chance: 2.0 + command: none + giveItem: true + broadcast: false + reward_34: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: REDSTONE + amount: 10 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §c§lReality Stone + lore: + - '' + - §6❙ §fRight Click to teleport to the player + - §6❙ §fthat you last hit within a §e§l30 second §fperiod. + - '' + - §fCan be found in the §6§lOctober Mystery Box§f! + chance: 2.0 + command: none + giveItem: true + broadcast: false + reward_35: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: EMERALD + amount: 10 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §a§lTime Stone + lore: + - '' + - §6❙ §fRight Click to reset all of your + - §6❙ §fability/partner item cooldowns. + - '' + - §fCan be found in the §6§lOctober Mystery Box§f! + chance: 2.0 + command: none + giveItem: true + broadcast: false + reward_36: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: TRIPWIRE_HOOK + amount: 10 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §e§ki§6§l Halloween Keys §e§ki + lore: + - '' + - §7Right click the §6§lHalloween Crate §7to obtain rewards + chance: 3.0 + command: none + giveItem: true + broadcast: false diff --git a/Configs + Precompiled/config/HCTeams/data/treasurechests/omega.yml b/Configs + Precompiled/config/HCTeams/data/treasurechests/omega.yml new file mode 100644 index 0000000..7210133 --- /dev/null +++ b/Configs + Precompiled/config/HCTeams/data/treasurechests/omega.yml @@ -0,0 +1,495 @@ +centralLocation: + ==: net.frozenorb.foxtrot.util.PersistableLocation + worldName: Spawn + x: -20.5 + y: 71.0 + z: 26.5 + yaw: '249.30031' + pitch: '26.550003' +displayName: '&4&lOmega Chest' +slot: 11 +maxOpened: 4 +material: EYE_OF_ENDER +location: + location_1: + ==: net.frozenorb.foxtrot.util.PersistableLocation + worldName: Spawn + x: -18.0 + y: 71.0 + z: 25.0 + yaw: '0.0' + pitch: '0.0' + location_2: + ==: net.frozenorb.foxtrot.util.PersistableLocation + worldName: Spawn + x: -20.0 + y: 71.0 + z: 23.0 + yaw: '0.0' + pitch: '0.0' + location_3: + ==: net.frozenorb.foxtrot.util.PersistableLocation + worldName: Spawn + x: -22.0 + y: 71.0 + z: 23.0 + yaw: '0.0' + pitch: '0.0' + location_4: + ==: net.frozenorb.foxtrot.util.PersistableLocation + worldName: Spawn + x: -18.0 + y: 71.0 + z: 27.0 + yaw: '0.0' + pitch: '0.0' + location_5: + ==: net.frozenorb.foxtrot.util.PersistableLocation + worldName: Spawn + x: -20.0 + y: 71.0 + z: 29.0 + yaw: '0.0' + pitch: '0.0' + location_6: + ==: net.frozenorb.foxtrot.util.PersistableLocation + worldName: Spawn + x: -22.0 + y: 71.0 + z: 29.0 + yaw: '0.0' + pitch: '0.0' + location_7: + ==: net.frozenorb.foxtrot.util.PersistableLocation + worldName: Spawn + x: -24.0 + y: 71.0 + z: 25.0 + yaw: '0.0' + pitch: '0.0' + location_8: + ==: net.frozenorb.foxtrot.util.PersistableLocation + worldName: Spawn + x: -24.0 + y: 71.0 + z: 27.0 + yaw: '0.0' + pitch: '0.0' +players: + 2a4c51af-3d63-404d-aac5-a3c601c3f46c: 0 + f79e8218-6b86-49c0-9bab-9328ba5760f6: 0 + 196acdde-45bb-420c-bea0-c2e6244d908e: 1 + f54e2116-df34-4970-b71b-7f5d3ed29dc0: 0 + 7e9a2e08-98fa-4a3a-a506-232a2bf88b6c: 0 + 4eae57e8-3948-48f5-87b0-edab39a95502: 0 + 581735a7-6a7e-438f-be7b-292ade9a1d66: 0 + a75512f0-7af7-480a-ab8b-d7440f05b5bc: 0 + 74873c13-3394-4306-b92a-c0ed3cab6ea4: 0 + 4fd6b5dc-4ef4-4d09-b5fb-ab31b702d3cc: 0 + d5c74946-be98-4c59-b5fc-198703a6cc8a: 0 + 10fcd790-cb4f-4a1b-b780-522e24ae62c0: 0 + 51916132-1ac0-4667-8e24-e487b7ad0dd3: 11 + 51eadbc2-33db-4410-b227-ef540e282f85: 2 + dde9ed5b-a959-4efb-b0c5-049ab5d63804: 9 + fec07ad5-3cd0-4147-90be-c4b8add7dfcd: 0 + 762a0eb8-3a2a-4c91-8624-8cb6dd568053: 2 + c353fe06-5b90-4d5d-8e2b-802f19322050: 0 + b8dec0a3-eec3-4c22-a10d-ac712f869019: 0 + c244ace7-7d6c-4b48-8683-08ed5536ab00: 0 +rewards: + reward_9: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: RAW_FISH + damage: 2 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §b§lFrenzy Network Booster + chance: 1.0 + command: booster give Frenzy 1 {player} + giveItem: false + broadcast: true + reward_10: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: INK_SACK + damage: 1 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §4§l60d Cave Rank + chance: 0.0 + command: vouchers addrank {player} Cave 60d &4&l60d Cave Rank + giveItem: false + broadcast: true + reward_11: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: INK_SACK + damage: 10 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §a§l30d §2§lSpring §a§lRank + chance: 0.0 + command: vouchers addrank {player} Holiday 30d &c&l90d Spring Rank + giveItem: false + broadcast: true + reward_12: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: EMERALD_BLOCK + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §2§l$§a§l25 Buycraft Voucher + chance: 10.0 + command: vouchers addamount {player} 25 + giveItem: false + broadcast: true + reward_13: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: EMERALD_BLOCK + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §2§l$§a§l50 Voucher + chance: 0.0 + command: vouchers addamount {player} 50 + giveItem: false + broadcast: true + reward_14: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: TRIPWIRE_HOOK + amount: 16 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §4§l16x Random Owner Keys + chance: 5.0 + command: randomownerkeys {player} 16 + giveItem: false + broadcast: false + reward_15: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: BOOK + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §c§l3x Random Clickable Kit + chance: 5.0 + command: randomclickablekit {player} 3 + giveItem: false + broadcast: true + reward_16: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: EGG + amount: 32 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §d§lEggport + lore: + - §7Switch places with your + - §7enemy that are within 15 blocks! + - '' + - §fCan be found in the §4§l3.0 Crate§f! + chance: 5.0 + command: ability eggport 32 {player} + giveItem: false + broadcast: false + reward_17: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: BLAZE_ROD + amount: 16 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lAnti-Blockup + lore: + - §7When you hit a player with this + - §73 times they may not block up for 15 seconds. + - '' + - §fCan be found in the §4§l3.0 Crate§f! + chance: 5.0 + command: ability antiblockup 16 {player} + giveItem: false + broadcast: false + reward_18: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: PAPER + amount: 16 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §a§lMed Kit + lore: + - §7Right Click to receive Resistance 3, + - §7Regeneration 3, and 4 Absorption + - §7Hearts for 5 seconds! + - '' + - §fCan be found in the §4§l3.0 Crate§f! + chance: 5.0 + command: ability medkit 16 {player} + giveItem: false + broadcast: false + reward_19: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: WORKBENCH + amount: 16 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §4§lCrafting Chaos + lore: + - §7Hit an enemy and for 10 seconds, every + - §7hit you deal has a 15% chance of + - §7putting them in a crafting table. + - '' + - §fCan be found in the §4§lQnA §fCrate! + chance: 5.0 + command: ability craftingchaos 10 {player} + giveItem: false + broadcast: false + reward_20: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: NETHER_STAR + amount: 10 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §b§lNinja Star + lore: + - §7Teleport to the last + - §7person who hit you within 30 seconds. + - '' + - §fCan be found in an §b§lAirdrop§f! + chance: 5.0 + command: ability ninjastar 10 {player} + giveItem: false + broadcast: false + reward_21: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: TRIPWIRE_HOOK + amount: 20 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §d§lPartner Key + lore: + - §7Right click a §dPartner Crate §7to receive rewards! + enchants: + DURABILITY: 1 + chance: 5.0 + command: none + giveItem: true + broadcast: false + reward_22: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: EMERALD_BLOCK + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §f§ki§a§l SOTW Bundle §f§ki + chance: 7.0 + command: vouchers addbundles {player} SOTW §2§ki§a§l SOTW Bundle §2§ki + giveItem: false + broadcast: true + reward_23: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: REDSTONE_BLOCK + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §f§ki§6§l Fall Bundle §f§ki + chance: 2.5 + command: vouchers addbundles {player} Seasonal §f§ki§6§l Fall Bundle §f§ki + giveItem: false + broadcast: true + reward_24: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: BEDROCK + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §f§ki§4§l Supreme Fall Bundle §f§ki + chance: 0.0 + command: vouchers addbundles {player} Supreme §f§ki§4§l Supreme Fall Bundle §f§ki + giveItem: false + broadcast: true + reward_25: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: ENDER_CHEST + amount: 3 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §e§ki§6§l Fall Lootbox §e§ki + lore: + - §7Unlocked at §fstore.cavepvp.org + - '' + - §4§lFINAL REWARDS + - ' §7➡ §4Cave Rank' + - ' §7➡ §6Summer Rank' + - ' §7➡ §6Premium Battle Pass' + - ' §7➡ §e§lVIP Subscription' + - ' §7➡ §6§lSummer Kit' + - ' §7➡ §2$§a10 Buycraft Voucher' + - ' §7➡ §2$§a5 Buycraft Voucher' + - ' §7➡ §a§l2x Perk Keys' + - ' §7➡ §b§l3x Airdrops' + - ' §7➡ §6§l5x Summer Keys' + - ' §7➡ §cRandom Clickable Kit' + - '' + - §4§lNORMAL REWARDS + - ' §7➡ §d16x Eggports' + - ' §7➡ §68x Anti-Blockup' + - ' §7➡ §a8x Med Kit' + - ' §7➡ §68x Midas Touch' + - ' §7➡ §cCrowbar' + - ' §7➡ §6§lGod Apple' + - ' §7➡ §632x Golden Apple' + - ' §7➡ §4OP Bow' + - ' §7➡ §bDiamond Sword' + - ' §7➡ §bDiamond Helmet' + - ' §7➡ §bDiamond Chestplate' + - ' §7➡ §bDiamond Leggings' + - ' §7➡ §bDiamond Boots' + - ' §7➡ §bDiamond Pickaxe' + - ' §7➡ §d16x Random Valuable Blocks' + - ' §7➡ §832x Gun Powder' + - ' §7➡ §e32x Glowstone Blocks' + - ' §7➡ §432x Nether Wart' + - ' §7➡ §c32x Glistering Melons' + chance: 5.0 + command: crates give {player} Seasonal 5 + giveItem: false + broadcast: false + reward_26: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: DROPPER + amount: 5 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §b§lAir Drop + lore: + - §7Obtainable at §fstore.cavepvp.org§7. + - '' + - §ePlace this down to designate a location for the drop! + chance: 3.0 + command: none + giveItem: true + broadcast: false + reward_27: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: CHEST + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §c§lSpider Man Armor Class + lore: + - '' + - '§cPerks:' + - §c❙ §f25% Fall Damage Reduction + - §c❙ §fPermanent Jump Boost II, Speed II, Fire Resistance I + - §c❙ §fSHIFT + Click to put the last player you hit in cobwebs! + - '' + - §aClick to redeem this armor set + chance: 2.5 + command: none + giveItem: true + broadcast: false + reward_28: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: CHEST + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §5§lTrapper Armor Class + lore: + - '' + - '§5Perks:' + - §5❙ §fTake 10% less damage + - §5❙ §fMed Kits and Portable Resistance last 25% longer + - §5❙ §fSHIFT + Click to put the last player you hit on Ability Item cooldown + - '' + - §aClick to redeem this armor set + chance: 2.5 + command: none + giveItem: true + broadcast: false + reward_29: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: CHEST + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §4§lRaider Armor Class + lore: + - '' + - '§4Perks:' + - §4❙ §fDeal 5% more damage + - §4❙ §f10% Reduced Partner Item cooldown + - §4❙ §fSHIFT + Click to activate Midas Touch for 10 seconds + - '' + - §aClick to redeem this armor set + chance: 2.5 + command: none + giveItem: true + broadcast: false + reward_30: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: CHEST + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §c§lPyromaniac Armor Class + lore: + - '' + - '§cPerks:' + - §c❙ §fSHIFT + Click to throw shockwaves + - §c❙ §f1% chance of putting them on Fire and giving them Wither I for 8 seconds. + - '' + - §aClick to redeem this armor set + chance: 2.5 + command: none + giveItem: true + broadcast: false + reward_31: + itemStack: + ==: org.bukkit.inventory.ItemStack + type: CHEST + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §a§lGrinder Armor Class + lore: + - '' + - '§aPerks:' + - §a❙ §f2x permanent XP multiplier + - '' + - §aClick to redeem this armor set + chance: 2.5 + command: none + giveItem: true + broadcast: false diff --git a/Configs + Precompiled/config/HCTeams/eventSchedule.json b/Configs + Precompiled/config/HCTeams/eventSchedule.json new file mode 100644 index 0000000..3fed7c0 --- /dev/null +++ b/Configs + Precompiled/config/HCTeams/eventSchedule.json @@ -0,0 +1,338 @@ +{ + "8 0:0": "End", + "8 1:30": "Desert", + "8 3:0": "Village", + "8 4:30": "Hell", + "8 6:0": "Aquarium", + "8 7:30": "End", + "8 9:0": "Desert", + "8 10:30": "Village", + "8 12:0": "Hell", + "8 13:30": "Aquarium", + "8 15:0": "End", + "8 16:30": "Desert", + "8 18:0": "Village", + "8 19:30": "Hell", + "8 21:0": "Aquarium", + "8 22:30": "End", + "9 0:0": "Aquarium", + "9 1:30": "Desert", + "9 3:0": "Hell", + "9 4:30": "Village", + "9 6:0": "End", + "9 7:30": "Aquarium", + "9 9:0": "Desert", + "9 10:30": "Hell", + "9 12:0": "Village", + "9 13:30": "End", + "9 15:0": "Aquarium", + "9 16:30": "Desert", + "9 18:0": "Hell", + "9 19:30": "Village", + "9 21:0": "End", + "9 22:30": "Aquarium", + "10 0:0": "Village", + "10 1:30": "Aquarium", + "10 3:0": "Hell", + "10 4:30": "End", + "10 6:0": "Desert", + "10 7:30": "Village", + "10 9:0": "Aquarium", + "10 10:30": "Hell", + "10 12:0": "End", + "10 13:30": "Desert", + "10 15:0": "Village", + "10 16:30": "Aquarium", + "10 18:0": "Hell", + "10 19:30": "End", + "10 21:0": "Desert", + "10 22:30": "Village", + "11 0:0": "Desert", + "11 1:30": "Aquarium", + "11 3:0": "Village", + "11 4:30": "Hell", + "11 6:0": "End", + "11 7:30": "Desert", + "11 9:0": "Aquarium", + "11 10:30": "Village", + "11 12:0": "Hell", + "11 13:30": "End", + "11 15:0": "Desert", + "11 16:30": "Aquarium", + "11 18:0": "Village", + "11 19:30": "Hell", + "11 21:0": "End", + "11 22:30": "Desert", + "12 0:0": "Hell", + "12 1:30": "Desert", + "12 3:0": "End", + "12 4:30": "Aquarium", + "12 6:0": "Village", + "12 7:30": "Hell", + "12 9:0": "Desert", + "12 10:30": "End", + "12 12:0": "Aquarium", + "12 13:30": "Village", + "12 15:0": "Hell", + "12 16:30": "Desert", + "12 18:0": "End", + "12 19:30": "Aquarium", + "12 21:0": "Village", + "12 22:30": "Hell", + "13 0:0": "End", + "13 1:30": "Desert", + "13 3:0": "Village", + "13 4:30": "Aquarium", + "13 6:0": "Hell", + "13 7:30": "End", + "13 9:0": "Desert", + "13 10:30": "Village", + "13 12:0": "Aquarium", + "13 13:30": "Hell", + "13 15:0": "End", + "13 16:30": "Desert", + "13 18:0": "Village", + "13 19:30": "Aquarium", + "13 21:0": "Hell", + "13 22:30": "End", + "14 0:0": "Desert", + "14 1:30": "Hell", + "14 3:0": "Aquarium", + "14 4:30": "End", + "14 6:0": "Village", + "14 7:30": "Desert", + "14 9:0": "Hell", + "14 10:30": "Aquarium", + "14 12:0": "End", + "14 13:30": "Village", + "14 15:0": "Desert", + "14 16:30": "Hell", + "14 18:0": "Aquarium", + "14 19:30": "End", + "14 21:0": "Village", + "14 22:30": "Desert", + "15 0:0": "Desert", + "15 1:30": "End", + "15 3:0": "Village", + "15 4:30": "Aquarium", + "15 6:0": "Hell", + "15 7:30": "Desert", + "15 9:0": "End", + "15 10:30": "Village", + "15 12:0": "Aquarium", + "15 13:30": "Hell", + "15 15:0": "Desert", + "15 16:30": "End", + "15 18:0": "Village", + "15 19:30": "Aquarium", + "15 21:0": "Hell", + "15 22:30": "Desert", + "16 0:0": "Village", + "16 1:30": "Desert", + "16 3:0": "End", + "16 4:30": "Hell", + "16 6:0": "Aquarium", + "16 7:30": "Village", + "16 9:0": "Desert", + "16 10:30": "End", + "16 12:0": "Hell", + "16 13:30": "Aquarium", + "16 15:0": "Village", + "16 16:30": "Desert", + "16 18:0": "End", + "16 19:30": "Hell", + "16 21:0": "Aquarium", + "16 22:30": "Village", + "17 0:0": "Desert", + "17 1:30": "Aquarium", + "17 3:0": "Village", + "17 4:30": "Hell", + "17 6:0": "End", + "17 7:30": "Desert", + "17 9:0": "Aquarium", + "17 10:30": "Village", + "17 12:0": "Hell", + "17 13:30": "End", + "17 15:0": "Desert", + "17 16:30": "Aquarium", + "17 18:0": "Village", + "17 19:30": "Hell", + "17 21:0": "End", + "17 22:30": "Desert", + "18 0:0": "End", + "18 1:30": "Desert", + "18 3:0": "Hell", + "18 4:30": "Village", + "18 6:0": "Aquarium", + "18 7:30": "End", + "18 9:0": "Desert", + "18 10:30": "Hell", + "18 12:0": "Village", + "18 13:30": "Aquarium", + "18 15:0": "End", + "18 16:30": "Desert", + "18 18:0": "Hell", + "18 19:30": "Village", + "18 21:0": "Aquarium", + "18 22:30": "End", + "19 0:0": "Hell", + "19 1:30": "Aquarium", + "19 3:0": "End", + "19 4:30": "Desert", + "19 6:0": "Village", + "19 7:30": "Hell", + "19 9:0": "Aquarium", + "19 10:30": "End", + "19 12:0": "Desert", + "19 13:30": "Village", + "19 15:0": "Hell", + "19 16:30": "Aquarium", + "19 18:0": "End", + "19 19:30": "Desert", + "19 21:0": "Village", + "19 22:30": "Hell", + "20 0:0": "Desert", + "20 1:30": "Village", + "20 3:0": "End", + "20 4:30": "Aquarium", + "20 6:0": "Hell", + "20 7:30": "Desert", + "20 9:0": "Village", + "20 10:30": "End", + "20 12:0": "Aquarium", + "20 13:30": "Hell", + "20 15:0": "Desert", + "20 16:30": "Village", + "20 18:0": "End", + "20 19:30": "Aquarium", + "20 21:0": "Hell", + "20 22:30": "Desert", + "21 0:0": "Hell", + "21 1:30": "Desert", + "21 3:0": "End", + "21 4:30": "Aquarium", + "21 6:0": "Village", + "21 7:30": "Hell", + "21 9:0": "Desert", + "21 10:30": "End", + "21 12:0": "Aquarium", + "21 13:30": "Village", + "21 15:0": "Hell", + "21 16:30": "Desert", + "21 18:0": "End", + "21 19:30": "Aquarium", + "21 21:0": "Village", + "21 22:30": "Hell", + "22 0:0": "Desert", + "22 1:30": "Aquarium", + "22 3:0": "Village", + "22 4:30": "End", + "22 6:0": "Hell", + "22 7:30": "Desert", + "22 9:0": "Aquarium", + "22 10:30": "Village", + "22 12:0": "End", + "22 13:30": "Hell", + "22 15:0": "Desert", + "22 16:30": "Aquarium", + "22 18:0": "Village", + "22 19:30": "End", + "22 21:0": "Hell", + "22 22:30": "Desert", + "23 0:0": "Desert", + "23 1:30": "Village", + "23 3:0": "Aquarium", + "23 4:30": "End", + "23 6:0": "Hell", + "23 7:30": "Desert", + "23 9:0": "Village", + "23 10:30": "Aquarium", + "23 12:0": "End", + "23 13:30": "Hell", + "23 15:0": "Desert", + "23 16:30": "Village", + "23 18:0": "Aquarium", + "23 19:30": "End", + "23 21:0": "Hell", + "23 22:30": "Desert", + "24 0:0": "Hell", + "24 1:30": "Desert", + "24 3:0": "Village", + "24 4:30": "End", + "24 6:0": "Aquarium", + "24 7:30": "Hell", + "24 9:0": "Desert", + "24 10:30": "Village", + "24 12:0": "End", + "24 13:30": "Aquarium", + "24 15:0": "Hell", + "24 16:30": "Desert", + "24 18:0": "Village", + "24 19:30": "End", + "24 21:0": "Aquarium", + "24 22:30": "Hell", + "25 0:0": "Village", + "25 1:30": "Desert", + "25 3:0": "Aquarium", + "25 4:30": "Hell", + "25 6:0": "End", + "25 7:30": "Village", + "25 9:0": "Desert", + "25 10:30": "Aquarium", + "25 12:0": "Hell", + "25 13:30": "End", + "25 15:0": "Village", + "25 16:30": "Desert", + "25 18:0": "Aquarium", + "25 19:30": "Hell", + "25 21:0": "End", + "25 22:30": "Village", + "26 0:0": "Hell", + "26 1:30": "Aquarium", + "26 3:0": "Village", + "26 4:30": "Desert", + "26 6:0": "End", + "26 7:30": "Hell", + "26 9:0": "Aquarium", + "26 10:30": "Village", + "26 12:0": "Desert", + "26 13:30": "End", + "26 15:0": "Hell", + "26 16:30": "Aquarium", + "26 18:0": "Village", + "26 19:30": "Desert", + "26 21:0": "End", + "26 22:30": "Hell", + "27 0:0": "Desert", + "27 1:30": "Aquarium", + "27 3:0": "End", + "27 4:30": "Hell", + "27 6:0": "Village", + "27 7:30": "Desert", + "27 9:0": "Aquarium", + "27 10:30": "End", + "27 12:0": "Hell", + "27 13:30": "Village", + "27 15:0": "Desert", + "27 16:30": "Aquarium", + "27 18:0": "End", + "27 19:30": "Hell", + "27 21:0": "Village", + "27 22:30": "Desert", + "28 0:0": "End", + "28 1:30": "Hell", + "28 3:0": "Desert", + "28 4:30": "Aquarium", + "28 6:0": "Village", + "28 7:30": "End", + "28 9:0": "Hell", + "28 10:30": "Desert", + "28 12:0": "Aquarium", + "28 13:30": "Village", + "28 15:0": "End", + "28 16:30": "Hell", + "28 18:0": "Desert", + "28 19:30": "Aquarium", + "28 21:0": "Village", + "28 22:30": "End" +} \ No newline at end of file diff --git a/Configs + Precompiled/config/HCTeams/events/koth/Aquarium.json b/Configs + Precompiled/config/HCTeams/events/koth/Aquarium.json new file mode 100644 index 0000000..2255eae --- /dev/null +++ b/Configs + Precompiled/config/HCTeams/events/koth/Aquarium.json @@ -0,0 +1,16 @@ +{ + "name": "Aquarium", + "capLocation": { + "x": -499.5, + "y": 71.0, + "z": 499.5 + }, + "world": "world", + "capDistance": 3, + "capTime": 480, + "hidden": false, + "mini": false, + "active": false, + "koth": true, + "type": "KOTH" +} \ No newline at end of file diff --git a/Configs + Precompiled/config/HCTeams/events/koth/Citadel.json b/Configs + Precompiled/config/HCTeams/events/koth/Citadel.json new file mode 100644 index 0000000..4c4c980 --- /dev/null +++ b/Configs + Precompiled/config/HCTeams/events/koth/Citadel.json @@ -0,0 +1,16 @@ +{ + "name": "Citadel", + "capLocation": { + "x": -197.71400831436935, + "y": 32.0, + "z": -499.9347015444014 + }, + "world": "world_nether", + "capDistance": 3, + "capTime": 720, + "hidden": false, + "mini": false, + "active": true, + "koth": true, + "type": "KOTH" +} \ No newline at end of file diff --git a/Configs + Precompiled/config/HCTeams/events/koth/Desert.json b/Configs + Precompiled/config/HCTeams/events/koth/Desert.json new file mode 100644 index 0000000..1efc829 --- /dev/null +++ b/Configs + Precompiled/config/HCTeams/events/koth/Desert.json @@ -0,0 +1,16 @@ +{ + "name": "Desert", + "capLocation": { + "x": 499.5, + "y": 70.0, + "z": -499.5 + }, + "world": "world", + "capDistance": 4, + "capTime": 480, + "hidden": false, + "mini": false, + "active": false, + "koth": true, + "type": "KOTH" +} \ No newline at end of file diff --git a/Configs + Precompiled/config/HCTeams/events/koth/EOTW.json b/Configs + Precompiled/config/HCTeams/events/koth/EOTW.json new file mode 100644 index 0000000..210d42f --- /dev/null +++ b/Configs + Precompiled/config/HCTeams/events/koth/EOTW.json @@ -0,0 +1,16 @@ +{ + "name": "EOTW", + "capLocation": { + "x": 0.5, + "y": 80.0, + "z": 0.5 + }, + "world": "world", + "capDistance": 3, + "capTime": 240, + "hidden": false, + "mini": false, + "active": false, + "koth": true, + "type": "KOTH" +} \ No newline at end of file diff --git a/Configs + Precompiled/config/HCTeams/events/koth/End.json b/Configs + Precompiled/config/HCTeams/events/koth/End.json new file mode 100644 index 0000000..fc02213 --- /dev/null +++ b/Configs + Precompiled/config/HCTeams/events/koth/End.json @@ -0,0 +1,16 @@ +{ + "name": "End", + "capLocation": { + "x": 203.63085801070682, + "y": 72.0, + "z": -35.49792764017163 + }, + "world": "world_the_end", + "capDistance": 3, + "capTime": 480, + "hidden": false, + "mini": false, + "active": false, + "koth": true, + "type": "KOTH" +} \ No newline at end of file diff --git a/Configs + Precompiled/config/HCTeams/events/koth/Hell.json b/Configs + Precompiled/config/HCTeams/events/koth/Hell.json new file mode 100644 index 0000000..9994780 --- /dev/null +++ b/Configs + Precompiled/config/HCTeams/events/koth/Hell.json @@ -0,0 +1,16 @@ +{ + "name": "Hell", + "capLocation": { + "x": 89.5, + "y": 37.0, + "z": 450.5 + }, + "world": "world_nether", + "capDistance": 4, + "capTime": 480, + "hidden": false, + "mini": false, + "active": false, + "koth": true, + "type": "KOTH" +} \ No newline at end of file diff --git a/Configs + Precompiled/config/HCTeams/events/koth/Nether-Outpost.json b/Configs + Precompiled/config/HCTeams/events/koth/Nether-Outpost.json new file mode 100644 index 0000000..422c7d0 --- /dev/null +++ b/Configs + Precompiled/config/HCTeams/events/koth/Nether-Outpost.json @@ -0,0 +1,16 @@ +{ + "name": "Nether-Outpost", + "capLocation": { + "x": 500.5, + "y": 32.0, + "z": -113.5 + }, + "world": "world_nether", + "capDistance": 4, + "capTime": 900, + "hidden": true, + "mini": false, + "active": false, + "koth": true, + "type": "KOTH" +} \ No newline at end of file diff --git a/Configs + Precompiled/config/HCTeams/events/koth/NetherCitadel.json b/Configs + Precompiled/config/HCTeams/events/koth/NetherCitadel.json new file mode 100644 index 0000000..7d869a7 --- /dev/null +++ b/Configs + Precompiled/config/HCTeams/events/koth/NetherCitadel.json @@ -0,0 +1,16 @@ +{ + "name": "NetherCitadel", + "capLocation": { + "x": -195.51424893866835, + "y": 32.0, + "z": -497.4992356106338 + }, + "world": "world_nether", + "capDistance": 4, + "capTime": 60, + "hidden": false, + "mini": false, + "active": false, + "koth": true, + "type": "KOTH" +} \ No newline at end of file diff --git a/Configs + Precompiled/config/HCTeams/events/koth/Road-Outpost.json b/Configs + Precompiled/config/HCTeams/events/koth/Road-Outpost.json new file mode 100644 index 0000000..de88273 --- /dev/null +++ b/Configs + Precompiled/config/HCTeams/events/koth/Road-Outpost.json @@ -0,0 +1,16 @@ +{ + "name": "Road-Outpost", + "capLocation": { + "x": 0.5, + "y": 70.0, + "z": 1199.5 + }, + "world": "world", + "capDistance": 3, + "capTime": 900, + "hidden": true, + "mini": false, + "active": false, + "koth": true, + "type": "KOTH" +} \ No newline at end of file diff --git a/Configs + Precompiled/config/HCTeams/events/koth/Spring-Mini.json b/Configs + Precompiled/config/HCTeams/events/koth/Spring-Mini.json new file mode 100644 index 0000000..09274e4 --- /dev/null +++ b/Configs + Precompiled/config/HCTeams/events/koth/Spring-Mini.json @@ -0,0 +1,16 @@ +{ + "name": "Spring-Mini", + "capLocation": { + "x": 264.5, + "y": 50.0, + "z": -50.5 + }, + "world": "MiniKOTH3", + "capDistance": 3, + "capTime": 300, + "hidden": false, + "mini": true, + "active": false, + "koth": true, + "type": "KOTH" +} \ No newline at end of file diff --git a/Configs + Precompiled/config/HCTeams/events/koth/Summer-Mini.json b/Configs + Precompiled/config/HCTeams/events/koth/Summer-Mini.json new file mode 100644 index 0000000..9d785e7 --- /dev/null +++ b/Configs + Precompiled/config/HCTeams/events/koth/Summer-Mini.json @@ -0,0 +1,16 @@ +{ + "name": "Summer-Mini", + "capLocation": { + "x": 252.5, + "y": 50.0, + "z": -48.5 + }, + "world": "MiniKOTH2", + "capDistance": 3, + "capTime": 300, + "hidden": false, + "mini": true, + "active": false, + "koth": true, + "type": "KOTH" +} \ No newline at end of file diff --git a/Configs + Precompiled/config/HCTeams/events/koth/Village.json b/Configs + Precompiled/config/HCTeams/events/koth/Village.json new file mode 100644 index 0000000..a3a98f6 --- /dev/null +++ b/Configs + Precompiled/config/HCTeams/events/koth/Village.json @@ -0,0 +1,16 @@ +{ + "name": "Village", + "capLocation": { + "x": -500.5, + "y": 78.0, + "z": -500.5 + }, + "world": "world", + "capDistance": 3, + "capTime": 480, + "hidden": false, + "mini": false, + "active": false, + "koth": true, + "type": "KOTH" +} \ No newline at end of file diff --git a/Configs + Precompiled/config/HCTeams/events/koth/Winter-Mini.json b/Configs + Precompiled/config/HCTeams/events/koth/Winter-Mini.json new file mode 100644 index 0000000..4813088 --- /dev/null +++ b/Configs + Precompiled/config/HCTeams/events/koth/Winter-Mini.json @@ -0,0 +1,16 @@ +{ + "name": "Winter-Mini", + "capLocation": { + "x": 250.5, + "y": 40.0, + "z": -51.5 + }, + "world": "MiniKOTH", + "capDistance": 3, + "capTime": 300, + "hidden": false, + "mini": true, + "active": false, + "koth": true, + "type": "KOTH" +} \ No newline at end of file diff --git a/Configs + Precompiled/config/HCTeams/mapInfo.json b/Configs + Precompiled/config/HCTeams/mapInfo.json new file mode 100644 index 0000000..43cb6d6 --- /dev/null +++ b/Configs + Precompiled/config/HCTeams/mapInfo.json @@ -0,0 +1,43 @@ +{ + "kitMap": false, + "allyLimit": 0, + "teamSize": 3, + "regenTimeDeath": 30, + "regenTimeRaidable": 30, + "scoreboardTitle": "\u00264\u0026lCavePvP \u00267┃ \u0026fFasts", + "mapStartedString": "Map started Saturday.", + "warzone": 1000, + "netherBuffer": 250, + "worldBuffer": 300, + "endPortalLocation": "1000, 1000", + "border": 3000, + "goppleCooldown": { + "$numberLong": "360" + }, + "fastSmeltEnabled": true, + "looting": { + "base": 1.0, + "level1": 1.0, + "level2": 1.0, + "level3": 1.0 + }, + "crafting": { + "gopple": true, + "reducedMelon": true + }, + "deathban": { + "CAVE": 1, + "HOLIDAY": 5, + "RAVINE": 5, + "PLATINUM": 15, + "SAPPHIRE": 20, + "PEARL": 25, + "EMERALD": 30, + "DIAMOND": 45, + "GOLD": 60, + "IRON": 90, + "DEFAULT": 120 + }, + "minForceInviteMembers": 10, + "dtrIncrementMultiplier": 4.5 +} \ No newline at end of file diff --git a/Configs + Precompiled/config/HCTeams/minieventSchedule.json b/Configs + Precompiled/config/HCTeams/minieventSchedule.json new file mode 100644 index 0000000..0d879f2 --- /dev/null +++ b/Configs + Precompiled/config/HCTeams/minieventSchedule.json @@ -0,0 +1,44 @@ +{ + "211 14:0": "Spring-Mini", + "211 19:0": "Winter-Mini", + "212 14:0": "Summer-Mini", + "212 19:0": "Spring-Mini", + "213 14:0": "Spring-Mini", + "213 19:0": "Summer-Mini", + "214 14:0": "Summer-Mini", + "214 19:0": "Winter-Mini", + "215 14:0": "Winter-Mini", + "215 19:0": "Spring-Mini", + "216 14:0": "Spring-Mini", + "216 19:0": "Summer-Mini", + "217 14:0": "Summer-Mini", + "217 19:0": "Winter-Mini", + "218 14:0": "Summer-Mini", + "218 19:0": "Winter-Mini", + "219 14:0": "Winter-Mini", + "219 19:0": "Summer-Mini", + "220 14:0": "Summer-Mini", + "220 19:0": "Spring-Mini", + "221 14:0": "Summer-Mini", + "221 19:0": "Winter-Mini", + "222 14:0": "Spring-Mini", + "222 19:0": "Summer-Mini", + "223 14:0": "Winter-Mini", + "223 19:0": "Spring-Mini", + "224 14:0": "Winter-Mini", + "224 19:0": "Summer-Mini", + "225 14:0": "Spring-Mini", + "225 19:0": "Winter-Mini", + "226 14:0": "Winter-Mini", + "226 19:0": "Spring-Mini", + "227 14:0": "Spring-Mini", + "227 19:0": "Summer-Mini", + "228 14:0": "Spring-Mini", + "228 19:0": "Summer-Mini", + "229 14:0": "Spring-Mini", + "229 19:0": "Summer-Mini", + "230 14:0": "Summer-Mini", + "230 19:0": "Spring-Mini", + "231 14:0": "Winter-Mini", + "231 19:0": "Summer-Mini" +} \ No newline at end of file diff --git a/Configs + Precompiled/config/HCTeams/redeem_creator.yml b/Configs + Precompiled/config/HCTeams/redeem_creator.yml new file mode 100644 index 0000000..d0bc159 --- /dev/null +++ b/Configs + Precompiled/config/HCTeams/redeem_creator.yml @@ -0,0 +1,78 @@ +partners: + Zigy: + aliases: + - Ziggy + Dylan_: + aliases: + - Dylan + - Loser + Resucting: + aliases: + - Resu + NotRamix: + aliases: + - Ramix + FlushaAimLock: + aliases: + - Flusha + - FlushaAimSex + - ballz + - balls + - GovernmentExperiment + iMakeMcVids: + aliases: + - iMake + Vik: + aliases: + - VikStar123 + - Walmart + Zylowh: + aliases: [] + Rheiley: + aliases: [] + Headed: + aliases: + - Headass + - virgin + - edater + OmarSmosh: + aliases: [] + Samfay: + aliases: + - SamHCF + - virgin2 + - edater2 + - ratio + Informing: + aliases: + - Then + stevvn: + aliases: + - steven + Lectors: + aliases: + - shitter + Frozeado: + aliases: [] + Nicoarg17: + aliases: [] + Houp: + aliases: [] + Eamotyn: + aliases: [] + Elivann: + aliases: [] + TobiiM9: + aliases: + - tobim9 + - tobi + QnA: + aliases: + - FatLard + - Billy + Rowin: + aliases: + - Emma + Lokonazo1: + aliases: + - Lokonazo diff --git a/Configs + Precompiled/config/LunarClientAPI/config.yml b/Configs + Precompiled/config/LunarClientAPI/config.yml new file mode 100644 index 0000000..8940919 --- /dev/null +++ b/Configs + Precompiled/config/LunarClientAPI/config.yml @@ -0,0 +1,4 @@ +SERVER_NAME: cavepvp.com +restrict: false +kick-message: '&cYou must use Lunar Client to connect to this server.' +authenticate: " \n&aYou have connected to the server with &lLunar Client&a.\n " diff --git a/Configs + Precompiled/config/Mobtimizer/config.yml b/Configs + Precompiled/config/Mobtimizer/config.yml new file mode 100644 index 0000000..114ee72 --- /dev/null +++ b/Configs + Precompiled/config/Mobtimizer/config.yml @@ -0,0 +1,9 @@ +STACK_ENTITIES: true +ENTITY_MERGE_RADIUS: 5.0 +ENTITY_MERGE_AMOUNT: 6 +MERGE_SPAWNER_ENTITIES_ONLY: false +MENTALLY_CHALLENGED_MOBS: true +MAX_ENTITES_PER_CHUNK: 55 +END_MOBS_ALWAYS_ACTIVE: true +STACKABLE_MOB_TYPES: [] +CHICKEN_EGG_TIME_MS: 240000 \ No newline at end of file diff --git a/Configs + Precompiled/config/ModSuite/config.json b/Configs + Precompiled/config/ModSuite/config.json new file mode 100644 index 0000000..cb26893 --- /dev/null +++ b/Configs + Precompiled/config/ModSuite/config.json @@ -0,0 +1,7 @@ +{ + "defaultSlowTime": 5000, + "modModeDisabled": false, + "modModeOnJoin": true, + "muted": false, + "slowTime": 0 +} \ No newline at end of file diff --git a/Configs + Precompiled/config/MonthlyCrates/config.yml b/Configs + Precompiled/config/MonthlyCrates/config.yml new file mode 100644 index 0000000..0f0356f --- /dev/null +++ b/Configs + Precompiled/config/MonthlyCrates/config.yml @@ -0,0 +1,623 @@ +-messages: + prefix: '&4&lCavePvP &8┃&f ' + no-perms: '%prefix%You don''t have permission to execute this command.' + config-reloaded: '%prefix%Config has successfully reloaded!' + invalid-usage: '%prefix%Incorrect usage.' + success-give: '%prefix%You have successfully given &4%amount%x &c%crate% &fMonthly + Crates to &c%player%&f!' + success-give-other: '%prefix%You have been given &4%amount%x &c2022 Mystery Boxes&f!' + created-item: '%prefix%You have added your hand item to the crate! To remove it, + go into the config and delete it.' + help-message: + - '&6/mcrate - show this message!' + - '&6/mcrate list - view the crate storage' + - '&6/mcrate reload - reload the config' + - '&6/mcrate giveall - give all players a monthly crate' + - '&6/mcrate give - give a player a monthly crate' + - '&6/mcrate addItem ' + - '&6Permission needed to execute /mcrate: mcrates.storage' + - '&6Permission needed to execute other commands: mcrates.admin' +storage-inv: + Name: '&8%crate#% Crates' + Size: 36 +crates: + Seasonal: + crate: + Material: ENDER_CHEST + Glow: false + ItemData: -1 + Name: '&e&ki&6&ki&e&ki&6&l &nOCTOBER MYSTERY BOX&e &ki&6&ki&e&ki' + Lores: + - '&fPurchaseable at &estore.cavepvp.org' + - '' + - '&e<&m----&6&l ALL REWARDS &e&m----&e>' + - '&f* &4&lEXTREME &e&ki&6 Custom Rank &e&ki' + - '&f* &5&lULTIMATE &fCave Rank' + - '&f* &5&lULTIMATE &fHoliday Rank' + - '&f* &2&lCASH &2$&a100.00 &fStore Voucher' + - '&f* &2&lCASH &2$&a50.00 &fStore Voucher' + - '&f* &2&lCASH &2$&a25.00 &fStore Voucher' + - '&f* &2&lCASH &2$&a10.00 &fStore Voucher' + - '&f* &c&lRARE &f5x Air Drop' + - '&f* &c&lRARE &f10x Fall Lootboxes' + - '&f* &c&lRARE &f16x Owner Keys' + - '&f* &c&lRARE &f24x Partner Keys' + - '&f* &c&lRARE &f32x Halloween Keys' + - '&f* &c&lRARE &f5x Zeus Hammer' + - '&f* &c&lRARE &f3x Random Clickable Kits' + - '' + - '&e<&m----&6&l ALL REWARDS &e&m----&e>' + - '&f* &c&lRARE &f1x Air Drop' + - '&f* &c&lRARE &f3x Fall Lootboxes' + - '&f* &c&lRARE &f5x Halloween Keys' + - '&f* &c&lRARE &f10x Cave Keys' + - '&f* &c&lRARE &f16x Legendary Keys' + - '&f* &c&lRARE &fEvader Custom Enchant' + - '&f* &c&lRARE &fGuardian Angel Custom Enchant' + - '&f* &6&lUNCOMMON &fLazy Brewer' + - '&f* &6&lUNCOMMON &f5x Power Stone' + - '&f* &6&lUNCOMMON &f5x Reality Stone' + - '&f* &6&lUNCOMMON &f5x Soul Stone' + - '&f* &6&lUNCOMMON &f5x Mind Stone' + - '&f* &6&lUNCOMMON &f5x Time Stone' + - '&f* &6&lUNCOMMON &f1x September Helmet' + - '&f* &6&lUNCOMMON &f1x September Chestplate' + - '&f* &6&lUNCOMMON &f1x September Leggings' + - '&f* &6&lUNCOMMON &f1x September Boots' + - '&f* &6&lUNCOMMON &f1x September Sword' + - '&f* &6&lUNCOMMON &f1x September Pickaxe' + - '&f* &6&lUNCOMMON &f1x September Bow' + - '&f* &a&lCOMMON &f64x Random Valuables' + - '&f* &a&lCOMMON &f2x Crowbar' + - '&f* &a&lCOMMON &f6x GOD Apples' + - '&f* &a&lCOMMON &f32x Golden Apples' + - '&f* &a&lCOMMON &f128x Ender Pearl' + gui: + Name: '&8Crate: %name%' + not-redeemed: + Material: ENDER_CHEST + Glow: false + ItemData: -1 + Amount: 1 + Name: '&f&l???' + Lores: + - '&7Click to receive a random' + - '&7item from the crate.' + final-not-redeemable: + Material: STAINED_GLASS_PANE + PaneColor: RED + Glow: false + Amount: 1 + Name: '&c&l???' + Lores: + - '&7You can''t open the final reward' + - '&7until you have redeemed all other rewards.' + animation: + Glow: false + ScrambleAnimationRunsPerItem: 10 + FinalAnimationRuns: 6 + animation-on-colors: + - BLUE + - LIME + - ORANGE + - MAGENTA + - PINK + - YELLOW + animation-off-color: BLACK + normal-rewards: + '0': + Material: EMERALD_BLOCK + Amount: 64 + Glow: false + ItemData: -1 + GiveItem: false + Name: '&2&lEmerald Blocks' + Lores: [] + Commands: + - give emeraldblock 64 %player% + Enchantments: [] + Chance: 2.0 + '1': + Material: DIAMOND_BLOCK + Amount: 64 + Glow: false + ItemData: -1 + GiveItem: false + Name: '&b&lDiamond Blocks' + Lores: [] + Commands: + - give diamondblock 64 %player% + Enchantments: [] + Chance: 2.0 + '2': + Material: GOLD_BLOCK + Amount: 64 + Glow: false + ItemData: -1 + GiveItem: false + Name: '&6&lGold Blocks' + Lores: [] + Commands: + - give goldblock 64 %player% + Enchantments: [] + Chance: 2.0 + '3': + Material: IRON_BLOCK + Amount: 64 + Glow: false + ItemData: -1 + GiveItem: false + Name: '&7&lIron Blocks' + Lores: [] + Commands: + - give ironblock 64 %player% + Enchantments: [] + Chance: 2.0 + '4': + Material: DIAMOND_HOE + Amount: 2 + Glow: false + ItemData: -1 + GiveItem: false + Name: '&cCrowbar' + Lores: [] + Commands: + - crowbar %player% + - crowbar %player% + Enchantments: [] + Chance: 5.0 + '5': + Material: GOLDEN_APPLE + Amount: 32 + Glow: false + ItemData: -1 + GiveItem: false + Name: '&6&l32x Golden Apples' + Lores: [] + Commands: + - give 322:1 32 %player% + Enchantments: [] + Chance: 5.0 + '6': + Material: ENDER_PEARL + Amount: 64 + Glow: false + ItemData: -1 + GiveItem: false + Name: '&5&l128x Ender Pearls' + Lores: [] + Commands: + - give enderpearl 32 %player% + - give enderpearl 32 %player% + - give enderpearl 32 %player% + - give enderpearl 32 %player% + Enchantments: [] + Chance: 5.0 + '7': + Material: DIAMOND_HELMET + Amount: 1 + Glow: false + ItemData: -1 + GiveItem: true + Name: '&6&lSeptember Helmet' + Commands: [] + Lores: + - '&cHellForged IV' + - '&cImplants V' + - '&cMermaid III' + - '&cRecover I' + - '&cFireResistance I' + - '&cGreed I' + Enchantments: + - PROTECTION_ENVIRONMENTAL:2 + - DURABILITY:3 + Chance: 2.0 + '8': + Material: DIAMOND_CHESTPLATE + Amount: 1 + Glow: false + ItemData: -1 + GiveItem: true + Name: '&6&lSeptember Chestplate' + Commands: [] + Lores: + - '&cHellForged IV' + - '&cRecover I' + - '&cFireResistance I' + - '&cInvisibility I' + - '&cFury I' + Enchantments: + - PROTECTION_ENVIRONMENTAL:2 + - DURABILITY:3 + Chance: 2.0 + '9': + Material: DIAMOND_LEGGINGS + Amount: 1 + Glow: false + ItemData: -1 + GiveItem: true + Name: '&6&lSeptember Leggings' + Commands: [] + Lores: + - '&cHellForged IV' + - '&cRecover I' + - '&cFireResistance I' + - '&cSwift I' + Enchantments: + - PROTECTION_ENVIRONMENTAL:2 + - DURABILITY:3 + Chance: 2.0 + '10': + Material: DIAMOND_BOOTS + Amount: 1 + Glow: false + ItemData: -1 + GiveItem: true + Name: '&6&lSeptember Boots' + Commands: [] + Lores: + - '&cSpeed II' + - '&cHellForged IV' + - '&cRecover I' + - '&cFireResistance I' + Enchantments: + - PROTECTION_ENVIRONMENTAL:2 + - PROTECTION_FALL:4 + - DURABILITY:3 + Chance: 2.0 + '11': + Material: DIAMOND_SWORD + Amount: 1 + Glow: false + ItemData: -1 + GiveItem: true + Name: '&6&lSeptember Sword' + Commands: [] + Lores: [] + Enchantments: + - DAMAGE_ALL:2 + - FIRE_ASPECT:2 + - DURABILITY:3 + Chance: 2.0 + '12': + Material: DIAMOND_PICKAXE + Amount: 1 + Glow: false + ItemData: -1 + GiveItem: true + Name: '&6&lSeptember Pickaxe' + Commands: [] + Lores: [] + Enchantments: + - DIG_SPEED:6 + - LOOT_BONUS_BLOCKS:5 + - DURABILITY:5 + Chance: 2.0 + '13': + Material: BOW + Amount: 1 + Glow: false + ItemData: -1 + GiveItem: true + Name: '&6&lSeptember Bow' + Commands: [] + Lores: [] + Enchantments: + - ARROW_DAMAGE:5 + - ARROW_FIRE:1 + - ARROW_INFINITE:1 + - DURABILITY:3 + Chance: 2.0 + '14': + Material: BREWING_STAND_ITEM + Amount: 1 + Glow: false + ItemData: -1 + GiveItem: false + Name: '&a&lLazy Brewer' + Commands: + - ability lazybrewer 1 %player% + Lores: [] + Enchantments: [] + Chance: 0.0 + '15': + Material: INK_SACK + Amount: 5 + Glow: false + ItemData: 5 + GiveItem: false + Name: '&5&l5x Power Stone' + Commands: + - ability powerstone 5 %player% + Lores: [] + Enchantments: [] + Chance: 2.5 + '16': + Material: INK_SACK + Amount: 5 + Glow: false + ItemData: 14 + GiveItem: false + Name: '&6&l5x Mind Stone' + Commands: + - ability mindstone 5 %player% + Lores: [] + Enchantments: [] + Chance: 2.5 + '17': + Material: GOLD_INGOT + Amount: 5 + Glow: false + ItemData: -1 + GiveItem: false + Name: '&6&l5x Soul Stone' + Commands: + - ability soulstone 5 %player% + Lores: [] + Enchantments: [] + Chance: 2.5 + '18': + Material: REDSTONE + Amount: 5 + Glow: false + ItemData: -1 + GiveItem: false + Name: '&c&l5x Reality Stone' + Commands: + - ability realitystone 5 %player% + Lores: [] + Enchantments: [] + Chance: 2.5 + '19': + Material: EMERALD + Amount: 5 + Glow: false + ItemData: -1 + GiveItem: false + Name: '&a&l5x Time Stone' + Commands: + - ability timestone 5 %player% + Lores: [] + Enchantments: [] + Chance: 2.5 + '20': + Material: BOOK + Amount: 1 + Glow: false + ItemData: -1 + GiveItem: false + Name: '&d&l1x Evader Enchantment Book' + Lores: [] + Commands: + - ce givebook %player% Evader 1 + Enchantments: [] + Chance: 1.0 + '21': + Material: BOOK + Amount: 1 + Glow: false + ItemData: -1 + GiveItem: false + Name: '&d&l1x Guardian Angel Enchantment Book' + Lores: [] + Commands: + - ce givebook %player% GuardianAngel 1 + Enchantments: [] + Chance: 1.0 + '22': + Material: DROPPER + Amount: 1 + Glow: false + ItemData: -1 + GiveItem: false + Name: '&b&l1x Air Drop' + Lores: [] + Commands: + - airdrops give %player% 1 + Enchantments: [] + Chance: 1.0 + '23': + Material: ENDER_CHEST + Amount: 1 + Glow: false + ItemData: -1 + GiveItem: false + Name: '&6&l3x Fall Lootbox' + Lores: [] + Commands: + - crates give %player% Seasonal 3 + Enchantments: [] + Chance: 1.0 + '24': + Material: TRIPWIRE_HOOK + Amount: 5 + Glow: false + ItemData: -1 + GiveItem: false + Name: '&6&l5x Halloween Keys' + Lores: [] + Commands: + - cr givekey %player% Seasonal 5 + Enchantments: [] + Chance: 1.0 + '25': + Material: TRIPWIRE_HOOK + Amount: 10 + Glow: false + ItemData: -1 + GiveItem: false + Name: '&4&l10x Cave Keys' + Lores: [] + Commands: + - cr givekey %player% Cave 10 + Enchantments: [] + Chance: 1.0 + '26': + Material: TRIPWIRE_HOOK + Amount: 16 + Glow: false + ItemData: -1 + GiveItem: false + Name: '&5&l16x Legendary Keys' + Lores: [] + Commands: + - cr givekey %player% Legendary 16 + Enchantments: [] + Chance: 1.0 + final-rewards: + '0': + Material: BOOK + Amount: 1 + Glow: false + ItemData: -1 + GiveItem: false + Name: '&c&l3x Random Clickable Kit' + Lores: [] + Commands: + - randomclickablekit %player% 3 + Enchantments: [] + Chance: 5.0 + '1': + Material: BLAZE_ROD + Amount: 5 + Glow: false + ItemData: -1 + GiveItem: false + Name: '&6&l5x Zeus Hammer' + Lores: [] + Commands: + - ability zeushammer 5 %player% + Chance: 3.0 + '2': + Material: DROPPER + Amount: 1 + Glow: false + ItemData: -1 + GiveItem: false + Name: '&b&l5x Air Drop' + Lores: [] + Commands: + - airdrops give %player% 5 + Enchantments: [] + Chance: 2.0 + '3': + Material: ENDER_CHEST + Amount: 10 + Glow: false + ItemData: -1 + GiveItem: false + Name: '&6&l10x Fall Lootbox' + Lores: [] + Commands: + - crates give %player% Seasonal 10 + Enchantments: [] + Chance: 2.0 + '4': + Material: TRIPWIRE_HOOK + Amount: 32 + Glow: false + ItemData: -1 + GiveItem: false + Name: '&6&l32x Halloween Keys' + Lores: [] + Commands: + - cr givekey %player% Seasonal 32 + Enchantments: [] + Chance: 2.0 + '5': + Material: TRIPWIRE_HOOK + Amount: 16 + Glow: false + ItemData: -1 + GiveItem: false + Name: '&4&l16x Owner Keys' + Lores: [] + Commands: + - randomownerkeys %player% 16 + Enchantments: [] + Chance: 2.0 + '6': + Material: TRIPWIRE_HOOK + Amount: 24 + Glow: false + ItemData: -1 + GiveItem: false + Name: '&d&l24x Partner Keys' + Lores: [] + Commands: + - cr givekey %player% Partner 24 + Enchantments: [] + Chance: 2.0 + '7': + Material: STONE + Amount: 1 + Glow: false + ItemData: -1 + GiveItem: false + Name: '&4&l30-day Cave Rank' + Lores: [] + Commands: + - vouchers addrank %player% Cave 30d &4&l30-day Cave Rank + - raw &f + - raw &4&lMystery Box + - raw &f%player% &chas just won &4&l30-day Cave Rank&c! + - raw &7Purchase Mystery Boxes on our store at &fstore.cavepvp.org&7! + - raw &f + Enchantments: [] + Chance: 0.0 + '8': + Material: COBBLESTONE + Amount: 1 + Glow: false + ItemData: -1 + GiveItem: false + Name: '&a&l40-day Spooky Rank' + Lores: [] + Commands: + - vouchers addrank %player% Holiday 40d &6&l40-day Spooky Rank + - raw &f + - raw &4&lMystery Box + - raw &f%player% &chas just won &6&l40-day Spooky Rank&c! + - raw &7Purchase Mystery Boxes on our store at &fstore.cavepvp.org&7! + - raw &f + Enchantments: [] + Chance: 0.0 + '9': + Material: STONE + Amount: 1 + Glow: false + ItemData: -1 + GiveItem: false + Name: '&d&l50-day Ravine Rank' + Lores: [] + Commands: + - vouchers addrank %player% Ravine 50d &d&l50-day Ravine Rank + - raw &f + - raw &4&lMystery Box + - raw &f%player% &chas just won &d&l50-day Ravine Rank&c! + - raw &7Purchase Mystery Boxes on our store at &fstore.cavepvp.org&7! + - raw &f + Enchantments: [] + Chance: 0.0 + '10': + Material: GOLD_BLOCK + Amount: 1 + Glow: false + ItemData: -1 + GiveItem: false + Name: '&e&l60-day VIP Status' + Lores: [] + Commands: + - vouchers addrank %player% VIP 60d &e&l60-day VIP Status + - raw &f + - raw &4&lMystery Box + - raw &f%player% &chas just won &e&l60-day VIP Status&c! + - raw &7Purchase Mystery Boxes on our store at &fstore.cavepvp.org&7! + - raw &f + Enchantments: [] + Chance: 0 +time: + ScrambleAnimationSpeedInTicks: 3 + FinalAnimationSpeedInTicks: 3 +once-per-item: false diff --git a/Configs + Precompiled/config/Neutron/config.yml b/Configs + Precompiled/config/Neutron/config.yml new file mode 100644 index 0000000..2cc9a9f --- /dev/null +++ b/Configs + Precompiled/config/Neutron/config.yml @@ -0,0 +1,10 @@ +network: "CAVEPVP" +mongo: + host: "0.0.0.0" + port: 27017 + database: "Neutron" +server: + name: "Fasts" +fancyName: + displayName: true + tabListName: false diff --git a/Configs + Precompiled/config/Piston/config.yml b/Configs + Precompiled/config/Piston/config.yml new file mode 100644 index 0000000..171f461 --- /dev/null +++ b/Configs + Precompiled/config/Piston/config.yml @@ -0,0 +1,2 @@ +server: + slots: 1000 diff --git a/Configs + Precompiled/config/PlugMan/config.yml b/Configs + Precompiled/config/PlugMan/config.yml new file mode 100644 index 0000000..207d595 --- /dev/null +++ b/Configs + Precompiled/config/PlugMan/config.yml @@ -0,0 +1,6 @@ +### +# A list of plugins that we should ignore when doing enable, disable, restart, load, reload, and unload. +# +# This takes the form of a comma separated list enclosed within the brackets. +### +ignored-plugins: [PlugMan] \ No newline at end of file diff --git a/Configs + Precompiled/config/Profiles/config.yml b/Configs + Precompiled/config/Profiles/config.yml new file mode 100644 index 0000000..a5cdcba --- /dev/null +++ b/Configs + Precompiled/config/Profiles/config.yml @@ -0,0 +1 @@ +databaseName: "Profiles" \ No newline at end of file diff --git a/Configs + Precompiled/config/Proton/config.yml b/Configs + Precompiled/config/Proton/config.yml new file mode 100644 index 0000000..e9942dc --- /dev/null +++ b/Configs + Precompiled/config/Proton/config.yml @@ -0,0 +1,11 @@ +Redis: + Host: '0.0.0.0' + DbId: 3 + Port: 6379 +Backbone: + Host: '0.0.0.0' + DbId: 0 + Port: 6379 +NametagPacketRestriction: + Enabled: false + BypassPrefix: '&a' diff --git a/Configs + Precompiled/config/Proton/holograms.json b/Configs + Precompiled/config/Proton/holograms.json new file mode 100644 index 0000000..2a06546 --- /dev/null +++ b/Configs + Precompiled/config/Proton/holograms.json @@ -0,0 +1,263 @@ +[ + { + "id": 33, + "location": { + "world": "Spawn", + "x": 20.5, + "y": 71.5, + "z": 29.5, + "yaw": 332.55054, + "pitch": 82.200035 + }, + "lines": [ + "\u00265\u0026lLegendary Crate", + "§f§ostore.cavepvp.org" + ] + }, + { + "id": 34, + "location": { + "world": "Spawn", + "x": 0.5606243760630027, + "y": 71.22926145831116, + "z": 26.54973290485479, + "yaw": 1.102364, + "pitch": 0.4409499 + }, + "lines": [ + "\u0026a\u0026lOverworld Portal", + "\u00267Jump through this water", + "§7to teleport to the real world!" + ] + }, + { + "id": 7, + "location": { + "world": "world", + "x": -13.54843159742499, + "y": 173.5, + "z": -35.49425461701776, + "yaw": -3.4831543, + "pitch": 90.0 + }, + "lines": [ + "\u00264\u0026lShop", + "\u00267Buy or Sell items", + "\u00267in our server shop", + "spacer", + "\u0026aShop is located down this pathway" + ] + }, + { + "id": 15, + "location": { + "world": "Spawn", + "x": -26.5, + "y": 71.5, + "z": 6.5, + "yaw": 339.9001, + "pitch": 90.0 + }, + "lines": [ + "\u0026c\u0026liMakeMcVids Crate", + "§f§ostore.cavepvp.org" + ] + }, + { + "id": 17, + "location": { + "world": "Spawn", + "x": 24.5, + "y": 71.5, + "z": 25.5, + "yaw": 276.30005, + "pitch": 90.0 + }, + "lines": [ + "\u0026b\u0026lRare Crate", + "§f§ostore.cavepvp.org" + ] + }, + { + "id": 18, + "location": { + "world": "Spawn", + "x": -26.5, + "y": 71.5, + "z": -5.5, + "yaw": 184.37273, + "pitch": -12.89995 + }, + "lines": [ + "\u00263\u0026lHeaded Crate", + "\u0026f\u0026ostore.cavepvp.org" + ] + }, + { + "id": 19, + "location": { + "world": "Spawn", + "x": -22.5, + "y": 71.50000000476837, + "z": 18.5, + "yaw": 271.3973, + "pitch": -4.3181725 + }, + "lines": [ + "\u00264\u0026lKOTH Crate", + "§f§o/koth schedule" + ] + }, + { + "id": 20, + "location": { + "world": "Spawn", + "x": 23.5, + "y": 71.6, + "z": 28.5, + "yaw": 308.82962, + "pitch": 5.3999906 + }, + "lines": [ + "\u00264\u0026lCave Crate", + "§f§ostore.cavepvp.org" + ] + }, + { + "id": 21, + "location": { + "world": "Spawn", + "x": -20.5, + "y": 71.5, + "z": 0.5, + "yaw": -59.868927, + "pitch": 14.699806 + }, + "lines": [ + "\u0026d\u0026lPartner Crate", + "§f§ostore.cavepvp.org" + ] + }, + { + "id": 22, + "location": { + "world": "Spawn", + "x": 8.5, + "y": 71.5, + "z": 28.5, + "yaw": 353.52948, + "pitch": 10.199877 + }, + "lines": [ + "\u00266\u0026lFall Lootbox", + "§f§ostore.cavepvp.org" + ] + }, + { + "id": 23, + "location": { + "world": "Spawn", + "x": -20.5, + "y": 71.4, + "z": 26.5, + "yaw": 0.0, + "pitch": 0.0 + }, + "lines": [ + "§f§ki§4§l TREASURE CHESTS §f§ki", + "§f§ostore.cavepvp.org" + ] + }, + { + "id": 24, + "location": { + "world": "world", + "x": 29.872337345898167, + "y": 266.6330486813818, + "z": 4.984532815440751, + "yaw": 74.63651, + "pitch": 42.53624 + }, + "lines": [ + "\u0026c\u0026lCentral Chest" + ] + }, + { + "id": 25, + "location": { + "world": "Spawn", + "x": 4.5, + "y": 71.6, + "z": 28.5, + "yaw": 346.02966, + "pitch": 2.249848 + }, + "lines": [ + "\u0026b\u0026lAirdrop", + "§f§ostore.cavepvp.org" + ] + }, + { + "id": 26, + "location": { + "world": "Spawn", + "x": -3.5, + "y": 71.45, + "z": 28.5, + "yaw": -27.470575, + "pitch": 3.2999787 + }, + "lines": [ + "\u0026a\u0026lPerk Crate", + "§f§ostore.cavepvp.org" + ] + }, + { + "id": 27, + "location": { + "world": "world", + "x": -9.5, + "y": 71.00000000476837, + "z": 32.5, + "yaw": 10.947636, + "pitch": 50.999954 + }, + "lines": [ + "\u00266\u0026lMini KOTH Zone", + "§f§oEnter the portal to compete", + "§f§oin Mini KOTHs for points and rewards!", + "§f", + "\u0026eType /minikoth for more information." + ] + }, + { + "id": 28, + "location": { + "world": "Spawn", + "x": -7.5, + "y": 71.5, + "z": 28.5, + "yaw": -2.1206124, + "pitch": -21.59999 + }, + "lines": [ + "\u0026e\u0026ki\u00266\u0026lHalloween Crate\u0026e\u0026ki", + "§f§ostore.cavepvp.org" + ] + }, + { + "id": 29, + "location": { + "world": "world", + "x": -13.54843159742499, + "y": 173.5, + "z": -35.49425461701776, + "yaw": -3.4831543, + "pitch": 90.0 + }, + "lines": [ + "\u0026c\u0026l❤ \u00264\u0026lCupid\u0027s \u0026f\u0026lMystery Box \u0026c\u0026l❤", + "§f§ostore.cavepvp.org" + ] + } +] \ No newline at end of file diff --git a/Configs + Precompiled/config/Queue/config.yml b/Configs + Precompiled/config/Queue/config.yml new file mode 100644 index 0000000..6f2c043 --- /dev/null +++ b/Configs + Precompiled/config/Queue/config.yml @@ -0,0 +1,29 @@ +REDIS: + HOST: "0.0.0.0" + PORT: 6379 + AUTHENTICATION: + ENABLED: false + PASSWORD: "" +SETTINGS: + SERVER_ID: "Fasts" # The server's unique ID + SERVER_NAME: "Fasts" # The server's display name (not network name) + CACHE_SERVERS: true +PRIORITY: + DEFAULT: 1 + RANKS: + Default: + PRIORITY: 1 + PERMISSION: "ranks.default" + VIP: + PRIORITY: 2 + PERMISSION: "ranks.vip" + MVP: + PRIORITY: 3 + PERMISSION: "ranks.mvp" +QUEUE: + JOINED: "&aYou have joined the {0} queue." + LEFT: "&cYou have been removed from the {0} queue." + REMINDER: + - "&eYou are position &d#{0} &eof &d{1} &ein the &a{2} &equeue." + - "&7Purchase a rank at store.cavepvp.org to get a higher queue priority." + SENDING: "&aSending you to {0}..." \ No newline at end of file diff --git a/Configs + Precompiled/config/Suge/config.yml b/Configs + Precompiled/config/Suge/config.yml new file mode 100644 index 0000000..e07ef96 --- /dev/null +++ b/Configs + Precompiled/config/Suge/config.yml @@ -0,0 +1 @@ +size: 54 \ No newline at end of file diff --git a/Configs + Precompiled/config/Suge/kits.yml b/Configs + Precompiled/config/Suge/kits.yml new file mode 100644 index 0000000..87ad276 --- /dev/null +++ b/Configs + Precompiled/config/Suge/kits.yml @@ -0,0 +1,6552 @@ +kits: + Custom: + slot: 14 + displayName: §6§lCustom Kit + material: INK_SACK + cooldown: 24 + lore: + - '&7An exclusive kit to the &6&lCustom &7rank.' + - '' + - '&4&l┃ &fCooldown: &c1 Day' + - '&4&l┃ &fAvailable in: &c{remaining}' + - '' + - '&aRight Click to preview this kit' + damage: 14 + uses: 536 + category: NORMAL + content: + item_0: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_SWORD + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lCustom Sword + enchants: + DAMAGE_ALL: 2 + DAMAGE_UNDEAD: 4 + DURABILITY: 4 + DAMAGE_ARTHROPODS: 5 + LOOT_BONUS_MOBS: 4 + item_1: + ==: org.bukkit.inventory.ItemStack + type: ENDER_PEARL + amount: 16 + item_2: + ==: org.bukkit.inventory.ItemStack + type: GOLDEN_APPLE + amount: 16 + item_3: + ==: org.bukkit.inventory.ItemStack + type: EGG + amount: 16 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §d§lEggport + lore: + - '' + - §6❙ §fSwitch places with your + - §6❙ §fenemy that are within §c§l15 §fblocks! + - '' + - §fCan be found in the §e§ki§6§lHalloween Crate§e§ki§f! + item_4: + ==: org.bukkit.inventory.ItemStack + type: PAPER + amount: 5 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §a§lMed Kit + lore: + - '' + - §6❙ §fRight Click to receive Resistance 3, + - §6❙ §fRegeneration 3, and 4 Absorption + - §6❙ §fHearts for §e§l5 seconds§f! + - '' + - §fCan be found in the §e§ki§6§lHalloween Crate§e§ki§f! + item_5: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_6: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_7: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_8: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_9: + ==: org.bukkit.inventory.ItemStack + type: GOLDEN_APPLE + damage: 1 + item_10: + ==: org.bukkit.inventory.ItemStack + type: INK_SACK + damage: 5 + amount: 5 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §5§lPower Stone + lore: + - '' + - §6❙ §fRight Click to receive Strength II, + - §6❙ §fResistance III and Regeneration III for §e§l10 seconds + - §6❙ §fDuring that time you may not use any potions! + - '' + - §fCan be found in the §6§lOctober Mystery Box§f! + item_11: + ==: org.bukkit.inventory.ItemStack + type: NETHER_STAR + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §b§lNinja Star + lore: + - '' + - §6❙ §fTeleport to the last person that + - §6❙ §fhit you within the last §e§l30 seconds§f! + - '' + - §fCan be found in an §b§lAirdrop§f! + item_12: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_13: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_14: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_15: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_16: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_17: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_18: + ==: org.bukkit.inventory.ItemStack + type: BLAZE_ROD + amount: 5 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lAnti-Blockup + lore: + - '' + - §6❙ §fWhen you hit a player with this + - §6❙ §c§l3 times §fthey may not block up for §e§l15 seconds§f. + - '' + - §fCan be found in the §e§ki§6§lHalloween Crate§e§ki§f! + item_19: + ==: org.bukkit.inventory.ItemStack + type: WATCH + amount: 5 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lTime Warp + lore: + - '' + - §6❙ §fTravel back to where + - §6❙ §fyou last threw a pearl! + - '' + - §fCan be found in an §b§lAirdrop§f! + item_20: + ==: org.bukkit.inventory.ItemStack + type: REDSTONE + amount: 3 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §c§lReality Stone + lore: + - '' + - §6❙ §fRight Click to teleport to the player + - §6❙ §fthat you last hit within a §e§l30 second §fperiod. + - '' + - §fCan be found in the §6§lOctober Mystery Box§f! + item_21: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_22: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_23: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_24: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_25: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_26: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_27: + ==: org.bukkit.inventory.ItemStack + type: GOLD_INGOT + amount: 5 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §e§lSoul Stone + lore: + - '' + - §6❙ §fUpon going below 2 hearts, you will be instantly + - §6❙ §fhealed and given Resistance III for §e§l5 seconds§f. + - '' + - §fCan be found in the §6§lOctober Mystery Box§f! + item_28: + ==: org.bukkit.inventory.ItemStack + type: BLAZE_POWDER + amount: 5 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lStrength + lore: + - '' + - §6❙ §fGive you and your teammates + - §6❙ §e§l5 seconds §fof §c§lStrength + - '' + - §fCan be found in an §b§lAirdrop§f! + item_29: + ==: org.bukkit.inventory.ItemStack + type: EMERALD + amount: 2 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §a§lTime Stone + lore: + - '' + - §6❙ §fRight Click to reset all of your + - §6❙ §fability/partner item cooldowns. + - '' + - §fCan be found in the §6§lOctober Mystery Box§f! + item_30: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_31: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_32: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_33: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_34: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_35: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + armor: + item_0: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_BOOTS + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lCustom Boots + lore: + - '' + - '§4Armor Class: §fRaider' + - '§4Perks:' + - §4❙ §fDeal 5% more damage + - §4❙ §f10% Reduced Partner Item cooldown + - §4❙ §fSHIFT + Click to activate Midas Touch for 10 seconds + - '' + - §cSpeed II + - §cHellForged IV + - §cRecover I + - §cFireResistance I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 3 + PROTECTION_FALL: 4 + item_1: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_LEGGINGS + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lCustom Leggings + lore: + - '' + - '§4Armor Class: §fRaider' + - '§4Perks:' + - §4❙ §fDeal 5% more damage + - §4❙ §f10% Reduced Partner Item cooldown + - §4❙ §fSHIFT + Click to activate Midas Touch for 10 seconds + - '' + - §cHellForged IV + - §cRecover I + - §cFireResistance I + - §cSwift I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 3 + item_2: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_CHESTPLATE + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lCustom Chestplate + lore: + - '' + - '§4Armor Class: §fRaider' + - '§4Perks:' + - §4❙ §fDeal 5% more damage + - §4❙ §f10% Reduced Partner Item cooldown + - §4❙ §fSHIFT + Click to activate Midas Touch for 10 seconds + - '' + - §cHellForged IV + - §cRecover I + - §cFireResistance I + - §cInvisibility I + - §cFury I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 3 + item_3: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_HELMET + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lCustom Helmet + lore: + - '' + - '§4Armor Class: §fRaider' + - '§4Perks:' + - §4❙ §fDeal 5% more damage + - §4❙ §f10% Reduced Partner Item cooldown + - §4❙ §fSHIFT + Click to activate Midas Touch for 10 seconds + - '' + - §cHellForged IV + - §cImplants V + - §cMermaid III + - §cRecover I + - §cFireResistance I + - §cGreed I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 3 + Cave: + slot: 23 + displayName: '&4&lCave Kit' + material: INK_SACK + cooldown: 24 + lore: + - '&7An exclusive kit to the &4&lCave &7rank.' + - '' + - '&4&l┃ &fCooldown: &c1 Day' + - '&4&l┃ &fAvailable in: &c{remaining}' + - '' + - '&aRight Click to preview this kit' + damage: 1 + category: NORMAL + content: + item_0: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_SWORD + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §4§l§nCave§7 ┃ §fSword + enchants: + DAMAGE_ALL: 2 + DURABILITY: 4 + FIRE_ASPECT: 2 + item_1: + ==: org.bukkit.inventory.ItemStack + type: ENDER_PEARL + amount: 16 + item_2: + ==: org.bukkit.inventory.ItemStack + type: GOLDEN_APPLE + amount: 32 + item_3: + ==: org.bukkit.inventory.ItemStack + type: EGG + amount: 16 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §d§lEggport + lore: + - '' + - §6❙ §fSwitch places with your + - §6❙ §fenemy that are within §c§l15 §fblocks! + - '' + - §fCan be found in the §e§ki§6§lHalloween Crate§e§ki§f! + item_4: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_5: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_6: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_7: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_8: + ==: org.bukkit.inventory.ItemStack + type: GOLDEN_APPLE + damage: 1 + item_9: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_10: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_11: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_12: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_13: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_14: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_15: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_16: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_17: + ==: org.bukkit.inventory.ItemStack + type: PAPER + amount: 5 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §a§lMed Kit + lore: + - '' + - §6❙ §fRight Click to receive Resistance 3, + - §6❙ §fRegeneration 3, and 4 Absorption + - §6❙ §fHearts for §e§l5 seconds§f! + - '' + - §fCan be found in the §e§ki§6§lHalloween Crate§e§ki§f! + item_18: + ==: org.bukkit.inventory.ItemStack + type: WATCH + amount: 5 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lTime Warp + lore: + - '' + - §6❙ §fTravel back to where + - §6❙ §fyou last threw a pearl! + - '' + - §fCan be found in an §b§lAirdrop§f! + item_19: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_20: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_21: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_22: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_23: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_24: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_25: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_26: + ==: org.bukkit.inventory.ItemStack + type: BLAZE_POWDER + amount: 5 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lStrength + lore: + - '' + - §6❙ §fGive you and your teammates + - §6❙ §e§l5 seconds §fof §c§lStrength + - '' + - §fCan be found in an §b§lAirdrop§f! + item_27: + ==: org.bukkit.inventory.ItemStack + type: BLAZE_ROD + amount: 5 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lAnti-Blockup + lore: + - '' + - §6❙ §fWhen you hit a player with this + - §6❙ §c§l3 times §fthey may not block up for §e§l15 seconds§f. + - '' + - §fCan be found in the §e§ki§6§lHalloween Crate§e§ki§f! + item_28: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_29: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_30: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_31: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_32: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_33: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_34: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_35: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + armor: + item_0: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_BOOTS + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §4§l§nCave§7 ┃ §fBoots + lore: + - §cSpeed II + - §cHellForged IV + - §cRecover I + - §cFireResistance I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 4 + PROTECTION_FALL: 4 + PROTECTION_EXPLOSIONS: 4 + item_1: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_LEGGINGS + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §4§l§nCave§7 ┃ §fLeggings + lore: + - §cHellForged IV + - §cRecover I + - §cFireResistance I + - §cSwift I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 4 + PROTECTION_EXPLOSIONS: 4 + item_2: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_CHESTPLATE + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §4§l§nCave§7 ┃ §fChestplate + lore: + - §cHellForged IV + - §cRecover I + - §cFireResistance I + - §cInvisibility I + - §cFury I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 4 + PROTECTION_EXPLOSIONS: 4 + item_3: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_HELMET + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §4§l§nCave§7 ┃ §fHelmet + lore: + - §cHellForged IV + - §cImplants V + - §cMermaid III + - §cRecover I + - §cFireResistance I + - §cGreed I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 4 + PROTECTION_EXPLOSIONS: 4 + uses: 1912 + Spring: + slot: 22 + displayName: '&a&lSpring Kit' + material: RED_ROSE + category: NORMAL + cooldown: 24 + lore: + - '&7An exclusive kit to the &a&lSpring &7rank.' + - '' + - '&4&l┃ &fCooldown: &c1 Day' + - '&4&l┃ &fAvailable in: &c{remaining}' + - '' + - '&aRight Click to preview this kit' + damage: 8 + content: + item_0: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_SWORD + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §a§lSpring §7┃ §fSword + enchants: + DAMAGE_ALL: 2 + DURABILITY: 4 + FIRE_ASPECT: 2 + item_1: + ==: org.bukkit.inventory.ItemStack + type: ENDER_PEARL + amount: 16 + item_2: + ==: org.bukkit.inventory.ItemStack + type: GOLDEN_APPLE + amount: 24 + item_3: + ==: org.bukkit.inventory.ItemStack + type: EGG + amount: 16 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §d§lEggport + lore: + - '' + - §6❙ §fSwitch places with your + - §6❙ §fenemy that are within §c§l15 §fblocks! + - '' + - §fCan be found in the §e§ki§6§lHalloween Crate§e§ki§f! + item_4: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_5: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_6: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_7: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_8: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_9: + ==: org.bukkit.inventory.ItemStack + type: GOLDEN_APPLE + damage: 1 + item_10: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_11: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_12: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_13: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_14: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_15: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_16: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_17: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_18: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_19: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_20: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_21: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_22: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_23: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_24: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_25: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_26: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_27: + ==: org.bukkit.inventory.ItemStack + type: BLAZE_ROD + amount: 5 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lAnti-Blockup + lore: + - '' + - §6❙ §fWhen you hit a player with this + - §6❙ §c§l3 times §fthey may not block up for §e§l15 seconds§f. + - '' + - §fCan be found in the §e§ki§6§lHalloween Crate§e§ki§f! + item_28: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_29: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_30: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_31: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_32: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_33: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_34: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_35: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + armor: + item_0: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_BOOTS + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §a§lSpring §7┃ §fBoots + lore: + - §cSpeed II + - §cHellForged III + - §cRecover I + - §cFireResistance I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 4 + PROTECTION_FALL: 4 + item_1: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_LEGGINGS + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §a§lSpring §7┃ §fLeggings + lore: + - §cHellForged III + - §cRecover I + - §cFireResistance I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 4 + item_2: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_CHESTPLATE + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §a§lSpring §7┃ §fChestplate + lore: + - §cHellForged III + - §cRecover I + - §cFireResistance I + - §cSwift I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 4 + item_3: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_HELMET + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §a§lSpring §7┃ §fHelmet + lore: + - §cHellForged III + - §cImplants V + - §cMermaid III + - §cRecover I + - §cFireResistance I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 4 + uses: 2378 + Ravine: + slot: 24 + displayName: '&d&lRavine Kit' + material: INK_SACK + cooldown: 24 + lore: + - '&7An exclusive kit to the &dRavine &7rank.' + - '' + - '&4&l┃ &fCooldown: &c1 Day' + - '&4&l┃ &fAvailable in: &c{remaining}' + - '' + - '&aRight Click to preview this kit' + damage: 9 + category: NORMAL + content: + item_0: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_SWORD + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §d§lRavine §7┃ §f┃ §fSword + enchants: + DAMAGE_ALL: 2 + DURABILITY: 4 + LOOT_BONUS_MOBS: 4 + item_1: + ==: org.bukkit.inventory.ItemStack + type: ENDER_PEARL + amount: 16 + item_2: + ==: org.bukkit.inventory.ItemStack + type: GOLDEN_APPLE + amount: 16 + item_3: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 8270 + item_4: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_5: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_6: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_7: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_8: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_9: + ==: org.bukkit.inventory.ItemStack + type: GOLDEN_APPLE + damage: 1 + item_10: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_11: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_12: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_13: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_14: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_15: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_16: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_17: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_18: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_19: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_20: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_21: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_22: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_23: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_24: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_25: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_26: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_27: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_28: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_29: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_30: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_31: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_32: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_33: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_34: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_35: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + armor: + item_0: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_BOOTS + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §d§lRavine §7┃ §fBoots + lore: + - §cSpeed II + - §cHellForged III + - §cRecover I + - §cFireResistance I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 4 + PROTECTION_FALL: 4 + item_1: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_LEGGINGS + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §d§lRavine §7┃ §fLeggings + lore: + - §cHellForged III + - §cRecover I + - §cFireResistance I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 4 + item_2: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_CHESTPLATE + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §d§lRavine §7┃ §fChestplate + lore: + - §cHellForged III + - §cRecover I + - §cFireResistance I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 4 + item_3: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_HELMET + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §d§lRavine §7┃ §fHelmet + lore: + - §cHellForged III + - §cImplants V + - §cMermaid III + - §cRecover I + - §cFireResistance I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 4 + uses: 3256 + Archer: + slot: 31 + displayName: '&d&lArcher Kit' + material: BOW + cooldown: 24 + category: NORMAL + lore: + - '&7You may purchase this kit at &fstore.cavepvp.org' + - '' + - '&4&l┃ &fCooldown: &c1 Day' + - '&4&l┃ &fAvailable in: &c{remaining}' + - '' + - '&aRight Click to preview this kit' + content: + item_0: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_SWORD + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §d§lArcher §7┃ §fSword + enchants: + DAMAGE_ALL: 2 + DURABILITY: 3 + item_1: + ==: org.bukkit.inventory.ItemStack + type: ENDER_PEARL + amount: 16 + item_2: + ==: org.bukkit.inventory.ItemStack + type: BOW + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §d§lArcher §7┃ §fBow + enchants: + ARROW_DAMAGE: 4 + DURABILITY: 4 + ARROW_FIRE: 1 + ARROW_INFINITE: 1 + item_3: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_4: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_5: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_6: + ==: org.bukkit.inventory.ItemStack + type: SUGAR + amount: 32 + item_7: + ==: org.bukkit.inventory.ItemStack + type: FEATHER + amount: 32 + item_8: + ==: org.bukkit.inventory.ItemStack + type: COOKED_BEEF + amount: 64 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §d§lArcher §7┃ §fSteak + item_9: + ==: org.bukkit.inventory.ItemStack + type: ARROW + item_10: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_11: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_12: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_13: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_14: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_15: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_16: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_17: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_18: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_19: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_20: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_21: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_22: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_23: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_24: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_25: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_26: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_27: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_28: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_29: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_30: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_31: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_32: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_33: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_34: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_35: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + armor: + item_0: + ==: org.bukkit.inventory.ItemStack + type: LEATHER_BOOTS + meta: + ==: ItemMeta + meta-type: LEATHER_ARMOR + display-name: §d§lArcher §7┃ §fBoots + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 3 + PROTECTION_FALL: 4 + item_1: + ==: org.bukkit.inventory.ItemStack + type: LEATHER_LEGGINGS + meta: + ==: ItemMeta + meta-type: LEATHER_ARMOR + display-name: §d§lArcher §7┃ §fLeggings + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 3 + item_2: + ==: org.bukkit.inventory.ItemStack + type: LEATHER_CHESTPLATE + meta: + ==: ItemMeta + meta-type: LEATHER_ARMOR + display-name: §d§lArcher §7┃ §fChestplate + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 3 + item_3: + ==: org.bukkit.inventory.ItemStack + type: LEATHER_HELMET + meta: + ==: ItemMeta + meta-type: LEATHER_ARMOR + display-name: §d§lArcher §7┃ §fHelmet + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 3 + damage: 0 + uses: 5534 + UltimateRogue: + slot: 15 + displayName: '&3&lUltimate Rogue Kit' + material: CHAINMAIL_HELMET + cooldown: 24 + lore: + - '&7You may purchase this kit at &fstore.cavepvp.org' + - '' + - '&4&l┃ &fCooldown: &c1 Day' + - '&4&l┃ &fAvailable in: &c{remaining}' + - '' + - '&aRight Click to preview this kit' + damage: 0 + category: ULTIMATE + content: + item_0: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_SWORD + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §3§lUltimate Rogue §7┃ §fSword + enchants: + DAMAGE_ALL: 2 + DURABILITY: 4 + item_1: + ==: org.bukkit.inventory.ItemStack + type: ENDER_PEARL + amount: 16 + item_2: + ==: org.bukkit.inventory.ItemStack + type: SUGAR + amount: 64 + item_3: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_4: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_5: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_6: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_7: + ==: org.bukkit.inventory.ItemStack + type: GOLD_SWORD + item_8: + ==: org.bukkit.inventory.ItemStack + type: GOLD_SWORD + item_9: + ==: org.bukkit.inventory.ItemStack + type: FEATHER + amount: 64 + item_10: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_11: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_12: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_13: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_14: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_15: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_16: + ==: org.bukkit.inventory.ItemStack + type: GOLD_SWORD + item_17: + ==: org.bukkit.inventory.ItemStack + type: GOLD_SWORD + item_18: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_19: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_20: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_21: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_22: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_23: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_24: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_25: + ==: org.bukkit.inventory.ItemStack + type: GOLD_SWORD + item_26: + ==: org.bukkit.inventory.ItemStack + type: GOLD_SWORD + item_27: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_28: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_29: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_30: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_31: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_32: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_33: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_34: + ==: org.bukkit.inventory.ItemStack + type: GOLD_SWORD + item_35: + ==: org.bukkit.inventory.ItemStack + type: GOLD_SWORD + armor: + item_0: + ==: org.bukkit.inventory.ItemStack + type: CHAINMAIL_BOOTS + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §3§lUltimate Rogue §7┃ §fBoots + lore: + - §cHellForged IV + - §cRecover I + - §cFireResistance I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 4 + PROTECTION_FALL: 4 + PROTECTION_EXPLOSIONS: 4 + item_1: + ==: org.bukkit.inventory.ItemStack + type: CHAINMAIL_LEGGINGS + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §3§lUltimate Rogue §7┃ §fLeggings + lore: + - §cHellForged IV + - §cRecover I + - §cFireResistance I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 4 + PROTECTION_EXPLOSIONS: 4 + item_2: + ==: org.bukkit.inventory.ItemStack + type: CHAINMAIL_CHESTPLATE + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §3§lUltimate Rogue §7┃ §fChestplate + lore: + - §cHellForged IV + - §cRecover I + - §cFireResistance I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 4 + PROTECTION_EXPLOSIONS: 4 + item_3: + ==: org.bukkit.inventory.ItemStack + type: CHAINMAIL_HELMET + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §3§lUltimate Rogue §7┃ §fHelmet + lore: + - §cHellForged IV + - §cImplants V + - §cMermaid III + - §cRecover I + - §cFireResistance I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 4 + PROTECTION_EXPLOSIONS: 4 + uses: 972 + Builder: + slot: 17 + displayName: '&c&lBuilder Kit' + material: GRASS + cooldown: 24 + lore: + - '&7This kit is free to all players!' + - '' + - '&4&l┃ &fCooldown: &c1 Day' + - '&4&l┃ &fAvailable in: &c{remaining}' + - '' + - '&aRight Click to preview this kit' + damage: 0 + category: FREE + content: + item_0: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_PICKAXE + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §c§lBuilder §7┃ §fPickaxe + enchants: + DIG_SPEED: 5 + DURABILITY: 3 + item_1: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_AXE + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §c§lBuilder §7┃ §fAxe + enchants: + DIG_SPEED: 5 + DURABILITY: 3 + item_2: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_SPADE + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §c§lBuilder §7┃ §fShovel + enchants: + DIG_SPEED: 5 + DURABILITY: 3 + item_3: + ==: org.bukkit.inventory.ItemStack + type: SMOOTH_BRICK + amount: 64 + item_4: + ==: org.bukkit.inventory.ItemStack + type: SMOOTH_BRICK + amount: 64 + item_5: + ==: org.bukkit.inventory.ItemStack + type: SMOOTH_BRICK + amount: 64 + item_6: + ==: org.bukkit.inventory.ItemStack + type: SMOOTH_BRICK + amount: 64 + item_7: + ==: org.bukkit.inventory.ItemStack + type: SMOOTH_BRICK + amount: 64 + item_8: + ==: org.bukkit.inventory.ItemStack + type: GRASS + amount: 64 + item_9: + ==: org.bukkit.inventory.ItemStack + type: SANDSTONE + amount: 64 + item_10: + ==: org.bukkit.inventory.ItemStack + type: FENCE_GATE + amount: 64 + item_11: + ==: org.bukkit.inventory.ItemStack + type: GLASS + amount: 64 + item_12: + ==: org.bukkit.inventory.ItemStack + type: SANDSTONE + amount: 64 + item_13: + ==: org.bukkit.inventory.ItemStack + type: LOG + damage: 2 + amount: 64 + item_14: + ==: org.bukkit.inventory.ItemStack + type: LOG + damage: 1 + amount: 64 + item_15: + ==: org.bukkit.inventory.ItemStack + type: LOG + damage: 3 + amount: 64 + item_16: + ==: org.bukkit.inventory.ItemStack + type: LOG + amount: 64 + item_17: + ==: org.bukkit.inventory.ItemStack + type: LOG + amount: 64 + item_18: + ==: org.bukkit.inventory.ItemStack + type: STONE + amount: 64 + item_19: + ==: org.bukkit.inventory.ItemStack + type: STONE + amount: 64 + item_20: + ==: org.bukkit.inventory.ItemStack + type: STONE + amount: 64 + item_21: + ==: org.bukkit.inventory.ItemStack + type: STONE + amount: 64 + item_22: + ==: org.bukkit.inventory.ItemStack + type: HOPPER + amount: 24 + item_23: + ==: org.bukkit.inventory.ItemStack + type: PISTON_STICKY_BASE + amount: 16 + item_24: + ==: org.bukkit.inventory.ItemStack + type: LEVER + amount: 64 + item_25: + ==: org.bukkit.inventory.ItemStack + type: PISTON_BASE + amount: 16 + item_26: + ==: org.bukkit.inventory.ItemStack + type: REDSTONE + amount: 64 + item_27: + ==: org.bukkit.inventory.ItemStack + type: LEVER + amount: 64 + item_28: + ==: org.bukkit.inventory.ItemStack + type: REDSTONE_COMPARATOR + amount: 10 + item_29: + ==: org.bukkit.inventory.ItemStack + type: DIODE + amount: 64 + item_30: + ==: org.bukkit.inventory.ItemStack + type: REDSTONE_BLOCK + amount: 32 + armor: + item_0: + ==: org.bukkit.inventory.ItemStack + type: AIR + damage: -1 + amount: 0 + item_1: + ==: org.bukkit.inventory.ItemStack + type: AIR + damage: -1 + amount: 0 + item_2: + ==: org.bukkit.inventory.ItemStack + type: AIR + damage: -1 + amount: 0 + item_3: + ==: org.bukkit.inventory.ItemStack + type: AIR + damage: -1 + amount: 0 + uses: 12252 + Diamond: + slot: 32 + displayName: '&b&lDiamond Kit' + material: DIAMOND_SWORD + cooldown: 24 + category: NORMAL + lore: + - '&7You may purchase this kit at &fstore.cavepvp.org' + - '' + - '&4&l┃ &fCooldown: &c1 Day' + - '&4&l┃ &fAvailable in: &c{remaining}' + - '' + - '&aRight Click to preview this kit' + content: + item_0: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_SWORD + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §b§lDiamond §7┃ §fSword + enchants: + DAMAGE_ALL: 2 + DURABILITY: 3 + item_1: + ==: org.bukkit.inventory.ItemStack + type: ENDER_PEARL + amount: 16 + item_2: + ==: org.bukkit.inventory.ItemStack + type: COOKED_BEEF + amount: 64 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §b§lDiamond §7┃ §fSteak + item_3: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 8226 + item_4: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_5: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_6: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_7: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_8: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_9: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_10: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_11: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_12: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_13: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_14: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_15: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_16: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_17: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 8226 + item_18: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_19: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_20: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_21: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_22: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_23: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_24: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_25: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_26: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 8226 + item_27: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_28: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_29: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_30: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_31: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_32: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_33: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_34: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 8226 + item_35: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 8226 + armor: + item_0: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_BOOTS + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §b§lDiamond §7┃ §fBoots + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 3 + PROTECTION_FALL: 4 + item_1: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_LEGGINGS + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §b§lDiamond §7┃ §fLeggings + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 3 + item_2: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_CHESTPLATE + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §b§lDiamond §7┃ §fChestplate + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 3 + item_3: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_HELMET + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §b§lDiamond §7┃ §fHelmet + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 3 + damage: 0 + uses: 5350 + Starter: + slot: 13 + displayName: '&e&lStarter Kit' + material: FISHING_ROD + cooldown: 24 + lore: + - '&7This kit is free to all players!' + - '' + - '&4&l┃ &fCooldown: &c1 Day' + - '&4&l┃ &fAvailable in: &c{remaining}' + - '' + - '&aRight Click to preview this kit' + damage: 0 + category: FREE + content: + item_0: + ==: org.bukkit.inventory.ItemStack + type: IRON_SWORD + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §e§lStarter §7┃ §fSword + item_1: + ==: org.bukkit.inventory.ItemStack + type: FISHING_ROD + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + enchants: + LURE: 2 + item_2: + ==: org.bukkit.inventory.ItemStack + type: IRON_PICKAXE + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §e§lStarter §7┃ §fPickaxe + enchants: + DIG_SPEED: 2 + item_3: + ==: org.bukkit.inventory.ItemStack + type: IRON_AXE + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §e§lStarter §7┃ §fAxe + enchants: + DIG_SPEED: 2 + item_4: + ==: org.bukkit.inventory.ItemStack + type: IRON_SPADE + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §e§lStarter §7┃ §fShovel + enchants: + DIG_SPEED: 2 + item_5: + ==: org.bukkit.inventory.ItemStack + type: COOKED_BEEF + amount: 64 + item_6: + ==: org.bukkit.inventory.ItemStack + type: TRIPWIRE_HOOK + amount: 3 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §e§ki§6§l Halloween Keys §e§ki + lore: + - '' + - §7Right click the §6§lHalloween Crate §7to obtain rewards + item_7: + ==: org.bukkit.inventory.ItemStack + type: TRIPWIRE_HOOK + amount: 5 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §5§lLegendary Key + lore: + - '' + - §7Right click the §5Legendary Crate §7to obtain rewards! + item_8: + ==: org.bukkit.inventory.ItemStack + type: COBBLESTONE + amount: 64 + item_9: + ==: org.bukkit.inventory.ItemStack + type: SUGAR + amount: 8 + item_10: + ==: org.bukkit.inventory.ItemStack + type: GLOWSTONE + amount: 8 + item_11: + ==: org.bukkit.inventory.ItemStack + type: FERMENTED_SPIDER_EYE + amount: 8 + item_12: + ==: org.bukkit.inventory.ItemStack + type: SULPHUR + amount: 8 + item_13: + ==: org.bukkit.inventory.ItemStack + type: NETHER_STALK + amount: 8 + item_14: + ==: org.bukkit.inventory.ItemStack + type: SPECKLED_MELON + amount: 24 + item_15: + ==: org.bukkit.inventory.ItemStack + type: SPECKLED_MELON + amount: 8 + armor: + item_0: + ==: org.bukkit.inventory.ItemStack + type: LEATHER_BOOTS + meta: + ==: ItemMeta + meta-type: LEATHER_ARMOR + display-name: §e§lStarter §7┃ §fBoots + item_1: + ==: org.bukkit.inventory.ItemStack + type: LEATHER_LEGGINGS + meta: + ==: ItemMeta + meta-type: LEATHER_ARMOR + display-name: §e§lStarter §7┃ §fLeggings + item_2: + ==: org.bukkit.inventory.ItemStack + type: LEATHER_CHESTPLATE + meta: + ==: ItemMeta + meta-type: LEATHER_ARMOR + display-name: §e§lStarter §7┃ §fChestplate + item_3: + ==: org.bukkit.inventory.ItemStack + type: LEATHER_HELMET + meta: + ==: ItemMeta + meta-type: LEATHER_ARMOR + display-name: §e§lStarter §7┃ §fHelmet + uses: 16999 + NewSeasonal: + slot: 14 + displayName: '&f&ki&4&l 3.0 Kit&f &ki' + material: REDSTONE_BLOCK + cooldown: 24 + lore: + - '&7You may purchase this kit at &fstore.cavepvp.org' + - '' + - '&4&l┃ &fCooldown: &c1 Day' + - '&4&l┃ &fAvailable in: &c{remaining}' + - '' + - '&aRight Click to preview this kit' + damage: 0 + category: OP + content: + item_0: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_SWORD + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §4§l3.0§7 ┃ §fSword + enchants: + DAMAGE_ALL: 2 + DURABILITY: 5 + FIRE_ASPECT: 1 + item_1: + ==: org.bukkit.inventory.ItemStack + type: EGG + amount: 16 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §d§lEggport + lore: + - '' + - §6❙ §fSwitch places with your + - §6❙ §fenemy that are within §c§l15 §fblocks! + - '' + - §fCan be found in the §6§lSummer Crate§f! + item_2: + ==: org.bukkit.inventory.ItemStack + type: PAPER + amount: 5 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §a§lMed Kit + lore: + - '' + - §6❙ §fRight Click to receive Resistance 3, + - §6❙ §fRegeneration 3, and 4 Absorption + - §6❙ §fHearts for §e§l5 seconds§f! + - '' + - §fCan be found in the §e§ki§6§lHalloween Crate§e§ki§f! + item_3: + ==: org.bukkit.inventory.ItemStack + type: BLAZE_ROD + amount: 5 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lAnti-Blockup + lore: + - '' + - §6❙ §fWhen you hit a player with this + - §6❙ §c§l3 times §fthey may not block up for §e§l15 seconds§f. + - '' + - §fCan be found in the §e§ki§6§lHalloween Crate§e§ki§f! + item_4: + ==: org.bukkit.inventory.ItemStack + type: NETHER_STAR + amount: 3 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §b§lNinja Star + lore: + - '' + - §6❙ §fTeleport to the last person that + - §6❙ §fhit you within the last §e§l30 seconds§f! + - '' + - §fCan be found in an §b§lAirdrop§f! + item_5: + ==: org.bukkit.inventory.ItemStack + type: EYE_OF_ENDER + amount: 5 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §c§lAnti Pearl 2.0 + lore: + - '' + - §6❙ §fHit a player to put them on enderpearl cooldown. + - §6❙ §fRight Click to remove your enderpearl cooldown. + - '' + - §fCan be found in the §c§liMakeMcVids Crate§f! + item_6: + ==: org.bukkit.inventory.ItemStack + type: SNOW_BALL + amount: 5 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §4§lBall Of Rage + lore: + - '' + - §6❙ §fThrow to create a cloud of effects + - §6❙ §fwhere all teammates within 5 block + - §6❙ §fradius will be given positive effects. + - '' + - §fCan be found in the §4§lSimplyTrash Crate§f! + item_7: + ==: org.bukkit.inventory.ItemStack + type: MONSTER_EGG + damage: 66 + amount: 5 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §5§lWitch Effect + lore: + - '' + - §6❙ §fSpawn a witch that gives you passive + - '§6❙ §fbard effects: strength, regeneration,' + - §6❙ §fand resistance. + - '' + - §fCan be found in the §4§lCave Crate§f! + item_8: + ==: org.bukkit.inventory.ItemStack + type: RAW_FISH + damage: 3 + amount: 5 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §c§lDebuff Fish + lore: + - '' + - §6❙ §fHit a player §c§l3 times §fto + - §6❙ §fhit you deal has a §c§l15% §fchance of + - '' + - §fCan be found in the §4§lCave Crate§f! + item_9: + ==: org.bukkit.inventory.ItemStack + type: GOLDEN_APPLE + damage: 1 + item_10: + ==: org.bukkit.inventory.ItemStack + type: LEATHER_HELMET + meta: + ==: ItemMeta + meta-type: LEATHER_ARMOR + display-name: §4§l3.0§7 ┃ §fHelmet + lore: + - §cHellForged IV + - §cImplants V + - §cMermaid III + - §cRecover I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 5 + item_11: + ==: org.bukkit.inventory.ItemStack + type: LEATHER_CHESTPLATE + meta: + ==: ItemMeta + meta-type: LEATHER_ARMOR + display-name: §4§l3.0§7 ┃ §fChestplate + lore: + - §cHellForged IV + - §cImplants V + - §cRecover I + - §cFireResistance I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 5 + item_12: + ==: org.bukkit.inventory.ItemStack + type: LEATHER_LEGGINGS + meta: + ==: ItemMeta + meta-type: LEATHER_ARMOR + display-name: §4§l3.0§7 ┃ §fLeggings + lore: + - §cHellForged IV + - §cImplants V + - §cRecover I + - §cFireResistance I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 5 + item_13: + ==: org.bukkit.inventory.ItemStack + type: LEATHER_BOOTS + meta: + ==: ItemMeta + meta-type: LEATHER_ARMOR + display-name: §4§l3.0§7 ┃ §fBoots + lore: + - §cHellForged IV + - §cImplants V + - §cRecover I + - §cFireResistance I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 5 + PROTECTION_FALL: 4 + item_18: + ==: org.bukkit.inventory.ItemStack + type: TRIPWIRE_HOOK + amount: 3 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §e§ki§6§l Halloween Keys §e§ki + lore: + - '' + - §7Right click the §6§lHalloween Crate §7to obtain rewards + item_16: + ==: org.bukkit.inventory.ItemStack + type: BOW + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §4§l3.0§7 ┃ §fBow + enchants: + ARROW_DAMAGE: 5 + ARROW_FIRE: 1 + DURABILITY: 3 + ARROW_INFINITE: 1 + item_17: + ==: org.bukkit.inventory.ItemStack + type: ENDER_CHEST + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §e§ki§6§l Fall Lootbox §e§ki + lore: + - §7Unlocked at §fstore.cavepvp.org + - '' + - §6§lFINAL REWARDS + - ' §7➡ §4Cave Rank' + - ' §7➡ §6Spooky Rank' + - ' §7➡ §6Premium Battle Pass' + - ' §7➡ §e§lVIP Subscription' + - ' §7➡ §6§lHalloween Kit' + - ' §7➡ §2$§a10 Buycraft Voucher' + - ' §7➡ §2$§a5 Buycraft Voucher' + - ' §7➡ §a§l2x Perk Keys' + - ' §7➡ §b§l3x Airdrops' + - ' §7➡ §6§l5x Halloween Keys' + - ' §7➡ §cRandom Clickable Kit' + - '' + - §6§lNORMAL REWARDS + - ' §7➡ §d16x Eggports' + - ' §7➡ §68x Anti-Blockup' + - ' §7➡ §a8x Med Kit' + - ' §7➡ §68x Midas Touch' + - ' §7➡ §cCrowbar' + - ' §7➡ §6§lGod Apple' + - ' §7➡ §632x Golden Apple' + - ' §7➡ §4OP Bow' + - ' §7➡ §bDiamond Sword' + - ' §7➡ §bDiamond Helmet' + - ' §7➡ §bDiamond Chestplate' + - ' §7➡ §bDiamond Leggings' + - ' §7➡ §bDiamond Boots' + - ' §7➡ §bDiamond Pickaxe' + - ' §7➡ §d16x Random Valuable Blocks' + - ' §7➡ §832x Gun Powder' + - ' §7➡ §e32x Glowstone Blocks' + - ' §7➡ §432x Nether Wart' + - ' §7➡ §c32x Glistering Melons' + item_14: + ==: org.bukkit.inventory.ItemStack + type: BEACON + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lReinforce Lootbox + lore: + - §7Unlocked at §fstore.cavepvp.org + - '' + - §c§lEND REWARDS + - §8┃ §4§lLEGENDARY §4Cave §7Rank + - §8┃ §4§lLEGENDARY §aSpring §7Rank + - §8┃ §4§lLEGENDARY §dRavine §7Rank + - §8┃ §4§lLEGENDARY §2$§a50 §7Buycraft Voucher + - §8┃ §4§lLEGENDARY §2$§a25 §7Buycraft Voucher + - §8┃ §4§lLEGENDARY §ePremium Battle Pass + - §8┃ §5§lRARE §77d §e§lVIP §7Subscription + - §8┃ §5§lRARE §72x §c§lPerk §7Keys + - §8┃ §5§lRARE §2$§a10 §7Buycraft Voucher + - §8┃ §d§lUNCOMMON §73x §b§lAirdrops + - §8┃ §a§lCOMMON §7Random Clickable Kit + - §8┃ §a§lCOMMON §56x §7End Portal Frames + - §8┃ §a§lCOMMON §616x §7God Apples + - §8┃ §a§lCOMMON §e64x §7Golden Apples + - '' + - §c§lREWARDS + - §8┃ §c§lRARE §cFire §7Sword + - §8┃ §d§lUNCOMMON §bDiamond §7Helmet + - §8┃ §d§lUNCOMMON §bDiamond §7Chestplate + - §8┃ §d§lUNCOMMON §bDiamond §7Leggings + - §8┃ §d§lUNCOMMON §bDiamond §7Boots + - §8┃ §d§lUNCOMMON §bDiamond §7Looting Sword + - §8┃ §a§lCOMMON §6Gold §7Helmet + - §8┃ §a§lCOMMON §6Gold §7Chestplate + - §8┃ §a§lCOMMON §6Gold §7Leggings + - §8┃ §a§lCOMMON §6Gold §7Boots + - §8┃ §a§lCOMMON §dLeather §7Helmet + - §8┃ §a§lCOMMON §dLeather §7Chestplate + - §8┃ §a§lCOMMON §dLeather §7Leggings + - §8┃ §a§lCOMMON §dLeather §7Boots + item_15: + ==: org.bukkit.inventory.ItemStack + type: GOLDEN_APPLE + amount: 64 + item_19: + ==: org.bukkit.inventory.ItemStack + type: GOLD_HELMET + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §4§l3.0§7 ┃ §fHelmet + lore: + - §cHellForged IV + - §cImplants V + - §cMermaid III + - §cRecover I + - §cFireResistance I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 4 + item_20: + ==: org.bukkit.inventory.ItemStack + type: GOLD_CHESTPLATE + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §4§l3.0§7 ┃ §fChestplate + lore: + - §cHellForged IV + - §cRecover I + - §cFireResistance I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 4 + item_21: + ==: org.bukkit.inventory.ItemStack + type: GOLD_LEGGINGS + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §4§l3.0§7 ┃ §fLeggings + lore: + - §cHellForged IV + - §cRecover I + - §cFireResistance I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 4 + item_22: + ==: org.bukkit.inventory.ItemStack + type: GOLD_BOOTS + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §4§l3.0§7 ┃ §fBoots + lore: + - §cHellForged IV + - §cRecover I + - §cFireResistance I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 4 + PROTECTION_FALL: 4 + item_23: + ==: org.bukkit.inventory.ItemStack + type: EMERALD_BLOCK + amount: 64 + item_24: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_BLOCK + amount: 64 + item_25: + ==: org.bukkit.inventory.ItemStack + type: IRON_BLOCK + amount: 64 + item_26: + ==: org.bukkit.inventory.ItemStack + type: GOLD_BLOCK + amount: 64 + item_27: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_PICKAXE + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §4§l3.0§7 ┃ §fFortune + enchants: + DIG_SPEED: 5 + DURABILITY: 5 + LOOT_BONUS_BLOCKS: 5 + item_28: + ==: org.bukkit.inventory.ItemStack + type: CHAINMAIL_HELMET + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §4§l3.0§7 ┃ §fHelmet + lore: + - §cHellForged IV + - §cImplants V + - §cMermaid III + - §cRecover I + - §cFireResistance I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 4 + item_29: + ==: org.bukkit.inventory.ItemStack + type: CHAINMAIL_CHESTPLATE + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §4§l3.0§7 ┃ §fChestplate + lore: + - §cHellForged IV + - §cRecover I + - §cFireResistance I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 4 + item_30: + ==: org.bukkit.inventory.ItemStack + type: CHAINMAIL_LEGGINGS + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §4§l3.0§7 ┃ §fLeggings + lore: + - §cHellForged IV + - §cRecover I + - §cFireResistance I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 4 + item_31: + ==: org.bukkit.inventory.ItemStack + type: CHAINMAIL_BOOTS + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §4§l3.0§7 ┃ §fBoots + lore: + - §cHellForged IV + - §cRecover I + - §cFireResistance I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 4 + PROTECTION_FALL: 4 + item_32: + ==: org.bukkit.inventory.ItemStack + type: ENDER_PEARL + amount: 16 + item_33: + ==: org.bukkit.inventory.ItemStack + type: ARROW + amount: 64 + item_34: + ==: org.bukkit.inventory.ItemStack + type: INK_SACK + amount: 5 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §3§lInvisibility + lore: + - '' + - §6❙ §fWhen you right click this item + - §6❙ §fyour armor will no longer be visible. + - '' + - §fCan be found in an §b§lAirdrop§f! + item_35: + ==: org.bukkit.inventory.ItemStack + type: WATCH + amount: 5 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lTime Warp + lore: + - '' + - §6❙ §fTravel back to where + - §6❙ §fyou last threw a pearl! + - '' + - §fCan be found in an §b§lAirdrop§f! + armor: + item_0: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_BOOTS + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §4§l3.0§7 ┃ §fBoots + lore: + - §cSpeed II + - §cHellForged IV + - §cImplants V + - §cRecover I + - §cFireResistance I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 5 + PROTECTION_FALL: 4 + item_1: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_LEGGINGS + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §4§l3.0§7 ┃ §fLeggings + lore: + - §cHellForged IV + - §cImplants V + - §cRecover I + - §cFireResistance I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 5 + item_2: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_CHESTPLATE + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §4§l3.0§7 ┃ §fChestplate + lore: + - §cHellForged IV + - §cImplants V + - §cRecover I + - §cFireResistance I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 5 + item_3: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_HELMET + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §4§l3.0§7 ┃ §fHelmet + lore: + - §cHellForged IV + - §cImplants V + - §cMermaid III + - §cRecover I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 5 + uses: 296 + UltimateMiner: + slot: 16 + displayName: '&f&lUltimate Miner Kit' + material: IRON_HELMET + cooldown: 24 + lore: + - '&7You may purchase this kit at &fstore.cavepvp.org' + - '' + - '&4&l┃ &fCooldown: &c1 Day' + - '&4&l┃ &fAvailable in: &c{remaining}' + - '' + - '&aRight Click to preview this kit' + damage: 0 + category: ULTIMATE + content: + item_0: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_SWORD + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §f§lUltimate Miner§7 ┃ §fSword + enchants: + DAMAGE_ALL: 2 + DURABILITY: 4 + item_1: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_PICKAXE + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §f§lUltimate Miner§7 ┃ §fPickaxe + enchants: + DIG_SPEED: 7 + DURABILITY: 4 + item_2: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_PICKAXE + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §f§lUltimate Miner§7 ┃ §fFortune + enchants: + DIG_SPEED: 7 + DURABILITY: 4 + LOOT_BONUS_BLOCKS: 4 + item_3: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_SPADE + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §f§lUltimate Miner§7 ┃ §fShovel + enchants: + DIG_SPEED: 7 + DURABILITY: 4 + item_4: + ==: org.bukkit.inventory.ItemStack + type: ANVIL + amount: 16 + item_5: + ==: org.bukkit.inventory.ItemStack + type: EXP_BOTTLE + amount: 64 + item_6: + ==: org.bukkit.inventory.ItemStack + type: WORKBENCH + amount: 2 + item_7: + ==: org.bukkit.inventory.ItemStack + type: WATER_BUCKET + item_8: + ==: org.bukkit.inventory.ItemStack + type: LAVA_BUCKET + item_9: + ==: org.bukkit.inventory.ItemStack + type: WATER_BUCKET + item_10: + ==: org.bukkit.inventory.ItemStack + type: LAVA_BUCKET + armor: + item_0: + ==: org.bukkit.inventory.ItemStack + type: IRON_BOOTS + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §f§lUltimate Miner§7 ┃ §fBoots + lore: + - §cSpeed II + - §cHellForged IV + - §cRecover I + - §cFireResistance I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 4 + PROTECTION_FALL: 4 + PROTECTION_EXPLOSIONS: 4 + item_1: + ==: org.bukkit.inventory.ItemStack + type: IRON_LEGGINGS + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §f§lUltimate Miner§7 ┃ §fLeggings + lore: + - §cHellForged IV + - §cRecover I + - §cFireResistance I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 4 + PROTECTION_EXPLOSIONS: 4 + item_2: + ==: org.bukkit.inventory.ItemStack + type: IRON_CHESTPLATE + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §f§lUltimate Miner§7 ┃ §fChestplate + lore: + - §cHellForged IV + - §cRecover I + - §cFireResistance I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 4 + PROTECTION_EXPLOSIONS: 4 + item_3: + ==: org.bukkit.inventory.ItemStack + type: IRON_HELMET + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §f§lUltimate Miner§7 ┃ §fHelmet + lore: + - §cHellForged IV + - §cImplants V + - §cMermaid III + - §cRecover I + - §cFireResistance I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 4 + PROTECTION_EXPLOSIONS: 4 + uses: 919 + Rogue: + slot: 33 + displayName: '&3&lRogue Kit' + material: GOLD_SWORD + cooldown: 24 + category: NORMAL + lore: + - '&7You may purchase this kit at &fstore.cavepvp.org' + - '' + - '&4&l┃ &fCooldown: &c1 Day' + - '&4&l┃ &fAvailable in: &c{remaining}' + - '' + - '&aRight Click to preview this kit' + content: + item_0: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_SWORD + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §3§lRogue§7 ┃ §fSword + enchants: + DAMAGE_ALL: 2 + DURABILITY: 3 + item_1: + ==: org.bukkit.inventory.ItemStack + type: ENDER_PEARL + amount: 16 + item_2: + ==: org.bukkit.inventory.ItemStack + type: GOLD_SWORD + item_3: + ==: org.bukkit.inventory.ItemStack + type: GOLD_SWORD + item_4: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_5: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_6: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_7: + ==: org.bukkit.inventory.ItemStack + type: SUGAR + amount: 32 + item_8: + ==: org.bukkit.inventory.ItemStack + type: COOKED_BEEF + amount: 64 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §3§lRogue§7 ┃ §fSteak + item_9: + ==: org.bukkit.inventory.ItemStack + type: FEATHER + amount: 32 + item_10: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_11: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_12: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_13: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_14: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_15: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_16: + ==: org.bukkit.inventory.ItemStack + type: GOLD_SWORD + item_17: + ==: org.bukkit.inventory.ItemStack + type: GOLD_SWORD + item_18: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_19: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_20: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_21: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_22: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_23: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_24: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_25: + ==: org.bukkit.inventory.ItemStack + type: GOLD_SWORD + item_26: + ==: org.bukkit.inventory.ItemStack + type: GOLD_SWORD + item_27: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_28: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_29: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_30: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_31: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_32: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_33: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_34: + ==: org.bukkit.inventory.ItemStack + type: GOLD_SWORD + item_35: + ==: org.bukkit.inventory.ItemStack + type: GOLD_SWORD + armor: + item_0: + ==: org.bukkit.inventory.ItemStack + type: CHAINMAIL_BOOTS + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §3§lRogue§7 ┃ §fBoots + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 3 + PROTECTION_FALL: 4 + item_1: + ==: org.bukkit.inventory.ItemStack + type: CHAINMAIL_LEGGINGS + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §3§lRogue§7 ┃ §fLeggings + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 3 + item_2: + ==: org.bukkit.inventory.ItemStack + type: CHAINMAIL_CHESTPLATE + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §3§lRogue§7 ┃ §fChestplate + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 3 + item_3: + ==: org.bukkit.inventory.ItemStack + type: CHAINMAIL_HELMET + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §3§lRogue§7 ┃ §fHelmet + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 3 + damage: 0 + uses: 2846 + Bard: + slot: 30 + displayName: '&6&lBard Kit' + material: BLAZE_POWDER + cooldown: 24 + category: NORMAL + lore: + - '&7You may purchase this kit at &fstore.cavepvp.org' + - '' + - '&4&l┃ &fCooldown: &c1 Day' + - '&4&l┃ &fAvailable in: &c{remaining}' + - '' + - '&aRight Click to preview this kit' + content: + item_0: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_SWORD + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lBard§7 ┃ §fSword + enchants: + DAMAGE_ALL: 1 + DURABILITY: 3 + item_1: + ==: org.bukkit.inventory.ItemStack + type: ENDER_PEARL + amount: 14 + item_2: + ==: org.bukkit.inventory.ItemStack + type: IRON_INGOT + amount: 32 + item_3: + ==: org.bukkit.inventory.ItemStack + type: BLAZE_POWDER + amount: 32 + item_4: + ==: org.bukkit.inventory.ItemStack + type: SUGAR + amount: 32 + item_5: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_6: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_7: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_8: + ==: org.bukkit.inventory.ItemStack + type: COOKED_BEEF + amount: 64 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lBard§7 ┃ §fKit + item_9: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_10: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_11: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_12: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_13: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_14: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_15: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_16: + ==: org.bukkit.inventory.ItemStack + type: SPIDER_EYE + amount: 32 + item_17: + ==: org.bukkit.inventory.ItemStack + type: MAGMA_CREAM + amount: 32 + item_18: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_19: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_20: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_21: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_22: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_23: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_24: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_25: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_26: + ==: org.bukkit.inventory.ItemStack + type: GHAST_TEAR + amount: 32 + item_27: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_28: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_29: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_30: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_31: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_32: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_33: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_34: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_35: + ==: org.bukkit.inventory.ItemStack + type: FEATHER + amount: 32 + armor: + item_0: + ==: org.bukkit.inventory.ItemStack + type: GOLD_BOOTS + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lBard§7 ┃ §fBoots + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 3 + PROTECTION_FALL: 4 + item_1: + ==: org.bukkit.inventory.ItemStack + type: GOLD_LEGGINGS + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lBard§7 ┃ §fLeggings + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 3 + item_2: + ==: org.bukkit.inventory.ItemStack + type: GOLD_CHESTPLATE + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lBard§7 ┃ §fChestplate + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 3 + item_3: + ==: org.bukkit.inventory.ItemStack + type: GOLD_HELMET + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lBard§7 ┃ §fHelmet + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 3 + damage: 0 + uses: 2954 + UltimateBard: + slot: 13 + displayName: '&6&lUltimate Bard Kit' + material: GOLD_HELMET + category: ULTIMATE + cooldown: 24 + lore: + - '&7You may purchase this kit at &fstore.cavepvp.org' + - '' + - '&4&l┃ &fCooldown: &c1 Day' + - '&4&l┃ &fAvailable in: &c{remaining}' + - '' + - '&aRight Click to preview this kit' + damage: 0 + content: + item_0: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_SWORD + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lUltimate Bard§7 ┃ §fSword + enchants: + DAMAGE_ALL: 2 + DURABILITY: 4 + item_1: + ==: org.bukkit.inventory.ItemStack + type: ENDER_PEARL + amount: 16 + item_2: + ==: org.bukkit.inventory.ItemStack + type: BLAZE_POWDER + amount: 64 + item_3: + ==: org.bukkit.inventory.ItemStack + type: IRON_INGOT + amount: 64 + item_4: + ==: org.bukkit.inventory.ItemStack + type: SUGAR + amount: 64 + item_5: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_6: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_7: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_8: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_9: + ==: org.bukkit.inventory.ItemStack + type: MAGMA_CREAM + amount: 64 + item_10: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_11: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_12: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_13: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_14: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_15: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_16: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_17: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_18: + ==: org.bukkit.inventory.ItemStack + type: GHAST_TEAR + amount: 64 + item_19: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_20: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_21: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_22: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_23: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_24: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_25: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_26: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_27: + ==: org.bukkit.inventory.ItemStack + type: FEATHER + amount: 64 + item_28: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_29: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_30: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_31: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_32: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_33: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_34: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_35: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + armor: + item_0: + ==: org.bukkit.inventory.ItemStack + type: GOLD_BOOTS + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lUltimate Bard§7 ┃ §fBoots + lore: + - §cHellForged IV + - §cRecover I + - §cFireResistance I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 4 + PROTECTION_FALL: 4 + PROTECTION_EXPLOSIONS: 4 + item_1: + ==: org.bukkit.inventory.ItemStack + type: GOLD_LEGGINGS + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lUltimate Bard§7 ┃ §fLeggings + lore: + - §cHellForged IV + - §cRecover I + - §cFireResistance I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 4 + PROTECTION_EXPLOSIONS: 4 + item_2: + ==: org.bukkit.inventory.ItemStack + type: GOLD_CHESTPLATE + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lUltimate Bard§7 ┃ §fChestplate + lore: + - §cHellForged IV + - §cRecover I + - §cFireResistance I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 4 + PROTECTION_EXPLOSIONS: 4 + item_3: + ==: org.bukkit.inventory.ItemStack + type: GOLD_HELMET + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lUltimate Bard§7 ┃ §fHelmet + lore: + - §cHellForged IV + - §cImplants V + - §cMermaid III + - §cRecover I + - §cFireResistance I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 4 + PROTECTION_EXPLOSIONS: 4 + uses: 1229 + UltimateDiamond: + slot: 14 + displayName: '&b&lUltimate Diamond Kit' + material: DIAMOND_HELMET + cooldown: 24 + category: ULTIMATE + lore: + - '&7You may purchase this kit at &fstore.cavepvp.org' + - '' + - '&4&l┃ &fCooldown: &c1 Day' + - '&4&l┃ &fAvailable in: &c{remaining}' + - '' + - '&aRight Click to preview this kit' + damage: 0 + content: + item_0: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_SWORD + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §b§lUltimate Diamond§7 ┃ §fSword + enchants: + DAMAGE_ALL: 2 + DAMAGE_UNDEAD: 4 + DURABILITY: 4 + DAMAGE_ARTHROPODS: 5 + LOOT_BONUS_MOBS: 4 + item_1: + ==: org.bukkit.inventory.ItemStack + type: ENDER_PEARL + amount: 16 + item_2: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_3: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_4: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_5: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_6: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_7: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_8: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_9: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_10: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_11: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_12: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_13: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_14: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_15: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_16: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_17: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_18: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_19: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_20: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_21: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_22: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_23: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_24: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_25: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_26: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_27: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_28: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_29: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_30: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_31: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_32: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_33: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_34: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_35: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + armor: + item_0: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_BOOTS + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §b§lUltimate Diamond§7 ┃ §fBoots + lore: + - §cSpeed II + - §cHellForged IV + - §cRecover I + - §cFireResistance I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 4 + PROTECTION_FALL: 4 + PROTECTION_EXPLOSIONS: 4 + item_1: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_LEGGINGS + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §b§lUltimate Diamond§7 ┃ §fLeggings + lore: + - §cHellForged IV + - §cRecover I + - §cFireResistance I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 4 + PROTECTION_EXPLOSIONS: 4 + item_2: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_CHESTPLATE + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §b§lUltimate Diamond§7 ┃ §fChestplate + lore: + - §cHellForged IV + - §cRecover I + - §cFireResistance I + - §cFury I + - §cSwift I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 4 + PROTECTION_EXPLOSIONS: 4 + item_3: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_HELMET + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §b§lUltimate Diamond§7 ┃ §fHelmet + lore: + - §cHellForged IV + - §cImplants V + - §cMermaid III + - §cRecover I + - §cFireResistance I + - §cGreed I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 4 + PROTECTION_EXPLOSIONS: 4 + uses: 1528 + Miner: + slot: 34 + displayName: '&f&lMiner Kit' + material: DIAMOND_PICKAXE + cooldown: 24 + category: NORMAL + lore: + - '&7You may purchase this kit at &fstore.cavepvp.org' + - '' + - '&4&l┃ &fCooldown: &c1 Day' + - '&4&l┃ &fAvailable in: &c{remaining}' + - '' + - '&aRight Click to preview this kit' + damage: 0 + content: + item_0: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_SWORD + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §f§lMiner §7┃ §fSword + enchants: + DAMAGE_ALL: 1 + DURABILITY: 3 + item_1: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_PICKAXE + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §f§lMiner §7┃ §fPickaxe + enchants: + DIG_SPEED: 6 + DURABILITY: 3 + item_2: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_PICKAXE + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §f§lMiner §7┃ §fPickaxe (Fortune) + enchants: + DIG_SPEED: 6 + DURABILITY: 3 + LOOT_BONUS_BLOCKS: 3 + item_3: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_AXE + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + enchants: + DIG_SPEED: 6 + DURABILITY: 3 + item_4: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_SPADE + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §f§lMiner §7┃ §fShovel + enchants: + DIG_SPEED: 6 + DURABILITY: 3 + item_5: + ==: org.bukkit.inventory.ItemStack + type: ANVIL + amount: 16 + item_6: + ==: org.bukkit.inventory.ItemStack + type: WORKBENCH + amount: 2 + item_7: + ==: org.bukkit.inventory.ItemStack + type: WATER_BUCKET + item_8: + ==: org.bukkit.inventory.ItemStack + type: COOKED_BEEF + amount: 64 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §f§lMiner §7┃ §fSteak + item_9: + ==: org.bukkit.inventory.ItemStack + type: LAVA_BUCKET + item_10: + ==: org.bukkit.inventory.ItemStack + type: LAVA_BUCKET + item_11: + ==: org.bukkit.inventory.ItemStack + type: WATER_BUCKET + item_12: + ==: org.bukkit.inventory.ItemStack + type: BUCKET + amount: 2 + armor: + item_0: + ==: org.bukkit.inventory.ItemStack + type: IRON_BOOTS + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §f§lMiner §7┃ §fBoots + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 3 + PROTECTION_FALL: 4 + item_1: + ==: org.bukkit.inventory.ItemStack + type: IRON_LEGGINGS + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §f§lMiner §7┃ §fLeggings + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 3 + item_2: + ==: org.bukkit.inventory.ItemStack + type: IRON_CHESTPLATE + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §f§lMiner §7┃ §fChestplate + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 3 + item_3: + ==: org.bukkit.inventory.ItemStack + type: IRON_HELMET + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §f§lMiner §7┃ §fHelmet + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 3 + uses: 3772 + UltimateArcher: + slot: 12 + displayName: '&d&lUltimate Archer Kit' + material: LEATHER_HELMET + cooldown: 24 + category: ULTIMATE + lore: + - '&7You may purchase this kit at &fstore.cavepvp.org' + - '' + - '&4&l┃ &fCooldown: &c1 Day' + - '&4&l┃ &fAvailable in: &c{remaining}' + - '' + - '&aRight Click to preview this kit' + damage: 0 + content: + item_0: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_SWORD + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §d§lUltimate Archer §7┃ §fSword + enchants: + DAMAGE_ALL: 2 + DURABILITY: 4 + item_1: + ==: org.bukkit.inventory.ItemStack + type: ENDER_PEARL + amount: 16 + item_2: + ==: org.bukkit.inventory.ItemStack + type: BOW + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §d§lUltimate Archer §7┃ §fBow + enchants: + ARROW_DAMAGE: 5 + DURABILITY: 4 + ARROW_FIRE: 1 + ARROW_INFINITE: 1 + item_3: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_4: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_5: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_6: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_7: + ==: org.bukkit.inventory.ItemStack + type: SUGAR + amount: 64 + item_8: + ==: org.bukkit.inventory.ItemStack + type: FEATHER + amount: 64 + item_9: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_10: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_11: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_12: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_13: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_14: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_15: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_16: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_17: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_18: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_19: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_20: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_21: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_22: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_23: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_24: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_25: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_26: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_27: + ==: org.bukkit.inventory.ItemStack + type: ARROW + item_28: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_29: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_30: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_31: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_32: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_33: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_34: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_35: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + armor: + item_0: + ==: org.bukkit.inventory.ItemStack + type: LEATHER_BOOTS + meta: + ==: ItemMeta + meta-type: LEATHER_ARMOR + display-name: §d§lUltimate Archer §7┃ §fBoots + lore: + - §cHellForged IV + - §cRecover I + - §cFireResistance I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 4 + PROTECTION_FALL: 4 + PROTECTION_EXPLOSIONS: 4 + item_1: + ==: org.bukkit.inventory.ItemStack + type: LEATHER_LEGGINGS + meta: + ==: ItemMeta + meta-type: LEATHER_ARMOR + display-name: §d§lUltimate Archer §7┃ §fLeggings + lore: + - §cHellForged IV + - §cRecover I + - §cFireResistance I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 4 + PROTECTION_EXPLOSIONS: 4 + item_2: + ==: org.bukkit.inventory.ItemStack + type: LEATHER_CHESTPLATE + meta: + ==: ItemMeta + meta-type: LEATHER_ARMOR + display-name: §d§lUltimate Archer §7┃ §fChestplate + lore: + - §cHellForged IV + - §cRecover I + - §cFireResistance I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 4 + PROTECTION_EXPLOSIONS: 4 + item_3: + ==: org.bukkit.inventory.ItemStack + type: LEATHER_HELMET + meta: + ==: ItemMeta + meta-type: LEATHER_ARMOR + display-name: §d§lUltimate Archer §7┃ §fHelmet + lore: + - §cHellForged IV + - §cImplants V + - §cMermaid III + - §cRecover I + - §cFireResistance I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 4 + PROTECTION_EXPLOSIONS: 4 + uses: 1376 + iMake: + slot: 16 + displayName: '&c&liMakeMcVids Kit' + material: RED_ROSE + cooldown: 24 + lore: + - '&7You may purchase this kit at &fstore.cavepvp.org' + - '' + - '&4&l┃ &fCooldown: &c1 Day' + - '&4&l┃ &fAvailable in: &c{remaining}' + - '' + - '&aRight Click to preview this kit' + damage: 4 + category: OP + content: + item_0: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_SWORD + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §c§l§niMakeMcVids §7┃ §fSword + enchants: + DAMAGE_ALL: 2 + DAMAGE_UNDEAD: 4 + DURABILITY: 4 + DAMAGE_ARTHROPODS: 5 + LOOT_BONUS_MOBS: 4 + item_1: + ==: org.bukkit.inventory.ItemStack + type: ENDER_PEARL + amount: 16 + item_2: + ==: org.bukkit.inventory.ItemStack + type: GOLDEN_APPLE + amount: 32 + item_3: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_4: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_5: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_6: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_7: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_8: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_9: + ==: org.bukkit.inventory.ItemStack + type: GOLDEN_APPLE + damage: 1 + item_10: + ==: org.bukkit.inventory.ItemStack + type: ENDER_CHEST + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §c§liMakeMcVids Lootbox + lore: + - §7Unlocked at §fstore.cavepvp.org + - '' + - §c§lFINAL REWARDS + - ' §7➡ §4Cave Rank' + - ' §7➡ §2$§a10 Buycraft Voucher' + - ' §7➡ §6Premium Battle Pass' + - ' §7➡ §b3x Airdrops' + - ' §7➡ §ciMakeMcVids Kit' + - ' §7➡ §c5x iMakeMcVids Keys' + - ' §7➡ §ciMakeMcVids Clickable Kit' + - '' + - §c§lNORMAL REWARDS + - ' §7➡ §35x Invisibility' + - ' §7➡ §45x TNT Minecart' + - ' §7➡ §65x Debuff Fish' + - ' §7➡ §c5x Anti-Pearl' + - ' §7➡ §c1x Crowbar' + - ' §7➡ §62x God Apples' + - ' §7➡ §d16x Ender Pearls' + - ' §7➡ §632x Golden Apples' + - ' §7➡ §bDiamond Sword' + - ' §7➡ §bDiamond Helmet' + - ' §7➡ §bDiamond Chestplate' + - ' §7➡ §bDiamond Leggings' + - ' §7➡ §bDiamond Boots' + - ' §7➡ §bDiamond Pickaxe' + - ' §7➡ §a16x Emerald Blocks' + - ' §7➡ §b16x Diamond Blocks' + - ' §7➡ §616x Gold Blocks' + - ' §7➡ §716x Iron Blocks' + - ' §7➡ §832x Gun Powder' + - ' §7➡ §e32x Glowstone Blocks' + - ' §7➡ §432x Nether Wart' + - ' §7➡ §c32x Glistering Melons' + item_11: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_12: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_13: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_14: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_15: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_16: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_17: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_18: + ==: org.bukkit.inventory.ItemStack + type: PAPER + amount: 4 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §a§lMed Kit + lore: + - '' + - §6❙ §fRight Click to receive Resistance 3, + - §6❙ §fRegeneration 3, and 4 Absorption + - §6❙ §fHearts for 5 seconds! + - '' + - §fCan be found in the §6§lSummer Crate§f! + item_19: + ==: org.bukkit.inventory.ItemStack + type: BLAZE_ROD + amount: 4 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lAnti-Blockup + lore: + - '' + - §6❙ §fWhen you hit a player with this + - §6❙ §c§l3 times §fthey may not block up for §e§l15 seconds§f. + - '' + - §fCan be found in the §6§lSummer Crate§f! + item_20: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_21: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_22: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_23: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_24: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_25: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_26: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_27: + ==: org.bukkit.inventory.ItemStack + type: BLAZE_POWDER + amount: 4 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lStrength + lore: + - '' + - §6❙ §fGive you and your teammates + - §6❙ §e§l5 seconds §fof §c§lStrength + - '' + - §fCan be found in an §b§lAirdrop§f! + item_28: + ==: org.bukkit.inventory.ItemStack + type: EYE_OF_ENDER + amount: 4 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §c§lAnti Pearl 2.0 + lore: + - '' + - §6❙ §fHit a player to put them on enderpearl cooldown. + - §6❙ §fRight Click to remove your enderpearl cooldown. + - '' + - §fCan be found in the §c§liMakeMcVids Crate§f! + item_29: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_30: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_31: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_32: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_33: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_34: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_35: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + armor: + item_0: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_BOOTS + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §c§l§niMakeMcVids §7┃ §fBoots + lore: + - §cSpeed II + - §cHellForged III + - §cRecover I + - §cFireResistance I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 4 + PROTECTION_FALL: 4 + PROTECTION_EXPLOSIONS: 4 + item_1: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_LEGGINGS + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §c§l§niMakeMcVids §7┃ §fLeggings + lore: + - §cHellForged III + - §cRecover I + - §cFireResistance I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 4 + PROTECTION_EXPLOSIONS: 4 + item_2: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_CHESTPLATE + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §c§l§niMakeMcVids §7┃ §fChestplate + lore: + - §cHellForged III + - §cRecover I + - §cFireResistance I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 4 + PROTECTION_EXPLOSIONS: 4 + item_3: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_HELMET + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §c§l§niMakeMcVids §7┃ §fHelmet + lore: + - §cHellForged III + - §cImplants V + - §cMermaid III + - §cRecover I + - §cFireResistance I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 4 + PROTECTION_EXPLOSIONS: 4 + uses: 449 + Dylan: + slot: 12 + displayName: '&a&lDylan Kit' + material: WATER_LILY + cooldown: 24 + category: OP + lore: + - '&7You may purchase this kit at &fstore.cavepvp.org' + - '' + - '&4&l┃ &fCooldown: &c1 Day' + - '&4&l┃ &fAvailable in: &c{remaining}' + - '' + - '&aRight Click to preview this kit' + damage: 4 + content: + item_0: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_SWORD + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §a§l§nDylan §7┃ §fSword + enchants: + DAMAGE_ALL: 2 + DAMAGE_UNDEAD: 4 + DURABILITY: 4 + DAMAGE_ARTHROPODS: 5 + LOOT_BONUS_MOBS: 4 + item_1: + ==: org.bukkit.inventory.ItemStack + type: ENDER_PEARL + amount: 16 + item_2: + ==: org.bukkit.inventory.ItemStack + type: GOLDEN_APPLE + amount: 32 + item_3: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_4: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_5: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_6: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_7: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_8: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_9: + ==: org.bukkit.inventory.ItemStack + type: GOLDEN_APPLE + damage: 1 + item_10: + ==: org.bukkit.inventory.ItemStack + type: ENDER_CHEST + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §a§lDylan Lootbox + lore: + - §7Unlocked at §fstore.cavepvp.org + - '' + - §2§lEND REWARDS §7(1 item) + - §8• §4§lLEGENDARY §4Cave §7Rank + - §8• §4§lLEGENDARY §cCupid §7Rank + - §8• §4§lLEGENDARY §2$§a25 §7Buycraft Voucher + - §8• §4§lLEGENDARY §2$§a5 §7Buycraft Voucher + - §8• §4§lLEGENDARY §ePremium Battle Pass + - §8• §c§lRARE §73x §c§lCupid Mystery Box + - §8• §c§lRARE §75x §b§lAirdrops + - §8• §d§lUNCOMMON §730-day §a§lDylan §7Kit + - §8• §d§lUNCOMMON §710x §a§lDylan §7Keys + - §8• §a§lCOMMON §a§lDylan §7Clickable Kit + - '' + - §2§lREWARDS §7(9 items) + - §8• §c§lRARE §61x §7Crowbar + - §8• §c§lRARE §61x §7Random Spawner + - §8• §c§lRARE §54x §7End Portal Frames + - §8• §d§lUNCOMMON §65x §7God Apples + - §8• §d§lUNCOMMON §d32x §7Ender Pearls + - §8• §d§lUNCOMMON §664x §7Golden Apples + - §8• §d§lUNCOMMON §aDylan §7Fire Sword + - §8• §d§lUNCOMMON §aDylan §7Helmet + - §8• §d§lUNCOMMON §aDylan §7Chestplate + - §8• §d§lUNCOMMON §aDylan §7Leggings + - §8• §d§lUNCOMMON §aDylan §7Boots + - §8• §d§lUNCOMMON §aDylan §7Pickaxe + - §8• §a§lCOMMON §a64x §7Emerald Blocks + - §8• §a§lCOMMON §b64x §7Diamond Blocks + - §8• §a§lCOMMON §664x §7Gold Blocks + - §8• §a§lCOMMON §7§l64x §7Iron Blocks + - §8• §a§lCOMMON §8§l64x §7Gun Powder + - §8• §a§lCOMMON §e§l64x §7Glowstone Blocks + - §8• §a§lCOMMON §c§l64x §7Glistering Melons + - §8• §a§lCOMMON §c§l64x §7Nether Wart + item_11: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_12: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_13: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_14: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_15: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_16: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_17: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_18: + ==: org.bukkit.inventory.ItemStack + type: BLAZE_POWDER + amount: 4 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lStrength + lore: + - '' + - §6❙ §fGive you and your teammates + - §6❙ §e§l5 seconds §fof §c§lStrength + - '' + - §fCan be found in an §b§lAirdrop§f! + item_19: + ==: org.bukkit.inventory.ItemStack + type: RED_ROSE + amount: 4 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §a§lCombo Ability + lore: + - '' + - §6❙ §fGet a second of strength II for the + - §6❙ §famount of hits dealt within §e§l10 seconds§f. + - '' + - §fCan be found in the §a§lDylan Crate§f! + item_20: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_21: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_22: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_23: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_24: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_25: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_26: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_27: + ==: org.bukkit.inventory.ItemStack + type: BLAZE_ROD + amount: 4 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lAnti-Blockup + lore: + - '' + - §6❙ §fWhen you hit a player with this + - §6❙ §c§l3 times §fthey may not block up for §e§l15 seconds§f. + - '' + - §fCan be found in the §6§lSummer Crate§f! + item_28: + ==: org.bukkit.inventory.ItemStack + type: PAPER + amount: 4 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §a§lMed Kit + lore: + - '' + - §6❙ §fRight Click to receive Resistance 3, + - §6❙ §fRegeneration 3, and 4 Absorption + - §6❙ §fHearts for 5 seconds! + - '' + - §fCan be found in the §6§lSummer Crate§f! + item_29: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_30: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_31: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_32: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_33: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_34: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_35: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + armor: + item_0: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_BOOTS + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §a§l§nDylan §7┃ §fBoots + lore: + - §cSpeed II + - §cHellForged III + - §cRecover I + - §cFireResistance I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 4 + PROTECTION_FALL: 4 + PROTECTION_EXPLOSIONS: 4 + item_1: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_LEGGINGS + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §a§l§nDylan §7┃ §fLeggings + lore: + - §cHellForged III + - §cRecover I + - §cFireResistance I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 4 + PROTECTION_EXPLOSIONS: 4 + item_2: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_CHESTPLATE + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §a§l§nDylan §7┃ §fChestplate + lore: + - §cHellForged III + - §cRecover I + - §cFireResistance I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 4 + PROTECTION_EXPLOSIONS: 4 + item_3: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_HELMET + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §a§l§nDylan §7┃ §fHelmet + lore: + - §cHellForged III + - §cImplants V + - §cMermaid III + - §cRecover I + - §cFireResistance I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 4 + PROTECTION_EXPLOSIONS: 4 + uses: 301 + Weekly: + slot: 15 + displayName: §6§lWeekly Kit + material: IRON_SWORD + cooldown: 168 + category: FREE + lore: + - '&7This kit is free to all players!' + - '' + - '&4&l┃ &fCooldown: &c1 Week' + - '&4&l┃ &fAvailable in: &c{remaining}' + - '' + - '&aRight Click to preview this kit' + damage: 0 + content: + item_0: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_SWORD + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lWeekly §7┃ §fSword + enchants: + DAMAGE_ALL: 2 + DURABILITY: 3 + item_1: + ==: org.bukkit.inventory.ItemStack + type: ENDER_PEARL + amount: 6 + item_2: + ==: org.bukkit.inventory.ItemStack + type: GOLDEN_APPLE + amount: 6 + item_3: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_4: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_5: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_6: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_7: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 8226 + item_8: + ==: org.bukkit.inventory.ItemStack + type: COOKED_BEEF + amount: 64 + item_9: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_10: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_11: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_12: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_13: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_14: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_15: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_16: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 8226 + item_17: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 8226 + armor: + item_0: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_BOOTS + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lWeekly §7┃ §fBoots + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 2 + PROTECTION_FALL: 4 + item_1: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_LEGGINGS + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lWeekly §7┃ §fLeggings + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 2 + item_2: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_CHESTPLATE + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lWeekly §7┃ §fChestplate + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 2 + item_3: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_HELMET + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lWeekly §7┃ §fHelmet + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 2 + uses: 3209 + SOTW: + slot: 5 + displayName: §6§lSOTW + material: DIAMOND_SWORD + cooldown: 24 + category: NONE + lore: + - '&7You may purchase this kit at &fstore.cavepvp.org' + - '' + - '&7Cooldown: &c1 Day' + - '&7Available in: &c{remaining}' + - '' + - '&7(&c!&7) Right click to preview' + damage: 0 + content: + item_0: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_SWORD + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lSOTW Kit + enchants: + DAMAGE_ALL: 2 + DAMAGE_UNDEAD: 4 + DURABILITY: 4 + DAMAGE_ARTHROPODS: 5 + LOOT_BONUS_MOBS: 4 + item_1: + ==: org.bukkit.inventory.ItemStack + type: ENDER_PEARL + amount: 16 + item_2: + ==: org.bukkit.inventory.ItemStack + type: GOLDEN_APPLE + amount: 8 + item_3: + ==: org.bukkit.inventory.ItemStack + type: BLAZE_POWDER + amount: 3 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lStrength + lore: + - §7Give yourself and your teammates + - §7around you Strength 2 for 5 seconds + - '' + - §fCan be found in an §b§lAirdrop§f! + item_4: + ==: org.bukkit.inventory.ItemStack + type: PAPER + amount: 3 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §a§lMed Kit + lore: + - §7Right Click to receive Resistance 3, + - §7Regeneration 3, and 4 Absorption + - §7Hearts for 5 seconds! + - '' + - §fCan be found in the §4§l3.0 Crate§f! + item_5: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_6: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_7: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_8: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_9: + ==: org.bukkit.inventory.ItemStack + type: NETHER_STAR + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §b§lNinja Star + lore: + - §7Teleport to the last + - §7person who hit you within 30 seconds. + - '' + - §fCan be found in an §b§lAirdrop§f! + item_10: + ==: org.bukkit.inventory.ItemStack + type: SNOW_BALL + amount: 2 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §4§lBall Of Rage + lore: + - §7Throw to create a cloud of effects + - §7where all teammates within 5 block + - §7radius will be given Strength II and + - §7Resistance III for 6 seconds. + - '' + - §fCan be found in the §4§lSimplyTrash §fCrate! + item_11: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_12: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_13: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_14: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_15: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_16: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_17: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_18: + ==: org.bukkit.inventory.ItemStack + type: BLAZE_ROD + amount: 2 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lAnti-Blockup + lore: + - §7When you hit a player with this + - §73 times they may not block up for 15 seconds. + - '' + - §fCan be found in the §4§l3.0 Crate§f! + item_19: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_20: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_21: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_22: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_23: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_24: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_25: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_26: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_27: + ==: org.bukkit.inventory.ItemStack + type: WORKBENCH + amount: 2 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §4§lCrafting Chaos + lore: + - §7Hit an enemy and for 10 seconds, every + - §7hit you deal has a 15% chance of + - §7putting them in a crafting table. + - '' + - §fCan be found in the §4§lQnA §fCrate! + item_28: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_29: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_30: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_31: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_32: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_33: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_34: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_35: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + armor: + item_0: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_BOOTS + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lSOTW Kit + lore: + - §cSpeed II + - §cHellForged IV + - §cRecover I + - §cFireResistance I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 4 + PROTECTION_FALL: 4 + PROTECTION_EXPLOSIONS: 4 + item_1: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_LEGGINGS + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lSOTW Kit + lore: + - §cHellForged IV + - §cRecover I + - §cFireResistance I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 4 + PROTECTION_EXPLOSIONS: 4 + item_2: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_CHESTPLATE + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lSOTW Kit + lore: + - §cHellForged IV + - §cRecover I + - §cFireResistance I + - §cFury I + - §cSwift I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 4 + PROTECTION_EXPLOSIONS: 4 + item_3: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_HELMET + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lSOTW Kit + lore: + - §cHellForged IV + - §cImplants V + - §cMermaid III + - §cRecover I + - §cFireResistance I + - §cGreed I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 4 + PROTECTION_EXPLOSIONS: 4 + uses: 0 + Raider: + slot: 11 + displayName: '&4&lRaider Kit' + material: DIAMOND_SWORD + cooldown: 24 + lore: + - '&7An exclusive kit to the &6&lCustom &7rank.' + - '' + - '&4&l┃ &fCooldown: &c1 Day' + - '&4&l┃ &fAvailable in: &c{remaining}' + - '' + - '&aRight Click to preview this kit' + damage: 0 + uses: 381 + category: CLASSES + content: + item_0: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_SWORD + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §4§lRaider Sword + enchants: + DAMAGE_ALL: 2 + DAMAGE_UNDEAD: 4 + DURABILITY: 4 + DAMAGE_ARTHROPODS: 5 + LOOT_BONUS_MOBS: 4 + item_1: + ==: org.bukkit.inventory.ItemStack + type: ENDER_PEARL + amount: 16 + item_2: + ==: org.bukkit.inventory.ItemStack + type: GOLDEN_APPLE + amount: 16 + item_3: + ==: org.bukkit.inventory.ItemStack + type: EGG + amount: 16 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §d§lEggport + lore: + - '' + - §6❙ §fSwitch places with your + - §6❙ §fenemy that are within §c§l15 §fblocks! + - '' + - §fCan be found in the §6§lSummer Crate§f! + item_4: + ==: org.bukkit.inventory.ItemStack + type: PAPER + amount: 5 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §a§lMed Kit + lore: + - '' + - §6❙ §fRight Click to receive Resistance 3, + - §6❙ §fRegeneration 3, and 4 Absorption + - §6❙ §fHearts for 5 seconds! + - '' + - §fCan be found in the §6§lSummer Crate§f! + item_5: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_6: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_7: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_8: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_9: + ==: org.bukkit.inventory.ItemStack + type: GOLDEN_APPLE + damage: 1 + item_10: + ==: org.bukkit.inventory.ItemStack + type: INK_SACK + damage: 5 + amount: 3 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §5§lPower Stone + lore: + - '' + - §6❙ §fRight Click to receive Strength II, + - §6❙ §fResistance III and Regeneration III for §e§l10 seconds + - §6❙ §fDuring that time you may not use any potions! + - '' + - §fCan be found in the §b§lIlluminated Chest§f! + item_11: + ==: org.bukkit.inventory.ItemStack + type: WATCH + amount: 5 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lTime Warp + lore: + - '' + - §6❙ §fTravel back to where + - §6❙ §fyou last threw a pearl! + - '' + - §fCan be found in an §b§lAirdrop§f! + item_12: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_13: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_14: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_15: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_16: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_17: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_18: + ==: org.bukkit.inventory.ItemStack + type: BLAZE_ROD + amount: 5 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lAnti-Blockup + lore: + - '' + - §6❙ §fWhen you hit a player with this + - §6❙ §c§l3 times §fthey may not block up for §e§l15 seconds§f. + - '' + - §fCan be found in the §6§lSummer Crate§f! + item_19: + ==: org.bukkit.inventory.ItemStack + type: INK_SACK + amount: 5 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §3§lInvisibility + lore: + - '' + - §6❙ §fWhen you right click this item + - §6❙ §fyour armor will no longer be visible. + - '' + - §fCan be found in an §b§lAirdrop§f! + item_20: + ==: org.bukkit.inventory.ItemStack + type: NETHER_STAR + amount: 3 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §b§lNinja Star + lore: + - '' + - §6❙ §fTeleport to the last person that + - §6❙ §fhit you within the last §e§l30 seconds§f! + - '' + - §fCan be found in an §b§lAirdrop§f! + item_21: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_22: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_23: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_24: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_25: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_26: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_27: + ==: org.bukkit.inventory.ItemStack + type: MONSTER_EGG + damage: 60 + amount: 5 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lBlock Bug + lore: + - '' + - §6❙ §fHit a player §c§lthree times §fand for + - §6❙ §fthe next §e§l10 seconds §fall blocks they + - §6❙ §fplace will turn into a silverfish. + - '' + - §fCan be found in the §4§lCave Crate§f! + item_28: + ==: org.bukkit.inventory.ItemStack + type: EMPTY_MAP + amount: 3 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lReverse Card + lore: + - '' + - §6❙ §fHit a player three times. + - §6❙ §fFor §e§l12 seconds§f, you can click + - §6❙ §fany block they click with and you + - §6❙ §fcan break any block they place. + - '' + - §fCan be found in the §6§lSummer Mystery Box§f! + item_29: + ==: org.bukkit.inventory.ItemStack + type: BLAZE_POWDER + amount: 5 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lStrength + lore: + - '' + - §6❙ §fGive you and your teammates + - §6❙ §e§l5 seconds §fof §c§lStrength + - '' + - §fCan be found in an §b§lAirdrop§f! + item_30: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_31: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_32: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_33: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_34: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_35: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + armor: + item_0: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_BOOTS + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §4§lRaider Boots + lore: + - '' + - '§4Armor Class: §fRaider' + - '§4Perks:' + - §4❙ §fDeal 5% more damage + - §4❙ §f10% Reduced Partner Item cooldown + - §4❙ §fSHIFT + Click to activate Midas Touch for 10 seconds + - '' + - §cSpeed II + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 3 + PROTECTION_FALL: 4 + item_1: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_LEGGINGS + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §4§lRaider Leggings + lore: + - '' + - '§4Armor Class: §fRaider' + - '§4Perks:' + - §4❙ §fDeal 5% more damage + - §4❙ §f10% Reduced Partner Item cooldown + - §4❙ §fSHIFT + Click to activate Midas Touch for 10 seconds + - '' + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 3 + item_2: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_CHESTPLATE + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §4§lRaider Chestplate + lore: + - '' + - '§4Armor Class: §fRaider' + - '§4Perks:' + - §4❙ §fDeal 5% more damage + - §4❙ §f10% Reduced Partner Item cooldown + - §4❙ §fSHIFT + Click to activate Midas Touch for 10 seconds + - '' + - §cFireResistance I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 3 + item_3: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_HELMET + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §4§lRaider Helmet + lore: + - '' + - '§4Armor Class: §fRaider' + - '§4Perks:' + - §4❙ §fDeal 5% more damage + - §4❙ §f10% Reduced Partner Item cooldown + - §4❙ §fSHIFT + Click to activate Midas Touch for 10 seconds + - '' + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 3 + Pyromaniac: + slot: 15 + displayName: '&c&lPyromaniac Kit' + material: FIREBALL + cooldown: 24 + lore: + - '&7An exclusive kit to the &6&lCustom &7rank.' + - '' + - '&4&l┃ &fCooldown: &c1 Day' + - '&4&l┃ &fAvailable in: &c{remaining}' + - '' + - '&aRight Click to preview this kit' + damage: 0 + uses: 224 + category: CLASSES + content: + item_0: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_SWORD + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §c§lPyromaniac Sword + enchants: + DAMAGE_ALL: 2 + DAMAGE_UNDEAD: 4 + DURABILITY: 4 + DAMAGE_ARTHROPODS: 5 + LOOT_BONUS_MOBS: 4 + item_1: + ==: org.bukkit.inventory.ItemStack + type: ENDER_PEARL + amount: 16 + item_2: + ==: org.bukkit.inventory.ItemStack + type: GOLDEN_APPLE + amount: 8 + item_3: + ==: org.bukkit.inventory.ItemStack + type: EGG + amount: 8 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §d§lEggport + lore: + - '' + - §6❙ §fSwitch places with your + - §6❙ §fenemy that are within §c§l15 §fblocks! + - '' + - §fCan be found in the §6§lSummer Crate§f! + item_4: + ==: org.bukkit.inventory.ItemStack + type: PAPER + amount: 3 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §a§lMed Kit + lore: + - '' + - §6❙ §fRight Click to receive Resistance 3, + - §6❙ §fRegeneration 3, and 4 Absorption + - §6❙ §fHearts for 5 seconds! + - '' + - §fCan be found in the §6§lSummer Crate§f! + item_5: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_6: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_7: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_8: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_9: + ==: org.bukkit.inventory.ItemStack + type: CLAY_BRICK + amount: 5 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §2§lHulk Smash + lore: + - '' + - §6❙ §fRight Click to be launched, when + - §6❙ §fyou land all players within a §c§l5x5 §fradius + - §6❙ §fwill take damage and will be launched in the air. + - '' + - §fCan be found in the §9§lNotRamix Crate§f! + item_10: + ==: org.bukkit.inventory.ItemStack + type: SLIME_BALL + amount: 5 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lKryptonite Gas + lore: + - '' + - §6❙ §fClick and all players within a §c§l10 §fblock radius + - §6❙ §fwill be given Weakness and Poison for §e§l15 seconds§f. + - §6❙ §fYou will also receive Resistance II for §e§l15 seconds§f. + - '' + - §fCan be found in the §6§lSummer Lootbox§f! + item_11: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_12: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_13: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_14: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_15: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_16: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_17: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_18: + ==: org.bukkit.inventory.ItemStack + type: WORKBENCH + amount: 5 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §3§lCrafting Chaos + lore: + - '' + - §6❙ §fHit an enemy and for §e§l10 seconds§f, every + - §6❙ §fhit you deal has a §c§l15% §fchance of + - §6❙ §fputting them in a crafting table. + - '' + - §fCan be found in the §3§lHeaded Crate§f! + item_19: + ==: org.bukkit.inventory.ItemStack + type: INK_SACK + damage: 14 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lPortable Bard + lore: + - '' + - §6❙ §fReceive §c§l5 §fportable bard effects! + - '' + - §fCan be found in an §b§lAirdrop§f! + item_20: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_21: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_22: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_23: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_24: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_25: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_26: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_27: + ==: org.bukkit.inventory.ItemStack + type: STICK + amount: 5 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §3§lSpin Bot + lore: + - '' + - §6❙ §fHit a player §c§l3 times §fand every + - §6❙ §fhit for §e§l10 seconds §fhas a chance + - §6❙ §fof rotating their head + - '' + - §fCan be found in the §d§lPartner Crate§f! + item_28: + ==: org.bukkit.inventory.ItemStack + type: MONSTER_EGG + damage: 66 + amount: 5 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §5§lWitch Effect + lore: + - '' + - §6❙ §fSpawn a witch that give you passive + - '§6❙ §fbard effects: strength, regeneration,' + - §6❙ §fand resistance. + - '' + - §fCan be found in the §d§lPartner Crate§f! + item_29: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_30: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_31: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_32: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_33: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_34: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_35: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + armor: + item_0: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_BOOTS + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §c§lPyromaniac Boots + lore: + - '' + - '§cArmor Class: §fPyromaniac' + - '§cPerks:' + - §c❙ §fSHIFT + Click to throw shockwaves + - §c❙ §f1% chance of putting them on Fire and giving them Wither I for 8 seconds. + - '' + - §cSpeed II + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 3 + PROTECTION_FALL: 4 + item_1: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_LEGGINGS + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §c§lPyromaniac Leggings + lore: + - '' + - '§cArmor Class: §fPyromaniac' + - '§cPerks:' + - §c❙ §fSHIFT + Click to throw shockwaves + - §c❙ §f1% chance of putting them on Fire and giving them Wither I for 8 seconds. + - '' + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 3 + item_2: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_CHESTPLATE + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §c§lPyromaniac Chestplate + lore: + - '' + - '§cArmor Class: §fPyromaniac' + - '§cPerks:' + - §c❙ §fSHIFT + Click to throw shockwaves + - §c❙ §f1% chance of putting them on Fire and giving them Wither I for 8 seconds. + - '' + - §cFireResistance I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 3 + item_3: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_HELMET + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §c§lPyromaniac Helmet + lore: + - '' + - '§cArmor Class: §fPyromaniac' + - '§cPerks:' + - §c❙ §fSHIFT + Click to throw shockwaves + - §c❙ §f1% chance of putting them on Fire and giving them Wither I for 8 seconds. + - '' + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 3 + Trapper: + slot: 13 + displayName: '&5&lTrapper Kit' + material: COBBLESTONE + cooldown: 24 + lore: + - '&7An exclusive kit to the &6&lCustom &7rank.' + - '' + - '&4&l┃ &fCooldown: &c1 Day' + - '&4&l┃ &fAvailable in: &c{remaining}' + - '' + - '&aRight Click to preview this kit' + damage: 0 + uses: 248 + category: CLASSES + content: + item_0: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_SWORD + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §5§lTrapper Sword + enchants: + DAMAGE_ALL: 2 + DAMAGE_UNDEAD: 4 + DURABILITY: 4 + DAMAGE_ARTHROPODS: 5 + LOOT_BONUS_MOBS: 4 + item_1: + ==: org.bukkit.inventory.ItemStack + type: ENDER_PEARL + amount: 16 + item_2: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_PICKAXE + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §5§lTrapper Pickaxe + enchants: + DIG_SPEED: 5 + DURABILITY: 3 + item_3: + ==: org.bukkit.inventory.ItemStack + type: GOLDEN_APPLE + amount: 16 + item_4: + ==: org.bukkit.inventory.ItemStack + type: EGG + amount: 16 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §d§lEggport + lore: + - '' + - §6❙ §fSwitch places with your + - §6❙ §fenemy that are within §c§l15 §fblocks! + - '' + - §fCan be found in the §6§lSummer Crate§f! + item_5: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_6: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_7: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_8: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_9: + ==: org.bukkit.inventory.ItemStack + type: GOLDEN_APPLE + damage: 1 + item_10: + ==: org.bukkit.inventory.ItemStack + type: EYE_OF_ENDER + amount: 5 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §c§lAnti Pearl 2.0 + lore: + - '' + - §6❙ §fHit a player to put them on enderpearl cooldown. + - §6❙ §fRight Click to remove your enderpearl cooldown. + - '' + - §fCan be found in the §c§liMakeMcVids Crate§f! + item_11: + ==: org.bukkit.inventory.ItemStack + type: PAPER + amount: 5 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §a§lMed Kit + lore: + - '' + - §6❙ §fRight Click to receive Resistance 3, + - §6❙ §fRegeneration 3, and 4 Absorption + - §6❙ §fHearts for 5 seconds! + - '' + - §fCan be found in the §6§lSummer Crate§f! + item_12: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_13: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_14: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_15: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_16: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_17: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_18: + ==: org.bukkit.inventory.ItemStack + type: IRON_FENCE + amount: 5 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §d§lLock In + lore: + - '' + - §6❙ §fHit a player three times to + - §6❙ §fbe locked in a 1v1 where only + - §6❙ §fyou fight that player for §e§l30 seconds§f. + - '' + - §fCan be found in the §4§lCave Crate§f! + item_19: + ==: org.bukkit.inventory.ItemStack + type: BLAZE_POWDER + amount: 5 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lStrength + lore: + - '' + - §6❙ §fGive you and your teammates + - §6❙ §e§l5 seconds §fof §c§lStrength + - '' + - §fCan be found in an §b§lAirdrop§f! + item_20: + ==: org.bukkit.inventory.ItemStack + type: COBBLESTONE + amount: 64 + item_21: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_22: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_23: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_24: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_25: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_26: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_27: + ==: org.bukkit.inventory.ItemStack + type: GOLD_INGOT + amount: 3 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §e§lSoul Stone + lore: + - '' + - §6❙ §fUpon going below 2 hearts, you will be instantly + - §6❙ §fhealed and given Resistance III for §e§l5 seconds§f. + - '' + - §fCan be found in the §b§lIlluminated Chest§f! + item_28: + ==: org.bukkit.inventory.ItemStack + type: WORKBENCH + amount: 5 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §3§lCrafting Chaos + lore: + - '' + - §6❙ §fHit an enemy and for §e§l10 seconds§f, every + - §6❙ §fhit you deal has a §c§l15% §fchance of + - §6❙ §fputting them in a crafting table. + - '' + - §fCan be found in the §3§lHeaded Crate§f! + item_29: + ==: org.bukkit.inventory.ItemStack + type: STEP + amount: 64 + item_30: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_31: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_32: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_33: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_34: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_35: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + armor: + item_0: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_BOOTS + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §5§lTrapper Boots + lore: + - '' + - '§5Armor Class: §fTrapper' + - '§5Perks:' + - §5❙ §fTake 10% less damage + - §5❙ §fMed Kits and Portable Resistance last 25% longer + - §5❙ §fSHIFT + Click to put the last player you hit on Ability Item cooldown + - '' + - §cSpeed II + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 3 + PROTECTION_FALL: 4 + item_1: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_LEGGINGS + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §5§lTrapper Leggings + lore: + - '' + - '§5Armor Class: §fTrapper' + - '§5Perks:' + - §5❙ §fTake 10% less damage + - §5❙ §fMed Kits and Portable Resistance last 25% longer + - §5❙ §fSHIFT + Click to put the last player you hit on Ability Item cooldown + - '' + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 3 + item_2: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_CHESTPLATE + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §5§lTrapper Chestplate + lore: + - '' + - '§5Armor Class: §fTrapper' + - '§5Perks:' + - §5❙ §fTake 10% less damage + - §5❙ §fMed Kits and Portable Resistance last 25% longer + - §5❙ §fSHIFT + Click to put the last player you hit on Ability Item cooldown + - '' + - §cFireResistance I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 3 + item_3: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_HELMET + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §5§lTrapper Helmet + lore: + - '' + - '§5Armor Class: §fTrapper' + - '§5Perks:' + - §5❙ §fTake 10% less damage + - §5❙ §fMed Kits and Portable Resistance last 25% longer + - §5❙ §fSHIFT + Click to put the last player you hit on Ability Item cooldown + - '' + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 3 + Spiderman: + slot: 17 + displayName: '&c&lSpider Man Kit' + material: WEB + cooldown: 24 + lore: + - '&7An exclusive kit to the &6&lCustom &7rank.' + - '' + - '&4&l┃ &fCooldown: &c1 Day' + - '&4&l┃ &fAvailable in: &c{remaining}' + - '' + - '&aRight Click to preview this kit' + damage: 0 + uses: 265 + category: CLASSES + content: + item_0: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_SWORD + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §c§lSpider Man Sword + enchants: + DAMAGE_ALL: 2 + DAMAGE_UNDEAD: 4 + DURABILITY: 4 + DAMAGE_ARTHROPODS: 5 + LOOT_BONUS_MOBS: 4 + item_1: + ==: org.bukkit.inventory.ItemStack + type: ENDER_PEARL + amount: 16 + item_2: + ==: org.bukkit.inventory.ItemStack + type: GOLDEN_APPLE + amount: 16 + item_3: + ==: org.bukkit.inventory.ItemStack + type: EGG + amount: 16 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §d§lEggport + lore: + - '' + - §6❙ §fSwitch places with your + - §6❙ §fenemy that are within §c§l15 §fblocks! + - '' + - §fCan be found in the §6§lSummer Crate§f! + item_4: + ==: org.bukkit.inventory.ItemStack + type: PAPER + amount: 5 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §a§lMed Kit + lore: + - '' + - §6❙ §fRight Click to receive Resistance 3, + - §6❙ §fRegeneration 3, and 4 Absorption + - §6❙ §fHearts for 5 seconds! + - '' + - §fCan be found in the §6§lSummer Crate§f! + item_5: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_6: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_7: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_8: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_9: + ==: org.bukkit.inventory.ItemStack + type: GOLDEN_APPLE + damage: 1 + item_10: + ==: org.bukkit.inventory.ItemStack + type: BLAZE_POWDER + amount: 5 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §6§lStrength + lore: + - '' + - §6❙ §fGive you and your teammates + - §6❙ §e§l5 seconds §fof §c§lStrength + - '' + - §fCan be found in an §b§lAirdrop§f! + item_11: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_12: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_13: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_14: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_15: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_16: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_17: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_18: + ==: org.bukkit.inventory.ItemStack + type: FLINT + amount: 5 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §d§lTazer + lore: + - '' + - §6❙ §fHit a player and for the next + - §6❙ §e§l5 seconds §fthey will not be able to + - §6❙ §fmove or take knockback. + - '' + - §fCan be found in the §4§lCave Crate§f! + item_19: + ==: org.bukkit.inventory.ItemStack + type: WATER_BUCKET + amount: 5 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §9§lPortable Clutch + lore: + - '' + - §6❙ §fRight Click on a surface to + - §6❙ §fplace water in any claim! (non-spreadable) + - '' + - §fCan be found in the §4§lCave Crate§f! + item_20: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_21: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_22: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_23: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_24: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_25: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_26: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_27: + ==: org.bukkit.inventory.ItemStack + type: SPIDER_EYE + amount: 5 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §e§lSpider Ability + lore: + - '' + - §6❙ §fClick to activate and for the + - §6❙ §fnext §e§l15 seconds§f, all hits dealt + - §6❙ §fhave a §c§l25% §fchance of putting a + - §6❙ §fcobweb underneath the enemy. + - '' + - §fCan be found in the §e§lNicoArg17 Crate§f! + item_28: + ==: org.bukkit.inventory.ItemStack + type: ARROW + amount: 5 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §c§lArrow Reflector + lore: + - '' + - §6❙ §fClick and for §e§l15 seconds §fall + - §6❙ §farrows shot at you will be shot back + - §6❙ §fto the original shooter! + - '' + - §fCan be found in the §4§lCave Crate§f! + item_29: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_30: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_31: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_32: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_33: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_34: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + item_35: + ==: org.bukkit.inventory.ItemStack + type: POTION + damage: 16421 + armor: + item_0: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_BOOTS + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §c§lSpider Man Boots + lore: + - '' + - '§cArmor Class: §fSpider Man' + - '§cPerks:' + - §c❙ §f25% Fall Damage Reduction + - §c❙ §fPermanent Jump Boost II, Speed II, Fire Resistance I + - §c❙ §fSHIFT + Click to put the last player you hit in cobwebs! + - '' + - §cSpeed II + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 3 + PROTECTION_FALL: 4 + item_1: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_LEGGINGS + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §c§lSpider Man Leggings + lore: + - '' + - '§cArmor Class: §fSpider Man' + - '§cPerks:' + - §c❙ §f25% Fall Damage Reduction + - §c❙ §fPermanent Jump Boost II, Speed II, Fire Resistance I + - §c❙ §fSHIFT + Click to put the last player you hit in cobwebs! + - '' + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 3 + item_2: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_CHESTPLATE + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §c§lSpider Man Chestplate + lore: + - '' + - '§cArmor Class: §fSpider Man' + - '§cPerks:' + - §c❙ §f25% Fall Damage Reduction + - §c❙ §fPermanent Jump Boost II, Speed II, Fire Resistance I + - §c❙ §fSHIFT + Click to put the last player you hit in cobwebs! + - '' + - §cFireResistance I + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 3 + item_3: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND_HELMET + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §c§lSpider Man Helmet + lore: + - '' + - '§cArmor Class: §fSpider Man' + - '§cPerks:' + - §c❙ §f25% Fall Damage Reduction + - §c❙ §fPermanent Jump Boost II, Speed II, Fire Resistance I + - §c❙ §fSHIFT + Click to put the last player you hit in cobwebs! + - '' + enchants: + PROTECTION_ENVIRONMENTAL: 2 + DURABILITY: 3 + Brewer: + slot: 11 + displayName: §d§lBrewer Kit + material: BREWING_STAND_ITEM + cooldown: 24 + lore: + - '&7This kit is free to all players!' + - '' + - '&4&l┃ &fCooldown: &c1 Day' + - '&4&l┃ &fAvailable in: &c{remaining}' + - '' + - '&aRight Click to preview this kit' + damage: 0 + uses: 8860 + category: FREE + content: + item_0: + ==: org.bukkit.inventory.ItemStack + type: BREWING_STAND_ITEM + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: §b§lFancy Brewer + lore: + - §7A brewing stand... but fancy. + - §7Place the brewer and open to get started. + - '' + - §aLearn more at cavepvp.org/fancybrewers + item_1: + ==: org.bukkit.inventory.ItemStack + type: NETHER_STALK + amount: 16 + item_2: + ==: org.bukkit.inventory.ItemStack + type: SPECKLED_MELON + amount: 16 + item_3: + ==: org.bukkit.inventory.ItemStack + type: GLOWSTONE_DUST + amount: 16 + item_4: + ==: org.bukkit.inventory.ItemStack + type: SULPHUR + amount: 16 + item_5: + ==: org.bukkit.inventory.ItemStack + type: SUGAR_CANE + amount: 16 + item_6: + ==: org.bukkit.inventory.ItemStack + type: FERMENTED_SPIDER_EYE + amount: 16 + item_7: + ==: org.bukkit.inventory.ItemStack + type: SOUL_SAND + amount: 16 + item_8: + ==: org.bukkit.inventory.ItemStack + type: MELON_SEEDS + amount: 8 + item_9: + ==: org.bukkit.inventory.ItemStack + type: BLAZE_ROD + amount: 16 + item_10: + ==: org.bukkit.inventory.ItemStack + type: CARROT_ITEM + amount: 16 + item_11: + ==: org.bukkit.inventory.ItemStack + type: POTATO_ITEM + amount: 16 + armor: + item_0: + ==: org.bukkit.inventory.ItemStack + type: AIR + damage: -1 + amount: 0 + item_1: + ==: org.bukkit.inventory.ItemStack + type: AIR + damage: -1 + amount: 0 + item_2: + ==: org.bukkit.inventory.ItemStack + type: AIR + damage: -1 + amount: 0 + item_3: + ==: org.bukkit.inventory.ItemStack + type: AIR + damage: -1 + amount: 0 diff --git a/Configs + Precompiled/config/Universe/config.yml b/Configs + Precompiled/config/Universe/config.yml new file mode 100644 index 0000000..8b36f59 --- /dev/null +++ b/Configs + Precompiled/config/Universe/config.yml @@ -0,0 +1,4 @@ +name: "Fasts" +group: "HCF" +redis: + host: "0.0.0.0" \ No newline at end of file diff --git a/Configs + Precompiled/config/Vault/config.yml b/Configs + Precompiled/config/Vault/config.yml new file mode 100644 index 0000000..5243845 --- /dev/null +++ b/Configs + Precompiled/config/Vault/config.yml @@ -0,0 +1 @@ +update-check: true diff --git a/Configs + Precompiled/config/Votifier/config.yml b/Configs + Precompiled/config/Votifier/config.yml new file mode 100644 index 0000000..5cdd5fa --- /dev/null +++ b/Configs + Precompiled/config/Votifier/config.yml @@ -0,0 +1,4 @@ +host: 0.0.0.0 +port: 8192 +debug: false +listener_folder: plugins/Votifier/listeners \ No newline at end of file diff --git a/Configs + Precompiled/config/WorldEdit/config.yml b/Configs + Precompiled/config/WorldEdit/config.yml new file mode 100644 index 0000000..064eb51 --- /dev/null +++ b/Configs + Precompiled/config/WorldEdit/config.yml @@ -0,0 +1,73 @@ +# +# WorldEdit's configuration file +# +# About editing this file: +# - DO NOT USE TABS. You MUST use spaces or Bukkit will complain. If +# you use an editor like Notepad++ (recommended for Windows users), you +# must configure it to "replace tabs with spaces." In Notepad++, this can +# be changed in Settings > Preferences > Language Menu. +# - Don't get rid of the indents. They are indented so some entries are +# in categories (like "max-blocks-changed" is in the "limits" +# category. +# - If you want to check the format of this file before putting it +# into WorldEdit, paste it into http://yaml-online-parser.appspot.com/ +# and see if it gives "ERROR:". +# - Lines starting with # are commentsand so they are ignored. +# + +limits: + allow-extra-data-values: false + max-blocks-changed: + default: -1 + maximum: -1 + max-polygonal-points: + default: -1 + maximum: 20 + max-radius: -1 + max-super-pickaxe-size: 30 + max-brush-radius: 15 + butcher-radius: + default: -1 + maximum: -1 + disallowed-blocks: [6, 7, 14, 15, 16, 26, 27, 28, 29, 39, 31, 32, 33, 34, 36, 37, 38, 39, 40, 46, 50, 51, 56, 59, 69, 73, 74, 75, 76, 77, 81, 83, 137, 210, 211, 255] + +use-inventory: + enable: false + allow-override: true + creative-mode-overrides: false + +logging: + log-commands: false + file: worldedit.log + +super-pickaxe: + drop-items: true + many-drop-items: false + +snapshots: + directory: + +navigation-wand: + item: 345 + max-distance: 100 + +scripting: + timeout: 3000 + dir: craftscripts + +saving: + dir: schematics + +files: + allow-symbolic-links: false + +history: + size: 15 + expiration: 10 + +wand-item: 271 +shell-save-type: +no-double-slash: false +no-op-permissions: false +debug: false +show-help-on-first-use: true diff --git a/Configs + Precompiled/config/server/bukkit.yml b/Configs + Precompiled/config/server/bukkit.yml new file mode 100644 index 0000000..dabe258 --- /dev/null +++ b/Configs + Precompiled/config/server/bukkit.yml @@ -0,0 +1,57 @@ +# This is the main configuration file for Bukkit. +# As you can see, there's actually not that much to configure without any plugins. +# For a reference for any variable inside this file, check out the Bukkit Wiki at +# http://wiki.bukkit.org/Bukkit.yml +# +# If you need help on this file, feel free to join us on irc or leave a message +# on the forums asking for advice. +# +# IRC: #spigot @ irc.spi.gt +# (If this means nothing to you, just go to http://irc.spi.gt/iris/?nick=&channels=spigot ) +# Forums: http://www.spigotmc.org/forums/help.40/ +# Bug tracker: http://www.spigotmc.org/forums/bugs-feature-requests.8/ + + +settings: + allow-end: true + warn-on-overload: true + permissions-file: permissions.yml + update-folder: update + ping-packet-limit: 100 + use-exact-login-location: false + plugin-profiling: false + connection-throttle: -1 + query-plugins: true + require-all-plugins: true + deprecated-verbose: default + shutdown-message: Server closed +spawn-limits: + monsters: -1 + animals: -1 + water-animals: -1 + ambient: -1 +chunk-gc: + period-in-ticks: 600 + load-threshold: 0 +ticks-per: + animal-spawns: 400 + monster-spawns: 600 + autosave: 6000 +auto-updater: + enabled: true + on-broken: + - warn-console + - warn-ops + on-update: + - warn-console + - warn-ops + preferred-channel: rb + host: dl.bukkit.org + suggest-channels: true +aliases: now-in-commands.yml +database: + username: bukkit + isolation: SERIALIZABLE + driver: org.sqlite.JDBC + password: walrus + url: jdbc:sqlite:{DIR}{NAME}.db diff --git a/Configs + Precompiled/config/server/commands.yml b/Configs + Precompiled/config/server/commands.yml new file mode 100644 index 0000000..c523f48 --- /dev/null +++ b/Configs + Precompiled/config/server/commands.yml @@ -0,0 +1,16 @@ +# This is the commands configuration file for Bukkit. +# For documentation on how to make use of this file, check out the Bukkit Wiki at +# http://wiki.bukkit.org/Commands.yml +# +# If you need help on this file, feel free to join us on irc or leave a message +# on the forums asking for advice. +# +# IRC: #spigot @ irc.spi.gt +# (If this means nothing to you, just go to http://irc.spi.gt/iris/?nick=&channels=spigot ) +# Forums: http://www.spigotmc.org/forums/help.40/ +# Bug tracker: http://www.spigotmc.org/forums/bugs-feature-requests.8/ + +command-block-overrides: [] +aliases: + icanhasbukkit: + - version $1- diff --git a/Configs + Precompiled/config/server/enchantments.yml b/Configs + Precompiled/config/server/enchantments.yml new file mode 100644 index 0000000..800c4f6 --- /dev/null +++ b/Configs + Precompiled/config/server/enchantments.yml @@ -0,0 +1,115 @@ +damage-all: + weight: 60 + max-level: 2 + start-level: 1 +protection-environmental: + weight: 60 + max-level: 2 + start-level: 1 +thorns: + weight: 0 + max-level: 0 + start-level: 0 +knockback: + weight: 0 + max-level: 0 + start-level: 0 +fire-aspect: + weight: 0 + max-level: 0 + start-level: 0 +protection-fire: + weight: 5 + start-level: 1 + max-level: 4 + conflicting: [] +protection-fall: + weight: 5 + start-level: 1 + max-level: 4 + conflicting: [] +protection-explosions: + weight: 2 + start-level: 1 + max-level: 4 + conflicting: [] +protection-projectile: + weight: 5 + start-level: 1 + max-level: 4 + conflicting: [] +oxygen: + weight: 2 + start-level: 1 + max-level: 3 + conflicting: [] +water-worker: + weight: 2 + start-level: 1 + max-level: 1 + conflicting: [] +damage-undead: + weight: 5 + start-level: 1 + max-level: 5 + conflicting: [] +damage-arthropods: + weight: 5 + start-level: 1 + max-level: 5 + conflicting: [] +loot-bonus-mobs: + weight: 2 + start-level: 1 + max-level: 3 + conflicting: [] +dig-speed: + weight: 10 + start-level: 1 + max-level: 5 + conflicting: [] +silk-touch: + weight: 1 + start-level: 1 + max-level: 1 + conflicting: [] +durability: + weight: 5 + start-level: 1 + max-level: 3 + conflicting: [] +loot-bonus-blocks: + weight: 2 + start-level: 1 + max-level: 3 + conflicting: [] +arrow-damage: + weight: 10 + start-level: 1 + max-level: 4 + conflicting: [] +arrow-knockback: + weight: 2 + start-level: 1 + max-level: 2 + conflicting: [] +arrow-fire: + weight: 2 + start-level: 1 + max-level: 1 + conflicting: [] +arrow-infinite: + weight: 1 + start-level: 1 + max-level: 1 + conflicting: [] +luck: + weight: 2 + start-level: 1 + max-level: 3 + conflicting: [] +lure: + weight: 2 + start-level: 1 + max-level: 1 + conflicting: [] diff --git a/Configs + Precompiled/config/server/knockback.json b/Configs + Precompiled/config/server/knockback.json new file mode 100644 index 0000000..e8ef01d --- /dev/null +++ b/Configs + Precompiled/config/server/knockback.json @@ -0,0 +1 @@ +{"settings":{"hcf":"false","wtap":"false"},"profiles":{"aawda":{"horizontal":"0.35","extraHorizontal":"0.425","extraVertical":"0.085","vertical":"0.35","verticalLimit":"0.4000000059604645","friction":"2.0"},"track2":{"horizontal":"0.7","extraHorizontal":"0.15","extraVertical":"0.05","vertical":"0.38","verticalLimit":"0.43","friction":"2.3"},"as":{"horizontal":"0.521","extraHorizontal":"0.265","extraVertical":"0.085","vertical":"0.33","verticalLimit":"0.32","friction":"2.0"},"asd":{"horizontal":"0.376","extraHorizontal":"0.41","extraVertical":"0.065","vertical":"0.314","verticalLimit":"0.327","friction":"3.5"},"test":{"horizontal":"0.35","extraHorizontal":"0.5","extraVertical":"0.1","vertical":"0.35","verticalLimit":"0.4","friction":"2.0"},"tracklol":{"horizontal":"0.72","extraHorizontal":"0.082","extraVertical":"0.085","vertical":"0.34","verticalLimit":"0.36","friction":"8.0"},"asdada":{"horizontal":"0.35","extraHorizontal":"0.425","extraVertical":"0.085","vertical":"0.35","verticalLimit":"0.4000000059604645","friction":"2.0"},"Fyre":{"horizontal":"0.35","extraHorizontal":"0.425","extraVertical":"0.085","vertical":"0.35","verticalLimit":"0.4000000059604645","friction":"2.0"},"track":{"horizontal":"0.96","extraHorizontal":"0.17","extraVertical":"0.02","vertical":"0.38","verticalLimit":"0.41","friction":"2.0"},"Default":{"horizontal":"0.73","extraHorizontal":"0.044","extraVertical":"0.054","vertical":"0.33","verticalLimit":"0.34","friction":"3.0"}}} \ No newline at end of file diff --git a/Configs + Precompiled/config/server/paper.yml b/Configs + Precompiled/config/server/paper.yml new file mode 100644 index 0000000..a12b5d0 --- /dev/null +++ b/Configs + Precompiled/config/server/paper.yml @@ -0,0 +1,81 @@ +# This is the main configuration file for PaperSpigot. +# As you can see, there's tons to configure. Some options may impact gameplay, so use +# with caution, and make sure you know what each option does before configuring. +# +# If you need help with the configuration or have any questions related to PaperSpigot, +# join us at the IRC. +# +# IRC: #paperspigot @ irc.spi.gt ( http://irc.spi.gt/iris/?channels=PaperSpigot ) + +config-version: 6 +effect-modifiers: + strength: 0.3 + weakness: -0.5 +stackable-buckets: + lava: false + water: false + milk: false +settings: + baby-zombie-movement-speed: 0.5 + async-plugin-bad-magic-catcher: true + limit-player-interactions: true +max-packets-per-player: 1000 +world-settings: + default: + verbose: true + squid-spawn-height: + minimum: 45.0 + maximum: 63.0 + optimize-explosions: true + game-mechanics: + boats-drop-boats: false + less-picky-torch-placement: false + disable-player-crits: false + disable-end-credits: true + generator-settings: + canyon: true + caves: true + dungeon: true + fortress: true + mineshaft: true + stronghold: true + temple: true + village: true + flat-bedrock: false + load-chunks: + enderpearls: true + tnt-entities: false + falling-blocks: false + fast-drain: + lava: true + water: true + player-blocking-damage-multiplier: 0.8 + despawn-ranges: + soft: 32 + hard: 100 + lava-flow-speed: + normal: 30 + nether: 10 + remove-unloaded: + enderpearls: false + tnt-entities: true + falling-blocks: true + remove-invalid-mob-spawner-tile-entities: true + player-exhaustion: + block-break: 0.025 + swimming: 0.015 + fishing-time-range: + MinimumTicks: 100 + MaximumTicks: 500 + max-growth-height: + cactus: 3 + reeds: 3 + tnt-entity-height-nerf: 0.0 + keep-spawn-loaded: true + tick-next-tick-list-cap: 10000 + tick-next-tick-list-cap-ignores-redstone: false + falling-blocks-collide-with-signs: false + use-async-lighting: false + water-over-lava-flow-speed: 5 + inverted-daylight-detectors: false + allow-undead-horse-leashing: true diff --git a/Configs + Precompiled/config/server/server.properties b/Configs + Precompiled/config/server/server.properties new file mode 100644 index 0000000..ce24524 --- /dev/null +++ b/Configs + Precompiled/config/server/server.properties @@ -0,0 +1,38 @@ +#Minecraft server properties +#Thu Mar 16 03:20:39 UTC 2023 +spawn-protection=16 +server-name=Fasts +generator-settings= +force-gamemode=false +allow-nether=true +gamemode=0 +enable-query=false +player-idle-timeout=10000 +difficulty=3 +spawn-monsters=true +op-permission-level=4 +announce-player-achievements=false +pvp=true +snooper-enabled=true +level-type=DEFAULT +hardcore=false +enable-command-block=true +max-players=300 +server-port=40011 +debug=false +server-ip= +spawn-npcs=true +allow-flight=false +level-name=world +view-distance=10 +server-id=Fasts +resource-pack= +spawn-animals=true +white-list=false +generate-structures=true +server-group=HCF +online-mode=false +max-build-height=256 +level-seed= +enable-rcon=false +motd=A Minecraft Server diff --git a/Configs + Precompiled/config/server/spigot.yml b/Configs + Precompiled/config/server/spigot.yml new file mode 100644 index 0000000..075827a --- /dev/null +++ b/Configs + Precompiled/config/server/spigot.yml @@ -0,0 +1,191 @@ +# This is the main configuration file for Spigot. +# As you can see, there's tons to configure. Some options may impact gameplay, so use +# with caution, and make sure you know what each option does before configuring. +# For a reference for any variable inside this file, check out the Spigot wiki at +# http://www.spigotmc.org/wiki/spigot-configuration/ +# +# If you need help with the configuration or have any questions related to Spigot, +# join us at the IRC or drop by our forums and leave a post. +# +# IRC: #spigot @ irc.spi.gt ( http://www.spigotmc.org/pages/irc/ ) +# Forums: http://www.spigotmc.org/ + +config-version: 8 +settings: + disable: + ticking: + weather: true + blocks: false + villages: true + general: + sleepcheck: true + entity-collisions: true + entityTracking: false + player-list-packets: false + ping-update-packets: false + disableSaving: false + save-user-cache-on-stop-only: false + instantRespawn: false + alternate-knockback: false + smeltingMultiplier: 4 + brewingMultiplier: 3 + only-custom-tab: true + pearl-through-gates-and-tripwire: true + logRemainingAsyncThreadsDuringShutdown: true + bungeecord: true + late-bind: false + sample-count: 12 + player-shuffle: 0 + filter-creative-items: true + user-cache-size: 1000 + int-cache-limit: 1024 + moved-wrongly-threshold: 0.225 + moved-too-quickly-threshold: 100.0 + chunkio: + players-per-thread: 150 + autosave: + chunks-per-tick: 200 + fire-WorldSaveEvent: false + clear-RegionFileCache: false + lagSpikeLogger: + enabled: false + tickLimitInMilliseconds: 60 + cache-chunk-maps: false + reduce-armor-damage: true + timeout-time: 10 + restart-on-crash: true + restart-script: ./start.sh + netty-threads: 4 + attribute: + maxHealth: + max: 2048.0 + movementSpeed: + max: 2048.0 + attackDamage: + max: 2048.0 + global-api-cache: false + disable-player-file-saving: false + debug: false + guardian: + enabled: false + testing: false + chunkSleeping: + enabled: true + tickDistance: 2 + queued-player-chunk-loading: + directChunkLoadRange: 1 +commands: + tab-complete: -1 + log: true + spam-exclusions: + - /skill + silent-commandblock-console: false + replace-commands: + - setblock + - summon + - testforblock + - tellraw +messages: + whitelist: You are not whitelisted on this server! + unknown-command: Unknown command. Type "/help" for help. + server-full: The server is full! + outdated-client: Outdated client! Please use {0} + outdated-server: Outdated server! I'm still on {0} + restart: Server is restarting +world-settings: + default: + verbose: true + mob-spawn-range: 3 + nerf-spawner-mobs: true + enderPearlsCanPassNonSolidBlocks: true + growth: + cactus-modifier: 1000 + cane-modifier: 1000 + melon-modifier: 1000 + mushroom-modifier: 1000 + pumpkin-modifier: 1000 + sapling-modifier: 1000 + wheat-modifier: 1000 + entity-activation-range: + animals: 2 + monsters: 2 + misc: 2 + entity-tracking-range: + players: 48 + animals: 12 + monsters: 16 + misc: 32 + other: 32 + hopper-alt-ticking: true + ticks-per: + hopper-transfer: 8 + hopper-check: 8 + hopper-amount: 1 + anti-xray: + enabled: false + engine-mode: 1 + hide-blocks: + - 14 + - 15 + - 16 + - 21 + - 48 + - 49 + - 54 + - 56 + - 73 + - 74 + - 82 + - 129 + - 130 + replace-blocks: + - 1 + - 5 + random-light-updates: false + save-structure-info: false + max-bulk-chunks: 5 + max-entity-collisions: 1 + dragon-death-sound-radius: 0 + seed-village: 10387312 + seed-feature: 14357617 + hunger: + walk-exhaustion: 0.2 + sprint-exhaustion: 0.2 + combat-exhaustion: 0.2 + regen-exhaustion: 0.2 + max-tnt-per-tick: 100 + updateMapItemsInPlayerInventory: false + view-distance: 8 + item-despawn-rate: 1200 + merge-radius: + item: 6.0 + exp: 6.0 + chunks-per-tick: 500 + clear-tick-list: true + mobs-enabled: true + exp-despawn-rate: 1200 + arrow-despawn-rate: 200 + enable-zombie-pigmen-portal-spawns: false + wither-spawn-sound-radius: 0 + hanging-tick-frequency: 600 + zombie-aggressive-towards-villager: false + useAlternateEndSpawn: false + tick-distance: 1 + max-activation-per-chunk: 4 + max-tick-time: + tile: 7 + entity: 9 + mob-limits: + spawner: + amount: 30 + radius: 64 + portal: + amount: 30 + radius: 64 + world_the_end: + entity-activation-range: + monsters: 16 +auto-wtap: false +hcf-knockback: false +stats: + forced-stats: {} diff --git a/Configs + Precompiled/plugins/BuycraftX.jar b/Configs + Precompiled/plugins/BuycraftX.jar new file mode 100644 index 0000000..16edc23 Binary files /dev/null and b/Configs + Precompiled/plugins/BuycraftX.jar differ diff --git a/Configs + Precompiled/plugins/CoinShop-1.0-SNAPSHOT.jar b/Configs + Precompiled/plugins/CoinShop-1.0-SNAPSHOT.jar new file mode 100644 index 0000000..63931f9 Binary files /dev/null and b/Configs + Precompiled/plugins/CoinShop-1.0-SNAPSHOT.jar differ diff --git a/Configs + Precompiled/plugins/CoreProtect.jar b/Configs + Precompiled/plugins/CoreProtect.jar new file mode 100644 index 0000000..6a40e27 Binary files /dev/null and b/Configs + Precompiled/plugins/CoreProtect.jar differ diff --git a/Configs + Precompiled/plugins/CrackShot.jar b/Configs + Precompiled/plugins/CrackShot.jar new file mode 100644 index 0000000..6861bb5 Binary files /dev/null and b/Configs + Precompiled/plugins/CrackShot.jar differ diff --git a/Configs + Precompiled/plugins/CrateReloaded.jar b/Configs + Precompiled/plugins/CrateReloaded.jar new file mode 100644 index 0000000..4ae6d8d Binary files /dev/null and b/Configs + Precompiled/plugins/CrateReloaded.jar differ diff --git a/Configs + Precompiled/plugins/EasyBackup.jar b/Configs + Precompiled/plugins/EasyBackup.jar new file mode 100644 index 0000000..f0d17d0 Binary files /dev/null and b/Configs + Precompiled/plugins/EasyBackup.jar differ diff --git a/Configs + Precompiled/plugins/Elevators.jar b/Configs + Precompiled/plugins/Elevators.jar new file mode 100644 index 0000000..ce8a22f Binary files /dev/null and b/Configs + Precompiled/plugins/Elevators.jar differ diff --git a/Configs + Precompiled/plugins/ExploitFixer.jar b/Configs + Precompiled/plugins/ExploitFixer.jar new file mode 100644 index 0000000..e12fc80 Binary files /dev/null and b/Configs + Precompiled/plugins/ExploitFixer.jar differ diff --git a/Configs + Precompiled/plugins/FlashPlugin23-1.0-SNAPSHOT.jar b/Configs + Precompiled/plugins/FlashPlugin23-1.0-SNAPSHOT.jar new file mode 100644 index 0000000..8390e75 Binary files /dev/null and b/Configs + Precompiled/plugins/FlashPlugin23-1.0-SNAPSHOT.jar differ diff --git a/Configs + Precompiled/plugins/GAListener.jar b/Configs + Precompiled/plugins/GAListener.jar new file mode 100644 index 0000000..0a18ec7 Binary files /dev/null and b/Configs + Precompiled/plugins/GAListener.jar differ diff --git a/Configs + Precompiled/plugins/HCTeams-1.0.jar b/Configs + Precompiled/plugins/HCTeams-1.0.jar new file mode 100644 index 0000000..3f4eef2 Binary files /dev/null and b/Configs + Precompiled/plugins/HCTeams-1.0.jar differ diff --git a/Configs + Precompiled/plugins/HamsterAPI.jar b/Configs + Precompiled/plugins/HamsterAPI.jar new file mode 100644 index 0000000..76c98ab Binary files /dev/null and b/Configs + Precompiled/plugins/HamsterAPI.jar differ diff --git a/Configs + Precompiled/plugins/MonthlyCrates-1.0-SNAPSHOT.jar b/Configs + Precompiled/plugins/MonthlyCrates-1.0-SNAPSHOT.jar new file mode 100644 index 0000000..ca8e025 Binary files /dev/null and b/Configs + Precompiled/plugins/MonthlyCrates-1.0-SNAPSHOT.jar differ diff --git a/Configs + Precompiled/plugins/PlugMan.jar b/Configs + Precompiled/plugins/PlugMan.jar new file mode 100644 index 0000000..8132026 Binary files /dev/null and b/Configs + Precompiled/plugins/PlugMan.jar differ diff --git a/Configs + Precompiled/plugins/Profiles-1.0-SNAPSHOT.jar b/Configs + Precompiled/plugins/Profiles-1.0-SNAPSHOT.jar new file mode 100644 index 0000000..b2a09d8 Binary files /dev/null and b/Configs + Precompiled/plugins/Profiles-1.0-SNAPSHOT.jar differ diff --git a/Configs + Precompiled/plugins/ProtocolLib.jar b/Configs + Precompiled/plugins/ProtocolLib.jar new file mode 100644 index 0000000..d657974 Binary files /dev/null and b/Configs + Precompiled/plugins/ProtocolLib.jar differ diff --git a/Configs + Precompiled/plugins/Suge-1.0-SNAPSHOT.jar b/Configs + Precompiled/plugins/Suge-1.0-SNAPSHOT.jar new file mode 100644 index 0000000..6d9f3dc Binary files /dev/null and b/Configs + Precompiled/plugins/Suge-1.0-SNAPSHOT.jar differ diff --git a/Configs + Precompiled/plugins/Vault.jar b/Configs + Precompiled/plugins/Vault.jar new file mode 100644 index 0000000..4bcaa89 Binary files /dev/null and b/Configs + Precompiled/plugins/Vault.jar differ diff --git a/Configs + Precompiled/plugins/Votifier.jar b/Configs + Precompiled/plugins/Votifier.jar new file mode 100644 index 0000000..9751f18 Binary files /dev/null and b/Configs + Precompiled/plugins/Votifier.jar differ diff --git a/Configs + Precompiled/plugins/WorldEdit.jar b/Configs + Precompiled/plugins/WorldEdit.jar new file mode 100644 index 0000000..9411332 Binary files /dev/null and b/Configs + Precompiled/plugins/WorldEdit.jar differ diff --git a/Configs + Precompiled/plugins/WorldEditCrashFix.jar b/Configs + Precompiled/plugins/WorldEditCrashFix.jar new file mode 100644 index 0000000..e2b7fdf Binary files /dev/null and b/Configs + Precompiled/plugins/WorldEditCrashFix.jar differ diff --git a/Configs + Precompiled/plugins/XPShop-1.0-SNAPSHOT.jar b/Configs + Precompiled/plugins/XPShop-1.0-SNAPSHOT.jar new file mode 100644 index 0000000..d96591d Binary files /dev/null and b/Configs + Precompiled/plugins/XPShop-1.0-SNAPSHOT.jar differ diff --git a/Configs + Precompiled/plugins/bukkitapi.jar b/Configs + Precompiled/plugins/bukkitapi.jar new file mode 100644 index 0000000..1b75438 Binary files /dev/null and b/Configs + Precompiled/plugins/bukkitapi.jar differ diff --git a/Configs + Precompiled/plugins/entity-entity-1.0-SNAPSHOT.jar b/Configs + Precompiled/plugins/entity-entity-1.0-SNAPSHOT.jar new file mode 100644 index 0000000..3925b4f Binary files /dev/null and b/Configs + Precompiled/plugins/entity-entity-1.0-SNAPSHOT.jar differ diff --git a/Configs + Precompiled/plugins/mobtimizer-1.0-SNAPSHOT.jar b/Configs + Precompiled/plugins/mobtimizer-1.0-SNAPSHOT.jar new file mode 100644 index 0000000..c6f8f6b Binary files /dev/null and b/Configs + Precompiled/plugins/mobtimizer-1.0-SNAPSHOT.jar differ diff --git a/Configs + Precompiled/plugins/modsuite-bukkit-1.0-SNAPSHOT.jar b/Configs + Precompiled/plugins/modsuite-bukkit-1.0-SNAPSHOT.jar new file mode 100644 index 0000000..6cd852f Binary files /dev/null and b/Configs + Precompiled/plugins/modsuite-bukkit-1.0-SNAPSHOT.jar differ diff --git a/Configs + Precompiled/plugins/neutron-1.0-SNAPSHOT.jar b/Configs + Precompiled/plugins/neutron-1.0-SNAPSHOT.jar new file mode 100644 index 0000000..bf7e306 Binary files /dev/null and b/Configs + Precompiled/plugins/neutron-1.0-SNAPSHOT.jar differ diff --git a/Configs + Precompiled/plugins/piston-1.0-SNAPSHOT.jar b/Configs + Precompiled/plugins/piston-1.0-SNAPSHOT.jar new file mode 100644 index 0000000..88cdcd2 Binary files /dev/null and b/Configs + Precompiled/plugins/piston-1.0-SNAPSHOT.jar differ diff --git a/Configs + Precompiled/plugins/proton-1.0-SNAPSHOT.jar b/Configs + Precompiled/plugins/proton-1.0-SNAPSHOT.jar new file mode 100644 index 0000000..87fba75 Binary files /dev/null and b/Configs + Precompiled/plugins/proton-1.0-SNAPSHOT.jar differ diff --git a/Configs + Precompiled/plugins/quartz-plugin-1.0-SNAPSHOT.jar b/Configs + Precompiled/plugins/quartz-plugin-1.0-SNAPSHOT.jar new file mode 100644 index 0000000..b460a21 Binary files /dev/null and b/Configs + Precompiled/plugins/quartz-plugin-1.0-SNAPSHOT.jar differ diff --git a/Configs + Precompiled/plugins/spark-1.8.8-bukkit.jar b/Configs + Precompiled/plugins/spark-1.8.8-bukkit.jar new file mode 100644 index 0000000..3ce6059 Binary files /dev/null and b/Configs + Precompiled/plugins/spark-1.8.8-bukkit.jar differ diff --git a/Configs + Precompiled/plugins/universe-spigot-1.0-SNAPSHOT.jar b/Configs + Precompiled/plugins/universe-spigot-1.0-SNAPSHOT.jar new file mode 100644 index 0000000..2f0d434 Binary files /dev/null and b/Configs + Precompiled/plugins/universe-spigot-1.0-SNAPSHOT.jar differ diff --git a/Entity-master/build.gradle b/Entity-master/build.gradle new file mode 100644 index 0000000..497177c --- /dev/null +++ b/Entity-master/build.gradle @@ -0,0 +1,83 @@ +plugins { + id "org.jetbrains.kotlin.jvm" version "$kotlin_version" apply true + id "org.jetbrains.kotlin.kapt" version "$kotlin_version" apply true // moshi + id "com.github.johnrengelman.shadow" version "$shadow_version" apply true +} + +this.group = "org.cavepvp.entity" +this.version = "1.0-SNAPSHOT" +this.description = "Entity" + +repositories { + + flatDir { + dirs 'libs' + } + + mavenLocal() + mavenCentral() +} + +this.tasks.withType(JavaCompile) { + options.encoding = 'UTF-8' +} + +apply plugin: "kotlin" +apply plugin: 'kotlin-kapt' +apply plugin: 'maven-publish' + + +this.targetCompatibility = '1.8' +this.sourceCompatibility = '1.8' + +sourceSets { + main.java.srcDirs += 'src/main/kotlin/' +} + +shadowJar { + shadowJar.classifier = null +} + +compileKotlin { + kotlinOptions.jvmTarget = '1.8' +} + +dependencies { + + kapt "com.squareup.moshi:moshi-kotlin-codegen:$moshi_version" + + compileOnly "cc.fyre.proton:proton:2.0-SNAPSHOT" + implementation "mkremins:fanciful:0.4.0-SNAPSHOT" + compileOnly "net.valorhcf:vspigot-server:1.7.10-R0.1-SNAPSHOT" + compileOnly "org.projectlombok:lombok:1.16.16" + + implementation "com.squareup.moshi:moshi-kotlin:$moshi_version" + implementation "com.squareup.moshi:moshi-adapters:$moshi_version" + + compileOnly "com.comphenix.protocol:ProtocolLib:3.6.5-SNAPSHOT" + + // put ur protocollib + + implementation "com.squareup.okhttp3:okhttp:$okhttp_version" // Retrofit's okhttp version + implementation "com.squareup.retrofit2:retrofit:$retrofit_version" + implementation "com.squareup.retrofit2:converter-moshi:$retrofit_converter_version" + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" + + compileOnly fileTree(dir: 'libs', include: ['*.jar']) +} + +shadowJar { + shadowJar.archiveName = this.rootProject.name + "-" + this.name + "-" + this.version + ".jar" +} + +publishing { + + publications { + + shadow(MavenPublication) { + publication -> project.shadow.component(publication) + } + + } + +} \ No newline at end of file diff --git a/Entity-master/gradle.properties b/Entity-master/gradle.properties new file mode 100644 index 0000000..9f6c064 --- /dev/null +++ b/Entity-master/gradle.properties @@ -0,0 +1,10 @@ +moshi_version=1.12.0 +redis_version=3.6.3 +mongo_version=3.12.10 +shadow_version=5.2.0 +okhttp_version=4.9.1 +kotlin_version=1.5.21 +circuit_version=1.0-SNAPSHOT +retrofit_version=2.9.0 +retrofit_converter_version=2.9.0 +spigot_version=1.7.10-R0.1-SNAPSHOT \ No newline at end of file diff --git a/Entity-master/settings.gradle b/Entity-master/settings.gradle new file mode 100644 index 0000000..14ca49a --- /dev/null +++ b/Entity-master/settings.gradle @@ -0,0 +1,2 @@ +rootProject.name = 'entity' + diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/Entity.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/Entity.kt new file mode 100644 index 0000000..ed8e4a5 --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/Entity.kt @@ -0,0 +1,120 @@ +package org.cavepvp.entity + +import org.cavepvp.entity.animation.EntityAnimation +import com.squareup.moshi.JsonClass +import org.bukkit.Bukkit +import org.bukkit.ChatColor +import org.bukkit.Location +import org.bukkit.Material +import org.bukkit.entity.EntityType +import org.bukkit.entity.Player +import org.bukkit.inventory.ItemStack +import org.cavepvp.entity.util.EntityUtil +import org.cavepvp.entity.util.ItemBuilder +import java.io.File +import java.util.* +import java.util.concurrent.ConcurrentHashMap + +/** + * @project carnage + * + * @date 15/02/2021 + * @author xanderume@gmail.com + */ +@JsonClass(generateAdapter = false) +abstract class Entity(var name: String,var location: Location,@Transient var parent: Int? = null) { + + var visibility = EntityVisibility.VISIBLE + var animations = mutableListOf() + + @Transient var id = EntityUtil.getNewEntityId() + @Transient var file = File("${EntityRepository.container.absolutePath}/${this.getSerializedName()}.json") + + @Transient var tick = 0 + @Transient var persistent = true + @Transient var initialized = false + + @Transient var selfHandledViewing = false + @Transient var selfHandledViewers: ConcurrentHashMap.KeySetView = ConcurrentHashMap.newKeySet() + + @Transient val viewers: ConcurrentHashMap.KeySetView = ConcurrentHashMap.newKeySet() + @Transient private val moveItem = ItemBuilder.of(MOVE_ITEM_TYPE) + .name(MOVE_ITEM_NAME) + .lore("$MOVE_ITEM_LORE_KEY${this.parent ?: this.id}") + .data(this.getEntityType().typeId) + .build() + + abstract fun init() + + @JvmName("getLocation1") + fun getLocation():Location { + return this.location + } + + open fun updateLocation(location: Location) { + this.location = location + } + + fun getDistance(location: Location):Double { + return this.location.distance(location) + } + + fun getDistanceSquared(location: Location):Double { + + if (location.world != this.location.world) { + return -1.0 + } + + return this.location.distanceSquared(location) + } + + fun updateVisibility(visibility: EntityVisibility) { + this.visibility = visibility + this.visibility.action.test(this) + } + + fun getMoveItem():ItemStack { + return this.moveItem + } + + private fun getSerializedName():String { + return this.name + } + + abstract fun getEntityType():EntityType + + abstract fun sendCreatePacket(player: Player) + abstract fun sendUpdatePacket(player: Player) + abstract fun sendRefreshPacket(player: Player) + abstract fun sendDestroyPacket(player: Player) + + open fun sendToAll(lambda: (player: Player) -> Unit) { + this.viewers.mapNotNull{Bukkit.getServer().getPlayer(it)}.filter{it.isOnline && !it.isDead}.forEach(lambda) + } + + fun getAllViewers():List { + return this.viewers.mapNotNull{Bukkit.getServer().getPlayer(it)}.filter{it.isOnline && !it.isDead} + } + + open fun onTick() {} + open fun onLeftClick(player: Player) {} + open fun onRightClick(player: Player) {} + + companion object { + + const val DISTANCE = 1600.0 + + val MOVE_ITEM_TYPE = Material.MONSTER_EGG + val MOVE_ITEM_NAME = "${ChatColor.YELLOW}${ChatColor.BOLD}Move Entity" + val MOVE_ITEM_LORE_KEY = "${ChatColor.DARK_GRAY}#" + + val BLOCK_HEIGHTS = hashMapOf( + Material.STEP to 0.5, + Material.WOOD_STEP to 0.5, + Material.TRAP_DOOR to 0.2, + Material.CARPET to 0.0625, + ) + + } + +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/EntityHandler.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/EntityHandler.kt new file mode 100644 index 0000000..fe2f8ed --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/EntityHandler.kt @@ -0,0 +1,155 @@ +package org.cavepvp.entity + +import org.cavepvp.entity.animation.EntityAnimationRegistry +import org.cavepvp.entity.animation.moshi.EntityAnimationJsonAdapter +import org.cavepvp.entity.animation.moshi.EntityAnimationTypeJsonAdapter +import org.cavepvp.entity.animation.type.RingsAnimation +import org.cavepvp.entity.listener.EntityListener +import org.cavepvp.entity.listener.EntityPacketListener +import org.cavepvp.entity.thread.EntityThread +import org.cavepvp.entity.type.hologram.Hologram +import org.cavepvp.entity.type.hologram.adapter.HologramAdapter +import org.cavepvp.entity.type.hologram.line.HologramLine +import org.cavepvp.entity.type.hologram.line.type.HologramItemLine +import org.cavepvp.entity.type.hologram.line.type.HologramTextLine +import org.cavepvp.entity.type.npc.NPC +import org.cavepvp.entity.type.npc.listener.NPCVisibilityListener +import com.squareup.moshi.adapters.PolymorphicJsonAdapterFactory +import org.bukkit.Bukkit +import org.bukkit.ChatColor +import org.bukkit.event.Listener +import org.cavepvp.entity.animation.type.RainbowAnimation +import org.cavepvp.entity.moshi.MoshiUtil +import java.math.BigDecimal + +/** + * @project carnage + * + * @date 15/02/2021 + * @author xanderume@gmail.com + */ +object EntityHandler { + + private val entities = mutableMapOf() + private val entitiesByName = mutableMapOf() + + private val adapters = mutableListOf() + + fun onLoad() { + MoshiUtil.rebuild{ + it.add(EntityAnimationJsonAdapter) + it.add(EntityAnimationTypeJsonAdapter) + it.add( + PolymorphicJsonAdapterFactory.of(Entity::class.java,"type") + .withSubtype(NPC::class.java,"NPC") + .withSubtype(Hologram::class.java,"HOLOGRAM") + ) + it.add( + PolymorphicJsonAdapterFactory.of(HologramLine::class.java,"type") + .withSubtype(HologramTextLine::class.java,"TEXT") + .withSubtype(HologramItemLine::class.java,"ITEM") + ) + } + + for (color in ChatColor.values().filter{it.isColor}) { + EntityAnimationRegistry.register(RingsAnimation(color)) + } + + EntityAnimationRegistry.register(RainbowAnimation) + + EntityRepository.onLoad() + + // Load them a second later, let other plugins register their own type first + Bukkit.getServer().scheduler.runTaskLater(EntityPlugin.instance,{ + + EntityRepository.findAll().forEach{entity -> + + if (entity is NPC) { + entity.hologram.parent = entity.id + } + + this.register(entity) + } + + EntityPlugin.instance.logger.info("[Entities] Loaded ${this.entities.size} ${if (this.entities.size == 1) "entity" else "entities"} to memory from ${EntityRepository.container.nameWithoutExtension} container.") + },20L) + + } + + fun destroy(entity: Entity) { + this.entities.remove(entity.id) + this.entitiesByName.remove(entity.name.toLowerCase()) + + if (!entity.file.exists() || !entity.persistent) { + return + } + + EntityRepository.deleteById(entity) + } + + fun register(entity: Entity) { + this.entities[entity.id] = entity + this.entitiesByName[entity.name.toLowerCase()] = entity + + entity.init() + entity.initialized = true + + if (!entity.persistent) { + return + } + + if (entity.file.exists()) { + return + } + + entity.file.createNewFile() + + EntityRepository.updateById(entity) + } + + fun registerType(clazz: Class,label: String) { + MoshiUtil.addToPolymorphic(Entity::class.java,clazz,label) + } + + fun getAllEntities():List { + return this.entities.values.toList() + } + + fun getEntityById(id: Int): Entity? { + return this.entities[id] + } + + fun getEntityByName(name: String): Entity? { + return this.entitiesByName[name.toLowerCase()] + } + + fun addAdapter(adapter: HologramAdapter) { + this.adapters.add(adapter) + } + + fun getAdapters():List { + return this.adapters + } + + fun onDisable() { + + val written = this.entities.values.filter{it.persistent}.sumOf{ + + if (!it.file.exists()) { + return@sumOf BigDecimal.ZERO + } + + try { + EntityRepository.updateById(it) + } catch (ex: Exception) { + ex.printStackTrace() + return@sumOf BigDecimal.ZERO + } + + return@sumOf BigDecimal.ONE + }.toInt() + + EntityPlugin.instance.logger.info("[Entities] Wrote $written ${if (written == 1) "entity" else "entities"} to disk in ${EntityRepository.container.nameWithoutExtension} container.") + } + +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/EntityPlugin.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/EntityPlugin.kt new file mode 100644 index 0000000..afad43c --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/EntityPlugin.kt @@ -0,0 +1,43 @@ +package org.cavepvp.entity + +import org.bukkit.Bukkit +import org.bukkit.plugin.java.JavaPlugin +import org.cavepvp.entity.command.EntityCommand +import org.cavepvp.entity.listener.EntityListener +import org.cavepvp.entity.listener.EntityPacketListener +import org.cavepvp.entity.thread.EntityThread +import org.cavepvp.entity.type.npc.listener.NPCVisibilityListener + +class EntityPlugin : JavaPlugin() { + + override fun onEnable() { + instance = this + + if (!this.dataFolder.exists()) { + this.dataFolder.mkdirs() + } + + EntityHandler.onLoad() + + Bukkit.getServer().pluginManager.registerEvents(EntityListener,this) + Bukkit.getServer().pluginManager.registerEvents(EntityPacketListener,this) + Bukkit.getServer().pluginManager.registerEvents(NPCVisibilityListener,this) + + println("345345345") + getCommand("entity").executor = EntityCommand() + println("DJsidaijd12342423") + + EntityThread.start() + } + + override fun onDisable() { + EntityHandler.onDisable() + } + + companion object { + + lateinit var instance: EntityPlugin + + } + +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/EntityRepository.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/EntityRepository.kt new file mode 100644 index 0000000..4e4565a --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/EntityRepository.kt @@ -0,0 +1,51 @@ +package org.cavepvp.entity + +import com.squareup.moshi.JsonReader +import okhttp3.internal.io.FileSystem +import okio.buffer +import org.cavepvp.entity.moshi.MoshiUtil +import org.cavepvp.entity.moshi.setPrettyPrinting +import java.io.File +import java.io.FileWriter +import java.io.IOException + +object EntityRepository { + + lateinit var container: File + + fun findAll():List { + return (this.container.listFiles() ?: arrayOf()) + .filterNotNull() + .mapNotNull{JsonReader.of(FileSystem.SYSTEM.source(it).buffer())} + .mapNotNull{MoshiUtil.instance.adapter(Entity::class.java).fromJson(it)} + } + + fun onLoad() { + this.container = File("${EntityPlugin.instance.dataFolder.absolutePath}/entities") + this.container.mkdir() + } + + fun updateById(entity: Entity) { + + val writer = FileWriter(entity.file) + + try { + writer.write(MoshiUtil.instance.adapter(Entity::class.java).setPrettyPrinting().toJson(entity)) + } catch (ex: IOException) { + ex.printStackTrace() + return + } + + writer.close() + } + + fun deleteById(entity: Entity) { + + if (!entity.file.exists()) { + return + } + + entity.file.delete() + } + +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/EntityVisibility.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/EntityVisibility.kt new file mode 100644 index 0000000..e41bc9c --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/EntityVisibility.kt @@ -0,0 +1,46 @@ +package org.cavepvp.entity + +import org.apache.commons.lang.WordUtils +import org.bukkit.Bukkit +import java.util.function.Predicate + +/** + * @project carnage + * + * @date 15/02/2021 + * @author xanderume@gmail.com + */ +enum class EntityVisibility(val action: Predicate,private var displayName: String? = null) { + + HIDDEN(Predicate{ + it.sendToAll{player -> it.sendDestroyPacket(player)} + it.viewers.clear() + return@Predicate true + }), + + VISIBLE(Predicate{ + Bukkit.getServer().onlinePlayers.forEach{player -> + + if (it.location.world != player.world) { + return@forEach + } + + if (it.getDistanceSquared(player.location) > Entity.DISTANCE) { + return@forEach + } + + it.viewers.add(player.uniqueId) + it.sendCreatePacket(player) + } + return@Predicate true + }); + + fun getDisplayName():String { + + if (this.displayName == null) { + this.displayName = WordUtils.capitalizeFully(this.name.replace("_"," ").toLowerCase()) + } + + return this.displayName!! + } +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/ai/EntityAI.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/ai/EntityAI.kt new file mode 100644 index 0000000..ae29031 --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/ai/EntityAI.kt @@ -0,0 +1,31 @@ +package org.cavepvp.entity.ai + +import org.cavepvp.entity.Entity +import org.cavepvp.entity.type.hologram.Hologram +import org.cavepvp.entity.type.hologram.line.type.HologramTextLine +import org.cavepvp.entity.type.npc.NPC +import org.bukkit.entity.Player +import org.bukkit.inventory.ItemStack + +interface EntityAI { + + fun sendNPCCreatePacket(player: Player,npc: NPC) + fun sendNPCUpdatePacket(player: Player,npc: NPC) + fun sendNPCRefreshPacket(player: Player,npc: NPC) + fun sendNPCDestroyPacket(player: Player,npc: NPC) + + fun sendNPCTagVisibility(player: Player,npc: NPC) + + fun sendHologramCreatePacket(player: Player,hologram: Hologram) + fun sendHologramUpdatePacket(player: Player,hologram: Hologram) + fun sendHologramRefreshPacket(player: Player,hologram: Hologram) + fun sendHologramDestroyPacket(player: Player,hologram: Hologram) + + fun renderHologramTextLine(player: Player,text: String,line: HologramTextLine) + fun updateHologramTextLine(player: Player,text: String,line: HologramTextLine) + fun destroyHologramTextLine(player: Player,line: HologramTextLine) + + fun renderHologramItemLine(player: Player,item: ItemStack,line: HologramTextLine) + + fun handleEntityViewerTick(entity: Entity) +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/ai/NmsAI.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/ai/NmsAI.kt new file mode 100644 index 0000000..e624a43 --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/ai/NmsAI.kt @@ -0,0 +1,33 @@ +package org.cavepvp.entity.ai + +import org.bukkit.World +import org.bukkit.entity.Entity +import org.bukkit.entity.Player +import org.bukkit.inventory.Inventory +import org.bukkit.inventory.ItemStack +import java.util.* + +interface NmsAI { + + fun getLatency(player: Player):Int + fun getProtocolVersion(player: Player):Int + + fun loadOfflinePlayerData(uuid: UUID,username: String):Player + + fun getName(item: ItemStack):String + fun getInventoryName(inventory: Inventory):String + + fun getWorldData(world: World,x: Int,y: Int,z: Int):Int + fun setSkullTexture(item: ItemStack,texture: String):ItemStack + + fun isActive(entity: Entity):Boolean + fun isMobSpawner(entity: Entity):Boolean + fun setMobSpawner(entity: Entity,spawner: Boolean) + + fun getWindowId(player: Player):Int + fun getContainerCounter(player: Player):Int + + fun updateInventory(player: Player) + fun updateInventoryWithoutEvent(player: Player,inventory: Inventory) + +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/ai/PacketAI.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/ai/PacketAI.kt new file mode 100644 index 0000000..a84a9c4 --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/ai/PacketAI.kt @@ -0,0 +1,48 @@ +package org.cavepvp.entity.ai + +import net.minecraft.util.com.mojang.authlib.GameProfile +import org.bukkit.Effect +import org.bukkit.GameMode +import org.bukkit.Location +import org.bukkit.Material +import org.bukkit.entity.Player +import org.bukkit.inventory.Inventory +import org.bukkit.inventory.ItemStack + +interface PacketAI { + + fun sendPacket(player: Player,packet: Any) + + fun createChat(text: String,type: Int,flag: Boolean):Any + fun createTabHeaderFooter(header: String,footer: String):Any + + fun createEquipment(id: Int,slot: Int,item: ItemStack?):Any + + fun createPlayerInfoAdd(ping: Int,gameMode: GameMode,username: String,profile: GameProfile):Any + fun createPlayerInfoRemove(username: String,profile: GameProfile):Any + fun createPlayerUpdateLatency(latency: Int,username: String,profile: GameProfile):Any + fun createPlayerUpdateDisplayName(displayName: String,profile: GameProfile):Any + + fun createOpenSign(location: Location):Any + fun createOpenWindow(window: Int,inventory: Inventory):Any + + fun createWindowItems(window: Int,items: List):Any + + fun createPlayerChat(message: String):Any + fun createBlockChange(type: Material,location: Location,fake: Boolean):Any + + fun createSpawnEntity(id: Int,location: Location,j: Int):Any + fun createNamedEntitySpawn(id: Int,location: Location,profile: GameProfile,watcher: Any,item: ItemStack? = null):Any + fun createSpawnEntityLiving(id: Int, typeId: Int, location: Location, watcher: Any,legacy: Boolean):Any + + fun createEntityAttach(id:Int,id1: Int,id2: Int):Any + fun createEntityTeleport(id: Int,location: Location):Any + fun createEntityAnimation(id: Int,animation: Int):Any + + fun createEntityLook(id: Int,yaw: Float,pitch: Float,onGround: Boolean):Any + fun createEntityHeadRotation(id: Int,yaw: Float):Any + fun createEntityDestroy(ids: IntArray):Any + fun createEntityMetadata(id: Int,watcher: Any):Any + + fun createWorldParticles(effect: Effect,location: Location,offsetX: Float,offsetY: Float,offsetZ: Float,speed: Float,amount: Int):Any +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/ai/ShardEntityAI.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/ai/ShardEntityAI.kt new file mode 100644 index 0000000..6464500 --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/ai/ShardEntityAI.kt @@ -0,0 +1,275 @@ +package org.cavepvp.entity.ai + +import net.minecraft.server.v1_7_R4.DataWatcher +import org.cavepvp.entity.util.PlayerUtil +import org.bukkit.Bukkit +import org.bukkit.ChatColor +import org.bukkit.GameMode +import org.bukkit.Material +import org.bukkit.craftbukkit.v1_7_R4.CraftWorld +import org.bukkit.entity.EntityType +import org.bukkit.entity.Player +import org.cavepvp.entity.Entity +import org.cavepvp.entity.EntityPlugin +import org.cavepvp.entity.EntityVisibility +import org.cavepvp.entity.type.hologram.Hologram +import org.cavepvp.entity.type.hologram.line.HologramLine +import org.cavepvp.entity.type.hologram.line.type.HologramTextLine +import org.cavepvp.entity.type.npc.NPC +import org.cavepvp.entity.type.npc.NPCAnimationType +import org.cavepvp.entity.util.ItemPart +import org.cavepvp.entity.util.NMSUtil +import java.util.* +import java.util.concurrent.ConcurrentHashMap + +object ShardEntityAI : EntityAI { + + override fun sendNPCCreatePacket(player: Player,npc: NPC) { + + val watcher = NMSUtil.createDataWatcher() as DataWatcher + + watcher.a(0,0.toByte()) + watcher.a(1,20.0F) + watcher.a(2,npc.name) + watcher.a(3,0x01) + watcher.a(4,0x00) + watcher.a(5,0x01) + watcher.a(6,20.0F) + watcher.a(7,0) + watcher.a(8,0.toByte()) + watcher.a(9,0.toByte()) + watcher.a(10,127.toByte()) + watcher.a(15,1.toByte()) + watcher.a(16,0x01) + watcher.a(17,0F) + + PlayerUtil.sendPacket(player,ShardPacketAI.createPlayerInfoAdd(0, GameMode.CREATIVE,npc.name,npc.profile)) + PlayerUtil.sendPacket(player,ShardPacketAI.createNamedEntitySpawn(npc.id,npc.getLocation(),npc.profile,watcher,npc.getEquipment(ItemPart.HAND))) + PlayerUtil.sendPacket(player,ShardPacketAI.createEntityHeadRotation(npc.id,npc.getLocation().yaw)) + PlayerUtil.sendPacket(player,ShardPacketAI.createEntityLook(npc.id,npc.getLocation().yaw,npc.getLocation().pitch,npc.location.block.type != Material.AIR)) + + if (npc.swing) { + Bukkit.getServer().scheduler.runTaskLater(EntityPlugin.instance,{ + PlayerUtil.sendPacket(player,ShardPacketAI.createEntityAnimation(npc.id,NPCAnimationType.SWING.id)) + },5L) + } + + if (npc.tagVisibility == EntityVisibility.HIDDEN) { + Bukkit.getServer().scheduler.runTaskLater(EntityPlugin.instance,{npc.ensureTagVisibility(player)},2L) + } + + if (npc.tabVisibility == EntityVisibility.HIDDEN) { + Bukkit.getServer().scheduler.runTaskLater(EntityPlugin.instance,{ + + if (!player.isOnline) { + return@runTaskLater + } + + PlayerUtil.sendPacket(player,ShardPacketAI.createPlayerInfoRemove( + npc.name, + npc.profile + )) + },20L) + } + + PlayerUtil.sendPacket(player,ShardPacketAI.createEntityTeleport(npc.id,npc.getLocation())) + } + + override fun sendNPCUpdatePacket(player: Player,npc: NPC) {} + + override fun sendNPCRefreshPacket(player: Player,npc: NPC) { + this.sendNPCDestroyPacket(player,npc) + this.sendNPCCreatePacket(player,npc) + } + + override fun sendNPCDestroyPacket(player: Player,npc: NPC) { + + val legacy = PlayerUtil.isLegacy(player) + + val entityIds = mutableListOf() + + npc.hologram.lines.forEach{ + + if (legacy) { + entityIds.add(it.horseId) + } + + entityIds.add(it.skullId) + } + + entityIds.add(npc.id) + + PlayerUtil.sendPacket(player,ShardPacketAI.createEntityDestroy(entityIds.toIntArray())) + + if (npc.tabVisibility == EntityVisibility.HIDDEN) { + return + } + + PlayerUtil.sendPacket(player,ShardPacketAI.createPlayerInfoRemove(npc.name,npc.profile)) + } + + override fun sendNPCTagVisibility(player: Player,npc: NPC) { + + if (npc.tabVisibility == EntityVisibility.VISIBLE) { + PlayerUtil.sendPacket(player,ShardPacketAI.createEntityDestroy(intArrayOf(npc.batId))) + return + } + + val watcher = NMSUtil.createDataWatcher() as DataWatcher + + watcher.a(0,(0 or 1 shl 5).toByte()) + watcher.a(1,300.toShort()) + watcher.a(12,-1700000) + + PlayerUtil.sendPacket(player,ShardPacketAI.createSpawnEntityLiving( + npc.batId, + EntityType.BAT.typeId.toInt(), + npc.getLocation(), + watcher, + PlayerUtil.isLegacy(player) + )) + + PlayerUtil.sendPacket(player,ShardPacketAI.createEntityAttach(0,npc.batId,npc.id)) + } + + override fun sendHologramCreatePacket(player: Player, hologram: Hologram) { + hologram.lines.forEach{it.render(player)} + } + + override fun sendHologramUpdatePacket(player: Player, hologram: Hologram) { + hologram.lines.forEach{it.update(player)} + } + + override fun sendHologramRefreshPacket(player: Player, hologram: Hologram) { + hologram.sendDestroyPacket(player) + hologram.sendCreatePacket(player) + } + + override fun sendHologramDestroyPacket(player: Player, hologram: Hologram) { + + val legacy = PlayerUtil.isLegacy(player) + val entityIds = mutableListOf() + + hologram.lines.forEach{ + + if (legacy) { + entityIds.add(it.horseId) + } + + entityIds.add(it.skullId) + } + + PlayerUtil.sendPacket(player,ShardPacketAI.createEntityDestroy(entityIds.toIntArray())) + } + + override fun renderHologramTextLine(player: Player,text: String,line: HologramTextLine) { + + val watcher = NMSUtil.createDataWatcher() as DataWatcher + + if (!PlayerUtil.isLegacy(player)) { + + watcher.a(0,32.toByte()) // Invisible + watcher.a(2,ChatColor.translateAlternateColorCodes('&',text)) + watcher.a(3,(if (line.blank) 0 else 1).toByte()) + + PlayerUtil.sendPacket(player,ShardPacketAI.createSpawnEntityLiving( + line.skullId, + HologramLine.ARMOR_STAND_ID, + line.location, + watcher, + false + )) + return + } + + watcher.a(0,0.toByte()) + watcher.a(1,300.toShort()) + watcher.a(10,ChatColor.translateAlternateColorCodes('&',text)) + watcher.a(11,(if (line.blank) 0 else 1).toByte()) + watcher.a(12,-1700000) + + PlayerUtil.sendPacket(player,ShardPacketAI.createSpawnEntity(line.skullId,line.location,66)) + PlayerUtil.sendPacket(player,ShardPacketAI.createSpawnEntityLiving( + line.horseId, + EntityType.HORSE.typeId.toInt(), + line.location, + watcher, + true + )) + PlayerUtil.sendPacket(player,ShardPacketAI.createEntityAttach( + 0, + line.horseId, + line.skullId + )) + } + + override fun updateHologramTextLine(player: Player,text: String,line: HologramTextLine) { + + val legacy = PlayerUtil.isLegacy(player) + + val watcher = NMSUtil.createDataWatcher() as DataWatcher + + watcher.a(if (legacy) 10 else 2,ChatColor.translateAlternateColorCodes('&',text)) + watcher.a(if (legacy) 11 else 3,(if (line.blank) 0 else 1).toByte()) + + PlayerUtil.sendPacket(player,ShardPacketAI.createEntityMetadata(if (legacy) line.horseId else line.skullId,watcher)) + } + + override fun destroyHologramTextLine(player: Player, line: HologramTextLine) { + + val legacy = PlayerUtil.isLegacy(player) + + PlayerUtil.sendPacket(player,ShardPacketAI.createEntityDestroy( + if (legacy) intArrayOf(line.skullId,line.horseId) else intArrayOf(line.skullId) + )) + } + + override fun renderHologramItemLine(player: Player, item: org.bukkit.inventory.ItemStack, line: HologramTextLine) { + + } + + override fun handleEntityViewerTick(entity: Entity) { + + val players = ConcurrentHashMap.newKeySet() + + (entity.location.world as CraftWorld).handle.playerMap.forEachNearby(entity.location.x,entity.location.y,entity.location.z,48.0,true) { + + if (!it.isAlive || !it.bukkitEntity.isOnline) { + return@forEachNearby + } + + if (entity.selfHandledViewing) { + + if (!entity.selfHandledViewers.contains(it.uniqueID)) { + return@forEachNearby + } + + players.add(it.uniqueID) + + if (entity.viewers.contains(it.uniqueID)) { + return@forEachNearby + } + + entity.viewers.add(it.uniqueID) + entity.sendCreatePacket(it.bukkitEntity) + return@forEachNearby + } + + if (!entity.viewers.contains(it.uniqueID)) { + entity.viewers.add(it.uniqueID) + entity.sendCreatePacket(it.bukkitEntity) + } + + players.add(it.uniqueID) + } + + entity.viewers.filter{!players.contains(it)}.forEach{ + Bukkit.getServer().getPlayer(it)?.also{player -> + entity.viewers.remove(player.uniqueId) + entity.sendDestroyPacket(player) + } + } + + } + +} diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/ai/ShardNmsAI.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/ai/ShardNmsAI.kt new file mode 100644 index 0000000..1a160a9 --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/ai/ShardNmsAI.kt @@ -0,0 +1,145 @@ +package org.cavepvp.entity.ai + +import net.minecraft.server.v1_7_R4.* +import net.minecraft.util.com.mojang.authlib.GameProfile +import org.apache.commons.lang.WordUtils +import org.bukkit.World +import org.bukkit.craftbukkit.v1_7_R4.CraftWorld +import org.bukkit.craftbukkit.v1_7_R4.entity.CraftEntity +import org.bukkit.craftbukkit.v1_7_R4.entity.CraftPlayer +import org.bukkit.craftbukkit.v1_7_R4.inventory.CraftContainer +import org.bukkit.craftbukkit.v1_7_R4.inventory.CraftInventory +import org.bukkit.craftbukkit.v1_7_R4.inventory.CraftItemStack +import org.bukkit.entity.Entity +import org.bukkit.entity.Player +import org.bukkit.inventory.Inventory +import org.bukkit.inventory.ItemStack +import org.spigotmc.ActivationRange +import java.util.* + +object ShardNmsAI : NmsAI { + + private val CONTAINER_COUNTER_FIELD = EntityPlayer::class.java.getDeclaredField("containerCounter") + + init { + CONTAINER_COUNTER_FIELD.isAccessible = true + } + + override fun getLatency(player: Player):Int { + return (player as CraftPlayer).handle.ping + } + + override fun getProtocolVersion(player: Player): Int { + return (player as CraftPlayer).handle.playerConnection.networkManager.version + } + + override fun getName(item: ItemStack): String { + + var toReturn = CraftItemStack.asNMSCopy(item).name + + if (toReturn.contains(".")) { + toReturn = WordUtils.capitalize(item.type.toString().toLowerCase().replace("_"," ")) + } + + return toReturn + } + + override fun getInventoryName(inventory: Inventory): String { + return (inventory as CraftInventory).inventory.inventoryName + } + + override fun loadOfflinePlayerData(uuid: UUID, username: String): Player { + return EntityPlayer( + MinecraftServer.getServer(), + MinecraftServer.getServer().getWorldServer(0), + GameProfile(uuid,username), + PlayerInteractManager(MinecraftServer.getServer().getWorldServer(0)) + ).bukkitEntity.also{it.loadData()} + } + + override fun getWorldData(world: World,x: Int, y: Int, z: Int): Int { + return (world as CraftWorld).handle.getData(x,y,z) + } + + override fun setSkullTexture(item: ItemStack, texture: String): ItemStack { + + val copy = CraftItemStack.asNMSCopy(item) + + val tag = copy.tag ?: NBTTagCompound() + + val skullOwner = NBTTagCompound() + + skullOwner.setString("Id",UUID.randomUUID().toString()) + + val compound = NBTTagCompound() + + compound.setString("Value", texture) + + val textures = NBTTagList() + + textures.add(compound) + + val properties = NBTTagCompound() + + properties.set("textures", textures) + skullOwner.set("Properties", properties) + tag.set("SkullOwner", skullOwner) + + copy.tag = tag + return CraftItemStack.asBukkitCopy(copy) + } + + override fun isActive(entity: Entity): Boolean { + return ActivationRange.checkIfActive((entity as CraftEntity).handle) + } + + override fun isMobSpawner(entity: Entity): Boolean { + return ((entity as CraftEntity).handle as? EntityInsentient)?.fromMobSpawner == true + } + + override fun setMobSpawner(entity: Entity,spawner: Boolean) { + + val insentient = (entity as CraftEntity).handle + + if (insentient !is EntityInsentient) { + return + } + + insentient.fromMobSpawner = spawner + } + + override fun getWindowId(player: Player): Int { + return (player as CraftPlayer).handle.activeContainer.windowId + } + + override fun getContainerCounter(player: Player): Int { + return CONTAINER_COUNTER_FIELD.getInt((player as CraftPlayer).handle) + } + + override fun updateInventory(player: Player) { + (player as CraftPlayer).handle.updateInventory(player.handle.activeContainer) + } + + override fun updateInventoryWithoutEvent(player: Player,inventory: Inventory) { + + if (player !is CraftPlayer) { + return + } + + val handle = player.handle + + if (handle.playerConnection == null) { + return + } + + val container = CraftContainer(inventory,player,handle.nextContainerCounter()) + + val size = container.bukkitView.topInventory.size + val title = container.bukkitView.title + + handle.playerConnection.sendPacket(PacketPlayOutOpenWindow(container.windowId,inventory.type.ordinal,title,size,true)) + handle.activeContainer = container + handle.activeContainer.addSlotListener(handle) + } + +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/ai/ShardPacketAI.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/ai/ShardPacketAI.kt new file mode 100644 index 0000000..8dafaab --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/ai/ShardPacketAI.kt @@ -0,0 +1,259 @@ +package org.cavepvp.entity.ai + +import net.minecraft.server.v1_7_R4.* +import net.minecraft.util.com.mojang.authlib.GameProfile +import org.bukkit.Effect +import org.bukkit.GameMode +import org.bukkit.Location +import org.bukkit.Material +import org.bukkit.craftbukkit.v1_7_R4.CraftWorld +import org.bukkit.craftbukkit.v1_7_R4.entity.CraftPlayer +import org.bukkit.craftbukkit.v1_7_R4.inventory.CraftInventory +import org.bukkit.craftbukkit.v1_7_R4.inventory.CraftItemStack +import org.bukkit.entity.Player +import org.bukkit.inventory.Inventory +import org.bukkit.inventory.ItemStack +import org.cavepvp.entity.util.PacketUtil +import org.cavepvp.entity.util.ReflectionUtil +import org.spigotmc.ProtocolInjector + +object ShardPacketAI : PacketAI { + + override fun sendPacket(player: Player,packet: Any) { + + if (packet !is Packet) { + throw IllegalStateException("${packet.javaClass.simpleName} is not a Packet!") + } + + (player as CraftPlayer).handle.playerConnection.sendPacket(packet) + } + + override fun createChat(text: String, type: Int, flag: Boolean): Any { + return PacketPlayOutChat(ChatComponentText(text),2,flag) + } + + override fun createTabHeaderFooter(header: String, footer: String): Any { + return ProtocolInjector.PacketTabHeader( + ChatSerializer.a(footer), + ChatSerializer.a(header) + ) + } + + override fun createEquipment(id: Int,slot: Int,item: ItemStack?): Any { + return PacketPlayOutEntityEquipment(id,slot,CraftItemStack.asNMSCopy(item)) + } + + override fun createPlayerInfoAdd(ping: Int,gameMode: GameMode,username: String,profile: GameProfile): Any { + + val packet = PacketPlayOutPlayerInfo() + + ReflectionUtil.setDeclaredField(packet,"ping",ping) + ReflectionUtil.setDeclaredField(packet,"action",PacketUtil.ADD_PLAYER) + ReflectionUtil.setDeclaredField(packet,"player",profile) + ReflectionUtil.setDeclaredField(packet,"gamemode",gameMode.ordinal) + ReflectionUtil.setDeclaredField(packet,"username",username) + + return packet + } + + override fun createPlayerInfoRemove(username: String,profile: GameProfile): Any { + + val packet = PacketPlayOutPlayerInfo() + + ReflectionUtil.setDeclaredField(packet,"action",PacketUtil.REMOVE_PLAYER) + ReflectionUtil.setDeclaredField(packet,"player",profile) + ReflectionUtil.setDeclaredField(packet,"username",username) + + return packet + } + + override fun createPlayerUpdateLatency(latency: Int, username: String, profile: GameProfile): Any { + + val packet = PacketPlayOutPlayerInfo() + + ReflectionUtil.setDeclaredField(packet,"ping",latency) + ReflectionUtil.setDeclaredField(packet,"action",PacketUtil.UPDATE_LATENCY) + ReflectionUtil.setDeclaredField(packet,"player",profile) + ReflectionUtil.setDeclaredField(packet,"username",username) + + return packet + } + + override fun createPlayerUpdateDisplayName(displayName: String,profile: GameProfile): Any { + + val packet = PacketPlayOutPlayerInfo() + + ReflectionUtil.setDeclaredField(packet,"action",PacketUtil.UPDATE_DISPLAY_NAME) + ReflectionUtil.setDeclaredField(packet,"player",profile) + ReflectionUtil.setDeclaredField(packet,"username",displayName) + + return packet + } + + override fun createOpenSign(location: Location):Any { + return PacketPlayOutOpenSignEditor(location.blockX,location.blockY,location.blockZ) + } + + override fun createOpenWindow(window: Int,inventory: Inventory): Any { + + if (inventory !is CraftInventory) { + throw java.lang.IllegalStateException("Invalid Inventory?") + } + + return PacketPlayOutOpenWindow(window,0,inventory.inventory.inventoryName,inventory.size,inventory.inventory.k_()) + } + + override fun createWindowItems(window: Int, items: List): Any { + return PacketPlayOutWindowItems(window,items.map{CraftItemStack.asNMSCopy(it)}) + } + + override fun createPlayerChat(message: String): Any { + return PacketPlayOutChat(ChatSerializer.a(message)) + } + + override fun createBlockChange(type: Material, location: Location, fake: Boolean):Any { + + val packet = PacketPlayOutBlockChange() + + ReflectionUtil.setField(packet,"a",location.blockX) + ReflectionUtil.setField(packet,"b",location.blockY) + ReflectionUtil.setField(packet,"c",location.blockZ) + ReflectionUtil.setField(packet,"fake",fake) + ReflectionUtil.setField(packet,"data",(location.world as CraftWorld).handle.getData(location.blockX,location.blockY,location.blockZ)) + ReflectionUtil.setField(packet,"block",Block.getById(type.id)) + + return packet + } + + override fun createEntityLook(id: Int, yaw: Float, pitch: Float,onGround: Boolean): Any { + + val packet = PacketPlayOutEntityLook() + + ReflectionUtil.setField(packet,"a",id) + ReflectionUtil.setField(packet,"b",MathHelper.d(PacketUtil.convertYawOrPitch(yaw)).toByte()) + ReflectionUtil.setField(packet,"c",MathHelper.d(PacketUtil.convertYawOrPitch(pitch)).toByte()) + ReflectionUtil.setDeclaredField(packet,"onGround",onGround) + + return packet + } + + override fun createEntityHeadRotation(id: Int,yaw: Float):Any { + + val packet = PacketPlayOutEntityHeadRotation() + + ReflectionUtil.setDeclaredField(packet,"a",id) + ReflectionUtil.setDeclaredField(packet,"b",PacketUtil.convertYawOrPitchAsByte(yaw)) + + return packet + } + + override fun createEntityDestroy(ids: IntArray): Any { + return PacketPlayOutEntityDestroy(*ids) + } + + override fun createEntityMetadata(id: Int, watcher: Any): Any { + return PacketPlayOutEntityMetadata(id,watcher as DataWatcher,true) + } + + override fun createWorldParticles( + effect: Effect, + location: Location, + offsetX: Float, + offsetY: Float, + offsetZ: Float, + speed: Float, + amount: Int + ): Any { + return PacketPlayOutWorldParticles(effect.getName(),location.x.toFloat(),location.y.toFloat(),location.z.toFloat(),offsetX,offsetY,offsetZ,speed,amount) + } + + override fun createNamedEntitySpawn(id: Int,location: Location,profile: GameProfile,watcher: Any,item: ItemStack?):Any { + + val packet = PacketPlayOutNamedEntitySpawn() + + ReflectionUtil.setDeclaredField(packet,"a",id) + ReflectionUtil.setDeclaredField(packet,"b",profile) + ReflectionUtil.setDeclaredField(packet,"c",MathHelper.floor(location.x * 32.0)) + ReflectionUtil.setDeclaredField(packet,"d",MathHelper.floor(location.y * 32.0)) + ReflectionUtil.setDeclaredField(packet,"e",MathHelper.floor(location.z * 32.0)) + ReflectionUtil.setDeclaredField(packet,"f",PacketUtil.convertYawOrPitchAsByte(location.yaw)) + ReflectionUtil.setDeclaredField(packet,"g",PacketUtil.convertYawOrPitchAsByte(location.pitch)) + ReflectionUtil.setDeclaredField(packet,"h",if (item == null) 0 else Item.getId(CraftItemStack.asNMSCopy(item).item)) + ReflectionUtil.setDeclaredField(packet,"i",watcher as DataWatcher) + + return packet + } + + override fun createSpawnEntity(id: Int, location: Location, j: Int): Any { + + val packet = PacketPlayOutSpawnEntity() + + ReflectionUtil.setField(packet,"a",id) + ReflectionUtil.setField(packet,"j",j) + ReflectionUtil.setDeclaredField(packet,"b",(location.x * 32.0).toInt()) + ReflectionUtil.setDeclaredField(packet,"c",MathHelper.floor((location.y - 0.13 + 55.0) * 32.0)) + ReflectionUtil.setDeclaredField(packet,"d",(location.z * 32.0).toInt()) + ReflectionUtil.setDeclaredField(packet,"h",MathHelper.d(PacketUtil.convertYawOrPitch(location.pitch))) + ReflectionUtil.setDeclaredField(packet,"i",MathHelper.d(PacketUtil.convertYawOrPitch(location.yaw))) + + return packet + } + + override fun createSpawnEntityLiving(id: Int, typeId: Int, location: Location,watcher: Any,legacy: Boolean): Any { + + val packet = PacketPlayOutSpawnEntityLiving() + + ReflectionUtil.setDeclaredField(packet,"a",id) + ReflectionUtil.setDeclaredField(packet,"b",typeId) + ReflectionUtil.setDeclaredField(packet,"c",MathHelper.floor(location.x * 32.0)) + + if (legacy) { + ReflectionUtil.setDeclaredField(packet,"d",MathHelper.floor((location.y + 55.0) * 32.0)) + } else { + ReflectionUtil.setDeclaredField(packet,"d",MathHelper.floor((location.y - 2.0) * 32.0)) + } + + ReflectionUtil.setDeclaredField(packet,"e",MathHelper.floor(location.z * 32.0)) + ReflectionUtil.setDeclaredField(packet,"i",PacketUtil.convertYawOrPitch(location.yaw).toInt().toByte()) + ReflectionUtil.setDeclaredField(packet,"j",PacketUtil.convertYawOrPitch(location.pitch).toInt().toByte()) + ReflectionUtil.setDeclaredField(packet,"l",watcher as DataWatcher) + + return packet + } + + override fun createEntityAttach(id: Int, id1: Int, id2: Int):Any { + + val packet = PacketPlayOutAttachEntity() + + ReflectionUtil.setDeclaredField(packet,"a",id) + ReflectionUtil.setDeclaredField(packet,"b",id1) + ReflectionUtil.setDeclaredField(packet,"c",id2) + + return packet + } + + override fun createEntityAnimation(id: Int,animation: Int):Any { + + val packet = PacketPlayOutAnimation() + + ReflectionUtil.setDeclaredField(packet,"a",id) + ReflectionUtil.setDeclaredField(packet,"b",animation) + + return packet + } + + override fun createEntityTeleport(id: Int, location: Location): Any { + + val packet = PacketPlayOutEntityTeleport() + + ReflectionUtil.setField(packet,"a",id) + ReflectionUtil.setField(packet,"b",MathHelper.floor(location.x * 32.0)) + ReflectionUtil.setField(packet,"c",MathHelper.floor(location.y * 32.0)) + ReflectionUtil.setField(packet,"d",MathHelper.floor(location.z * 32.0)) + ReflectionUtil.setField(packet,"e",PacketUtil.convertYawOrPitch(location.yaw).toInt().toByte()) + ReflectionUtil.setField(packet,"f",PacketUtil.convertYawOrPitch(location.pitch).toInt().toByte()) + + return packet + } + +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/animation/EntityAnimation.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/animation/EntityAnimation.kt new file mode 100644 index 0000000..8e0f464 --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/animation/EntityAnimation.kt @@ -0,0 +1,46 @@ +package org.cavepvp.entity.animation + +import org.cavepvp.entity.Entity +import org.bukkit.entity.Player +import org.bukkit.inventory.ItemStack + +interface EntityAnimation { + + fun onTick(entity: Entity) + fun onTick(entity: Entity,player: Player) // this is where we send the packets + + fun getName():String + fun getDisplayName():String + fun getDisplayItem():ItemStack + + fun isSupported(entity: Entity):Boolean + + fun onDisable(entity: Entity) { + + } + + infix fun ClosedRange.step(step: Double): Iterable { + + require(this.start.isFinite()) // + require(this.endInclusive.isFinite()) + require(step > 0.0) { "Step must be positive,was: $step." } + + val sequence = generateSequence(this.start) { previous -> + + if (previous == Double.POSITIVE_INFINITY) { + return@generateSequence null + } + + val next = previous + step + + if (next > this.endInclusive) { + return@generateSequence null + } + + return@generateSequence next + } + + return sequence.asIterable() + } + +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/animation/EntityAnimationRegistry.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/animation/EntityAnimationRegistry.kt new file mode 100644 index 0000000..ab528f5 --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/animation/EntityAnimationRegistry.kt @@ -0,0 +1,19 @@ +package org.cavepvp.entity.animation + +object EntityAnimationRegistry { + + private val animations = mutableMapOf() + + fun register(animation: EntityAnimation) { + this.animations[animation.getName()] = animation + } + + fun getAllAnimations():List { + return this.animations.values.toList() + } + + fun getAnimationByName(name: String):EntityAnimation? { + return this.animations[name] + } + +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/animation/moshi/EntityAnimationJsonAdapter.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/animation/moshi/EntityAnimationJsonAdapter.kt new file mode 100644 index 0000000..2f90e69 --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/animation/moshi/EntityAnimationJsonAdapter.kt @@ -0,0 +1,21 @@ +package org.cavepvp.entity.animation.moshi + +import org.cavepvp.entity.animation.EntityAnimation +import org.cavepvp.entity.animation.EntityAnimationRegistry +import org.cavepvp.entity.animation.moshi.EntityAnimationSerializer +import com.squareup.moshi.FromJson +import com.squareup.moshi.ToJson + +object EntityAnimationJsonAdapter { + + @ToJson + fun toJson(animation: EntityAnimation):String { + return animation.getName() + } + + @FromJson + fun fromJson(value: String): EntityAnimation { + return EntityAnimationRegistry.getAnimationByName(value)!! + } + +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/animation/moshi/EntityAnimationSerializer.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/animation/moshi/EntityAnimationSerializer.kt new file mode 100644 index 0000000..2314982 --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/animation/moshi/EntityAnimationSerializer.kt @@ -0,0 +1,8 @@ +package org.cavepvp.entity.animation.moshi + +import com.squareup.moshi.JsonQualifier + +@Retention(AnnotationRetention.RUNTIME) +@Target(AnnotationTarget.FIELD,AnnotationTarget.FUNCTION,AnnotationTarget.TYPE_PARAMETER,AnnotationTarget.VALUE_PARAMETER) +@JsonQualifier +annotation class EntityAnimationSerializer \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/animation/moshi/EntityAnimationTypeJsonAdapter.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/animation/moshi/EntityAnimationTypeJsonAdapter.kt new file mode 100644 index 0000000..03db6df --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/animation/moshi/EntityAnimationTypeJsonAdapter.kt @@ -0,0 +1,21 @@ +package org.cavepvp.entity.animation.moshi + +import org.cavepvp.entity.animation.EntityAnimation +import org.cavepvp.entity.animation.EntityAnimationRegistry +import com.squareup.moshi.FromJson +import com.squareup.moshi.ToJson + +object EntityAnimationTypeJsonAdapter { + + @ToJson + fun toJson(@EntityAnimationSerializer animation: EntityAnimation):String { + return animation.getName() + } + + @FromJson + @EntityAnimationSerializer + fun fromJson(value: String): EntityAnimation { + return EntityAnimationRegistry.getAnimationByName(value)!! + } + +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/animation/type/RainbowAnimation.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/animation/type/RainbowAnimation.kt new file mode 100644 index 0000000..505ffee --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/animation/type/RainbowAnimation.kt @@ -0,0 +1,107 @@ +package org.cavepvp.entity.animation.type + +import org.bukkit.Bukkit +import org.bukkit.ChatColor +import org.bukkit.DyeColor +import org.bukkit.Material +import org.bukkit.entity.Player +import org.bukkit.inventory.ItemStack +import org.cavepvp.entity.Entity +import org.cavepvp.entity.EntityPlugin +import org.cavepvp.entity.ai.ShardPacketAI +import org.cavepvp.entity.animation.EntityAnimation +import org.cavepvp.entity.type.npc.NPC +import org.cavepvp.entity.util.ItemBuilder +import org.cavepvp.entity.util.ItemPart +import org.cavepvp.entity.util.NMSUtil +import java.awt.Color + +object RainbowAnimation : EntityAnimation { + + private var hue = 0.0F + private var color = DyeColor.WHITE.color + private val contents = arrayOfNulls(4) + + private var packets = arrayOfNulls(4) + + init { + Bukkit.getServer().scheduler.runTaskTimerAsynchronously(EntityPlugin.instance,{ + increment() + },1L,1L) + this.update() + } + + private fun increment() { + + if (this.hue >= 1.0F) { + this.hue = 0.0F + } else { + this.hue += 0.005F + } + + Color.getHSBColor(this.hue,1F,1F).also{ + this.color = org.bukkit.Color.fromRGB(it.red,it.green,it.blue) // TODO nigger WTF? + } + + this.update() + } + + private fun update() { + this.contents[0] = this.create(Material.LEATHER_BOOTS) + this.contents[1] = this.create(Material.LEATHER_LEGGINGS) + this.contents[2] = this.create(Material.LEATHER_CHESTPLATE) + this.contents[3] = this.create(Material.LEATHER_HELMET) + } + + override fun getDisplayItem(): ItemStack { + return this.create(Material.LEATHER_HELMET) + } + + override fun getDisplayName(): String { + return "${ChatColor.RED}R${ChatColor.GOLD}a${ChatColor.YELLOW}i${ChatColor.DARK_GREEN}n${ChatColor.BLUE}b${ChatColor.DARK_PURPLE}o${ChatColor.LIGHT_PURPLE}w" + } + + override fun getName(): String { + return "rainbow" + } + + override fun isSupported(entity: Entity): Boolean { + return entity is NPC + } + + override fun onDisable(entity: Entity) { + + if (entity !is NPC) { + return + } + + this.packets[0] = ShardPacketAI.createEquipment(entity.id,ItemPart.BOOTS.ordinal,entity.getEquipment(ItemPart.BOOTS)) + this.packets[1] = ShardPacketAI.createEquipment(entity.id,ItemPart.LEGGINGS.ordinal,entity.getEquipment(ItemPart.LEGGINGS)) + this.packets[2] = ShardPacketAI.createEquipment(entity.id,ItemPart.CHESTPLATE.ordinal,entity.getEquipment(ItemPart.CHESTPLATE)) + this.packets[3] = ShardPacketAI.createEquipment(entity.id,ItemPart.HELMET.ordinal,entity.getEquipment(ItemPart.HELMET)) + } + + override fun onTick(entity: Entity) { + + if (entity !is NPC) { + return + } + + this.packets[0] = ShardPacketAI.createEquipment(entity.id,ItemPart.BOOTS.ordinal,this.contents[0]) + this.packets[1] = ShardPacketAI.createEquipment(entity.id,ItemPart.LEGGINGS.ordinal,this.contents[1]) + this.packets[2] = ShardPacketAI.createEquipment(entity.id,ItemPart.CHESTPLATE.ordinal,this.contents[2]) + this.packets[3] = ShardPacketAI.createEquipment(entity.id,ItemPart.HELMET.ordinal,this.contents[3]) + } + + override fun onTick(entity: Entity,player: Player) { + this.packets.forEach{NMSUtil.sendPacket(player,it!!)} + } + + private fun create(material: Material):ItemStack { + return ItemBuilder.of(material) + .name("${this.getDisplayName()} ${ChatColor.GRAY}Outfit") + .color(this.color) + .build() + } + +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/animation/type/RingsAnimation.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/animation/type/RingsAnimation.kt new file mode 100644 index 0000000..cb5d004 --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/animation/type/RingsAnimation.kt @@ -0,0 +1,86 @@ +package org.cavepvp.entity.animation.type + +import cc.fyre.shard.util.bukkit.ColorUtil +import org.cavepvp.entity.Entity +import org.cavepvp.entity.animation.EntityAnimation +import org.bukkit.ChatColor +import org.bukkit.Effect +import org.bukkit.Location +import org.bukkit.Material +import org.bukkit.entity.NPC +import org.bukkit.entity.Player +import org.bukkit.inventory.ItemStack +import org.cavepvp.entity.ai.ShardPacketAI +import org.cavepvp.entity.util.ItemBuilder +import org.cavepvp.entity.util.NMSUtil +import kotlin.math.cos +import kotlin.math.floor +import kotlin.math.sin + +class RingsAnimation(private val color: ChatColor) : EntityAnimation { + + private var tick = 0 + private val distance = 0.8 + + private val dyeColor = ColorUtil.getDyeColor(this.color) + private val particleColor = this.dyeColor.color + + private var offsetX: Float = ColorUtil.convertColorValue(this.particleColor.red.toDouble()).toFloat() + private var offsetY: Float = ColorUtil.convertColorValue(this.particleColor.green.toDouble()).toFloat() + private var offsetZ: Float = ColorUtil.convertColorValue(this.particleColor.blue.toDouble()).toFloat() + private val packets = arrayOfNulls(2) + + private lateinit var yin: Location + private lateinit var yang: Location + + override fun onTick(entity: Entity) { + this.tick++ + + val location = entity.location.clone() + + location.x = floor(location.x) + 0.5 + location.y = location.y + 1.0 + location.z = floor(location.z) + 0.5 + + val yAngle = if (this.tick + 1 >= 40) { + (this.tick - 40 + 1) * (2 * Math.PI) / 80 + } else { + (this.tick + 40 + 1) * (2 * Math.PI) / 80 + } + + val yinAngle = (this.tick + 1) * (2 * Math.PI) / 80 + + this.yin = location.clone().add(this.distance * cos(yinAngle),0.0,this.distance * sin(yinAngle)) + this.yang = location.clone().add(this.distance * cos(yAngle),0.0,this.distance * sin(yAngle)) + this.packets[0] = ShardPacketAI.createWorldParticles(Effect.COLOURED_DUST,this.yin,this.offsetX,this.offsetY,this.offsetZ,1.0F,0) + this.packets[1] = ShardPacketAI.createWorldParticles(Effect.COLOURED_DUST,this.yang,this.offsetX,this.offsetY,this.offsetZ,1.0F,0) + + if (this.tick >= 80) { + this.tick = 0 + } + + } + + override fun onTick(entity: Entity,player: Player) { + this.packets.forEach{NMSUtil.sendPacket(player,it!!)} + } + + override fun getName(): String { + return "Rings_${this.color.name}" + } + + override fun getDisplayName(): String { + return "${this.color}${ChatColor.BOLD}Rings" + } + + override fun getDisplayItem(): ItemStack { + return ItemBuilder.of(Material.WOOL) + .data(this.dyeColor.woolData) + .build() + } + + override fun isSupported(entity: Entity): Boolean { + return entity is NPC + } + +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/command/EntityCommand.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/command/EntityCommand.kt new file mode 100644 index 0000000..276a6c4 --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/command/EntityCommand.kt @@ -0,0 +1,25 @@ +package org.cavepvp.entity.command + +import org.bukkit.ChatColor +import org.bukkit.command.Command +import org.bukkit.command.CommandExecutor +import org.bukkit.command.CommandSender +import org.bukkit.entity.Player +import org.cavepvp.entity.menu.EntityMenu + +class EntityCommand : CommandExecutor { + override fun onCommand(sender: CommandSender?, p1: Command?, p2: String?, p3: Array?): Boolean { + + if (sender == null || sender !is Player) { + return false + } + + if (!sender.hasPermission("command.oplol")) { + sender.sendMessage("no.") + return false + } + + EntityMenu().openMenu(sender as Player) + return false + } +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/command/EntityCommand2.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/command/EntityCommand2.kt new file mode 100644 index 0000000..437079b --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/command/EntityCommand2.kt @@ -0,0 +1,15 @@ +package org.cavepvp.entity.command + +import cc.fyre.proton.command.Command +import org.bukkit.entity.Player +import org.cavepvp.entity.menu.EntityMenu + +object EntityCommand2 { + + @JvmStatic + @Command(names = ["entity","entities"],permission = "essentials.command.entity") + fun execute(sender: Player) { + EntityMenu().openMenu(sender) + } + +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/event/EntityInteractEvent.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/event/EntityInteractEvent.kt new file mode 100644 index 0000000..43a02ac --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/event/EntityInteractEvent.kt @@ -0,0 +1,36 @@ +package org.cavepvp.entity.event + +import org.cavepvp.entity.Entity +import org.bukkit.entity.Player +import org.bukkit.event.Event +import org.bukkit.event.HandlerList + +/** + * @author brew@atheist.com + * + * @date 4/24/2021 + * @project carnage + */ +class EntityInteractEvent(val entity: Entity,val player: Player,val action: EntityInteractAction) : Event() { + + override fun getHandlers(): HandlerList { + return handlerList + } + + companion object { + + @JvmStatic private val handlerList = HandlerList() + + @JvmStatic + fun getHandlerList(): HandlerList { + return handlerList + } + + } + + enum class EntityInteractAction { + RIGHT_CLICK, + LEFT_CLICK + } + +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/event/NPCNameTagStateEvent.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/event/NPCNameTagStateEvent.kt new file mode 100644 index 0000000..ac71c7e --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/event/NPCNameTagStateEvent.kt @@ -0,0 +1,31 @@ +package org.cavepvp.entity.event + +import org.cavepvp.entity.EntityVisibility +import org.cavepvp.entity.type.npc.NPC +import org.bukkit.event.Event +import org.bukkit.event.HandlerList + +/** + * @project carnage + * + * @date 03/21/21 + * @author xanderume@gmail.com + */ +class NPCNameTagStateEvent(val npc: NPC, val new: EntityVisibility) : Event() { + + override fun getHandlers(): HandlerList { + return handlerList + } + + companion object { + + @JvmStatic private val handlerList = HandlerList() + + @JvmStatic + fun getHandlerList(): HandlerList { + return handlerList + } + + } + +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/listener/EntityListener.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/listener/EntityListener.kt new file mode 100644 index 0000000..d564366 --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/listener/EntityListener.kt @@ -0,0 +1,137 @@ +package org.cavepvp.entity.listener + +import org.cavepvp.entity.util.VectorUtil +import org.cavepvp.entity.Entity +import org.cavepvp.entity.EntityHandler +import org.cavepvp.entity.EntityVisibility +import org.cavepvp.entity.type.npc.NPC +import org.bukkit.Bukkit +import org.bukkit.entity.Player +import org.bukkit.event.EventHandler +import org.bukkit.event.EventPriority +import org.bukkit.event.Listener +import org.bukkit.event.block.Action +import org.bukkit.event.entity.PlayerDeathEvent +import org.bukkit.event.inventory.InventoryClickEvent +import org.bukkit.event.inventory.InventoryDragEvent +import org.bukkit.event.player.PlayerDropItemEvent +import org.bukkit.event.player.PlayerInteractEvent +import org.bukkit.event.player.PlayerQuitEvent +import org.bukkit.inventory.ItemStack +import org.cavepvp.entity.EntityPlugin + +object EntityListener : Listener { + + @EventHandler(priority = EventPriority.MONITOR) + private fun onPlayerQuit(event: PlayerQuitEvent) { + EntityHandler.getAllEntities().filter{it.viewers.contains(event.player.uniqueId)}.forEach{ + it.viewers.remove(event.player.uniqueId) + } + } + + @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) + private fun onPlayerInteractEvent(event: PlayerInteractEvent) { + + if (event.player.itemInHand == null || !(event.action == Action.RIGHT_CLICK_BLOCK || event.action == Action.RIGHT_CLICK_AIR)) { + return + } + + if (!this.isMoveTool(event.player.itemInHand)) { + return + } + + val entity = EntityHandler.getEntityById(event.player.itemInHand.itemMeta.lore[0]!!.replace(Entity.MOVE_ITEM_LORE_KEY,"").toInt()) ?: return + + val location = if (event.action == Action.RIGHT_CLICK_BLOCK) { + event.clickedBlock.location.clone().add(0.5,Entity.BLOCK_HEIGHTS.getOrDefault(event.clickedBlock.type,1.0),0.5).also{ + + if (entity is NPC) { + it.yaw = VectorUtil.convertYawFromVectors(event.player.location.toVector(),it.toVector()) + it.pitch = it.clone().setDirection(event.player.location.clone().subtract(it.clone()).toVector()).pitch + } + + } + } else { + event.player.location.clone() + } + + entity.updateLocation(location) + entity.updateVisibility(EntityVisibility.VISIBLE) + + event.player.inventory.itemInHand = null + event.player.updateInventory() + } + + @EventHandler(priority = EventPriority.NORMAL) + private fun onInventoryClickEvent(event: InventoryClickEvent) { + + if (event.action.name.contains("DROP") && isMoveTool(event.currentItem)) { + event.isCancelled = true + } + + } + + @EventHandler(priority = EventPriority.NORMAL) + private fun onInventoryDragEvent(event: InventoryDragEvent) { + + if (event.cursor == null || !this.isMoveTool(event.cursor)) { + return + } + + event.isCancelled = true + } + + @EventHandler(priority = EventPriority.NORMAL) + private fun onPlayerDeathEvent(event: PlayerDeathEvent) { + event.drops.removeIf{this.isMoveTool(it)} + } + + @EventHandler(priority = EventPriority.NORMAL) + private fun onPlayerDropItem(event: PlayerDropItemEvent) { + + if (!this.isMoveTool(event.itemDrop.itemStack)) { + return + } + + event.isCancelled = true + + Bukkit.getServer().scheduler.runTaskLater(EntityPlugin.instance,{ + + if (!event.player.isOnline) { + return@runTaskLater + } + + this.clearInventoryOfTool(event.player) + },1L) + + } + + @EventHandler(priority = EventPriority.NORMAL) + private fun onPlayerQuitEvent(event: PlayerQuitEvent) { + this.clearInventoryOfTool(event.player) + } + + private fun isMoveTool(item: ItemStack?):Boolean { + return item != null + && item.type == Entity.MOVE_ITEM_TYPE + && item.hasItemMeta() + && (item.itemMeta.hasDisplayName() && item.itemMeta.hasLore()) + && item.itemMeta.displayName == Entity.MOVE_ITEM_NAME + && item.itemMeta.lore[0].startsWith(Entity.MOVE_ITEM_LORE_KEY) + } + + private fun clearInventoryOfTool(player: Player) { + player.inventory.contents.withIndex().filter{this.isMoveTool(it.value)}.forEach{ + + val item = it.value + val entity = EntityHandler.getEntityById(item.itemMeta.lore[0]!!.replace(Entity.MOVE_ITEM_LORE_KEY,"").toInt()) ?: return@forEach + + player.inventory.setItem(it.index,null) + player.inventory.contents[it.index] = null + player.updateInventory() + + entity.updateVisibility(EntityVisibility.VISIBLE) + } + } + +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/listener/EntityPacketListener.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/listener/EntityPacketListener.kt new file mode 100644 index 0000000..a79b36f --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/listener/EntityPacketListener.kt @@ -0,0 +1,84 @@ +package org.cavepvp.entity.listener + +import org.cavepvp.entity.EntityHandler +import org.cavepvp.entity.event.EntityInteractEvent +import org.cavepvp.entity.type.npc.NPC +import com.comphenix.protocol.PacketType +import com.comphenix.protocol.ProtocolLibrary +import com.comphenix.protocol.events.PacketAdapter +import com.comphenix.protocol.events.PacketEvent +import com.comphenix.protocol.wrappers.EnumWrappers +import org.bukkit.Bukkit +import org.bukkit.event.EventHandler +import org.bukkit.event.EventPriority +import org.bukkit.event.Listener +import org.bukkit.event.player.PlayerQuitEvent +import org.cavepvp.entity.EntityPlugin +import java.util.* +import java.util.concurrent.TimeUnit + +/** + * @project carnage + * + * @date 04/01/21 + * @author xanderume@gmail.com + */ +object EntityPacketListener : PacketAdapter(EntityPlugin.instance,PacketType.Play.Client.USE_ENTITY),Listener { + + private val cache = hashMapOf() + private val cooldown = TimeUnit.SECONDS.toMillis(1L) + + init { + ProtocolLibrary.getProtocolManager().addPacketListener(this) + } + + @EventHandler(priority = EventPriority.MONITOR) + private fun onPlayerQuit(event: PlayerQuitEvent) { + this.cache.remove(event.player.uniqueId) + } + + override fun onPacketReceiving(event: PacketEvent) { + + if (event.packet.type != PacketType.Play.Client.USE_ENTITY) { + return + } + + val entity = EntityHandler.getEntityById(event.packet.integers.read(0)) ?: return + + if (entity.location.distanceSquared(event.player.location) > 6.0) { + return + } + + if (this.cache.containsKey(event.player.uniqueId) && ((System.currentTimeMillis() - this.cache[event.player.uniqueId]!! <= this.cooldown))) { + return + } + + val action = try { + event.packet.entityUseActions.read(0) + // has to be java nullpointer + } catch (ex: java.lang.NullPointerException) { + EnumWrappers.EntityUseAction.INTERACT + } + + /* + if (action == null || action == EnumWrappers.EntityUseAction.INTERACT_AT) { + return + }*/ + + this.cache[event.player.uniqueId] = System.currentTimeMillis() + + if (action == EnumWrappers.EntityUseAction.ATTACK) { + entity.onLeftClick(event.player) + } else { + + if (entity is NPC) { + entity.commands.forEach{event.player.chat("/$it")} + } + + entity.onRightClick(event.player) + } + + Bukkit.getServer().pluginManager.callEvent(EntityInteractEvent(entity,event.player,if (action == EnumWrappers.EntityUseAction.ATTACK) EntityInteractEvent.EntityInteractAction.LEFT_CLICK else EntityInteractEvent.EntityInteractAction.RIGHT_CLICK)) + } + +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/menu/EntityCreateMenu.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/menu/EntityCreateMenu.kt new file mode 100644 index 0000000..6e3a7a4 --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/menu/EntityCreateMenu.kt @@ -0,0 +1,31 @@ +package org.cavepvp.entity.menu + +import org.cavepvp.entity.menu.button.EntityCreateHologramButton +import cc.fyre.proton.menu.Menu +import cc.fyre.proton.menu.Button +import cc.fyre.proton.menu.buttons.BackButton +import org.bukkit.entity.Player +import org.cavepvp.entity.menu.button.EntityCreateNPCButton + +object EntityCreateMenu : Menu() { + + override fun isPlaceholder(): Boolean { + return true; + } + + override fun size(player: Player?): Int { + return 3*9; + } + + override fun getTitle(player: Player): String { + return "Create Entity" + } + + override fun getButtons(player: Player): MutableMap { + return mutableMapOf( + 11 to EntityCreateNPCButton, + 13 to BackButton(EntityMenu()), + 15 to EntityCreateHologramButton + ) + } +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/menu/EntityMenu.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/menu/EntityMenu.kt new file mode 100644 index 0000000..ea3fc67 --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/menu/EntityMenu.kt @@ -0,0 +1,39 @@ +package org.cavepvp.entity.menu + +import cc.fyre.proton.menu.Button +import cc.fyre.proton.menu.pagination.PaginatedMenu +import org.bukkit.Material +import org.cavepvp.entity.menu.button.EntityCreateButton +import org.bukkit.entity.Player +import org.bukkit.inventory.ItemStack +import org.cavepvp.entity.EntityHandler +import org.cavepvp.entity.menu.hologram.HologramButton +import org.cavepvp.entity.menu.npc.NPCButton +import org.cavepvp.entity.type.hologram.Hologram +import org.cavepvp.entity.type.npc.NPC + +class EntityMenu : PaginatedMenu() { + + override fun getPrePaginatedTitle(p0: Player?): String { + return "Entities" + } + + override fun getAllPagesButtons(p0: Player?): MutableMap { + return EntityHandler.getAllEntities() + .sortedByDescending{it is NPC } + .withIndex() + .associate{it.index to when (it.value) { + is NPC -> NPCButton(it.value as NPC) + is Hologram -> HologramButton(it.value as Hologram) + else -> Button.fromItem(ItemStack(Material.AIR)) // Should never really happen? + }} + .toMutableMap() + } + + override fun getGlobalButtons(player: Player?): MutableMap { + return mutableMapOf( + 4 to EntityCreateButton + ) + } + +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/menu/button/EntityCreateButton.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/menu/button/EntityCreateButton.kt new file mode 100644 index 0000000..aff571a --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/menu/button/EntityCreateButton.kt @@ -0,0 +1,35 @@ +package org.cavepvp.entity.menu.button + +import cc.fyre.proton.menu.Button +import org.bukkit.ChatColor +import org.bukkit.Material +import org.bukkit.entity.Player +import org.bukkit.event.inventory.ClickType +import org.bukkit.inventory.ItemStack +import org.cavepvp.entity.menu.EntityCreateMenu +import org.cavepvp.entity.util.ItemBuilder +import java.util.* + +object EntityCreateButton : Button() { + override fun getName(p0: Player?): String { + return "" + } + + override fun getDescription(p0: Player?): MutableList { + return Collections.emptyList() + } + + override fun getMaterial(p0: Player?): Material { + return Material.AIR + } + + override fun getButtonItem(player: Player): ItemStack { + return ItemBuilder.of(Material.NETHER_STAR) + .name("${ChatColor.GREEN}Create Entity") + .build() + } + + override fun clicked(player: Player?, slot: Int, clickType: ClickType?) { + EntityCreateMenu.openMenu(player) + } +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/menu/button/EntityCreateHologramButton.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/menu/button/EntityCreateHologramButton.kt new file mode 100644 index 0000000..c4fc42e --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/menu/button/EntityCreateHologramButton.kt @@ -0,0 +1,59 @@ +package org.cavepvp.entity.menu.button + +import cc.fyre.proton.menu.Button +import org.apache.commons.lang.StringUtils +import org.bukkit.ChatColor +import org.bukkit.Material +import org.bukkit.SkullType +import org.bukkit.entity.Player +import org.bukkit.event.inventory.ClickType +import org.bukkit.inventory.ItemStack +import org.cavepvp.entity.EntityHandler +import org.cavepvp.entity.menu.EntityCreateMenu +import org.cavepvp.entity.menu.hologram.HologramMenu +import org.cavepvp.entity.type.hologram.Hologram +import org.cavepvp.entity.util.InputPrompt +import org.cavepvp.entity.util.ItemBuilder +import java.util.* +import java.util.function.Predicate + +object EntityCreateHologramButton: Button() { + override fun getName(p0: Player?): String { + return "" + } + + override fun getDescription(p0: Player?): MutableList { + return Collections.emptyList() + } + + override fun getMaterial(p0: Player?): Material { + return Material.AIR + } + + override fun getButtonItem(player: Player): ItemStack { + return ItemBuilder.of(Material.SKULL_ITEM) + .name("${ChatColor.GREEN}Create Hologram") + .data(SkullType.WITHER.ordinal) + .build() + } + + override fun clicked(player: Player, slot: Int, clickType: ClickType) { + InputPrompt{ + + if (EntityHandler.getEntityByName(it) != null) { + player.sendMessage("${ChatColor.RED}Entity with name \"$it\" already exists.") + EntityCreateMenu.openMenu(player) + return@InputPrompt + } + + val hologram = Hologram(it,player.location.clone().add(0.0,1.3,0.0)) + + hologram.addText("Use /entity to start editing this hologram.") + + EntityHandler.register(hologram) + + HologramMenu(hologram).openMenu(player) + return@InputPrompt + }.start(player) + } +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/menu/button/EntityCreateNPCButton.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/menu/button/EntityCreateNPCButton.kt new file mode 100644 index 0000000..d2f7ef5 --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/menu/button/EntityCreateNPCButton.kt @@ -0,0 +1,63 @@ +package org.cavepvp.entity.menu.button + +import cc.fyre.proton.menu.Button +import org.apache.commons.lang.StringUtils +import org.bukkit.ChatColor +import org.bukkit.Material +import org.bukkit.SkullType +import org.bukkit.entity.Player +import org.bukkit.event.inventory.ClickType +import org.bukkit.inventory.ItemStack +import org.cavepvp.entity.EntityHandler +import org.cavepvp.entity.EntityVisibility +import org.cavepvp.entity.menu.EntityCreateMenu +import org.cavepvp.entity.menu.npc.NPCMenu +import org.cavepvp.entity.type.npc.NPC +import org.cavepvp.entity.util.InputPrompt +import org.cavepvp.entity.util.ItemBuilder +import java.util.* +import java.util.function.Predicate + +object EntityCreateNPCButton : Button() { + override fun getName(p0: Player?): String { + return "" + } + + override fun getDescription(p0: Player?): MutableList { + return Collections.emptyList() + } + + override fun getMaterial(p0: Player?): Material { + return Material.AIR + } + + override fun getButtonItem(player: Player): ItemStack { + return ItemBuilder.of(Material.SKULL_ITEM) + .name("${ChatColor.GREEN}Create NPC") + .data(SkullType.PLAYER.ordinal) + .build() + } + + override fun clicked(player: Player, slot: Int, clickType: ClickType?) { + + InputPrompt{ + + if (EntityHandler.getEntityByName(it) != null) { + player.sendMessage("${ChatColor.RED}Entity with name \"$it\" already exists.") + EntityCreateMenu.openMenu(player) + return@InputPrompt + } + + val npc = NPC(it,player.location.clone()) + + npc.tabVisibility = EntityVisibility.HIDDEN + npc.tagVisibility = EntityVisibility.HIDDEN + + EntityHandler.register(npc) + + NPCMenu(npc).openMenu(player) + } + .withText("Please type a name: ") + .start(player) + } +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/menu/button/EntityMoveButton.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/menu/button/EntityMoveButton.kt new file mode 100644 index 0000000..bca10c0 --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/menu/button/EntityMoveButton.kt @@ -0,0 +1,45 @@ +package org.cavepvp.entity.menu.button + +import cc.fyre.proton.menu.Button +import org.bukkit.ChatColor +import org.bukkit.Material +import org.bukkit.entity.Player +import org.bukkit.event.inventory.ClickType +import org.bukkit.inventory.ItemStack +import org.cavepvp.entity.Entity +import org.cavepvp.entity.EntityVisibility +import org.cavepvp.entity.util.ItemBuilder +import java.util.* + +class EntityMoveButton(private val entity: Entity) : Button() { + override fun getName(p0: Player?): String { + return "" + } + + override fun getDescription(p0: Player?): MutableList { + return Collections.emptyList() + } + + override fun getMaterial(p0: Player?): Material { + return Material.AIR + } + + override fun getButtonItem(player: Player): ItemStack { + return ItemBuilder.copyOf(this.entity.getMoveItem().clone()) + .build() + } + + override fun clicked(player: Player, slot: Int, clickType: ClickType?) { + + if (player.inventory.firstEmpty() == -1) { + player.sendMessage("${ChatColor.RED}You have no space in your inventory!") + return + } + + player.inventory.addItem(this.entity.getMoveItem()) + player.closeInventory() + + this.entity.updateVisibility(EntityVisibility.HIDDEN) + } + +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/menu/hologram/HologramButton.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/menu/hologram/HologramButton.kt new file mode 100644 index 0000000..de25321 --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/menu/hologram/HologramButton.kt @@ -0,0 +1,112 @@ +package org.cavepvp.entity.menu.hologram + +import cc.fyre.proton.menu.Button +import cc.fyre.proton.menu.menus.ConfirmMenu +import cc.fyre.proton.util.Callback +import org.bukkit.ChatColor +import org.bukkit.Material +import org.bukkit.SkullType +import org.bukkit.entity.Player +import org.bukkit.event.inventory.ClickType +import org.bukkit.event.inventory.InventoryClickEvent +import org.bukkit.inventory.ItemStack +import org.cavepvp.entity.EntityHandler +import org.cavepvp.entity.menu.EntityMenu +import org.cavepvp.entity.type.hologram.Hologram +import org.cavepvp.entity.type.hologram.line.type.HologramItemLine +import org.cavepvp.entity.type.hologram.line.type.HologramTextLine +import org.cavepvp.entity.util.ItemBuilder +import java.util.* +import java.util.function.Predicate + +class HologramButton(private val hologram: Hologram) : Button() { + override fun getName(p0: Player?): String { + return "" + } + + override fun getDescription(p0: Player?): MutableList { + return Collections.emptyList() + } + + override fun getMaterial(p0: Player?): Material { + return Material.AIR + } + + override fun getButtonItem(player: Player): ItemStack { + + val lore = arrayListOf() + + lore.add("${ChatColor.DARK_GRAY}#${this.hologram.id}") + lore.add(" ") + + if (this.hologram.lines.isNotEmpty()) { + var index = 1 + + for (line in this.hologram.lines) { + + val text = StringBuilder("${ChatColor.GRAY}${index}. ") + + when (line) { + is HologramTextLine -> text.append(buildString{ + + if (line.text.length > 25) { + text.append(line.text.substring(0,25)) + } else { + text.append(line.text) + } + + }) + is HologramItemLine -> text.append(line.item.type.name) + } + + lore.add(text.toString()) + + index++ + } + + } else { + lore.add("${ChatColor.YELLOW}No text") + } + + + lore.add(" ") + + if (this.hologram.parent != null) { + EntityHandler.getEntityById(this.hologram.parent!!)?.also{ + lore.add("${ChatColor.GRAY}Parent: ${ChatColor.DARK_GRAY}#${it.id}") + } + } + + lore.add(" ") + lore.add("${ChatColor.GREEN}Click to edit Hologram") + + return ItemBuilder.of(Material.SKULL_ITEM) + .name("${ChatColor.GREEN}${ChatColor.BOLD}${this.hologram.name}") + .lore(lore) + .data(SkullType.SKELETON.ordinal) + .build() + } + override fun clicked(player: Player, slot: Int, clickType: ClickType) { + + if (clickType.isRightClick) { + + if (clickType.isShiftClick) { + object : ConfirmMenu("Delete Hologram?", Callback{ + this@HologramButton.hologram.sendToAll{ + this@HologramButton.hologram.sendDestroyPacket(it) + } + + EntityHandler.destroy(this@HologramButton.hologram) + EntityMenu().openMenu(player) + }){}.openMenu(player) + return + } + + player.teleport(this.hologram.getLocation()) + } else if (clickType.isLeftClick) { + HologramMenu(this.hologram).openMenu(player) + } + + } + +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/menu/hologram/HologramMenu.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/menu/hologram/HologramMenu.kt new file mode 100644 index 0000000..6180ff9 --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/menu/hologram/HologramMenu.kt @@ -0,0 +1,34 @@ +package org.cavepvp.entity.menu.hologram + +import cc.fyre.proton.menu.Button +import cc.fyre.proton.menu.Menu +import cc.fyre.proton.menu.buttons.BackButton +import org.bukkit.entity.Player +import org.cavepvp.entity.menu.EntityMenu +import org.cavepvp.entity.menu.button.EntityMoveButton +import org.cavepvp.entity.menu.hologram.type.HologramLinesButton +import org.cavepvp.entity.type.hologram.Hologram + +class HologramMenu(private val hologram: Hologram) : Menu() { + + override fun size(player: Player?): Int { + return 3*9 + } + + override fun isPlaceholder(): Boolean { + return true + } + + override fun getTitle(player: Player): String { + return this.hologram.name + } + + override fun getButtons(player: Player): MutableMap { + return mutableMapOf( + 10 to HologramLinesButton(this,this.hologram), + 11 to EntityMoveButton(this.hologram), + 16 to BackButton(EntityMenu()) + ) + } + +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/menu/hologram/type/HologramLinesButton.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/menu/hologram/type/HologramLinesButton.kt new file mode 100644 index 0000000..b8a2dd6 --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/menu/hologram/type/HologramLinesButton.kt @@ -0,0 +1,96 @@ +package org.cavepvp.entity.menu.hologram.type + +import cc.fyre.proton.menu.Menu +import cc.fyre.proton.util.Callback +import org.bukkit.ChatColor +import org.bukkit.Material +import org.bukkit.conversations.ConversationContext +import org.bukkit.conversations.Prompt +import org.bukkit.conversations.StringPrompt +import org.bukkit.entity.Player +import org.bukkit.event.inventory.ClickType +import org.bukkit.event.inventory.InventoryClickEvent +import org.bukkit.inventory.ItemStack +import org.cavepvp.entity.menu.hologram.HologramMenu +import org.cavepvp.entity.type.hologram.Hologram +import org.cavepvp.entity.type.hologram.line.HologramLine +import org.cavepvp.entity.type.hologram.line.type.HologramItemLine +import org.cavepvp.entity.type.hologram.line.type.HologramTextLine +import org.cavepvp.entity.util.InputPrompt +import org.cavepvp.entity.util.ItemBuilder +import org.cavepvp.entity.util.ListButton +import org.cavepvp.entity.util.PlayerUtil + +class HologramLinesButton(parent: Menu, private val hologram: Hologram) : ListButton(parent,15,30) { + + override fun addItem(item: HologramLine, player: Player): Runnable { + return Runnable{} + } + + override fun getEmptyDescription(player: Player): List { + return arrayListOf("${ChatColor.GRAY}No text") + } + + override fun getItemStack(player: Player): ItemStack { + return ItemBuilder.of(Material.SIGN) + .name("${ChatColor.GOLD}${ChatColor.BOLD}Lines") + .build() + } + + override fun getList(): List { + return this.hologram.lines + } + + override fun getTextFormat(item: HologramLine): Pair { + return when (item) { + is HologramTextLine -> Pair(ChatColor.translateAlternateColorCodes('&',item.text),"") + is HologramItemLine -> Pair("","") + else -> Pair("N/A","") + } + } + + override fun getExtraDescription(player: Player): List { + return super.getExtraDescription(player).plus("${ChatColor.AQUA}Middle click to edit text") + } + + override fun isModifiable(): Boolean { + return true + } + + override fun removeItem(item: HologramLine, player: Player): Runnable { + return Runnable{ + this.hologram.remove(this.hologram.lines.withIndex().first{it.value.skullId == item.skullId}.index) + } + } + + override fun startAddConversation(player: Player, callback: Callback) { + player.closeInventory() + + PlayerUtil.startPrompt(player,object : StringPrompt() { + + override fun getPromptText(context: ConversationContext): String { + return "${ChatColor.GREEN}Please type out text for this hologram" + } + + override fun acceptInput(context: ConversationContext,input: String): Prompt? { + this@HologramLinesButton.hologram.addText(input) + HologramMenu(this@HologramLinesButton.hologram).openMenu(player) + return END_OF_CONVERSATION + } + + },600) + } + + override fun clicked(player: Player, slot: Int, clickType: ClickType) { + if (clickType == ClickType.MIDDLE) { + InputPrompt{ + this.hologram.setText(this.index,it) + } + .withText("${ChatColor.GREEN}Please type out new text for this line.") + .start(player) + return + } + + super.clicked(player, slot, clickType) + } +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/menu/npc/NPCButton.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/menu/npc/NPCButton.kt new file mode 100644 index 0000000..5687739 --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/menu/npc/NPCButton.kt @@ -0,0 +1,73 @@ +package org.cavepvp.entity.menu.npc + +import cc.fyre.proton.menu.Button +import cc.fyre.proton.menu.menus.ConfirmMenu +import cc.fyre.proton.util.Callback +import org.bukkit.ChatColor +import org.bukkit.Material +import org.bukkit.SkullType +import org.bukkit.entity.Player +import org.bukkit.event.inventory.ClickType +import org.bukkit.inventory.ItemStack +import org.cavepvp.entity.EntityHandler +import org.cavepvp.entity.menu.EntityMenu +import org.cavepvp.entity.type.npc.NPC +import org.cavepvp.entity.util.ItemBuilder +import java.util.* +import java.util.function.Predicate + +class NPCButton(private val npc: NPC) : Button() { + override fun getName(p0: Player?): String { + return "" + } + + override fun getDescription(p0: Player?): MutableList { + return Collections.emptyList() + } + + override fun getMaterial(p0: Player?): Material { + return Material.AIR + } + + override fun getButtonItem(player: Player): ItemStack { + + val lore = arrayListOf() + + lore.add("${ChatColor.DARK_GRAY}#${this.npc.id}") + lore.add(" ") + lore.add("${ChatColor.GRAY}Skin: ${ChatColor.YELLOW}${this.npc.skinUsername ?: "N/A"}") + lore.add("${ChatColor.GRAY}Visibility: ${ChatColor.YELLOW}${this.npc.visibility.getDisplayName()}") + lore.add(" ") + lore.add("${ChatColor.GREEN}Click to edit NPC") + + return ItemBuilder.of(Material.SKULL_ITEM) + .name("${ChatColor.GREEN}${ChatColor.BOLD}${this.npc.name}") + .lore(lore) + .data(SkullType.SKELETON.ordinal) + .build() + } + + override fun clicked(player: Player, slot: Int, clickType: ClickType) { + + if (clickType.isRightClick) { + + if (clickType.isShiftClick) { + object : ConfirmMenu("Delete NPC?", Callback{ + this@NPCButton.npc.sendToAll{ + this@NPCButton.npc.sendDestroyPacket(it) + } + + EntityHandler.destroy(this@NPCButton.npc) + EntityMenu().openMenu(player) + }){}.openMenu(player) + return + } + + player.teleport(this.npc.getLocation()) + } else if (clickType.isLeftClick) { + NPCMenu(this.npc).openMenu(player) + } + + } + +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/menu/npc/NPCMenu.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/menu/npc/NPCMenu.kt new file mode 100644 index 0000000..6643702 --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/menu/npc/NPCMenu.kt @@ -0,0 +1,42 @@ +package org.cavepvp.entity.menu.npc + +import cc.fyre.proton.menu.Button +import cc.fyre.proton.menu.Menu +import cc.fyre.proton.menu.buttons.BackButton +import org.bukkit.entity.Player +import org.cavepvp.entity.menu.EntityMenu +import org.cavepvp.entity.menu.button.EntityMoveButton +import org.cavepvp.entity.menu.hologram.HologramButton +import org.cavepvp.entity.menu.npc.button.NPCAnimationButton +import org.cavepvp.entity.menu.npc.button.NPCCommandsButton +import org.cavepvp.entity.menu.npc.button.NPCEquipmentButton +import org.cavepvp.entity.menu.npc.button.NPCSkinButton +import org.cavepvp.entity.type.npc.NPC + +class NPCMenu(private val npc: NPC) : Menu() { + + override fun isPlaceholder(): Boolean { + return true; + } + + override fun size(player: Player?): Int { + return 3*9; + } + + override fun getTitle(player: Player): String { + return this.npc.name + } + + override fun getButtons(player: Player): MutableMap { + return mapOf( + 10 to NPCSkinButton(this.npc), + 11 to NPCEquipmentButton(this.npc), + 12 to NPCAnimationButton(this.npc), + 13 to NPCCommandsButton(this,this.npc), + 14 to HologramButton(this.npc.hologram), + 15 to EntityMoveButton(this.npc), + 16 to BackButton(EntityMenu()) + ).plus(this.npc.getEditorButtons()).toMutableMap() + } + +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/menu/npc/button/NPCAnimationButton.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/menu/npc/button/NPCAnimationButton.kt new file mode 100644 index 0000000..c4b2b44 --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/menu/npc/button/NPCAnimationButton.kt @@ -0,0 +1,37 @@ +package org.cavepvp.entity.menu.npc.button + +import cc.fyre.proton.menu.Button +import org.bukkit.ChatColor +import org.bukkit.Material +import org.bukkit.entity.Player +import org.bukkit.event.inventory.ClickType +import org.bukkit.inventory.ItemStack +import org.cavepvp.entity.menu.npc.menu.NPCAnimationMenu +import org.cavepvp.entity.type.npc.NPC +import org.cavepvp.entity.util.ItemBuilder +import java.util.* + +class NPCAnimationButton(private val npc: NPC): Button() { + override fun getName(p0: Player?): String { + return "" + } + + override fun getDescription(p0: Player?): MutableList { + return Collections.emptyList() + } + + override fun getMaterial(p0: Player?): Material { + return Material.AIR + } + + override fun getButtonItem(player: Player): ItemStack { + return ItemBuilder.of(Material.EYE_OF_ENDER) + .name("${ChatColor.GOLD}${ChatColor.BOLD}Animation") + .build() + } + + override fun clicked(player: Player?, slot: Int, clickType: ClickType) { + NPCAnimationMenu(this.npc).openMenu(player) + } + +} diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/menu/npc/button/NPCCommandsButton.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/menu/npc/button/NPCCommandsButton.kt new file mode 100644 index 0000000..dfb8830 --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/menu/npc/button/NPCCommandsButton.kt @@ -0,0 +1,59 @@ +package org.cavepvp.entity.menu.npc.button + +import cc.fyre.proton.menu.Menu +import cc.fyre.proton.util.Callback +import org.cavepvp.entity.util.ListButton +import org.cavepvp.entity.util.InputPrompt +import org.bukkit.ChatColor +import org.bukkit.Material +import org.bukkit.entity.Player +import org.bukkit.inventory.ItemStack +import org.cavepvp.entity.type.npc.NPC +import org.cavepvp.entity.util.ItemBuilder +import java.util.* + +class NPCCommandsButton(menu: Menu,private val npc: NPC) : ListButton(menu,10,50) { + + override fun getEmptyDescription(player: Player): List { + return listOf() + } + + override fun getList(): List { + return this.npc.commands + } + + override fun getTextFormat(item: String): Pair { + return Pair(item,"") + } + + override fun isModifiable(): Boolean { + return true + } + + override fun addItem(item: String, player: Player): Runnable { + this.npc.commands.add(item) + + return Runnable{this.npc.commands.add(item)} + } + + override fun removeItem(item: String, player: Player): Runnable { + this.npc.commands.remove(item) + + return Runnable{this.npc.commands.remove(item)} + } + + override fun startAddConversation(player: Player, callback: Callback) { + player.closeInventory() + InputPrompt{this.addItem(it,player)} + .withText("${ChatColor.GREEN}Please provide a command for this npc: ") + .start(player) + } + + override fun getItemStack(player: Player): ItemStack { + return ItemBuilder.of(Material.COMMAND) + .name("${ChatColor.GOLD}${ChatColor.BOLD}Commands") + .build() + } + + +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/menu/npc/button/NPCEquipmentButton.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/menu/npc/button/NPCEquipmentButton.kt new file mode 100644 index 0000000..a350d3e --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/menu/npc/button/NPCEquipmentButton.kt @@ -0,0 +1,38 @@ +package org.cavepvp.entity.menu.npc.button + +import cc.fyre.proton.menu.Button +import org.bukkit.ChatColor +import org.bukkit.Material +import org.bukkit.entity.Player +import org.bukkit.event.inventory.ClickType +import org.bukkit.inventory.ItemStack +import org.cavepvp.entity.menu.npc.menu.NPCEquipmentMenu +import org.cavepvp.entity.type.npc.NPC +import org.cavepvp.entity.util.ItemBuilder +import java.util.* + +class NPCEquipmentButton(private val npc: NPC) : Button() { + override fun getName(p0: Player?): String { + return "" + } + + override fun getDescription(p0: Player?): MutableList { + return Collections.emptyList() + } + + override fun getMaterial(p0: Player?): Material { + return Material.AIR + } + + override fun getButtonItem(player: Player): ItemStack { + return ItemBuilder.of(Material.DIAMOND_HELMET) + .name("${ChatColor.GOLD}${ChatColor.BOLD}Equipment") + .build() + } + + override fun clicked(player: Player, slot: Int, clickType: ClickType) { + NPCEquipmentMenu(this.npc).openMenu(player) + } + + +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/menu/npc/button/NPCSkinButton.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/menu/npc/button/NPCSkinButton.kt new file mode 100644 index 0000000..23a7f2a --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/menu/npc/button/NPCSkinButton.kt @@ -0,0 +1,95 @@ +package org.cavepvp.entity.menu.npc.button + +import cc.fyre.proton.Proton +import cc.fyre.proton.menu.Button +import cc.fyre.proton.util.MojangUtil +import cc.fyre.proton.util.UUIDUtils +import org.bukkit.Bukkit +import org.bukkit.ChatColor +import org.bukkit.Material +import org.bukkit.SkullType +import org.bukkit.conversations.ConversationContext +import org.bukkit.conversations.Prompt +import org.bukkit.conversations.StringPrompt +import org.bukkit.entity.Player +import org.bukkit.event.inventory.ClickType +import org.bukkit.inventory.ItemStack +import org.cavepvp.entity.EntityPlugin +import org.cavepvp.entity.menu.npc.NPCMenu +import org.cavepvp.entity.type.npc.NPC +import org.cavepvp.entity.util.ItemBuilder +import org.cavepvp.entity.util.PlayerUtil +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response +import java.util.* + +class NPCSkinButton(private val npc: NPC) : Button() { + override fun getName(p0: Player?): String { + return "" + } + + override fun getDescription(p0: Player?): MutableList { + return Collections.emptyList() + } + + override fun getMaterial(p0: Player?): Material { + return Material.AIR + } + + + override fun getButtonItem(player: Player): ItemStack { + return ItemBuilder.of(Material.SKULL_ITEM) + .name("${ChatColor.GOLD}${ChatColor.BOLD}Skin") + .data(SkullType.PLAYER.ordinal) + .build() + } + + override fun clicked(player: Player, slot: Int, clickType: ClickType) { + player.closeInventory() + PlayerUtil.startPrompt(player,object : StringPrompt() { + + override fun getPromptText(context: ConversationContext): String { + return "${ChatColor.YELLOW}Type a player's skin for this NPC." + } + + override fun acceptInput(context: ConversationContext,input: String): Prompt? { + + Bukkit.getServer().scheduler.runTaskAsynchronously(EntityPlugin.instance) { + + var uuid = UUIDUtils.uuid(input) + + if (uuid == null) { + uuid = MojangUtil.getFromMojang(input) + } + + if (uuid == null) { + + if (player.isOnline) { + player.sendMessage("${ChatColor.RED}Unable to find \"$input\" in mojang database.") + } + + return@runTaskAsynchronously + } + + val skin = MojangUtil.getSkin(uuid) + + if (skin == null) { + player.sendMessage("${ChatColor.RED}Unable to find \"$input\" in mojang database. [1]") + return@runTaskAsynchronously + } + + if (player.isOnline) { + NPCMenu(npc).openMenu(player) + } + + npc.setSkin(input,skin.key,skin.value) + + } + + return END_OF_CONVERSATION + } + + },600,EntityPlugin.instance) + } +} diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/menu/npc/menu/NPCAnimationMenu.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/menu/npc/menu/NPCAnimationMenu.kt new file mode 100644 index 0000000..7c4adb8 --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/menu/npc/menu/NPCAnimationMenu.kt @@ -0,0 +1,76 @@ +package org.cavepvp.entity.menu.npc.menu + +import cc.fyre.proton.menu.Button +import cc.fyre.proton.menu.buttons.BackButton +import cc.fyre.proton.menu.pagination.PaginatedMenu +import org.bukkit.Material +import org.bukkit.enchantments.Enchantment +import org.bukkit.entity.Player +import org.bukkit.event.inventory.ClickType +import org.bukkit.event.inventory.InventoryClickEvent +import org.bukkit.inventory.ItemStack +import org.cavepvp.entity.animation.EntityAnimationRegistry +import org.cavepvp.entity.menu.npc.NPCMenu +import org.cavepvp.entity.type.npc.NPC +import org.cavepvp.entity.util.ItemBuilder +import java.util.* + +class NPCAnimationMenu(private val npc: NPC) : PaginatedMenu() { + + override fun getMaxItemsPerPage(player: Player): Int { + return 2*9 + } + + override fun getGlobalButtons(player: Player): MutableMap { + return mutableMapOf( + 4 to BackButton(NPCMenu(this.npc)) + ) + } + + override fun getPrePaginatedTitle(p0: Player?): String { + return "Animations" + } + + override fun getAllPagesButtons(player: Player): MutableMap { + return EntityAnimationRegistry.getAllAnimations() + .withIndex() + .associate{it.index to object : Button() { + override fun getName(p0: Player?): String { + return "" + } + + override fun getDescription(p0: Player?): MutableList { + return Collections.emptyList() + } + + override fun getMaterial(p0: Player?): Material { + return Material.AIR + } + + override fun getButtonItem(player: Player): ItemStack { + + var item = ItemBuilder.copyOf(it.value.getDisplayItem().clone()) + .name(it.value.getDisplayName()) + + if (this@NPCAnimationMenu.npc.animations.contains(it.value)) { + item = item.enchant(Enchantment.DURABILITY, 10) + } + + return item.build() + } + + override fun clicked(player: Player, slot: Int, clickType: ClickType) { + + if (this@NPCAnimationMenu.npc.animations.contains(it.value)) { + this@NPCAnimationMenu.npc.animations.remove(it.value) + } else { + this@NPCAnimationMenu.npc.animations.add(it.value) + } + + } + + }} + .toMutableMap() + } + +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/menu/npc/menu/NPCEquipmentMenu.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/menu/npc/menu/NPCEquipmentMenu.kt new file mode 100644 index 0000000..27f202a --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/menu/npc/menu/NPCEquipmentMenu.kt @@ -0,0 +1,251 @@ +package org.cavepvp.entity.menu.npc.menu + +import cc.fyre.proton.menu.Menu +import cc.fyre.proton.menu.Button +import cc.fyre.proton.menu.buttons.BackButton +import cc.fyre.proton.menu.pagination.PaginatedMenu +import org.bukkit.DyeColor +import org.bukkit.Material +import org.bukkit.entity.Player +import org.bukkit.event.inventory.ClickType +import org.bukkit.inventory.ItemStack +import org.bukkit.material.* +import org.bukkit.potion.Potion +import org.bukkit.potion.PotionType +import org.cavepvp.entity.menu.npc.NPCMenu +import org.cavepvp.entity.type.npc.NPC +import org.cavepvp.entity.util.ItemBuilder +import org.cavepvp.entity.util.ItemPart +import java.util.* +import kotlin.collections.ArrayList +import kotlin.collections.HashMap + +class NPCEquipmentMenu(private val npc: NPC) : Menu() { + + override fun isPlaceholder(): Boolean { + return true; + } + + override fun size(player: Player?): Int { + return 3*9; + } + + override fun getTitle(player: Player): String { + return "Equipment" + } + + override fun getButtons(player: Player): MutableMap { + + val buttons = mutableMapOf() + + buttons[10] = EquipmentButton(this.npc, ItemPart.HAND) + buttons[11] = EquipmentButton(this.npc,ItemPart.HELMET) + buttons[12] = EquipmentButton(this.npc,ItemPart.CHESTPLATE) + buttons[13] = EquipmentButton(this.npc,ItemPart.LEGGINGS) + buttons[14] = EquipmentButton(this.npc,ItemPart.BOOTS) + + buttons[16] = BackButton(NPCMenu(this.npc)) + + return buttons + } + + inner class EquipmentButton(private val npc: NPC,private val part: ItemPart) : Button() { + override fun getName(p0: Player?): String { + return "" + } + + override fun getDescription(p0: Player?): MutableList { + return Collections.emptyList() + } + + override fun getMaterial(p0: Player?): Material { + return Material.AIR + } + + private var item = this.npc.getEquipment(this.part) + + override fun getButtonItem(player: Player): ItemStack { + + if (this.item == null) { + return ItemBuilder.of(Material.EMPTY_MAP) + .name(this.part.name) + .build() + } + + return ItemBuilder.copyOf(this.item!!.clone()) + .build() + } + + override fun clicked(player: Player?, slot: Int, clickType: ClickType) { + + if (clickType.isRightClick) { + npc.setEquipment(this.part,null) + return + } + + object : PaginatedMenu() { + + override fun getPrePaginatedTitle(player: Player): String { + return this@EquipmentButton.part.name + } + + override fun getMaxItemsPerPage(player: Player): Int { + return (5*9) + } + + override fun getGlobalButtons(player: Player): MutableMap { + return mutableMapOf( + 4 to BackButton(NPCEquipmentMenu(npc)) + ) + } + + override fun getAllPagesButtons(player: Player): HashMap { + return (cached[part] ?: arrayListOf()).withIndex().associate{it.index to object : Button() { + override fun getName(p0: Player?): String { + return "" + } + + override fun getDescription(p0: Player?): MutableList { + return Collections.emptyList() + } + + override fun getMaterial(p0: Player?): Material { + return Material.AIR + } + + override fun getButtonItem(player: Player): ItemStack { + return it.value + } + + override fun clicked(player: Player?, slot: Int, clickType: ClickType?) { + npc.setEquipment(part,it.value) + NPCEquipmentMenu(npc).openMenu(player) + } + + } }.toMap(HashMap()) + } + + }.openMenu(player) + + } + + } + + companion object { + + private val cached = hashMapOf>() + private val materialBlacklist = arrayListOf( + Material.WATER, + Material.STATIONARY_WATER, + Material.LAVA, + Material.STATIONARY_LAVA, + Material.DOUBLE_STEP, + Material.FIRE, + Material.BURNING_FURNACE, + Material.SIGN_POST, + Material.WALL_SIGN, + Material.WOODEN_DOOR, + Material.IRON_DOOR_BLOCK, + Material.GLOWING_REDSTONE_ORE, + Material.REDSTONE_TORCH_OFF, + Material.SUGAR_CANE_BLOCK, + Material.PORTAL, + Material.JACK_O_LANTERN, + Material.CAKE_BLOCK, + Material.DIODE_BLOCK_OFF, + Material.DIODE_BLOCK_ON, + Material.PUMPKIN_STEM, + Material.MELON_STEM, + Material.NETHER_WARTS, + Material.BREWING_STAND, + Material.CAULDRON, + Material.ENDER_PORTAL, + Material.REDSTONE_LAMP_ON, + Material.WOOD_DOUBLE_STEP, + Material.COCOA, + Material.TRIPWIRE, + Material.FLOWER_POT, + Material.CARROT, + Material.POTATO, + Material.REDSTONE_COMPARATOR_OFF, + Material.REDSTONE_COMPARATOR_ON, + Material.PISTON_MOVING_PIECE, + Material.SKULL + ) + + init { + ItemPart.values().forEach{ + + val list = arrayListOf() + + if (it != ItemPart.HAND) { + + for (name in arrayOf("DIAMOND","GOLD","IRON","CHAINMAIL","LEATHER")) { + + val item = try { + Material.valueOf("${name}_${it.name}") + } catch (ex: Exception) { + continue + } + + val items = arrayListOf() + + items.add(ItemStack(item)) + + if (item.name.startsWith("LEATHER")) { + + for (color in DyeColor.values()) { + items.add(ItemBuilder.of(item).color(color.color).build()) + } + + } + + list.addAll(items) + } + } else { + Material.values().filter{material -> + + if (material.maxStackSize < 1) { + return@filter false + } + + if (this.materialBlacklist.contains(material)) { + return@filter false + } + + if (material.data == Bed::class.java + || material.data == PistonExtensionMaterial::class.java + || material.data == LongGrass::class.java + || material.data == RedstoneWire::class.java + || material.data == Crops::class.java + ) { + return@filter false + } + + if (ItemPart.values().any{part -> material.name.endsWith(part.name)}) { + return@filter false + } + + return@filter true + }.forEach{material -> list.add(ItemStack(material))} + + + for (color in DyeColor.values()) { + list.add(ItemBuilder.of(Material.FIREWORK_CHARGE).setFireworkColor(color.color).build()) + } + + for (type in PotionType.values().filter{ type -> type.maxLevel > 0}) { + list.add(Potion(type,1,false).toItemStack(1)) + } + + for (type in PotionType.values().filter{type -> type.maxLevel > 0}) { + list.add(Potion(type,1,true).toItemStack(1)) + } + + } + + this.cached[it] = list + } + } + } +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/moshi/MoshiUtil.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/moshi/MoshiUtil.kt new file mode 100644 index 0000000..1e995ad --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/moshi/MoshiUtil.kt @@ -0,0 +1,80 @@ +package org.cavepvp.entity.moshi + +import com.squareup.moshi.JsonAdapter.Factory +import com.squareup.moshi.Moshi + +import com.squareup.moshi.Types +import com.squareup.moshi.adapters.PolymorphicJsonAdapterFactory +import com.squareup.moshi.addAdapter +import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory +import org.cavepvp.entity.moshi.adapter.* +import org.cavepvp.entity.moshi.adapter.world.WorldJsonAdapter +import org.cavepvp.entity.moshi.adapter.world.WorldNameJsonAdapter +import org.cavepvp.entity.util.ReflectionUtil +import java.lang.IllegalStateException +import java.lang.reflect.ParameterizedType + +/** + * @project carnage + * + * @date 05/22/21 + * @author xanderume@gmail.com + */ +@OptIn(ExperimentalStdlibApi::class) +object MoshiUtil { + + private val builder: Moshi.Builder = Moshi.Builder() + .add(UUIDJsonAdapter) + .add(ListJsonAdapter) + .add(PairJsonAdapter) + .add(JsonObjectAdapter) + .add(SerializeNullAdapter) + .add(AtomicIntegerJsonAdapter) + .add(WorldJsonAdapter) + .add(WorldNameJsonAdapter) + .add(LegacyItemStackJsonAdapter) + .add(FireworkEffectJsonAdapter) + .addAdapter(PotionEffectJsonAdapter) + .addAdapter(LocationJsonAdapter) + .add(LocalDateTimeJsonAdapter) + .addLast(KotlinJsonAdapterFactory()) + + var instance: Moshi = builder + .build() + + private var factories = getFactories().toMutableList() + + fun rebuild(use: (Moshi.Builder) -> Unit) { + use.invoke(builder) + + instance = builder.build() + factories = getFactories().toMutableList() + } + + fun addToPolymorphic(instance: Class,type: Class,label: String) { + + val indexedValue = factories + .withIndex() + .firstOrNull{it.value is PolymorphicJsonAdapterFactory<*> && ReflectionUtil.getDeclaredField(it.value,"baseType") == instance} + ?: throw IllegalStateException("Failed to find Polymorphic adapter for ${instance.simpleName}") + + val factory = (indexedValue.value as PolymorphicJsonAdapterFactory).withSubtype(type,label) + + factories[indexedValue.index] = factory + setFactories(factories) + } + + private fun setFactories(factories: List) { + ReflectionUtil.setDeclaredField(builder,"factories",factories) + instance = builder.build() + } + + private fun getFactories():List { + return ReflectionUtil.getDeclaredField(builder,"factories") as List + } + + val LIST_STRING_TYPE: ParameterizedType = Types.newParameterizedType(List::class.java,String::class.java) + val STRING_TO_ANY_MAP_TYPE: ParameterizedType = Types.newParameterizedType(Map::class.java,String::class.java,Any::class.java) + + const val PRETTY_PRINT_INDENT = " " +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/moshi/MoshiWrapper.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/moshi/MoshiWrapper.kt new file mode 100644 index 0000000..5d855a6 --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/moshi/MoshiWrapper.kt @@ -0,0 +1,86 @@ +package org.cavepvp.entity.moshi + +import com.squareup.moshi.JsonAdapter +import com.squareup.moshi.JsonReader +import com.squareup.moshi.JsonWriter + +fun JsonWriter.write(key: String,value: String) { + this.name(key) + this.value(value) +} + +fun JsonWriter.write(key: String,value: Int) { + this.name(key) + this.value(value) +} + +fun JsonWriter.write(key: String,value: Short) { + this.name(key) + this.value(value) +} + +fun JsonWriter.write(key: String,value: Double) { + this.name(key) + this.value(value) +} + +fun JsonWriter.write(key: String,value: Float) { + this.name(key) + this.value(value) +} + +fun JsonWriter.write(key: String,value: Boolean) { + this.name(key) + this.value(value) +} + +fun JsonWriter.write(key: String,map: Map) { + this.name(key) + + val array = this.beginArray() + + map.entries.forEach{(name,value) -> + array.name(name) + + when (value) { + is Long -> array.value(value) + is Float -> array.value(value) + is Double -> array.value(value) + is Number -> array.value(value) + is String -> array.value(value) + is Boolean -> array.value(value) + else -> array.value(value.toString()) + } + + } + array.endArray() +} + +fun JsonReader.readString():String { + this.nextName() + return this.nextString() +} + +fun JsonReader.readInt():Int { + this.nextName() + return this.nextInt() +} + +fun JsonReader.readDouble():Double { + this.nextName() + return this.nextDouble() +} + +fun JsonReader.readFloat():Float { + this.nextName() + return this.nextDouble().toFloat() +} + +fun JsonReader.readBoolean():Boolean { + this.nextName() + return this.nextBoolean() +} + +fun JsonAdapter.setPrettyPrinting():JsonAdapter { + return this.indent(MoshiUtil.PRETTY_PRINT_INDENT) +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/moshi/adapter/AtomicIntegerJsonAdapter.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/moshi/adapter/AtomicIntegerJsonAdapter.kt new file mode 100644 index 0000000..16c88c2 --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/moshi/adapter/AtomicIntegerJsonAdapter.kt @@ -0,0 +1,18 @@ +package org.cavepvp.entity.moshi.adapter + +import com.squareup.moshi.FromJson +import com.squareup.moshi.ToJson +import java.util.concurrent.atomic.AtomicInteger + +object AtomicIntegerJsonAdapter { + + @ToJson + fun toJson(value: AtomicInteger):String { + return value.get().toString() + } + + @FromJson + fun fromJson(value: String):AtomicInteger { + return AtomicInteger(value.toInt()) + } +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/moshi/adapter/FireworkEffectJsonAdapter.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/moshi/adapter/FireworkEffectJsonAdapter.kt new file mode 100644 index 0000000..b4851db --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/moshi/adapter/FireworkEffectJsonAdapter.kt @@ -0,0 +1,23 @@ +package org.cavepvp.entity.moshi.adapter + +import com.squareup.moshi.FromJson +import com.squareup.moshi.ToJson +import com.squareup.moshi.Types +import org.bukkit.FireworkEffect +import java.lang.reflect.ParameterizedType + +object FireworkEffectJsonAdapter { + + val LIST_TYPE: ParameterizedType = Types.newParameterizedType(List::class.java,FireworkEffect::class.java) + + @ToJson + fun toJson(effect: FireworkEffect):Map<@JvmSuppressWildcards String,@JvmSuppressWildcards Any?> { + return effect.serialize() + } + + @FromJson + fun fromJson(json: Map<@JvmSuppressWildcards String, @JvmSuppressWildcards Any>):FireworkEffect { + return FireworkEffect.deserialize(json) as FireworkEffect + } + +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/moshi/adapter/IntRangeJsonAdapter.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/moshi/adapter/IntRangeJsonAdapter.kt new file mode 100644 index 0000000..23dac1d --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/moshi/adapter/IntRangeJsonAdapter.kt @@ -0,0 +1,21 @@ +package org.cavepvp.entity.moshi.adapter + +import com.squareup.moshi.FromJson +import com.squareup.moshi.ToJson + +object IntRangeJsonAdapter { + + private const val SPLITTER = "\\" + + @ToJson + fun toJson(range: IntRange):String { + return "${range.first}$SPLITTER${range.last}" + } + + @FromJson + fun fromJson(json: String):IntRange { + json.split(SPLITTER).also{ + return IntRange(it[0].toInt(),it[1].toInt()) + } + } +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/moshi/adapter/JsonObjectAdapter.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/moshi/adapter/JsonObjectAdapter.kt new file mode 100644 index 0000000..dede7cf --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/moshi/adapter/JsonObjectAdapter.kt @@ -0,0 +1,20 @@ +package org.cavepvp.entity.moshi.adapter + +import org.cavepvp.entity.moshi.MoshiUtil +import org.cavepvp.entity.moshi.json.JsonObject +import com.squareup.moshi.FromJson +import com.squareup.moshi.ToJson + +object JsonObjectAdapter { + + @ToJson + fun toJson(json: JsonObject):String { + return MoshiUtil.instance.adapter>(MoshiUtil.STRING_TO_ANY_MAP_TYPE).toJson(json.get()) + } + + @FromJson + fun fromJson(json: String): JsonObject { + return JsonObject(MoshiUtil.instance.adapter>(MoshiUtil.STRING_TO_ANY_MAP_TYPE).fromJson(json)!!) + } + +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/moshi/adapter/LegacyItemStackJsonAdapter.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/moshi/adapter/LegacyItemStackJsonAdapter.kt new file mode 100644 index 0000000..19c08d1 --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/moshi/adapter/LegacyItemStackJsonAdapter.kt @@ -0,0 +1,193 @@ +package org.cavepvp.entity.moshi.adapter + +import com.squareup.moshi.FromJson +import com.squareup.moshi.ToJson +import org.bukkit.Color +import org.bukkit.FireworkEffect +import org.bukkit.Material +import org.bukkit.enchantments.Enchantment +import org.bukkit.inventory.ItemStack +import org.bukkit.inventory.meta.* +import org.bukkit.potion.PotionEffect +import org.cavepvp.entity.moshi.MoshiUtil +import org.cavepvp.entity.moshi.json.JsonObject + +object LegacyItemStackJsonAdapter { + + @ToJson + fun toJson(item: ItemStack):Map<@JvmSuppressWildcards String,@JvmSuppressWildcards Any?> { + + val toReturn = mutableMapOf() + + toReturn["type"] = item.type.name + toReturn["amount"] = item.amount + toReturn["durability"] = item.durability + + val itemMeta = item.itemMeta + val metadata = mutableMapOf() + + if (itemMeta != null) { + if (itemMeta.hasLore()) { + metadata["lore"] = MoshiUtil.instance.adapter>(MoshiUtil.LIST_STRING_TYPE).toJson(itemMeta.lore) + } + + if (itemMeta.hasEnchants()) { + metadata["enchants"] = MoshiUtil.instance.adapter>(MoshiUtil.STRING_TO_ANY_MAP_TYPE).toJson(itemMeta.enchants.mapKeys{it.key.name}) + } + + if (itemMeta.hasDisplayName()) { + metadata["displayName"] = itemMeta.displayName + } + + when (itemMeta) { + is MapMeta -> { + metadata["scaling"] = itemMeta.isScaling + } + is BookMeta -> { + + if (itemMeta.hasTitle()) { + metadata["title"] = itemMeta.title + } + + if (itemMeta.hasPages()) { + metadata["pages"] = MoshiUtil.instance.adapter>(MoshiUtil.LIST_STRING_TYPE).toJson(itemMeta.pages) + } + + if (itemMeta.hasAuthor()) { + metadata["author"] = itemMeta.author + } + + } + is SkullMeta -> { + + if (itemMeta.hasOwner()) { + metadata["owner"] = itemMeta.owner + } + + } + is PotionMeta -> { + + if (itemMeta.hasCustomEffects()) { + metadata["effects"] = MoshiUtil.instance.adapter>(PotionEffectJsonAdapter.LIST_TYPE).toJson(itemMeta.customEffects) + } + + } + is FireworkMeta -> { + + if (itemMeta.hasEffects()) { + metadata["effects"] = MoshiUtil.instance.adapter>(FireworkEffectJsonAdapter.LIST_TYPE).toJson(itemMeta.effects) + } + + metadata["power"] = itemMeta.power + } + is FireworkEffectMeta -> { + + if (itemMeta.hasEffect()) { + metadata["effect"] = MoshiUtil.instance.adapter(FireworkEffect::class.java).toJson(itemMeta.effect) + } + + } + is LeatherArmorMeta -> { + metadata["color"] = itemMeta.color.asRGB() + } + } + + } + + toReturn["metadata"] = metadata + + return toReturn + } + + @FromJson + fun fromJson(json : Map<@JvmSuppressWildcards String,@JvmSuppressWildcards Any?>):ItemStack { + + val toReturn = ItemStack(Material.valueOf(json["type"] as String)) + + toReturn.amount = (json["amount"] as Double).toInt() + toReturn.durability = (json["durability"] as Double).toInt().toShort() + + val itemMeta = toReturn.itemMeta + val metadata = JsonObject(json["metadata"] as Map<*,*>) + + if (metadata.containsKey("displayName")) { + itemMeta.displayName = metadata.getString("displayName") + } + + if (metadata.containsKey("lore")) { + itemMeta.lore = MoshiUtil.instance.adapter>(MoshiUtil.LIST_STRING_TYPE).fromJson(metadata.getString("lore")!!) + } + + when (itemMeta) { + is MapMeta -> { + itemMeta.isScaling = metadata.getBoolean("scaling") ?: false + } + is BookMeta -> { + + if (metadata.containsKey("title")) { + itemMeta.title = metadata.getString("title") + } + + if (metadata.containsKey("pages")) { + itemMeta.pages = MoshiUtil.instance.adapter>(MoshiUtil.LIST_STRING_TYPE).fromJson(metadata.getString("pages")!!) + } + + if (metadata.containsKey("author")) { + itemMeta.author = metadata.getString("author")!! + } + + } + is SkullMeta -> { + + if (metadata.containsKey("owner")) { + itemMeta.owner = metadata.getString("owner") + } + + } + is PotionMeta -> { + + if (metadata.containsKey("effects")) { + MoshiUtil.instance.adapter>(PotionEffectJsonAdapter.LIST_TYPE).fromJson(metadata.getString("effects")!!)!!.forEach{ + itemMeta.addCustomEffect(it,true) + } + } + + } + is FireworkMeta -> { + + if (metadata.containsKey("effects")) { + MoshiUtil.instance.adapter>(FireworkEffectJsonAdapter.LIST_TYPE).fromJson(metadata.getString("effects")!!)!!.forEach{ + itemMeta.addEffect(it) + } + } + + itemMeta.power = metadata.getInt("power") ?: 1 + } + is FireworkEffectMeta -> { + + if (metadata.containsKey("effect")) { + itemMeta.effect = MoshiUtil.instance.adapter(FireworkEffect::class.java).fromJson(metadata.getString("effect")!!) + } + + } + + is LeatherArmorMeta -> { + itemMeta.color = Color.fromRGB(metadata.getInt("color")!!) + } + } + + toReturn.itemMeta = itemMeta + + + // Enchants always last + if (metadata.containsKey("enchants")) { + MoshiUtil.instance.adapter>(MoshiUtil.STRING_TO_ANY_MAP_TYPE).fromJson(metadata.getString("enchants")!!)!!.entries.associate{ + Enchantment.getByName(it.key) to (it.value as Double).toInt() + }.forEach{toReturn.addUnsafeEnchantment(it.key,it.value)} + } + + return toReturn + } + + +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/moshi/adapter/ListJsonAdapter.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/moshi/adapter/ListJsonAdapter.kt new file mode 100644 index 0000000..f0ca71f --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/moshi/adapter/ListJsonAdapter.kt @@ -0,0 +1,76 @@ +package org.cavepvp.entity.moshi.adapter + + +import java.lang.reflect.Type +import java.util.ArrayList + +import com.squareup.moshi.* +import java.io.IOException + +/** + * @project api + * + * @date 05/16/21 + * @author xanderume@gmail.com + */ +object ListJsonAdapter : JsonAdapter.Factory { + + private val EMPTY_LIST = emptyList() + private val SINGLE_TON_LIST = listOf("") + + override fun create(type: Type,annotations: MutableSet,moshi: Moshi): JsonAdapter<*>? { + + val raw = Types.getRawType(type) + + if (raw == ArrayList::class.java || raw == MutableList::class.java || raw == EMPTY_LIST::class.java || raw == SINGLE_TON_LIST::class.java) { + return newArrayListAdapter(type,moshi).nullSafe() + } + + return null + } + + private fun newArrayListAdapter(type: Type,moshi: Moshi): JsonAdapter> { + return object : ListJsonElementAdapter, T>(moshi.adapter(Types.collectionElementType(type,MutableCollection::class.java))) { + override fun newCollection(): MutableCollection { + return mutableListOf() + } + } + } + + abstract class ListJsonElementAdapter?, T>(private val elementAdapter: JsonAdapter) :JsonAdapter() { + + abstract fun newCollection(): C + + @Throws(IOException::class) + override fun fromJson(reader: JsonReader): C { + val result = newCollection() + + reader.beginArray() + + while (reader.hasNext()) { + result?.add(elementAdapter.fromJson(reader)!!) + } + + reader.endArray() + + return result + } + + @Throws(IOException::class) + override fun toJson(writer: JsonWriter,value: C?) { + writer.beginArray() + + for (element in value!!) { + this.elementAdapter.toJson(writer,element) + } + + writer.endArray() + } + + override fun toString(): String { + return "$elementAdapter.collection()" + } + + } + +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/moshi/adapter/LocalDateTimeJsonAdapter.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/moshi/adapter/LocalDateTimeJsonAdapter.kt new file mode 100644 index 0000000..ee73c29 --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/moshi/adapter/LocalDateTimeJsonAdapter.kt @@ -0,0 +1,19 @@ +package org.cavepvp.entity.moshi.adapter + +import com.squareup.moshi.FromJson +import com.squareup.moshi.ToJson +import java.time.LocalDateTime + +object LocalDateTimeJsonAdapter { + + @ToJson + fun toJson(time: LocalDateTime):String { + return time.toString() + } + + @FromJson + fun fromJson(value: String):LocalDateTime { + return LocalDateTime.parse(value) + } + +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/moshi/adapter/LocationJsonAdapter.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/moshi/adapter/LocationJsonAdapter.kt new file mode 100644 index 0000000..8bbf9dd --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/moshi/adapter/LocationJsonAdapter.kt @@ -0,0 +1,56 @@ +package org.cavepvp.entity.moshi.adapter + +import org.cavepvp.entity.moshi.readDouble +import org.cavepvp.entity.moshi.readFloat +import org.cavepvp.entity.moshi.readString +import org.cavepvp.entity.moshi.write +import com.squareup.moshi.* +import org.bukkit.Bukkit +import org.bukkit.Location + +/** + * @project carnage + * + * @date 27/02/2021 + * @author xanderume@gmail.com + */ +object LocationJsonAdapter : JsonAdapter() { + + override fun toJson(writer: JsonWriter,location: Location?) { + + if (location == null) { + writer.nullValue() + return + } + + writer.beginObject() + + writer.write("world",location.world.name) + writer.write("x",location.x) + writer.write("y",location.y) + writer.write("z",location.z) + writer.write("yaw",location.yaw) + writer.write("pitch",location.pitch) + + writer.endObject() + } + + override fun fromJson(reader: JsonReader): Location? { + + if (!reader.hasNext()) { + return null + } + + reader.beginObject() + + return Location( + Bukkit.getServer().getWorld(reader.readString()), + reader.readDouble(), + reader.readDouble(), + reader.readDouble(), + reader.readFloat(), + reader.readFloat(), + ).also{reader.endObject()} + } + +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/moshi/adapter/PairJsonAdapter.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/moshi/adapter/PairJsonAdapter.kt new file mode 100644 index 0000000..4779a17 --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/moshi/adapter/PairJsonAdapter.kt @@ -0,0 +1,54 @@ +package org.cavepvp.entity.moshi.adapter + +import com.squareup.moshi.* +import java.lang.reflect.ParameterizedType +import java.lang.reflect.Type + +object PairJsonAdapter : JsonAdapter.Factory { + + override fun create(type: Type, annotations: MutableSet,moshi: Moshi): JsonAdapter<*>? { + + if (type !is ParameterizedType) { + return null + } + + if (type.rawType != Pair::class.java) { + return null + } + + return PairAdapter( + moshi.adapter(type.actualTypeArguments[0]), + moshi.adapter(type.actualTypeArguments[1]), + moshi.adapter(Types.newParameterizedType(List::class.java,String::class.java)) + ) + } + + private class PairAdapter( + private val firstAdapter: JsonAdapter, + private val secondAdapter: JsonAdapter, + private val listAdapter: JsonAdapter> + ) : JsonAdapter>() { + + override fun toJson(writer: JsonWriter,value: Pair?) { + writer.beginArray() + this.firstAdapter.toJson(writer,value?.first) + this.secondAdapter.toJson(writer,value?.second) + writer.endArray() + } + + override fun fromJson(reader: JsonReader): Pair? { + + val list = this.listAdapter.fromJson(reader) ?: return null + + require(list.size == 2) { + "pair with more or less than two elements: $list" + } + + val first = this.firstAdapter.fromJsonValue(list[0])!! + val second = this.secondAdapter.fromJsonValue(list[1])!! + + return first to second + } + + } +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/moshi/adapter/PotionEffectJsonAdapter.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/moshi/adapter/PotionEffectJsonAdapter.kt new file mode 100644 index 0000000..6a1bd45 --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/moshi/adapter/PotionEffectJsonAdapter.kt @@ -0,0 +1,51 @@ +package org.cavepvp.entity.moshi.adapter + +import com.squareup.moshi.* +import org.bukkit.potion.PotionEffect +import org.bukkit.potion.PotionEffectType +import org.cavepvp.entity.moshi.readBoolean +import org.cavepvp.entity.moshi.readInt +import org.cavepvp.entity.moshi.write +import java.lang.reflect.ParameterizedType + +/** + * @project carnage + * + * @date 28/02/2021 + * @author xanderume@gmail.com + */ +object PotionEffectJsonAdapter : JsonAdapter() { + + val LIST_TYPE: ParameterizedType = Types.newParameterizedType(List::class.java,PotionEffect::class.java) + + override fun toJson(writer: JsonWriter,effect: PotionEffect?) { + + if (effect == null) { + writer.nullValue() + return + } + + writer.beginObject() + writer.write("effect",effect.type.id) + writer.write("duration",effect.duration) + writer.write("amplifier",effect.amplifier) + writer.write("ambient",effect.isAmbient) + writer.endObject() + } + + override fun fromJson(reader: JsonReader): PotionEffect? { + if (!reader.hasNext()) { + return null + } + + reader.beginObject() + + return PotionEffect( + PotionEffectType.getById(reader.readInt()), + reader.readInt(), + reader.readInt(), + reader.readBoolean(), + ).also{reader.endObject()} + } + +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/moshi/adapter/SerializeNullAdapter.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/moshi/adapter/SerializeNullAdapter.kt new file mode 100644 index 0000000..8015de3 --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/moshi/adapter/SerializeNullAdapter.kt @@ -0,0 +1,28 @@ +package org.cavepvp.entity.moshi.adapter + +import org.cavepvp.entity.moshi.annotation.SerializeNull +import com.squareup.moshi.JsonAdapter +import com.squareup.moshi.Moshi +import com.squareup.moshi.Types +import java.lang.reflect.Type + +/** + * @project carnage + * + * @date 05/22/21 + * @author xanderume@gmail.com + */ +object SerializeNullAdapter : JsonAdapter.Factory { + + override fun create(type: Type,annotations: MutableSet,moshi: Moshi): JsonAdapter? { + + val annotation = Types.nextAnnotations(annotations, SerializeNull::class.java) + + if (annotation == null || annotation.isEmpty()) { + return null + } + + return moshi.nextAdapter(this,type,annotation).serializeNulls() + } + +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/moshi/adapter/UUIDJsonAdapter.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/moshi/adapter/UUIDJsonAdapter.kt new file mode 100644 index 0000000..4e19016 --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/moshi/adapter/UUIDJsonAdapter.kt @@ -0,0 +1,31 @@ +package org.cavepvp.entity.moshi.adapter + +import java.util.* +import com.squareup.moshi.* + +/** + * @project api + * + * @date 05/16/21 + * @author xanderume@gmail.com + */ +object UUIDJsonAdapter { + + private val REGEX = Regex("(\\w{8})(\\w{4})(\\w{4})(\\w{4})(\\w{12})") + + @ToJson + fun toJson(uuid: UUID):String { + return uuid.toString() + } + + @FromJson + fun fromJson(json: String):UUID { + + if (json.length == 36) { + UUID.fromString(json) + } + + return UUID.fromString(REGEX.replaceFirst(json,"$1-$2-$3-$4-$5")) + } + +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/moshi/adapter/world/WorldJsonAdapter.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/moshi/adapter/world/WorldJsonAdapter.kt new file mode 100644 index 0000000..0693bb0 --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/moshi/adapter/world/WorldJsonAdapter.kt @@ -0,0 +1,22 @@ +package org.cavepvp.entity.moshi.adapter.world + +import com.squareup.moshi.FromJson +import com.squareup.moshi.ToJson +import org.bukkit.Bukkit +import org.bukkit.World +import java.util.* + +object WorldJsonAdapter { + + @ToJson + fun toJson(@WorldSerializer world: World):String { + return world.uid.toString() + } + + @FromJson + @WorldSerializer + fun fromJson(value: String):World { + return Bukkit.getServer().getWorld(UUID.fromString(value)) + } + +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/moshi/adapter/world/WorldNameJsonAdapter.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/moshi/adapter/world/WorldNameJsonAdapter.kt new file mode 100644 index 0000000..c8e7e99 --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/moshi/adapter/world/WorldNameJsonAdapter.kt @@ -0,0 +1,21 @@ +package org.cavepvp.entity.moshi.adapter.world + +import com.squareup.moshi.FromJson +import com.squareup.moshi.ToJson +import org.bukkit.Bukkit +import org.bukkit.World + +object WorldNameJsonAdapter { + + @ToJson + fun toJson(@WorldNameSerializer world: World):String { + return world.name + } + + @FromJson + @WorldNameSerializer + fun fromJson(value: String):World { + return Bukkit.getServer().getWorld(value) + } + +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/moshi/adapter/world/WorldNameSerializer.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/moshi/adapter/world/WorldNameSerializer.kt new file mode 100644 index 0000000..9ce89fd --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/moshi/adapter/world/WorldNameSerializer.kt @@ -0,0 +1,8 @@ +package org.cavepvp.entity.moshi.adapter.world + +import com.squareup.moshi.JsonQualifier + +@Retention(AnnotationRetention.RUNTIME) +@Target(AnnotationTarget.FIELD,AnnotationTarget.FUNCTION,AnnotationTarget.TYPE_PARAMETER,AnnotationTarget.VALUE_PARAMETER) +@JsonQualifier +annotation class WorldNameSerializer diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/moshi/adapter/world/WorldSerializer.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/moshi/adapter/world/WorldSerializer.kt new file mode 100644 index 0000000..f8e1de1 --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/moshi/adapter/world/WorldSerializer.kt @@ -0,0 +1,8 @@ +package org.cavepvp.entity.moshi.adapter.world + +import com.squareup.moshi.JsonQualifier + +@Retention(AnnotationRetention.RUNTIME) +@Target(AnnotationTarget.FIELD,AnnotationTarget.FUNCTION,AnnotationTarget.TYPE_PARAMETER,AnnotationTarget.VALUE_PARAMETER) +@JsonQualifier +annotation class WorldSerializer \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/moshi/annotation/SerializeNull.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/moshi/annotation/SerializeNull.kt new file mode 100644 index 0000000..3914d8d --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/moshi/annotation/SerializeNull.kt @@ -0,0 +1,13 @@ +package org.cavepvp.entity.moshi.annotation + +import com.squareup.moshi.JsonQualifier + +/** + * @project carnage + * + * @date 05/22/21 + * @author xanderume@gmail.com + */ +@Retention(AnnotationRetention.RUNTIME) +@JsonQualifier +annotation class SerializeNull \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/moshi/json/JsonObject.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/moshi/json/JsonObject.kt new file mode 100644 index 0000000..ce5627e --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/moshi/json/JsonObject.kt @@ -0,0 +1,118 @@ +package org.cavepvp.entity.moshi.json + +import org.cavepvp.entity.moshi.MoshiUtil +import com.squareup.moshi.Moshi + +class JsonObject { + + private var json = "{}" + private var jsonUpdateRequired = true + + constructor() { + this.entries = mutableMapOf() + } + + constructor(entries: Map<*,*>) { + + val newEntries = mutableMapOf() + + for (entry in entries) { + + if (entry.key !is String || entry.value == null) { + continue + } + + newEntries[entry.key as String] = entry.value!! + } + + this.entries = newEntries + } + + private var entries: MutableMap + + fun get():Map { + return this.entries + } + + operator fun set(key: String,value: Any) { + this.entries[key] = value + this.jsonUpdateRequired = true + } + + fun containsKey(key: String):Boolean { + return this.entries.containsKey(key) + } + + fun getInt(key: String):Int? { + + val value = this.entries[key] + + if (value is Double) { + return value.toInt() + } + + return value as? Int + } + + fun getLong(key: String):Long? { + + val value = this.entries[key] + + if (value is Double) { + return value.toLong() + } + + return value as? Long + } + + fun getFloat(key: String):Float? { + return this.entries[key] as? Float + } + + fun getString(key: String):String? { + return this.entries[key] as? String + } + + fun getDouble(key: String):Double? { + return this.entries[key] as? Double + } + + fun getBoolean(key: String):Boolean? { + return this.entries[key] as? Boolean + } + + fun getJsonObject(key: String): JsonObject { + val value = this.entries[key] + return when { + value is Map<*,*> -> JsonObject(value) + value is String && value.isNotEmpty() && value[0] == '{' && value[value.lastIndex] == '}' -> { + + val fromJson = fromJson(value) + + // re-update value in cache to a Map so we don't have to deserialize again. + this.entries[key] = fromJson.get() + + fromJson + } + else -> JsonObject() + } + + } + + fun toJson(moshi: Moshi):String { + + if (this.jsonUpdateRequired) { + this.json = moshi.adapter>(MoshiUtil.STRING_TO_ANY_MAP_TYPE).toJson(this.entries)!! + } + + return this.json + } + + companion object { + + fun fromJson(value: String): JsonObject { + return JsonObject(MoshiUtil.instance.adapter>(MoshiUtil.STRING_TO_ANY_MAP_TYPE).fromJson(value)!!) + } + + } +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/thread/EntityThread.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/thread/EntityThread.kt new file mode 100644 index 0000000..753ad0a --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/thread/EntityThread.kt @@ -0,0 +1,102 @@ +package org.cavepvp.entity.thread + +import org.bukkit.Bukkit +import org.bukkit.craftbukkit.v1_7_R4.CraftWorld +import org.cavepvp.entity.EntityHandler +import org.cavepvp.entity.EntityPlugin +import org.cavepvp.entity.EntityVisibility +import org.cavepvp.entity.ai.ShardEntityAI +import org.cavepvp.entity.ai.ShardPacketAI +import org.cavepvp.entity.type.npc.NPC +import org.cavepvp.entity.type.npc.NPCAnimationType +import org.cavepvp.entity.util.NMSUtil + +object EntityThread : Thread("Shard - Entity Thread") { + + private var tick = 0 + + // TODO We could possible cache the entity's surrounding chunks and see if the players are in those chunks? + override fun run() { + + while (true) { + + var tickViewers = false + + if (++this.tick > 20) { + this.tick = 0 + tickViewers = true + } + + EntityHandler.getAllEntities().forEach{entity -> + + if (entity.visibility == EntityVisibility.HIDDEN) { + return@forEach + } + + if (tickViewers) { + + try { + ShardEntityAI.handleEntityViewerTick(entity) + } catch (ex: ConcurrentModificationException) { + EntityPlugin.instance.logger.info("vSpigot entity tracker would have crashed the thread but it has been prevented.") + } + + } + + val viewers = entity.getAllViewers() + + if (entity.initialized) { + entity.tick = this.tick + entity.onTick() + + if (entity is NPC && entity.faces) { + + val outsideOfFacing = entity.lookingTowards.toHashSet() + + (entity.location.world as CraftWorld).handle.playerMap.forEachNearby(entity.location.x,entity.location.y,entity.location.z,NPC.FACE_DISTANCE,true) { + + if (outsideOfFacing.contains(it.uniqueID)) { + outsideOfFacing.remove(it.uniqueID) + } + + entity.lookTowardsPlayer(it.bukkitEntity,false) + } + + if (outsideOfFacing.isNotEmpty()) { + + val packets = arrayListOf( + ShardPacketAI.createEntityHeadRotation(entity.id,entity.location.yaw), + ShardPacketAI.createEntityLook(entity.id,entity.location.yaw,entity.location.pitch,true) + ) + + if (entity.swing) { + packets.add(ShardPacketAI.createEntityAnimation(entity.id, NPCAnimationType.SWING.id)) + } + + outsideOfFacing.forEach{ + entity.lookingTowards.remove(it) + + val player = Bukkit.getServer().getPlayer(it) ?: return@forEach + + packets.forEach{packet -> NMSUtil.sendPacket(player,packet)} + } + } + } + + } + + entity.animations.forEach{ + // We tick the animation and set the values there, + // then we loop through all the players and tick it individually for performance, + // this reduces the amount of viewer loops + it.onTick(entity) + viewers.forEach{viewer -> it.onTick(entity,viewer)} + } + } + + sleep(50) + } + + } + +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/type/hologram/Hologram.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/type/hologram/Hologram.kt new file mode 100644 index 0000000..f36c647 --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/type/hologram/Hologram.kt @@ -0,0 +1,181 @@ +package org.cavepvp.entity.type.hologram + +import org.cavepvp.entity.Entity +import org.cavepvp.entity.EntityHandler +import org.cavepvp.entity.type.hologram.line.HologramLine +import org.cavepvp.entity.type.hologram.line.type.HologramItemLine +import org.cavepvp.entity.type.hologram.line.type.HologramTextLine +import com.squareup.moshi.JsonClass +import org.bukkit.Location +import org.bukkit.entity.EntityType +import org.bukkit.entity.Player +import org.bukkit.inventory.ItemStack +import org.cavepvp.entity.ai.ShardEntityAI + +/** + * @project carnage + * + * @date 15/02/2021 + * @author xanderume@gmail.com + */ +@JsonClass(generateAdapter = true) +open class Hologram(name: String,location: Location,parent: Int? = null) : Entity(name,location,parent) { + + var lines = mutableListOf() + + override fun init() {} + + override fun getEntityType(): EntityType { + return EntityType.WITHER_SKULL + } + + override fun sendCreatePacket(player: Player) { + ShardEntityAI.sendHologramCreatePacket(player,this) + } + + override fun sendUpdatePacket(player: Player) { + ShardEntityAI.sendHologramUpdatePacket(player,this) + } + + override fun sendRefreshPacket(player: Player) { + ShardEntityAI.sendHologramRefreshPacket(player,this) + } + + override fun sendDestroyPacket(player: Player) { + ShardEntityAI.sendHologramDestroyPacket(player,this) + } + + operator fun set(index: Int,text: String) { + this.setText(index,text) + } + + operator fun set(index: Int,item: ItemStack) { + this.setItem(index,item) + } + + fun addText(text: String) { + + for (line in this.lines) { + line.location.add(0.0,TEXT_IN_BETWEEN_DISTANCE,0.0) + } + + this.lines.add(HologramTextLine(text,this.location.clone().subtract(0.0,TEXT_IN_BETWEEN_DISTANCE,0.0))) + this.sendToAll{this.sendRefreshPacket(it)} + } + + fun addItem(item: ItemStack) { + + for (line in this.lines) { + line.location.add(0.0, TEXT_IN_BETWEEN_DISTANCE,0.0) + } + + this.lines.add(HologramItemLine(item,this.location.clone().subtract(0.0, TEXT_IN_BETWEEN_DISTANCE,0.0))) + this.sendToAll{this.sendRefreshPacket(it)} + } + + fun setText(index: Int,text: String) { + + if (index > this.lines.lastIndex) { + this.addText(text) + return + } + + val line = this.lines[index] + + if (line is HologramTextLine) { + line.setText(text) + this.sendToAll{line.update(it)} + return + } + + this.lines[index] = HologramTextLine(text,line.location.clone().add(0.0, TEXT_IN_BETWEEN_DISTANCE,0.0)) + this.sendToAll{line.destroy(it);this.lines[index].render(it)} + } + + fun setText(vararg lines: String) { + + for (i in lines.indices) { + + if (i <= this.lines.lastIndex) { + this.setText(i,lines[i]) + } else { + this.addText(lines[i]) + } + + } + + } + + fun setItem(index: Int,item: ItemStack) { + + if (index > this.lines.lastIndex) { + this.addItem(item) + return + } + + val line = this.lines[index] + + if (line is HologramItemLine) { + line.item = item + this.sendToAll{line.update(it)} + return + } + + this.lines[index] = HologramItemLine(item,line.location.clone().subtract(0.0, TEXT_IN_BETWEEN_DISTANCE,0.0)) + this.sendToAll{line.destroy(it);this.lines[index].render(it)} + } + + fun remove(index: Int) { + + if (index > this.lines.lastIndex) { + return + } + + val removed = this.lines.removeAt(index) + + this.sendToAll{removed.destroy(it)} + + val toReload = this.lines.withIndex().filter{it.index >= index}.map{it.value} + + this.sendToAll{toReload.forEach{hologram -> hologram.destroy(it);hologram.render(it)}} + } + + override fun updateLocation(location: Location) { + this.sendToAll{this.sendDestroyPacket(it)} + this.location = location + + val clone = this.lines.toList() + + this.lines.clear() + + clone.forEach{ + + when (it) { + is HologramItemLine -> this.addItem(it.item) + is HologramTextLine -> this.addText(it.text) + } + + } + + //TODO PacketPlayOutEntityTeleport + + this.sendToAll{this.sendCreatePacket(it)} + } + + override fun sendToAll(lambda: (player: Player) -> Unit) { + + if (this.parent == null) { + super.sendToAll(lambda) + return + } + + EntityHandler.getEntityById(this.parent!!)?.sendToAll(lambda) ?: super.sendToAll(lambda) + } + + companion object { + + const val TEXT_IN_BETWEEN_DISTANCE = 0.23 + const val ITEM_IN_BETWEEN_DISTANCE = 0.46 + + } +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/type/hologram/adapter/HologramAdapter.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/type/hologram/adapter/HologramAdapter.kt new file mode 100644 index 0000000..c46bc5a --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/type/hologram/adapter/HologramAdapter.kt @@ -0,0 +1,15 @@ +package org.cavepvp.entity.type.hologram.adapter + +import org.bukkit.entity.Player + +/** + * @author brew@atheist.com + * + * @date 4/24/2021 + * @project carnage + */ +interface HologramAdapter { + + fun resolve(player: Player): HashMap + +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/type/hologram/line/HologramLine.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/type/hologram/line/HologramLine.kt new file mode 100644 index 0000000..3c12372 --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/type/hologram/line/HologramLine.kt @@ -0,0 +1,30 @@ +package org.cavepvp.entity.type.hologram.line + +import com.squareup.moshi.JsonClass +import org.bukkit.Location +import org.bukkit.entity.Player +import org.cavepvp.entity.util.EntityUtil + +/** + * @project carnage + * + * @date 24/02/2021 + * @author xanderume@gmail.com + */ +@JsonClass(generateAdapter = false) +abstract class HologramLine(var location: Location) { + + @Transient val skullId = EntityUtil.getNewEntityId() + @Transient val horseId = EntityUtil.getNewEntityId() + + abstract fun render(player: Player) + abstract fun update(player: Player) + abstract fun destroy(player: Player) + + companion object { + + const val ARMOR_STAND_ID = 30 + + } + +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/type/hologram/line/type/HologramItemLine.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/type/hologram/line/type/HologramItemLine.kt new file mode 100644 index 0000000..c630d6d --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/type/hologram/line/type/HologramItemLine.kt @@ -0,0 +1,24 @@ +package org.cavepvp.entity.type.hologram.line.type + +import org.cavepvp.entity.type.hologram.line.HologramLine +import com.squareup.moshi.JsonClass +import org.bukkit.Location +import org.bukkit.entity.Player +import org.bukkit.inventory.ItemStack + + +/** + * @project carnage + * + * @date 04/08/21 + * @author xanderume@gmail.com + */ +@JsonClass(generateAdapter = true) +class HologramItemLine(var item: ItemStack,location: Location) : HologramLine(location) { + + //TODO + override fun render(player: Player) {} + override fun update(player: Player) {} + override fun destroy(player: Player) {} + +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/type/hologram/line/type/HologramTextLine.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/type/hologram/line/type/HologramTextLine.kt new file mode 100644 index 0000000..4f25a4f --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/type/hologram/line/type/HologramTextLine.kt @@ -0,0 +1,75 @@ +package org.cavepvp.entity.type.hologram.line.type + +import org.cavepvp.entity.EntityHandler +import org.cavepvp.entity.type.hologram.line.HologramLine +import com.squareup.moshi.JsonClass +import org.bukkit.ChatColor + +import org.bukkit.Location +import org.bukkit.entity.Player +import org.cavepvp.entity.ai.ShardEntityAI + +/** + * @project carnage + * + * @date 24/02/2021 + * @author xanderume@gmail.com + */ +@JsonClass(generateAdapter = true) +class HologramTextLine(var text: String,location: Location) : HologramLine(location) { + + @Transient var blank = this.text == " " || this.text.equals("blank",true) + @Transient var textLowerCase = this.text.toLowerCase() + + override fun render(player: Player) { + + var text = this.text + + for (map in EntityHandler.getAdapters().map{it.resolve(player)}) { + + for (entry in map) { + + if (!this.textLowerCase.contains(entry.key.toLowerCase())) { + continue + } + + text = text.replace(entry.key,entry.value.toString(),true) + } + + } + + ShardEntityAI.renderHologramTextLine(player,text,this) + } + + override fun update(player: Player) { + + var text = this.text + + for (map in EntityHandler.getAdapters().map{it.resolve(player)}) { + + for (entry in map) { + + if (!this.textLowerCase.contains(entry.key.toLowerCase())) { + continue + } + + text = text.replace(entry.key,entry.value.toString(),true) + } + + } + + ShardEntityAI.updateHologramTextLine(player,text,this) + } + + override fun destroy(player: Player) { + ShardEntityAI.destroyHologramTextLine(player,this) + } + + @JvmName("setText1") + fun setText(value: String) { + this.text = ChatColor.translateAlternateColorCodes('&',value) + this.blank = this.text.equals("blank",true) + this.textLowerCase = value.toLowerCase() + } + +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/type/npc/NPC.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/type/npc/NPC.kt new file mode 100644 index 0000000..909db97 --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/type/npc/NPC.kt @@ -0,0 +1,296 @@ +package org.cavepvp.entity.type.npc + +import cc.fyre.proton.menu.Button +import org.cavepvp.entity.Entity +import org.cavepvp.entity.EntityVisibility +import org.cavepvp.entity.event.NPCNameTagStateEvent +import org.cavepvp.entity.type.hologram.Hologram +import com.squareup.moshi.JsonClass +import net.minecraft.util.com.mojang.authlib.GameProfile +import net.minecraft.util.com.mojang.authlib.properties.Property +import org.bukkit.Bukkit +import org.bukkit.GameMode +import org.bukkit.Location +import org.bukkit.Material +import org.bukkit.entity.EntityType +import org.bukkit.entity.Player +import org.bukkit.inventory.ItemStack +import org.cavepvp.entity.ai.ShardEntityAI +import org.cavepvp.entity.ai.ShardPacketAI +import org.cavepvp.entity.util.EntityUtil +import org.cavepvp.entity.util.ItemPart +import org.cavepvp.entity.util.NMSUtil +import org.cavepvp.entity.util.PlayerUtil +import java.util.* +import java.util.concurrent.ConcurrentHashMap +import kotlin.math.abs +import kotlin.math.acos +import kotlin.math.sqrt +import kotlin.reflect.jvm.internal.impl.builtins.StandardNames.FqNames.target + +/** + * @project carnage + * + * @date 15/02/2021 + * @author xanderume@gmail.com + */ +@JsonClass(generateAdapter = true) +open class NPC(name: String,location: Location) : Entity(name,location,null) { + + val uuid: UUID = UUID.randomUUID() + + var swing = true + var faces = false + + var commands = mutableListOf() + var hologram = Hologram("NPC_${this.name}_HOLOGRAM",location.clone().add(0.0,2.0,0.0),this.id) + var equipment = arrayOfNulls(5) + + var texture: String? = null + var signature: String? = null + var skinUsername: String? = null + + var tabVisibility = EntityVisibility.VISIBLE + var tagVisibility = EntityVisibility.VISIBLE + + @Transient var batId = EntityUtil.getNewEntityId() + @Transient var profile = GameProfile(this.uuid,this.name) + @Transient val lookingTowards: MutableSet = ConcurrentHashMap.newKeySet() + + override fun init() { + + if (this.name.length > 16) { + this.name = this.name.substring(0,15) + } + + this.profile.properties["textures"].add(Property("textures",this.texture ?: "",this.signature ?: "")) + } + + override fun getEntityType(): EntityType { + return EntityType.PLAYER + } + + override fun sendCreatePacket(player: Player) { + ShardEntityAI.sendNPCCreatePacket(player,this) + + this.sendEquipment(player) + this.hologram.sendCreatePacket(player) + } + + override fun sendUpdatePacket(player: Player) { + ShardEntityAI.sendNPCUpdatePacket(player,this) + } + + override fun sendRefreshPacket(player: Player) { + ShardEntityAI.sendNPCRefreshPacket(player,this) + } + + override fun sendDestroyPacket(player: Player) { + ShardEntityAI.sendNPCDestroyPacket(player,this) + } + + override fun updateLocation(location: Location) { + this.location = location + this.hologram.updateLocation(location.clone().add( + 0.0, + if (this.tagVisibility == EntityVisibility.HIDDEN) 2+HOLOGRAM_DISTANCE else 2+HOLOGRAM_DISTANCE_WITH_NAME_TAG, + 0.0 + )) + } + + fun setSkin(player: Player) { + + val property = NMSUtil.getGameProfile(player).properties["textures"].firstOrNull() ?: return + + this.texture = property.value + this.signature = property.signature + this.skinUsername = player.name + + val properties = this.profile.properties["textures"] + + properties.clear() + properties.add(Property("textures",this.texture ?: "",this.signature ?: "")) + + this.sendToAll{ + this.sendDestroyPacket(it) + this.sendCreatePacket(it) + } + } + + fun setSkin(username: String?,texture: String?,signature: String?) { + + this.texture = texture + this.signature = signature + this.skinUsername = username + + val properties = this.profile.properties["textures"] + + properties.clear() + properties.add(Property("textures",this.texture ?: "",this.signature ?: "")) + + this.sendToAll{ + this.sendDestroyPacket(it) + this.sendCreatePacket(it) + } + } + + fun updateTabVisibility(visibility: EntityVisibility) { + + if (this.tabVisibility == visibility) { + return + } + + val packet = if (visibility == EntityVisibility.HIDDEN) { + ShardPacketAI.createPlayerInfoRemove(this.name,this.profile) + } else { + ShardPacketAI.createPlayerInfoAdd(0,GameMode.CREATIVE,this.name,this.profile) + } + + this.tabVisibility = visibility + this.sendToAll{PlayerUtil.sendPacket(it,packet)} + } + + fun updateTagVisibility(visibility: EntityVisibility) { + + if (this.tagVisibility == visibility) { + return + } + + this.hologram.updateLocation(this.location.clone().add( + 0.0, + if (this.tagVisibility == EntityVisibility.HIDDEN) HOLOGRAM_DISTANCE else HOLOGRAM_DISTANCE_WITH_NAME_TAG, + 0.0 + )) + this.tagVisibility = visibility + + Bukkit.getPluginManager().callEvent(NPCNameTagStateEvent(this,visibility)) + } + + open fun getEquipment(slot: Int):ItemStack? { + return this.equipment[slot] + } + + open fun getEquipment(part: ItemPart):ItemStack? { + return this.getEquipment(part.ordinal) + } + + open fun setEquipment(slot: Int,item: ItemStack?) { + + if (this.equipment[slot] == item) { + return + } + + this.equipment[slot] = item + + ShardPacketAI.createEquipment(this.id,slot,item).also{packet -> + this.sendToAll{PlayerUtil.sendPacket(it,packet)} + } + } + + open fun setEquipment(part: ItemPart,item: ItemStack?) { + this.setEquipment(part.ordinal,item) + } + + fun setEquipmentInternal(slot: Int,item: ItemStack?) { + + if (this.equipment[slot] == item) { + return + } + + this.equipment[slot] = item + } + + fun setEquipmentInternal(part: ItemPart,item: ItemStack?) { + this.setEquipmentInternal(part.ordinal,item) + } + + fun sendEquipment(player: Player) { + + for (i in 0..this.equipment.lastIndex) { + + var item = this.equipment[i] + + if (item == null) { + item = ItemStack(Material.AIR) + } + + PlayerUtil.sendPacket(player,ShardPacketAI.createEquipment(this.id,i,item)) + } + + } + + fun ensureTagVisibility(player: Player) { + ShardEntityAI.sendNPCTagVisibility(player,this) + } + + @JvmName("setFaces1") + fun setFaces(value: Boolean) { + + if (this.faces == value) { + return + } + + + if (!value) { + + val packets = arrayOf( + ShardPacketAI.createEntityHeadRotation(this.id,this.location.yaw), + ShardPacketAI.createEntityLook(this.id,this.location.yaw,this.location.pitch,true), + ShardPacketAI.createEntityAnimation(this.id,NPCAnimationType.SWING.id) + ) + + this.sendToAll{packets.forEach{packet -> PlayerUtil.sendPacket(it,packet)}} + } + + this.faces = value + } + + fun lookTowardsPlayer(player: Player,headOnly: Boolean) { + + val to = player.location.clone() + val fromLocation = this.location.clone() + + val xDiff: Double = to.x - fromLocation.x + val yDiff: Double = to.y - fromLocation.y + val zDiff: Double = to.z - fromLocation.z + + val distanceXZ = sqrt(xDiff * xDiff + zDiff * zDiff) + val distanceY = sqrt(distanceXZ * distanceXZ + yDiff * yDiff) + + var yaw = Math.toDegrees(acos(xDiff / distanceXZ)) + val pitch = Math.toDegrees(acos(yDiff / distanceY)) - 90 + + if (zDiff < 0.0) { + yaw += abs(180 - yaw) * 2 + } + + yaw -= 90 + + if (headOnly) { + PlayerUtil.sendPacket(player,ShardPacketAI.createEntityHeadRotation(this.id,yaw.toFloat())) + } else { + PlayerUtil.sendPacket(player,ShardPacketAI.createEntityHeadRotation(this.id,yaw.toFloat())) + PlayerUtil.sendPacket(player,ShardPacketAI.createEntityLook(this.id,yaw.toFloat(),pitch.toFloat(),true)) + } + + if (this.lookingTowards.contains(player.uniqueId)) { + return + } + + this.lookingTowards.add(player.uniqueId) + } + + open fun getEditorButtons():Map { + return mapOf() + } + + companion object { + + const val FACE_DISTANCE = 5.0 + + const val HOLOGRAM_DISTANCE = 0.095 + const val HOLOGRAM_DISTANCE_WITH_NAME_TAG = 0.3 + + } + +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/type/npc/NPCAnimationType.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/type/npc/NPCAnimationType.kt new file mode 100644 index 0000000..3dcb9cc --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/type/npc/NPCAnimationType.kt @@ -0,0 +1,11 @@ +package org.cavepvp.entity.type.npc + +enum class NPCAnimationType(val id: Int) { + + EAT(3), + SWING(0), + DAMAGE(1), + CRITICAL_HIT(4), + MAGIC_CRITICAL_HIT(5) + +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/type/npc/listener/NPCVisibilityListener.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/type/npc/listener/NPCVisibilityListener.kt new file mode 100644 index 0000000..94db35e --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/type/npc/listener/NPCVisibilityListener.kt @@ -0,0 +1,21 @@ +package org.cavepvp.entity.type.npc.listener + +import org.cavepvp.entity.event.NPCNameTagStateEvent +import org.bukkit.event.EventHandler +import org.bukkit.event.EventPriority +import org.bukkit.event.Listener + +/** + * @project carnage + * + * @date 03/21/21 + * @author xanderume@gmail.com + */ +object NPCVisibilityListener: Listener { + + @EventHandler(priority = EventPriority.MONITOR) + private fun onStateChange(event: NPCNameTagStateEvent) { + event.npc.sendToAll{event.npc.ensureTagVisibility(it)} + } + +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/util/ColorUtil.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/util/ColorUtil.kt new file mode 100644 index 0000000..67bf049 --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/util/ColorUtil.kt @@ -0,0 +1,90 @@ +package cc.fyre.shard.util.bukkit + +import org.apache.commons.lang.WordUtils +import org.bukkit.ChatColor +import org.bukkit.DyeColor + +/** + * @project carnage + * + * @date 28/02/2021 + * @author xanderume@gmail.com + */ +object ColorUtil { + + private val colorToDyeColor = mutableMapOf( + ChatColor.BLACK to DyeColor.BLACK, + ChatColor.DARK_BLUE to DyeColor.BLUE, + ChatColor.DARK_GREEN to DyeColor.GREEN, + ChatColor.DARK_AQUA to DyeColor.CYAN, + ChatColor.DARK_RED to DyeColor.RED, + ChatColor.DARK_PURPLE to DyeColor.PURPLE, + ChatColor.GOLD to DyeColor.ORANGE, + ChatColor.GRAY to DyeColor.SILVER, + ChatColor.DARK_GRAY to DyeColor.GRAY, + ChatColor.BLUE to DyeColor.BLUE, + ChatColor.GREEN to DyeColor.LIME, + ChatColor.AQUA to DyeColor.LIGHT_BLUE, + ChatColor.RED to DyeColor.RED, + ChatColor.LIGHT_PURPLE to DyeColor.MAGENTA, + ChatColor.YELLOW to DyeColor.YELLOW, + ) + private val dyeColorToColor = mutableMapOf() + private val colorToDisplayName = mutableMapOf() + + init { + + for (color in ChatColor.values()) { + + if (this.colorToDyeColor.containsKey(color)) { + this.dyeColorToColor[this.colorToDyeColor[color]!!] = color + } + + this.colorToDisplayName[color] = WordUtils.capitalizeFully(color.name.toLowerCase().replace("_"," ")) + } + + } + + @JvmStatic + fun getName(color: ChatColor):String { + return colorToDisplayName[color]!! + } + + @JvmStatic + fun getName(color: DyeColor):String { + return getName(dyeColorToColor[color] ?: ChatColor.WHITE) + } + + @JvmStatic + fun getDyeColor(color: ChatColor):DyeColor { + return colorToDyeColor[color] ?: DyeColor.WHITE + } + + @JvmStatic + fun getWoolColor(color: ChatColor):Byte { + return (colorToDyeColor[color] ?: DyeColor.WHITE).woolData + } + + @JvmStatic + fun getChatColorByChar(char: Char):ChatColor { + return ChatColor.getByChar(char) ?: ChatColor.WHITE + } + + @JvmStatic + fun convertColorValue(value: Double): Double { + + var toReturn = value + + if (toReturn <= 0.0) { + toReturn = -1.0 + } + + return toReturn / 255.0 + } + + @JvmStatic + fun getChatColorByIndex(index: Int):ChatColor { + return ChatColor.values()[index] + } + +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/util/EntityUtil.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/util/EntityUtil.kt new file mode 100644 index 0000000..fc747b3 --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/util/EntityUtil.kt @@ -0,0 +1,24 @@ +package org.cavepvp.entity.util + +/** + * @project carnage + * + * @date 15/02/2021 + * @author xanderume@gmail.com + */ +object EntityUtil { + + private var count = Integer.MAX_VALUE + + @JvmStatic + fun getEntityCount():Int { + //return ENTITY_COUNT_FIELD.getInt(null) + return count + } + + @JvmStatic + fun getNewEntityId():Int { + return count-- + } + +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/util/EzPrompt.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/util/EzPrompt.kt new file mode 100644 index 0000000..19dcae0 --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/util/EzPrompt.kt @@ -0,0 +1,96 @@ +package org.cavepvp.entity.util + +import cc.fyre.proton.Proton +import cc.fyre.proton.menu.Menu +import org.bukkit.ChatColor +import org.bukkit.conversations.ConversationContext +import org.bukkit.conversations.Prompt +import org.bukkit.conversations.StringPrompt +import org.bukkit.entity.Player + +open class EzPrompt(protected val lambda: (T) -> Unit) : StringPrompt() { + + protected var text = "${ChatColor.GREEN}Please input a value." + private var limit = -1 + private var regex: Regex? = null + private var restoreMenu = true + private var failureLambda: ((String) -> Unit)? = null + + fun withText(text: String): EzPrompt { + this.text = text + return this + } + + fun withRegex(regex: Regex): EzPrompt { + this.regex = regex + return this + } + + fun withLimit(limit: Int): EzPrompt { + this.limit = limit + return this + } + + fun withRestoreMenu(value: Boolean): EzPrompt { + this.restoreMenu = value + return this + } + + fun onFailure(use: (String) -> Unit): EzPrompt { + this.failureLambda = use + return this + } + + override fun getPromptText(context: ConversationContext): String { + return this.text + } + + override fun acceptInput(context: ConversationContext, input: String): Prompt? { + + val player = context.forWhom as Player + + val menu = Menu.getCurrentlyOpenedMenus()[player.uniqueId] + + if (menu != null) { + player.closeInventory() + } + + if (this.limit != -1 && input.length > this.limit) { + player.sendRawMessage("${ChatColor.RED}Input text is too long! (${input.length} > ${this.limit})") + this.failureLambda?.invoke(input) + return Prompt.END_OF_CONVERSATION + } + + if (this.regex != null && !input.matches(this.regex!!)) { + player.sendRawMessage("${ChatColor.RED}Input text does not match regex pattern ${this.regex!!.pattern}.") + this.failureLambda?.invoke(input) + return Prompt.END_OF_CONVERSATION + } + + try { + this.lambda.invoke(input as T) + } catch (ex: Exception) { + player.sendRawMessage("${ChatColor.RED}Failed to handle input: ${ChatColor.WHITE}${input}") + this.failureLambda?.invoke(input) + } + + if (menu != null && this.restoreMenu) { + menu.openMenu(player) + } + + return Prompt.END_OF_CONVERSATION + } + + fun start(player: Player) { + PlayerUtil.startPrompt(player,this) + } + + companion object { + + val NAME_PROMPT = "${ChatColor.GREEN}Please input a name. ${ChatColor.GRAY}(Colors supported, limit of 48 characters)" + val IDENTIFIER_PROMPT = "${ChatColor.GREEN}Please input a unique ID. ${ChatColor.GRAY}(Limit of 16 characters)" + val IDENTIFIER_REGEX = "[a-zA-Z_\\-0-9]*".toRegex() + + } + +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/util/InputPrompt.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/util/InputPrompt.kt new file mode 100644 index 0000000..cd402fd --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/util/InputPrompt.kt @@ -0,0 +1,5 @@ +package org.cavepvp.entity.util + +import org.cavepvp.entity.util.EzPrompt + +class InputPrompt(lambda: (String) -> Unit) : EzPrompt(lambda) \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/util/ItemBuilder.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/util/ItemBuilder.kt new file mode 100644 index 0000000..732af5c --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/util/ItemBuilder.kt @@ -0,0 +1,148 @@ +package org.cavepvp.entity.util + +import org.bukkit.* +import org.bukkit.enchantments.Enchantment +import org.bukkit.inventory.ItemStack +import org.bukkit.inventory.meta.FireworkEffectMeta +import org.bukkit.inventory.meta.ItemMeta +import org.bukkit.inventory.meta.LeatherArmorMeta +import org.bukkit.inventory.meta.SkullMeta + +class ItemBuilder(private val item: ItemStack) { + + private constructor(material: Material, amount: Int):this(ItemStack(material,if (amount < 1) 1 else amount)) + + fun name(displayName: String): ItemBuilder { + this.editMeta{ + it.displayName = ChatColor.translateAlternateColorCodes('&',displayName) + } + return this + } + + fun data(data: Int): ItemBuilder { + return this.data(data.toShort()) + } + + fun data(data: Byte): ItemBuilder { + return this.data(data.toShort()) + } + + fun data(data: Short): ItemBuilder { + this.item.durability = data + return this + } + + fun lore(vararg lore: String,translate: Boolean = true): ItemBuilder { + return this.lore(lore.toList(),translate) + } + + fun lore(lore: Collection,translate: Boolean = true): ItemBuilder { + this.editMeta{ + it.lore = if (translate) lore.map{text -> ChatColor.translateAlternateColorCodes('&',text)}.toList() else lore.toList() + } + return this + } + + fun addToLore(lore: ArrayList,translate: Boolean = true): ItemBuilder { + this.editMeta{ + it.lore = (it.lore ?: arrayListOf()) + .plus(if (translate) lore.map{text -> ChatColor.translateAlternateColorCodes('&',text)}.toList() else lore.toList()) + } + return this + } + + fun amount(amount: Int): ItemBuilder { + this.item.amount = amount + return this + } + + fun enchant(enchantment: Enchantment,level: Int): ItemBuilder { + this.item.addUnsafeEnchantment(enchantment, level) + return this + } + + fun removeEnchant(enchantment: Enchantment): ItemBuilder { + this.item.removeEnchantment(enchantment) + return this + } + + fun color(color: Color?): ItemBuilder { + this.editMeta{ + + if (it !is LeatherArmorMeta) { + throw UnsupportedOperationException("Cannot set color of a non-leather armor item.") + } + + it.color = color + } + + return this + } + + fun unbreakable(unbreakable: Boolean): ItemBuilder { + this.editMeta{it.spigot().isUnbreakable = unbreakable} + return this + } + + fun owner(owner: String): ItemBuilder { + this.editMeta{ + + if (it !is SkullMeta) { + throw UnsupportedOperationException("Cannot set owner of a non-skull item.") + } + + it.owner = owner + } + return this + } + + fun setFireworkColor(color: Color): ItemBuilder { + this.editMeta{ + + if (it !is FireworkEffectMeta) { + throw UnsupportedOperationException("Cannot set color of a non-firework item.") + } + + it.effect = FireworkEffect.builder().withColor(color).build() + } + return this + } + + private fun editMeta(meta: (ItemMeta) -> Unit) { + + var itemMeta = this.item.itemMeta + + if (itemMeta == null) { + itemMeta = Bukkit.getItemFactory().getItemMeta(Material.getMaterial(this.item.typeId)) + } + + meta.invoke(itemMeta) + + this.item.itemMeta = itemMeta + } + + fun build(): ItemStack { + return this.item.clone() + } + + companion object { + + fun of(material: Material): ItemBuilder { + return ItemBuilder(material,1) + } + + fun of(material: Material,amount: Int): ItemBuilder { + return ItemBuilder(material,amount) + } + + fun copyOf(builder: ItemBuilder): ItemBuilder { + return ItemBuilder(builder.build()) + } + + fun copyOf(item: ItemStack): ItemBuilder { + return ItemBuilder(item) + } + + } + +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/util/ItemPart.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/util/ItemPart.kt new file mode 100644 index 0000000..36758ce --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/util/ItemPart.kt @@ -0,0 +1,25 @@ +package org.cavepvp.entity.util + +/** + * @project carnage + * + * @date 04/26/21 + * @author xanderume@gmail.com + */ +enum class ItemPart { + + HAND, + HELMET, + CHESTPLATE, + LEGGINGS, + BOOTS; + + companion object { + + fun findBySlot(slot: Int): ItemPart? { + return values().firstOrNull{it.ordinal == slot} + } + + } + +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/util/ListButton.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/util/ListButton.kt new file mode 100644 index 0000000..ce10346 --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/util/ListButton.kt @@ -0,0 +1,169 @@ +package org.cavepvp.entity.util + +import cc.fyre.proton.menu.Button +import cc.fyre.proton.menu.Menu +import cc.fyre.proton.menu.menus.ConfirmMenu +import cc.fyre.proton.util.Callback +import org.bukkit.Bukkit +import org.bukkit.ChatColor +import org.bukkit.Material +import org.bukkit.entity.Player +import org.bukkit.event.inventory.ClickType +import org.bukkit.event.inventory.InventoryClickEvent +import org.bukkit.inventory.ItemStack +import java.util.* +import java.util.function.Predicate +import kotlin.math.max + +abstract class ListButton(private val menu: Menu, private val length: Int, private val characterLimit: Int) : Button() { + + init { + this.menu.isUpdateAfterClick = true + } + + private var list = mutableListOf() + + protected var index = 0 + protected var selectedItem: T? = null + + abstract fun getList():List + + abstract fun addItem(item: T,player: Player):Runnable + abstract fun removeItem(item: T,player: Player):Runnable + + abstract fun isModifiable():Boolean + + abstract fun startAddConversation(player: Player,callback: Callback) + + abstract fun getTextFormat(item: T):Pair + + abstract fun getItemStack(player: Player):ItemStack + abstract fun getEmptyDescription(player: Player):List + + open fun getExtraDescription(player: Player):List { + return emptyList() + } + + override fun getName(p0: Player?): String { + return "" + } + + override fun getDescription(p0: Player?): MutableList { + return Collections.emptyList() + } + + override fun getMaterial(p0: Player?): Material { + return Material.AIR + } + + override fun getButtonItem(player: Player): ItemStack { + this.list = this.getList().toMutableList() + + if (this.index > this.list.lastIndex) { + this.index = this.list.lastIndex + } + + this.selectedItem = if (this.list.isEmpty()) null else this.list[this.index] + + val lore = mutableListOf() + + lore.add(" ") + lore.addAll(if (this.list.isEmpty()) this.getEmptyDescription(player) else this.getDescription(player)) + + if (this.list.isNotEmpty()) { + + val startIndex = if (this.index < (this.length / 2)) 0 else this.index - (this.length / 2) + val (looping,leftover) = this.list.withIndex().partition{it.index in (startIndex until (this.index + (this.length / 2) + 1))} + + val (top,bottom) = leftover.partition{it.index < looping.first().index} + + if (top.isNotEmpty()) { + lore.add("${ChatColor.GRAY}${looping.first().index - 1}. ${ChatColor.WHITE}${top.size} more..") + } + + looping.forEach{ + + val format = this.getTextFormat(it.value) + var text = format.first + val exceededLimit = text.length > this.characterLimit + + if (exceededLimit) { + text = text.substring(0,this.characterLimit) + } + + lore.add("${if (this.index == it.index) ChatColor.GREEN else ChatColor.GRAY}${it.index}. ${ChatColor.WHITE}$text${ChatColor.WHITE}${if (exceededLimit) ".." else ""} ${format.second}") + } + + if (bottom.isNotEmpty()) { + lore.add("${ChatColor.GRAY}${looping.last().index + 1}. ${ChatColor.WHITE}${bottom.size} more..") + } + + } + + lore.add(" ") + + if (this.isModifiable()) { + lore.add("${ChatColor.GREEN}Shift Left click to add a item") + lore.add("${ChatColor.RED}Shift Right click to delete a item") + } + + lore.add("${ChatColor.YELLOW}Left and right click to scroll") + lore.addAll(this.getExtraDescription(player)) + + return ItemBuilder.copyOf(this.getItemStack(player)) + .lore(lore) + .build() + } + + override fun clicked(player: Player, slot: Int, clickType: ClickType) { + + if (this.index > this.list.lastIndex) { + this.setIndex(this.list.lastIndex) + } + + if (clickType.isShiftClick) { + + if (!this.isModifiable()) { + return + } + + if (clickType.isLeftClick) { + this.startAddConversation(player) { callback -> + this@ListButton.addItem(callback, player) + this@ListButton.menu.openMenu(player) + } + return + } + + object : ConfirmMenu("Delete?", Callback{value -> + if (value) { + this@ListButton.removeItem(this@ListButton.list[this@ListButton.index],player) + this@ListButton.menu.openMenu(player) + } + + this@ListButton.menu.openMenu(player) + }) {}.openMenu(player) + return + } + + if (clickType.isLeftClick) { + + if (this.index >= this.list.lastIndex) { + this.setIndex(0) + } else { + this.setIndex(this.index + 1) + } + + } else if (clickType.isRightClick) { + this.setIndex(max(this.index - 1,0)) + } + + } + + @JvmName("setIndex1") + private fun setIndex(index: Int) { + this.index = index + this.selectedItem = if (this.list.isEmpty()) null else if (index > this.list.lastIndex) this.list.last() else this.list[this.index] + } + +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/util/NMSUtil.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/util/NMSUtil.kt new file mode 100644 index 0000000..61db490 --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/util/NMSUtil.kt @@ -0,0 +1,107 @@ +package org.cavepvp.entity.util + +import net.minecraft.util.com.mojang.authlib.GameProfile +import org.bukkit.Bukkit +import org.bukkit.World + +import org.bukkit.entity.Entity +import org.bukkit.entity.Player +import org.bukkit.inventory.ItemStack + + + +/** + * @project carnage + * + * @date 26/05/2020 + * @author xanderume@gmail.com + */ + +object NMSUtil { + + private val version = Bukkit.getServer()::class.java.name.split(".")[3] + + @JvmStatic + fun getHandle(world: World):Any { + return world::class.java.getMethod("getHandle").invoke(world) + } + + @JvmStatic + fun getHandle(entity: Entity):Any { + return entity::class.java.getMethod("getHandle").invoke(entity) + } + + @JvmStatic + fun getVersion():String { + return version + } + + @JvmStatic + fun getNMSClass(name: String):Class<*> { + return Class.forName("net.minecraft.server.$version.$name") + } + + @JvmStatic + fun getBukkitClass(name: String):Class<*> { + return Class.forName("org.bukkit.craftbukkit.$version.$name") + } + + @JvmStatic + fun getAsNMSCopy(itemStack: ItemStack):Any? { + return getBukkitClass("inventory.CraftItemStack").getMethod("asNMSCopy",ItemStack::class.java).invoke(itemStack) + } + + @JvmStatic + fun sendPacket(player: Player,packet: Any) { + sendPacket(player,arrayOf(packet)) + } + + @JvmStatic + fun sendPacket(player: Player,packets: Array) { + + val handle = getHandle(player) + val connection = handle::class.java.getField("playerConnection").get(handle) + + packets.forEach{connection::class.java.getMethod("sendPacket", getNMSClass("Packet")).invoke(connection,it)} + } + + @JvmStatic + fun updateInventory(player: Player,container: Any) { + updateInventory(getHandle(player),container) + } + + @JvmStatic + fun updateInventory(handle: Any,container: Any) { + getNMSClass("EntityPlayer").getMethod("updateInventory", getNMSClass("Container")).invoke(handle,container) + } + + @JvmStatic + fun getGameProfile(player: Player):GameProfile { + return getNMSClass("EntityHuman").getMethod("getProfile").invoke(getHandle(player)) as GameProfile + } + + @JvmStatic + fun setGameProfile(player: Player,profile: GameProfile) { + + val field = getNMSClass("EntityHuman").getDeclaredField("bH") + + field.isAccessible = true + field.set(getHandle(player),profile) + field.isAccessible = false + } + + @JvmStatic + fun floorByMathHelper(value: Double):Int { + return MATH_HELPER_FLOOR_METHOD.invoke(null,value) as Int + } + + @JvmStatic + fun createDataWatcher():Any { + return DATA_WATCHER_CONSTRUCTOR.newInstance(null) + } + + private val DATA_WATCHER_CLASS: Class<*> = getNMSClass("DataWatcher") + private val DATA_WATCHER_CONSTRUCTOR = DATA_WATCHER_CLASS.getConstructor(getNMSClass("Entity")) + + private val MATH_HELPER_FLOOR_METHOD = getNMSClass("MathHelper").getMethod("floor",Double::class.java) +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/util/PacketUtil.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/util/PacketUtil.kt new file mode 100644 index 0000000..5f5dcfa --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/util/PacketUtil.kt @@ -0,0 +1,58 @@ +package org.cavepvp.entity.util + +import com.comphenix.protocol.ProtocolLibrary +import com.comphenix.protocol.events.PacketContainer +import org.bukkit.entity.Player +import java.lang.reflect.InvocationTargetException + +object PacketUtil { + + const val ADD_PLAYER = 0 + const val REMOVE_PLAYER = 4 + + const val UPDATE_LATENCY = 2 + const val UPDATE_GAMEMODE = 1 + const val UPDATE_DISPLAY_NAME = 3 + + @JvmStatic + fun convertYawOrPitchAsByte(value: Float):Byte { + return (value * 256.0F / 360.0F).toInt().toByte() + } + + @JvmStatic + fun convertYawOrPitch(value: Float):Float { + return (value * 256.0F / 360.0F) + } + + @JvmStatic + fun convertYawOrPitchAsByte(value: Byte):Float { + return (value * 256.0F / 360.0F) + } + + @JvmStatic + fun broadcast(packet: PacketContainer) { + ProtocolLibrary.getProtocolManager().broadcastServerPacket(packet) + } + + @JvmStatic + fun sendPacket(player: Player,packet: PacketContainer) { + + try { + ProtocolLibrary.getProtocolManager().sendServerPacket(player,packet) + } catch (ex: InvocationTargetException) { + throw RuntimeException("Cannot send packet.",ex) + } + + } + + @JvmStatic + fun receivePacket(sender: Player,packet: PacketContainer) { + + try { + ProtocolLibrary.getProtocolManager().recieveClientPacket(sender,packet) + } catch (ex: Exception) { + throw RuntimeException("Cannot receive packet.",ex) + } + + } +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/util/PlayerUtil.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/util/PlayerUtil.kt new file mode 100644 index 0000000..4d8ec25 --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/util/PlayerUtil.kt @@ -0,0 +1,71 @@ +package org.cavepvp.entity.util + +import net.minecraft.util.com.mojang.authlib.GameProfile +import net.minecraft.util.com.mojang.authlib.properties.Property +import org.bukkit.conversations.ConversationFactory +import org.bukkit.conversations.Prompt +import org.bukkit.craftbukkit.v1_7_R4.entity.CraftPlayer + +import org.bukkit.entity.Player +import org.bukkit.plugin.Plugin +import org.cavepvp.entity.EntityPlugin +import org.cavepvp.entity.ai.ShardPacketAI + +object PlayerUtil { + + @JvmStatic + fun isLegacy(player: Player):Boolean { + return (player as CraftPlayer).handle.playerConnection.networkManager.version <= 5 + } + + @JvmStatic + fun sendPacket(player: Player,packet: Any) { + ShardPacketAI.sendPacket(player,packet) + } + + @JvmStatic + fun createCloneProfile(player: Player):GameProfile { + return createCloneProfile(NMSUtil.getGameProfile(player)) + } + + @JvmStatic + fun startPrompt(player: Player,prompt: Prompt,timeout: Int = 30,plugin: Plugin = EntityPlugin.instance) { + player.beginConversation(ConversationFactory(plugin).withFirstPrompt(prompt).withModality(false).withLocalEcho(false).withTimeout(timeout).buildConversation(player)) + } + + @JvmStatic + fun createCloneProfile(profile: GameProfile):GameProfile { + + val toReturn = GameProfile(profile.id,profile.name) + var textures = profile.properties["textures"].firstOrNull() + + if (textures != null && textures.value != null && textures.hasSignature()) { + textures = Property(textures.name,textures.value,textures.signature) + toReturn.properties.put("textures",textures) + } + + return toReturn + } + +// fun sendActionBar(player: Player,text: String) { +// +// if (isLegacy(player)) { +// +// if (!LunarClientAPI.getInstance().isRunningLunarClient(player)) { +// return +// } +// +// LunarClientAPI.getInstance().sendPacket(player,LCPacketTitle( +// TitleType.SUBTITLE.name, +// text, +// 3000L, +// 0L, +// 3000L +// )) +// return +// } +// +// sendPacket(player,ShardPacketAI.createChat(text,2,false)) +// } + +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/util/ReflectionUtil.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/util/ReflectionUtil.kt new file mode 100644 index 0000000..05f1fa6 --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/util/ReflectionUtil.kt @@ -0,0 +1,58 @@ +package org.cavepvp.entity.util + +object ReflectionUtil { + + @JvmStatic + fun getField(instance: Any,fieldName: String):Any? { + return try { + instance::class.java.getField(fieldName).get(instance) + } catch (ex: Exception) { + ex.printStackTrace() + return null + } + } + + @JvmStatic + fun getDeclaredField(instance: Any, fieldName: String): Any? { + + val field = try { + instance::class.java.getDeclaredField(fieldName) + } catch (ex: Exception) { + ex.printStackTrace() + return null + } + + field.isAccessible = true + + return field[instance] + } + + @JvmStatic + fun setField(instance: Any,fieldName: String,value: Any) { + + val field = try { + instance::class.java.getField(fieldName) + } catch (ex: Exception) { + ex.printStackTrace() + return + } + + field.isAccessible = true + field.set(instance,value) + } + + @JvmStatic + fun setDeclaredField(instance: Any,fieldName: String,value: Any) { + + val field = try { + instance::class.java.getDeclaredField(fieldName) + } catch (ex: Exception) { + ex.printStackTrace() + return + } + + field.isAccessible = true + field.set(instance,value) + } + +} \ No newline at end of file diff --git a/Entity-master/src/main/kotlin/org/cavepvp/entity/util/VectorUtil.kt b/Entity-master/src/main/kotlin/org/cavepvp/entity/util/VectorUtil.kt new file mode 100644 index 0000000..3111a8c --- /dev/null +++ b/Entity-master/src/main/kotlin/org/cavepvp/entity/util/VectorUtil.kt @@ -0,0 +1,28 @@ +package org.cavepvp.entity.util + +import org.bukkit.util.Vector +import kotlin.math.atan2 + +/** + * @project carnage + * + * @date 27/02/2021 + * @author xanderume@gmail.com + */ +object VectorUtil { + + @JvmStatic + fun convertYawFromVectors(a: Vector,b: Vector):Float { + val dx = a.x - b.x + val dz = a.z - b.z + + var angle = Math.toDegrees(atan2(dz,dx)).toFloat() - 90.0F + + if (angle < 0.0F) { + angle += 360.0F + } + + return angle + } + +} \ No newline at end of file diff --git a/Entity-master/src/main/resources/plugin.yml b/Entity-master/src/main/resources/plugin.yml new file mode 100644 index 0000000..2d3861f --- /dev/null +++ b/Entity-master/src/main/resources/plugin.yml @@ -0,0 +1,7 @@ +name: Entity +main: org.cavepvp.entity.EntityPlugin +author: MineHQ Development Team +version: 1.0-SNAPSHOT +softdepend: [ProtocolLib, Proton] +commands: + entity: \ No newline at end of file diff --git a/HCF-master/.gitignore b/HCF-master/.gitignore new file mode 100644 index 0000000..e673575 --- /dev/null +++ b/HCF-master/.gitignore @@ -0,0 +1,2 @@ +.idea/ +target/ \ No newline at end of file diff --git a/HCF-master/lib/BuycraftX.jar b/HCF-master/lib/BuycraftX.jar new file mode 100644 index 0000000..16edc23 Binary files /dev/null and b/HCF-master/lib/BuycraftX.jar differ diff --git a/HCF-master/lib/CrackShot.jar b/HCF-master/lib/CrackShot.jar new file mode 100644 index 0000000..ff44a0e Binary files /dev/null and b/HCF-master/lib/CrackShot.jar differ diff --git a/HCF-master/lib/CrazyEnchantments.jar b/HCF-master/lib/CrazyEnchantments.jar new file mode 100644 index 0000000..4b0eb0e Binary files /dev/null and b/HCF-master/lib/CrazyEnchantments.jar differ diff --git a/HCF-master/lib/Votifier.jar b/HCF-master/lib/Votifier.jar new file mode 100644 index 0000000..9751f18 Binary files /dev/null and b/HCF-master/lib/Votifier.jar differ diff --git a/HCF-master/lib/WorldEdit.jar b/HCF-master/lib/WorldEdit.jar new file mode 100644 index 0000000..9411332 Binary files /dev/null and b/HCF-master/lib/WorldEdit.jar differ diff --git a/HCF-master/lib/bukkitapi.jar b/HCF-master/lib/bukkitapi.jar new file mode 100644 index 0000000..d4a7bcf Binary files /dev/null and b/HCF-master/lib/bukkitapi.jar differ diff --git a/HCF-master/lib/proton-1.0-SNAPSHOT.jar b/HCF-master/lib/proton-1.0-SNAPSHOT.jar new file mode 100644 index 0000000..aa8b685 Binary files /dev/null and b/HCF-master/lib/proton-1.0-SNAPSHOT.jar differ diff --git a/HCF-master/pom.xml b/HCF-master/pom.xml new file mode 100644 index 0000000..bbd1295 --- /dev/null +++ b/HCF-master/pom.xml @@ -0,0 +1,254 @@ + + 4.0.0 + net.frozenorb + HCTeams + 1.0 + + + minehq-low + UTF-8 + UTF-8 + 1.8 + 1.8 + + + + + + org.jetbrains.kotlin + kotlin-maven-plugin + 1.5.21 + + + compile + + compile + + + + src/main/kotlin + src/main/java + + + + + test-compile + test-compile + + + ${project.basedir}/src/test/kotlin + ${project.basedir}/src/test/java + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.5.1 + + 1.8 + 1.8 + + + org.projectlombok + lombok + 1.16.16 + + + + + + + default-compile + none + + + + default-testCompile + none + + + java-compile + compile + + compile + + + + java-test-compile + test-compile + + testCompile + + + + + + + + + + + com.squareup.moshi + moshi-kotlin-codegen + 1.13.0 + provided + + + + org.apache.commons + commons-collections4 + 4.4 + provided + + + + org.jetbrains.kotlin + kotlin-stdlib-jdk8 + 1.5.21 + + + + net.valorhcf + vspigot-api + 1.7.10-R0.1-SNAPSHOT + provided + + + net.valorhcf + vspigot-server + 1.7.10-R0.1-SNAPSHOT + provided + + + + + org.mongodb + mongo-java-driver + 3.10.2 + compile + + + org.cavepvp.coinshop + CoinShop + 1.0-SNAPSHOT + provided + + + cc.fyre.proton + Proton + 1.0-SNAPSHOT + provided + + + com.minexd.quartz + plugin + 1.0-SNAPSHOT + provided + + + cc.fury.piston + Piston + 1.0-SNAPSHOT + provided + + + org.cavepvp.suge + Suge + 1.0-SNAPSHOT + provided + + + org.cavepvp.buycraft + Buycraft + 1.0-SNAPSHOT + system + ${project.basedir}/lib/BuycraftX.jar + + + org.cavepvp.crackshot + Crackshot + 1.0-SNAPSHOT + system + ${project.basedir}/lib/CrackShot.jar + + + votifier + votifier + 1.0-SNAPSHOT + system + ${project.basedir}/lib/Votifier.jar + + + cc.fyre.universe + spigot + 1.0-SNAPSHOT + provided + + + com.comphenix.protocol + ProtocolLib + 3.6.5-SNAPSHOT + + + org.projectlombok + lombok + LATEST + + + com.sk89q.worldedit + worldedit-bukkit + 6.1.55 + system + ${project.basedir}/lib/WorldEdit.jar + + + org.cavepvp.entity + entity + 1.0-SNAPSHOT + provided + + + com.google.code.gson + gson + 2.8.5 + provided + + + cc.fyre.neutron + Neutron + 1.0-SNAPSHOT + provided + + + com.lunarclient + bukkitapi + 1.0-SNAPSHOT + system + ${project.basedir}/lib/bukkitapi.jar + + + cc.fyre.modsuite + bukkit + 1.0-SNAPSHOT + provided + + + org.cavepvp.profiles + Profiles + 1.0-SNAPSHOT + provided + + + diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/FoxConstants.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/FoxConstants.java new file mode 100644 index 0000000..c017aab --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/FoxConstants.java @@ -0,0 +1,51 @@ +package net.frozenorb.foxtrot; + +import cc.fyre.neutron.NeutronConstants; +import net.frozenorb.foxtrot.team.Team; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import org.cavepvp.profiles.Profiles; +import org.cavepvp.profiles.playerProfiles.impl.Brackets; + +public final class FoxConstants { + + public static String teamChatFormat(Player player, String message) { + return (ChatColor.DARK_AQUA + "(Team) " + player.getName() + ": " + ChatColor.YELLOW + message); + } + + public static String officerChatFormat(Player player, String message) { + return (ChatColor.LIGHT_PURPLE + "(Officer) " + player.getName() + ": " + ChatColor.YELLOW + message); + } + + public static String teamChatSpyFormat(Team team, Player player, String message) { + return (ChatColor.GOLD + "[" + ChatColor.DARK_AQUA + "TC: " + ChatColor.YELLOW + team.getName() + ChatColor.GOLD + "]" + ChatColor.DARK_AQUA + player.getName() + ": " + message); + } + + public static String allyChatFormat(Player player, String message) { + return (Team.ALLY_COLOR + "(Ally) " + player.getName() + ": " + ChatColor.YELLOW + message); + } + + public static String allyChatSpyFormat(Team team, Player player, String message) { + return (ChatColor.GOLD + "[" + Team.ALLY_COLOR + "AC: " + ChatColor.YELLOW + team.getName() + ChatColor.GOLD + "]" + Team.ALLY_COLOR + player.getName() + ": " + message); + } + + public static String publicChatFormat(Player player, Team team, String message, String customPrefix) { + + String starting = ""; + + if (team != null) { + starting = ChatColor.GOLD + "[" + Foxtrot.getInstance().getServerHandler().getDefaultRelationColor() + team.getName() + ChatColor.GOLD + "] " + ChatColor.WHITE; + } + + final Brackets brackets = Profiles.getInstance().getReputationHandler().findBracket(player.getUniqueId(), player.getName()); + + String bracketTag = ""; + + if (!brackets.equals(Brackets.UNRANKED)) { + bracketTag = brackets.getChatColor() + "✦"; + } + + return starting + customPrefix + bracketTag + NeutronConstants.formatChatDisplay(player, message); + } + +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/Foxtrot.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/Foxtrot.java new file mode 100644 index 0000000..a23d978 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/Foxtrot.java @@ -0,0 +1,594 @@ +package net.frozenorb.foxtrot; + +import cc.fyre.neutron.util.PlayerUtil; +import cc.fyre.proton.Proton; +import cc.fyre.proton.util.TimeUtils; +import com.mongodb.MongoClient; +import com.mongodb.MongoCredential; +import com.mongodb.ServerAddress; +import com.shampaggon.crackshot.CSUtility; +import com.sk89q.worldedit.bukkit.WorldEditPlugin; + +import lombok.Getter; +import lombok.Setter; +import net.buycraft.plugin.bukkit.BuycraftPlugin; +import net.frozenorb.foxtrot.brewer.FancyBrewerModule; +import net.frozenorb.foxtrot.chat.tips.TipsHandler; +import net.frozenorb.foxtrot.chat.trivia.TriviaHandler; +import net.frozenorb.foxtrot.commands.CustomTimerCreateCommand; +import net.frozenorb.foxtrot.deathmessage.DeathMessageHandler; +import net.frozenorb.foxtrot.economy.EconomyHandler; +import net.frozenorb.foxtrot.gameplay.ability.type.MidasTouch; +import net.frozenorb.foxtrot.gameplay.armorclass.ArmorClassHandler; +import net.frozenorb.foxtrot.gameplay.boosters.NetworkBoosterHandler; +import net.frozenorb.foxtrot.gameplay.bosses.BossHandler; +import net.frozenorb.foxtrot.gameplay.cavesays.CaveSaysHandler; +import net.frozenorb.foxtrot.gameplay.clickitem.ClickItemHandler; +import net.frozenorb.foxtrot.gameplay.content.ContentHandler; +import net.frozenorb.foxtrot.gameplay.coupondrops.CouponDropsHandler; +import net.frozenorb.foxtrot.gameplay.events.EventHandler; +import net.frozenorb.foxtrot.gameplay.events.cavenite.CaveNiteHandler; +import net.frozenorb.foxtrot.gameplay.events.citadel.CitadelHandler; +import net.frozenorb.foxtrot.gameplay.events.conquest.ConquestHandler; +import net.frozenorb.foxtrot.gameplay.events.fury.FuryHandler; +import net.frozenorb.foxtrot.gameplay.events.mini.MiniEventsHandler; +import net.frozenorb.foxtrot.gameplay.events.outposts.OutpostHandler; +import net.frozenorb.foxtrot.gameplay.events.region.cavern.CavernHandler; +import net.frozenorb.foxtrot.gameplay.events.region.glowmtn.GlowHandler; +import net.frozenorb.foxtrot.gameplay.grounds.SpawnerGroundsHandler; +import net.frozenorb.foxtrot.gameplay.kitmap.bounty.BountyManager; +import net.frozenorb.foxtrot.gameplay.kitmap.daily.DailyKitHandler; +import net.frozenorb.foxtrot.gameplay.kitmap.game.Game; +import net.frozenorb.foxtrot.gameplay.kitmap.gem.GemHandler; +import net.frozenorb.foxtrot.gameplay.kitmap.gemflip.GemFlipHandler; +import net.frozenorb.foxtrot.gameplay.kitmap.partner.PartnerCrateHandler; +import net.frozenorb.foxtrot.gameplay.kitmap.tokens.TokensHandler; +import net.frozenorb.foxtrot.gameplay.lettingIn.LettingInHandler; +import net.frozenorb.foxtrot.gameplay.loot.airdrop.AirDropHandler; +import net.frozenorb.foxtrot.gameplay.loot.battlepass.BattlePassHandler; +import net.frozenorb.foxtrot.gameplay.loot.battlepass.challenge.Challenge; +import net.frozenorb.foxtrot.gameplay.loot.battlepass.challenge.serializer.ChallengeSerializer; +import net.frozenorb.foxtrot.gameplay.loot.crate.CrateHandler; +import net.frozenorb.foxtrot.gameplay.loot.itemboxes.ItemBoxesHandler; +import net.frozenorb.foxtrot.gameplay.loot.treasurechest.TreasureChestHandler; + +import net.frozenorb.foxtrot.gameplay.loot.redeem.RedeemCreatorHandler; +import net.frozenorb.foxtrot.gameplay.loot.shop.ShopHandler; +import net.frozenorb.foxtrot.gameplay.loot.treasurecove.TreasureCoveHandler; +import net.frozenorb.foxtrot.gameplay.loot.voteparty.VotePartyHandler; +import net.frozenorb.foxtrot.gameplay.pvpclasses.PvPClassHandler; +import net.frozenorb.foxtrot.gameplay.pvpclasses.mastery.MasteryUpgradeHandler; +import net.frozenorb.foxtrot.gameplay.quest.QuestHandler; +import net.frozenorb.foxtrot.gameplay.totem.TotemHandler; +import net.frozenorb.foxtrot.listener.*; +import net.frozenorb.foxtrot.map.MapHandler; +import net.frozenorb.foxtrot.nametag.modsuite.InventorySeeHandler; +import net.frozenorb.foxtrot.packetborder.PacketBorderThread; +import net.frozenorb.foxtrot.persist.RedisSaveTask; +import net.frozenorb.foxtrot.persist.maps.*; +import net.frozenorb.foxtrot.persist.maps.toggle.*; +import net.frozenorb.foxtrot.serialization.*; +import net.frozenorb.foxtrot.server.ListenerHandler; +import net.frozenorb.foxtrot.server.ServerHandler; +import net.frozenorb.foxtrot.server.keyalls.KeyAllHandler; +import net.frozenorb.foxtrot.server.customTimer.CustomTimerHandler; +import net.frozenorb.foxtrot.server.deathban.DeathbanArenaHandler; +import net.frozenorb.foxtrot.server.polls.PollHandler; +import net.frozenorb.foxtrot.server.voucher.VoucherHandler; +import net.frozenorb.foxtrot.tab.FoxtrotTabLayoutProvider; +import net.frozenorb.foxtrot.team.Team; +import net.frozenorb.foxtrot.team.TeamHandler; +import net.frozenorb.foxtrot.team.claims.LandBoard; +import net.frozenorb.foxtrot.team.dtr.DTRHandler; +import net.frozenorb.foxtrot.util.CC; +import net.frozenorb.foxtrot.util.PersistableLocation; +import net.frozenorb.foxtrot.util.RegenUtils; + +import org.bukkit.*; +import org.bukkit.block.Block; +import org.bukkit.configuration.serialization.ConfigurationSerialization; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.metadata.FixedMetadataValue; +import org.bukkit.plugin.Plugin; +import org.bukkit.plugin.java.JavaPlugin; +import org.bukkit.potion.PotionEffect; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.BlockVector; +import org.cavepvp.profiles.playerProfiles.impl.stats.StatisticServer; + +import java.util.*; +import java.util.concurrent.TimeUnit; +import java.util.function.Predicate; + +public class Foxtrot extends JavaPlugin { + + public static String MONGO_DB_NAME = "HCTeams"; + + public static final Gson GSON = new GsonBuilder() + .registerTypeHierarchyAdapter(PotionEffect.class, new PotionEffectAdapter()) + .registerTypeHierarchyAdapter(ItemStack.class, new ItemStackAdapter()) + .registerTypeHierarchyAdapter(Location.class, new LocationAdapter()) + .registerTypeHierarchyAdapter(Vector.class, new VectorAdapter()) + .registerTypeHierarchyAdapter(BlockVector.class, new BlockVectorAdapter()) + .registerTypeHierarchyAdapter(PotionAdapter.class, new PotionAdapter()) + .registerTypeAdapter(Challenge.class, new ChallengeSerializer()) + .setPrettyPrinting() + .serializeNulls().create(); + + @Getter public static Foxtrot instance; + @Getter public MongoClient mongoPool; + @Getter private BuycraftPlugin buycraftPlugin; + @Getter private EconomyHandler economyHandler; + @Getter private DailyKitHandler dailyKitHandler; + @Getter private ContentHandler contentHandler; + @Getter private LettingInHandler lettingInHandler; + @Getter private OutpostHandler outpostHandler; + @Getter private PvPClassHandler pvpClassHandler; + @Getter private ItemBoxesHandler itemBoxesHandler; + @Getter private ClickItemHandler clickItemHandler; + @Getter private ArmorClassHandler armorClassHandler; + @Getter private QuestHandler questHandler; + @Getter private BattlePassHandler battlePassHandler; + @Getter private WorldEditPlugin worldEdit; + @Getter private KeyAllHandler keyAllHandler; + @Getter private CouponDropsHandler couponDropsHandler; + @Getter private TeamHandler teamHandler; + @Getter public ServerHandler serverHandler; + @Getter private MapHandler mapHandler; + @Getter private TipsHandler tipsHandler; + @Getter private CitadelHandler citadelHandler; + @Getter private EventHandler eventHandler; + @Getter private GemFlipHandler gemFlipHandler; + @Getter private CaveSaysHandler caveSaysHandler; + @Getter private TokensHandler tokensHandler; + @Getter private ConquestHandler conquestHandler; + @Getter private DeathbanArenaHandler deathbanArenaHandler; + @Getter private PollHandler pollHandler; + @Getter private VoucherHandler voucherHandler; + @Getter private TreasureChestHandler treasureChestHandler; + @Getter private MiniEventsHandler miniEventsHandler; + @Getter private SpawnerGroundsHandler spawnerGroundsHandler; + @Getter private MasteryUpgradeHandler masteryUpgradeHandler; + @Getter private CavernHandler cavernHandler; + @Getter private CaveNiteHandler caveNiteHandler; + @Getter private GlowHandler glowHandler; + @Getter private CrateHandler crateHandler; + @Getter private BossHandler bossHandler; + @Getter private NetworkBoosterHandler networkBoosterHandler; + @Getter private RedeemCreatorHandler redeemCreatorHandler; + @Getter private CustomTimerHandler customTimerHandler; + @Getter private ShopHandler shopHandler; + @Getter private TotemHandler totemHandler; + @Getter private PlaytimeMap playtimeMap; + @Getter private OppleMap oppleMap; + @Getter private DeathbanMap deathbanMap; + @Getter private PvPTimerMap PvPTimerMap; + @Getter private SaleTimersScoreboardMap saleTimersScoreboardMap; + @Getter private StartingPvPTimerMap startingPvPTimerMap; + @Getter private DeathsMap deathsMap; + @Getter private KillsMap killsMap; + @Getter private FactionFilterMap factionFilterMap; + @Getter private KitmapTokensMap kitmapTokensMap; + @Getter private AirDropHandler airDropHandler; + @Getter private GemHandler gemHandler; + @Getter private PartnerCrateHandler partnerCrateHandler; + @Getter private BountyManager bountyManager; + @Getter private KillstreakMap killstreakMap; + @Getter private KillTagMap killTagMap; + @Getter private TeamColorMap teamColorMap; + @Getter private EnemyColorMap enemyColorMap; + @Getter private ArcherTagColorMap archerTagColorMap; + @Getter private FocusColorMap focusColorMap; + @Getter private TeamFocusColorMap teamFocusColorMap; + @Getter private AnnoyingBroadcastMap annoyingBroadcastMap; + @Getter private ChatModeMap chatModeMap; + @Getter private FishingKitMap fishingKitMap; + @Getter private ToggleGlobalChatMap toggleGlobalChatMap; + @Getter private ChatSpyMap chatSpyMap; + @Getter private DiamondMinedMap diamondMinedMap; + @Getter private GoldMinedMap goldMinedMap; + @Getter private IronMinedMap ironMinedMap; + @Getter private CoalMinedMap coalMinedMap; + @Getter private RedstoneMinedMap redstoneMinedMap; + @Getter private LapisMinedMap lapisMinedMap; + @Getter private EmeraldMinedMap emeraldMinedMap; + @Getter private FirstJoinMap firstJoinMap; + @Getter private LastJoinMap lastJoinMap; + @Getter private FriendLivesMap friendLivesMap; + @Getter private AbilityCooldownsScoreboardMap abilityCooldownsScoreboardMap; + @Getter private WrappedBalanceMap wrappedBalanceMap; + @Getter private TreasureCoveHandler treasureCoveHandler; + @Getter private ToggleFoundDiamondsMap toggleFoundDiamondsMap; + @Getter private ToggleDeathMessageMap toggleDeathMessageMap; + @Getter private ToggleClaimMessageMap toggleClaimMessageMap; + @Getter private TabListModeMap tabListModeMap; + @Getter private CobblePickupMap cobblePickupMap; + @Getter private MobDropsPickupMap mobDropsPickupMap; + @Getter private KDRMap kdrMap; + @Getter private BountyCooldownMap bountyCooldownMap; + @Getter private ReclaimMap reclaimMap; + @Getter private TriviaHandler triviaHandler; + @Getter private FuryHandler furyHandler; + @Getter private DTRDisplayMap DTRDisplayMap; + @Getter private TeamfightModeMap teamfightModeMap; + @Getter private LCTeamViewMap lcTeamViewMap; + @Getter private TipsMap tipsMap; + @Getter private CSUtility csUtility; + @Getter private GemMap gemMap; + @Getter private GemBoosterMap gemBoosterMap; + @Getter @Setter private CombatLoggerListener combatLoggerListener; + @Getter private InventorySeeHandler inventorySeeHandler; + @Getter private FancyBrewerModule fancyBrewerModule; + @Getter private VotePartyHandler votePartyHandler; + + @Getter + @Setter + // for the case of some commands in the plugin, + // a player shouldn't be able to do them in a duel + // thus this predicate exists to test that to avoid dep. issues + private Predicate inDuelPredicate = (player) -> mapHandler.isKitMap() && mapHandler.getDuelHandler().isInDuel(player); + +// @Getter private BuycraftPlugin buycraftPlugin; + + @Getter + @Setter + private Predicate inEventPredicate = (player) -> + mapHandler.isKitMap() && + mapHandler.getGameHandler().isOngoingGame() && mapHandler.getGameHandler().getOngoingGame().isPlaying(player.getUniqueId()); + + @Override + public void onEnable() { + if (Bukkit.getServerName().contains(" ")) { + System.out.println("*********************************************"); + System.out.println(" ATTENTION"); + System.out.println("SET server-name VALUE IN server.properties TO"); + System.out.println("A PROPER SERVER NAME. THIS WILL BE USED AS THE"); + System.out.println("MONGO DATABASE NAME."); + System.out.println("*********************************************"); + this.getServer().shutdown(); + return; + } + + instance = this; + saveDefaultConfig(); + + try { + + if (!this.getConfig().getString("Mongo.Pass").equalsIgnoreCase("")) { + final MongoCredential mongoCredential = MongoCredential.createCredential(this.getConfig().getString("Mongo.User", "admin"), this.getConfig().getString("Mongo.Database", "admin"), this.getConfig().getString("Mongo.Pass").toCharArray()); + this.mongoPool = new MongoClient(new ServerAddress(getConfig().getString("Mongo.Host", "127.0.0.1"), 27017), Collections.singletonList(mongoCredential)); + } else { + this.mongoPool = new MongoClient(new ServerAddress(getConfig().getString("Mongo.Host", "127.0.0.1"), 27017)); + } + + MONGO_DB_NAME = this.getConfig().getString("Mongo.DBName"); + } catch (Exception e) { + e.printStackTrace(); + } + + for (World world : Bukkit.getWorlds()) { + world.setThundering(false); + world.setStorm(false); + + if (world.getEnvironment() == World.Environment.NORMAL) { + world.setTime(18000); + } + + world.setWeatherDuration(Integer.MAX_VALUE); + world.setGameRuleValue("doMobSpawning", "false"); + world.setGameRuleValue("doFireTick", "false"); + world.setGameRuleValue("doDaylightCycle", "false"); + world.setGameRuleValue("mobGriefing", "false"); + } + + (new DTRHandler()).runTaskTimer(this, 20L, 20 * 120); + (new RedisSaveTask()).runTaskTimerAsynchronously(this, 1200L, 1200L); + (new PacketBorderThread()).start(); + + final Plugin plugin = this.getServer().getPluginManager().getPlugin("BuycraftX"); + + if (plugin != null && plugin.isEnabled() && plugin instanceof BuycraftPlugin) { + this.buycraftPlugin = (BuycraftPlugin) plugin; + } + + setupHandlers(); + setupPersistence(); + new ListenerHandler(this); + setupTasks(); + + ConfigurationSerialization.registerClass(PersistableLocation.class); + + Proton.getInstance().getTabHandler().setLayoutProvider(new FoxtrotTabLayoutProvider()); + + this.getServer().getMessenger().registerOutgoingPluginChannel(this, "BungeeCord"); + } + + @Override + public void onDisable() { + getEventHandler().saveEvents(); + + for (Player player : Foxtrot.getInstance().getServer().getOnlinePlayers()) { + getPlaytimeMap().playerQuit(player.getUniqueId(), false); + player.setMetadata("loggedout", new FixedMetadataValue(this, true)); + } + + for (String playerName : PvPClassHandler.getEquippedKits().keySet()) { + PvPClassHandler.getEquippedKits().get(playerName).remove(getServer().getPlayerExact(playerName)); + } + + for (Entity e : this.combatLoggerListener.getCombatLoggers()) { + if (e != null) { + e.remove(); + } + } + + if (this.mapHandler.isKitMap() && this.mapHandler.getGameHandler().getOngoingGame() != null) { + final Game ongoingGame = this.mapHandler.getGameHandler().getOngoingGame(); + + for (Player player : ongoingGame.getPlayers()) { + ongoingGame.removePlayer(player); + } + + for (Player spectator : ongoingGame.getSpectators()) { + ongoingGame.removeSpectator(spectator); + } + + ongoingGame.endGame(); + } + + for (Map.Entry locationMaterialEntry : MidasTouch.cache.entrySet()) { + final Block block = locationMaterialEntry.getKey().getBlock(); + + block.removeMetadata("MIDAS_TOUCH", Foxtrot.getInstance()); + block.setType(MidasTouch.cache.remove(block.getLocation())); + } + + RegenUtils.resetAll(); + + Proton.getInstance().runRedisCommand((jedis) -> { + jedis.save(); + return null; + }); + + this.saveData(); + if (this.mapHandler.isKitMap()) { + this.gemFlipHandler.onDisable(); + } + + if (Foxtrot.getInstance().getMapHandler().getGameHandler() != null) { + if (Foxtrot.getInstance().getMapHandler().getGameHandler().isOngoingGame()) { + Foxtrot.getInstance().getMapHandler().getGameHandler().getOngoingGame().endGame(); + } + } + } + public void saveData() { + RedisSaveTask.save(null, false); + Foxtrot.getInstance().getServerHandler().save(); + + if (!getConfig().getBoolean("kits", false) && !getConfig().getBoolean("teams", false)) { + this.crateHandler.saveData(); + this.treasureCoveHandler.saveTreasureInfo(); + this.networkBoosterHandler.saveBoosters(); + this.caveNiteHandler.saveLocations(); + } + + // This shouldn't be here but whatever + if (mapHandler.isKitMap()) { + mapHandler.getKitUpgradesHandler().saveUpgrades(); + bountyManager.save(); + dailyKitHandler.saveData(); + } + + this.fancyBrewerModule.shutdown(this); + this.airDropHandler.saveLootTable(); + this.customTimerHandler.saveData(); + this.mapHandler.getAbilityHandler().saveStatistics(); + this.tipsHandler.saveTips(); + this.voucherHandler.saveData(); + this.treasureChestHandler.saveData(); + this.outpostHandler.saveData(); + this.keyAllHandler.saveData(); + + if (Foxtrot.getInstance().getMapHandler().isKitMap()) { + Foxtrot.getInstance().getMapHandler().getStatsHandler().save(); + } + } + + + private void setupHandlers() { + this.serverHandler = new ServerHandler(); + this.mapHandler = new MapHandler(); + + if (this.getMapHandler().isKitMap()) { + new WorldCreator("kits_events").environment(World.Environment.NORMAL).createWorld(); + } else { + new WorldCreator("Spawn").environment(World.Environment.NORMAL).createWorld(); + new WorldCreator("Deathban").environment(World.Environment.NORMAL).createWorld(); + new WorldCreator("sg").environment(World.Environment.NORMAL).createWorld(); + } + + this.eventHandler = new EventHandler(); + this.mapHandler.load(); + this.economyHandler = new EconomyHandler(this); + + this.teamHandler = new TeamHandler(); + LandBoard.getInstance().loadFromTeams(); + + this.citadelHandler = new CitadelHandler(); + this.pvpClassHandler = new PvPClassHandler(); + this.conquestHandler = new ConquestHandler(); + this.outpostHandler = new OutpostHandler(this); + this.shopHandler = new ShopHandler(this); + this.contentHandler = new ContentHandler(this); + this.totemHandler = new TotemHandler(this); + + if (mapHandler.isKitMap()) { + this.csUtility = new CSUtility(); + (this.gemHandler = new GemHandler()).loadChances(); + this.gemFlipHandler = new GemFlipHandler(); + this.partnerCrateHandler = new PartnerCrateHandler(); + this.bountyManager = new BountyManager(); + this.dailyKitHandler = new DailyKitHandler(this); + this.masteryUpgradeHandler = new MasteryUpgradeHandler(this); + } + + this.tokensHandler = new TokensHandler(); + + if (getConfig().getBoolean("glowstoneMountain", false)) { + this.glowHandler = new GlowHandler(); + } + + this.customTimerHandler = new CustomTimerHandler(); + this.voucherHandler = new VoucherHandler(this); + this.pollHandler = new PollHandler(); + this.tipsHandler = new TipsHandler(this); + this.inventorySeeHandler = new InventorySeeHandler(); + this.fancyBrewerModule = new FancyBrewerModule(); + this.fancyBrewerModule.init(this); + this.deathbanArenaHandler = new DeathbanArenaHandler(this); + this.questHandler = new QuestHandler(this); + this.armorClassHandler = new ArmorClassHandler(this); + this.treasureChestHandler = new TreasureChestHandler(this); + + if (!this.serverHandler.isTeams() && !this.mapHandler.isKitMap()) { + this.crateHandler = new CrateHandler(this); + this.redeemCreatorHandler = new RedeemCreatorHandler(); + this.itemBoxesHandler = new ItemBoxesHandler(this); + this.clickItemHandler = new ClickItemHandler(this); + this.furyHandler = new FuryHandler(this); + this.battlePassHandler = new BattlePassHandler(); + this.treasureCoveHandler = new TreasureCoveHandler(); + this.lettingInHandler = new LettingInHandler(this); + this.votePartyHandler = new VotePartyHandler(this); + this.caveNiteHandler = new CaveNiteHandler(this); + this.spawnerGroundsHandler = new SpawnerGroundsHandler(this); + } + + this.bossHandler = new BossHandler(this); + this.miniEventsHandler = new MiniEventsHandler(this); + this.caveSaysHandler = new CaveSaysHandler(this); + this.networkBoosterHandler = new NetworkBoosterHandler(this); + this.couponDropsHandler = new CouponDropsHandler(this); + this.triviaHandler = new TriviaHandler(this); + this.airDropHandler = new AirDropHandler(this); + this.keyAllHandler = new KeyAllHandler(this); + + if (getConfig().getBoolean("cavern", false)) { + cavernHandler = new CavernHandler(); + } + + Proton.getInstance().getCommandHandler().registerAll(this); + + DeathMessageHandler.init(); + } + + private void setupPersistence() { + (playtimeMap = new PlaytimeMap()).loadFromRedis(); + (oppleMap = new OppleMap()).loadFromRedis(); + (deathbanMap = new DeathbanMap()).loadFromRedis(); + (PvPTimerMap = new PvPTimerMap()).loadFromRedis(); + (saleTimersScoreboardMap = new SaleTimersScoreboardMap()).loadFromRedis(); + (startingPvPTimerMap = new StartingPvPTimerMap()).loadFromRedis(); + (deathsMap = new DeathsMap()).loadFromRedis(); + (factionFilterMap = new FactionFilterMap()).loadFromRedis(); + (kitmapTokensMap = new KitmapTokensMap()).loadFromRedis(); + (killsMap = new KillsMap()).loadFromRedis(); + (killstreakMap = new KillstreakMap()).loadFromRedis(); + (killTagMap = new KillTagMap()).loadFromRedis(); + (chatModeMap = new ChatModeMap()).loadFromRedis(); + (teamColorMap = new TeamColorMap()).loadFromRedis(); + (enemyColorMap = new EnemyColorMap()).loadFromRedis(); + (archerTagColorMap = new ArcherTagColorMap()).loadFromRedis(); + (teamFocusColorMap = new TeamFocusColorMap()).loadFromRedis(); + (focusColorMap = new FocusColorMap()).loadFromRedis(); + (toggleGlobalChatMap = new ToggleGlobalChatMap()).loadFromRedis(); + (fishingKitMap = new FishingKitMap()).loadFromRedis(); + (friendLivesMap = new FriendLivesMap()).loadFromRedis(); + (chatSpyMap = new ChatSpyMap()).loadFromRedis(); + (diamondMinedMap = new DiamondMinedMap()).loadFromRedis(); + (goldMinedMap = new GoldMinedMap()).loadFromRedis(); + (ironMinedMap = new IronMinedMap()).loadFromRedis(); + (coalMinedMap = new CoalMinedMap()).loadFromRedis(); + (redstoneMinedMap = new RedstoneMinedMap()).loadFromRedis(); + (annoyingBroadcastMap = new AnnoyingBroadcastMap()).loadFromRedis(); + (lapisMinedMap = new LapisMinedMap()).loadFromRedis(); + (emeraldMinedMap = new EmeraldMinedMap()).loadFromRedis(); + (DTRDisplayMap = new DTRDisplayMap()).loadFromRedis(); + (teamfightModeMap = new TeamfightModeMap()).loadFromRedis(); + (lcTeamViewMap = new LCTeamViewMap()).loadFromRedis(); + (tipsMap = new TipsMap()).loadFromRedis(); + (firstJoinMap = new FirstJoinMap()).loadFromRedis(); + (lastJoinMap = new LastJoinMap()).loadFromRedis(); + (wrappedBalanceMap = new WrappedBalanceMap()).loadFromRedis(); + (toggleFoundDiamondsMap = new ToggleFoundDiamondsMap()).loadFromRedis(); + (toggleDeathMessageMap = new ToggleDeathMessageMap()).loadFromRedis(); + (toggleClaimMessageMap = new ToggleClaimMessageMap()).loadFromRedis(); + (abilityCooldownsScoreboardMap = new AbilityCooldownsScoreboardMap()).loadFromRedis(); + (tabListModeMap = new TabListModeMap()).loadFromRedis(); + (cobblePickupMap = new CobblePickupMap()).loadFromRedis(); + (mobDropsPickupMap = new MobDropsPickupMap()).loadFromRedis(); + (reclaimMap = new ReclaimMap()).loadFromRedis(); + (kdrMap = new KDRMap()).loadFromRedis(); + (bountyCooldownMap = new BountyCooldownMap()).loadFromRedis(); + (gemMap = new GemMap()).loadFromRedis(); + (gemBoosterMap = new GemBoosterMap()).loadFromRedis(); + } + + private void setupTasks() { + // unlocks claims at 10 minutes left of SOTW timer + new BukkitRunnable() { + @Override + public void run() { + if (!CustomTimerCreateCommand.isSOTWTimer()) { + return; + } + + long endsAt = CustomTimerCreateCommand.getCustomTimers().get("&a&lSOTW"); + long remaining = endsAt - System.currentTimeMillis(); + + int seconds = (int) (remaining/1000); + + if (sotwReminders.contains(seconds)) { + for (Player onlinePlayer : getServer().getOnlinePlayers()) { + PlayerUtil.sendTitle(onlinePlayer, "&a&lSOTW", "&f" + TimeUtils.formatIntoDetailedString(seconds) + " &7remaining!"); + } + } + + if (remaining <= TimeUnit.MINUTES.toMillis(10L)) { + for (Team team : Foxtrot.getInstance().getTeamHandler().getTeams()) { + if (team.isClaimLocked()) { + team.setClaimLocked(false); + team.sendMessage(CC.YELLOW + "Your faction's claims have been unlocked due to SOTW ending in 10 minutes!"); + } + } + } + } + }.runTaskTimerAsynchronously(Foxtrot.getInstance(), 20L, 20L); + + new BukkitRunnable() { + @Override + public void run() { + saveData(); + } + }.runTaskTimerAsynchronously(Foxtrot.getInstance(), 20*60*5, 20*60*5); + } + + public StatisticServer getStatisticServer() { + if (Foxtrot.getInstance().getMapHandler().isKitMap()) { + return StatisticServer.KITS; + } + + if (Foxtrot.getInstance().getServerHandler().isTeams()) { + return StatisticServer.CLANS; + } + + return StatisticServer.FASTS; + } + + private final List sotwReminders = Arrays.asList(300, 600, 900, 1800, 3600, 7200); + +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/chat/enums/ChatMode.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/chat/enums/ChatMode.java new file mode 100644 index 0000000..a255ce4 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/chat/enums/ChatMode.java @@ -0,0 +1,30 @@ +package net.frozenorb.foxtrot.chat.enums; + +import net.minecraft.util.com.google.common.collect.ImmutableSet; +import lombok.AllArgsConstructor; + +import java.util.Set; + +@AllArgsConstructor +public enum ChatMode { + + PUBLIC(ImmutableSet.of('!')), + ALLIANCE(ImmutableSet.of('#')), + TEAM(ImmutableSet.of('@')), + OFFICER(ImmutableSet.of('^')); + + Set forcedPrefixes; + + public static ChatMode findFromForcedPrefix(char forcedPrefix) { + for (ChatMode chatMode : values()) { + for (char chatModePrefix : chatMode.forcedPrefixes) { + if (chatModePrefix == forcedPrefix) { + return chatMode; + } + } + } + + return null; + } + +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/chat/listeners/ChatListener.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/chat/listeners/ChatListener.java new file mode 100644 index 0000000..3e78686 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/chat/listeners/ChatListener.java @@ -0,0 +1,281 @@ +package net.frozenorb.foxtrot.chat.listeners; + +import cc.fyre.piston.Piston; +import net.minecraft.util.com.google.common.collect.ImmutableMap; +import net.frozenorb.foxtrot.FoxConstants; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.chat.enums.ChatMode; +import net.frozenorb.foxtrot.team.Team; +import net.frozenorb.foxtrot.team.commands.team.TeamMuteCommand; +import net.frozenorb.foxtrot.team.commands.team.TeamShadowMuteCommand; +import net.frozenorb.foxtrot.team.track.TeamActionTracker; +import net.frozenorb.foxtrot.team.track.TeamActionType; +import net.frozenorb.foxtrot.util.CC; +import net.md_5.bungee.api.chat.BaseComponent; +import net.md_5.bungee.api.chat.ClickEvent; +import net.md_5.bungee.api.chat.HoverEvent; +import net.md_5.bungee.api.chat.TextComponent; +import org.bson.types.ObjectId; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.metadata.FixedMetadataValue; +import org.cavepvp.profiles.Profiles; +import org.cavepvp.profiles.playerProfiles.PlayerProfile; + +import java.util.Map; +import java.util.UUID; + +public class ChatListener implements Listener { + + private String getCustomPrefix(UUID uuid) { + Map placesMap = Foxtrot.getInstance().getMapHandler().getStatsHandler() != null ? Foxtrot.getInstance().getMapHandler().getStatsHandler().getTopKills() : null; + if (placesMap == null) { + return ""; + } + + int place = placesMap.size() == 3 ? placesMap.get(1).equals(uuid) ? 1 : placesMap.get(2).equals(uuid) ? 2 : placesMap.get(3).equals(uuid) ? 3 : 99 : 99; + + if (place == 99) { + return ""; + } + + return ChatColor.translateAlternateColorCodes('&', place == 1 ? "&2➊" : place == 2 ? "&a➋" : "&e➌") + " "; + } + + @EventHandler(priority = EventPriority.LOWEST) // this handler prevents people from getting banned for spam in faction (or ally) chat + public void onAsyncPlayerChatEarly(AsyncPlayerChatEvent event) { + ChatMode playerChatMode = Foxtrot.getInstance().getChatModeMap().getChatMode(event.getPlayer().getUniqueId()); + ChatMode forcedChatMode = ChatMode.findFromForcedPrefix(event.getMessage().charAt(0)); + ChatMode finalChatMode; + + if (forcedChatMode != null) { + finalChatMode = forcedChatMode; + } else { + finalChatMode = playerChatMode; + } + + if (finalChatMode != ChatMode.PUBLIC) { + event.getPlayer().setMetadata("NoSpamCheck", new FixedMetadataValue(Foxtrot.getInstance(), true)); + } + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onAsyncPlayerChat(AsyncPlayerChatEvent event) { + event.getPlayer().removeMetadata("NoSpamCheck", Foxtrot.getInstance()); + + Team playerTeam = Foxtrot.getInstance().getTeamHandler().getTeam(event.getPlayer()); + ChatMode playerChatMode = Foxtrot.getInstance().getChatModeMap().getChatMode(event.getPlayer().getUniqueId()); + ChatMode forcedChatMode = ChatMode.findFromForcedPrefix(event.getMessage().charAt(0)); + ChatMode finalChatMode; + + if (Profiles.getInstance().hasStaffChatEnabled(event.getPlayer())) { + return; + } + + // If they provided us with a forced chat mode, we have to remove it from the final message. + // We also .trim() the message because people will do things like '! hi', which just looks annoying in chat. + if (forcedChatMode != null) { + event.setMessage(event.getMessage().substring(1).trim()); + } + + if (forcedChatMode != null) { + finalChatMode = forcedChatMode; + } else { + finalChatMode = playerChatMode; + } + + // If another plugin cancelled this event before it got to us (we are on MONITOR, so it'll happen) + if (event.isCancelled() && finalChatMode == ChatMode.PUBLIC) { // Only respect cancelled events if this is public chat. Who cares what their team says. + return; + } + + // Any route we go down will cancel the event eventually. + // Let' s just do it here. + event.setCancelled(true); + + // If someone's not in a team, instead of forcing their 'channel' to public, + // we just tell them they can't. + if (finalChatMode != ChatMode.PUBLIC && playerTeam == null) { + event.getPlayer().sendMessage(ChatColor.RED + "You can't speak in non-public chat if you're not in a team!"); + return; + } + + if (finalChatMode == ChatMode.OFFICER && !playerTeam.isCaptain(event.getPlayer().getUniqueId()) && !playerTeam.isCoLeader(event.getPlayer().getUniqueId()) && !playerTeam.isOwner(event.getPlayer().getUniqueId())) { + event.getPlayer().sendMessage(ChatColor.RED + "You can't speak in officer chat if you're not an officer!"); + return; + } + + if (finalChatMode == ChatMode.PUBLIC && TeamMuteCommand.getTeamMutes().containsKey(event.getPlayer().getUniqueId())) { + event.getPlayer().sendMessage(ChatColor.RED.toString() + ChatColor.BOLD + "Your team is muted!"); + return; + } + + // and here starts the big logic switch + switch (finalChatMode) { + case PUBLIC: + + String publicChatFormat = FoxConstants.publicChatFormat(event.getPlayer(), playerTeam, event.getMessage(), getCustomPrefix(event.getPlayer().getUniqueId())); + + TextComponent component = null; + if (event.getPlayer().hasMetadata("stream_link")) { + String streamLink = (String) event.getPlayer().getMetadata("stream_link").get(0).value(); + component = new TextComponent(); + component.setText(ChatColor.RED + CC.BOLD + "[LIVE] "); + component.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new BaseComponent[]{new TextComponent(CC.GRAY + "Click to open stream!")})); + component.setClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, streamLink)); + component.addExtra(publicChatFormat); + } + + // Loop those who are to receive the message (which they won't if they have the sender /ignore'd or something), + // not online players + for (Player player : event.getRecipients()) { +// if (!event.getPlayer().isOp() && Piston.getInstance().getIgnoreCache().containsKey(player.getUniqueId()) && +// Piston.getInstance().getIgnoreCache().get(player.getUniqueId()).contains(event.getPlayer().getUniqueId())) { +// continue; +// } + + if (playerTeam == null) { + // If the player sending the message is shadowmuted (if their team was and they left it) + // then we don't allow them to. We probably could move this check "higher up", but oh well. + if (TeamShadowMuteCommand.getTeamShadowMutes().containsKey(event.getPlayer().getUniqueId())) { + continue; + } + + // If their chat is enabled (which it is by default) or the sender is op, send them the message + // The isOp() fragment is so OP messages are sent regardless of if the player's chat is toggled + if (event.getPlayer().isOp() || Foxtrot.getInstance().getToggleGlobalChatMap().isGlobalChatToggled(player.getUniqueId())) { + if (component != null) { + player.spigot().sendMessage(component); + } else { + player.sendMessage(publicChatFormat); + } + } + } else { + if (playerTeam.isMember(player.getUniqueId())) { + // Gypsie way to get a custom color if they're allies/teammates + if (component != null) { + player.spigot().sendMessage(component); + } else { + player.sendMessage(publicChatFormat.replace(ChatColor.GOLD + "[" + Foxtrot.getInstance().getServerHandler().getDefaultRelationColor(), ChatColor.GOLD + "[" + ChatColor.DARK_GREEN)); + } + } else if (playerTeam.isAlly(player.getUniqueId())) { + // Gypsie way to get a custom color if they're allies/teammates + if (component != null) { + player.spigot().sendMessage(component); + } else { + player.sendMessage(publicChatFormat.replace(ChatColor.GOLD + "[" + Foxtrot.getInstance().getServerHandler().getDefaultRelationColor(), ChatColor.GOLD + "[" + Team.ALLY_COLOR)); + } + } else { + // We only check this here as... + // Team members always see their team's messages + // Allies always see their allies' messages, 'cause they'll probably be in a TS or something + // and they could figure out this code even exists + if (TeamShadowMuteCommand.getTeamShadowMutes().containsKey(event.getPlayer().getUniqueId())) { + continue; + } + + // If their chat is enabled (which it is by default) or the sender is op, send them the message + // The isOp() fragment is so OP messages are sent regardless of if the player's chat is toggled + if (event.getPlayer().isOp() || Foxtrot.getInstance().getToggleGlobalChatMap().isGlobalChatToggled(player.getUniqueId())) { + if (component != null) { + player.spigot().sendMessage(component); + } else { + player.sendMessage(publicChatFormat); + } + } + } + } + } + + Foxtrot.getInstance().getServer().getConsoleSender().sendMessage(publicChatFormat); + break; + case ALLIANCE: + String allyChatFormat = FoxConstants.allyChatFormat(event.getPlayer(), event.getMessage()); + String allyChatSpyFormat = FoxConstants.allyChatSpyFormat(playerTeam, event.getPlayer(), event.getMessage()); + + // Loop online players and not recipients just in case you're weird and + // /ignore your teammates/allies + for (Player player : Foxtrot.getInstance().getServer().getOnlinePlayers()) { + if (playerTeam.isMember(player.getUniqueId()) || playerTeam.isAlly(player.getUniqueId())) { + player.sendMessage(allyChatFormat); + } else if (Foxtrot.getInstance().getChatSpyMap().getChatSpy(player.getUniqueId()).contains(playerTeam.getUniqueId())) { + player.sendMessage(allyChatSpyFormat); + } + } + + // Log to ally's allychat log. + for (ObjectId allyId : playerTeam.getAllies()) { + Team ally = Foxtrot.getInstance().getTeamHandler().getTeam(allyId); + + if (ally != null) { + TeamActionTracker.logActionAsync(ally, TeamActionType.ALLY_CHAT_MESSAGE, ImmutableMap.builder() + .put("allyTeamId", playerTeam.getUniqueId()) + .put("allyTeamName", playerTeam.getName()) + .put("playerId", event.getPlayer().getUniqueId()) + .put("playerName", event.getPlayer().getName()) + .put("message", event.getMessage()) + .build() + ); + } + } + + TeamActionTracker.logActionAsync(playerTeam, TeamActionType.ALLY_CHAT_MESSAGE, ImmutableMap.of( + "playerId", event.getPlayer().getUniqueId(), + "playerName", event.getPlayer().getName(), + "message", event.getMessage() + )); + + Foxtrot.getInstance().getServer().getLogger().info("[Ally Chat] [" + playerTeam.getName() + "] " + event.getPlayer().getName() + ": " + event.getMessage()); + break; + case TEAM: + String teamChatFormat = FoxConstants.teamChatFormat(event.getPlayer(), event.getMessage()); + String teamChatSpyFormat = FoxConstants.teamChatSpyFormat(playerTeam, event.getPlayer(), event.getMessage()); + + // Loop online players and not recipients just in case you're weird and + // /ignore your teammates + for (Player player : Foxtrot.getInstance().getServer().getOnlinePlayers()) { + if (playerTeam.isMember(player.getUniqueId())) { + player.sendMessage(teamChatFormat); + } else if (Foxtrot.getInstance().getChatSpyMap().getChatSpy(player.getUniqueId()).contains(playerTeam.getUniqueId())) { + player.sendMessage(teamChatSpyFormat); + } + } + + // Log to our teamchat log. + TeamActionTracker.logActionAsync(playerTeam, TeamActionType.TEAM_CHAT_MESSAGE, ImmutableMap.of( + "playerId", event.getPlayer().getUniqueId(), + "playerName", event.getPlayer().getName(), + "message", event.getMessage() + )); + + Foxtrot.getInstance().getServer().getLogger().info("[Team Chat] [" + playerTeam.getName() + "] " + event.getPlayer().getName() + ": " + event.getMessage()); + break; + case OFFICER: + String officerChatFormat = FoxConstants.officerChatFormat(event.getPlayer(), event.getMessage()); + + // Loop online players and not recipients just in case you're weird and + // /ignore your teammates + for (Player player : Foxtrot.getInstance().getServer().getOnlinePlayers()) { + if (playerTeam.isCaptain(player.getUniqueId()) || playerTeam.isCoLeader(player.getUniqueId()) || playerTeam.isOwner(player.getUniqueId())) { + player.sendMessage(officerChatFormat); + } + } + + // Log to our teamchat log. + TeamActionTracker.logActionAsync(playerTeam, TeamActionType.OFFICER_CHAT_MESSAGE, ImmutableMap.of( + "playerId", event.getPlayer().getUniqueId(), + "playerName", event.getPlayer().getName(), + "message", event.getMessage() + )); + + Foxtrot.getInstance().getServer().getLogger().info("[Officer Chat] [" + playerTeam.getName() + "] " + event.getPlayer().getName() + ": " + event.getMessage()); + break; + } + } + +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/chat/tips/TipsHandler.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/chat/tips/TipsHandler.java new file mode 100644 index 0000000..e0e04f1 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/chat/tips/TipsHandler.java @@ -0,0 +1,115 @@ +package net.frozenorb.foxtrot.chat.tips; + +import cc.fyre.proton.command.Command; +import cc.fyre.proton.command.param.Parameter; + +import lombok.Getter; + +import lombok.Setter; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.chat.tips.task.TipTask; + +import org.bukkit.ChatColor; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.entity.Player; + +import java.io.File; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +public class TipsHandler { + + public static String PREFIX = ChatColor.GRAY + "[" + ChatColor.RED + ChatColor.BOLD + ChatColor.ITALIC + "TIP" + ChatColor.GRAY + "] " + ChatColor.GOLD; + + @Getter private Map tips = new HashMap<>(); + @Getter @Setter private int interval; + @Getter @Setter private TipTask tipTask; + + @Getter private File file; + @Getter private FileConfiguration data; + + public TipsHandler(Foxtrot instance) { + this.interval = instance.getConfig().getInt("tips.interval", 300); + this.tipTask = new TipTask(instance, this); + this.tipTask.runTaskTimer(instance, 20L * interval, 20L * interval); + + this.loadTips(); + } + + public void loadTips() { + this.file = new File(Foxtrot.getInstance().getDataFolder(), "data/tips.yml"); + this.data = YamlConfiguration.loadConfiguration(this.file); + + if (!this.file.exists()) { + try { + this.file.createNewFile(); + } catch (IOException e) { + e.printStackTrace(); + } + return; + } + + if (this.data.get("tips") == null) { + return; + } + + for (String key : this.data.getConfigurationSection("tips").getKeys(false)) { + final String tip = this.data.getString("tips." + key + ".text"); + + tips.put(Integer.parseInt(key.replace("id_", "")), tip); + } + } + + + public void saveTips() { + this.data.getValues(false).forEach((key, value) -> this.data.set(key, null)); + + for (Map.Entry tipEntry : this.tips.entrySet()) { + this.data.set("tips.id_" + tipEntry.getKey() + ".text", tipEntry.getValue()); + } + + try { + this.data.save(this.file); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Command(names = {"tips setinterval"}, permission = "op") + public static void execute(Player player, @Parameter(name = "seconds")int seconds) { + Foxtrot.getInstance().getTipsHandler().setInterval(seconds); + + Foxtrot.getInstance().getTipsHandler().getTipTask().cancel(); + Foxtrot.getInstance().getTipsHandler().setTipTask(new TipTask(Foxtrot.getInstance(), Foxtrot.getInstance().getTipsHandler())); + Foxtrot.getInstance().getTipsHandler().getTipTask().runTaskTimer(Foxtrot.getInstance(), 20*seconds, 20*seconds); + + player.sendMessage(ChatColor.GOLD + "Set tip interval to " + ChatColor.WHITE + seconds); + } + + @Command(names = {"tips add"}, permission = "op") + public static void add(Player player, @Parameter(name = "id")int id, @Parameter(name = "tip", wildcard = true)String tip) { + if (Foxtrot.getInstance().getTipsHandler().getTips().containsKey(id)) { + player.sendMessage(ChatColor.RED + "Tip with the ID " + id + " already exists!"); + return; + } + + Foxtrot.getInstance().getTipsHandler().getTipTask().getQueue().add(tip); + Foxtrot.getInstance().getTipsHandler().getTips().put(id, tip); + + player.sendMessage(ChatColor.GOLD + "Added tip with the ID " + ChatColor.WHITE + id + ChatColor.GOLD + "."); + player.sendMessage("Sample: " + ChatColor.translate(PREFIX + tip)); + } + + @Command(names = {"tips delete"}, permission = "op") + public static void delete(Player player, @Parameter(name = "id")int id) { + if (!Foxtrot.getInstance().getTipsHandler().getTips().containsKey(id)) { + player.sendMessage(ChatColor.RED + "Tip with the ID " + id + " doesn't exist!"); + return; + } + + player.sendMessage(ChatColor.GOLD + "Deleted tip with the ID " + ChatColor.WHITE + id + ChatColor.GOLD + "."); + Foxtrot.getInstance().getTipsHandler().getTips().remove(id); + } +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/chat/tips/task/TipTask.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/chat/tips/task/TipTask.java new file mode 100644 index 0000000..ab29a4e --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/chat/tips/task/TipTask.java @@ -0,0 +1,50 @@ +package net.frozenorb.foxtrot.chat.tips.task; + +import lombok.Getter; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.chat.tips.TipsHandler; +import net.frozenorb.foxtrot.team.Team; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; + +import java.util.ArrayList; +import java.util.List; + +public class TipTask extends BukkitRunnable { + private Foxtrot instance; + private TipsHandler tipsHandler; + + @Getter private List queue = new ArrayList<>(); + + public TipTask(Foxtrot instance, TipsHandler tipsHandler) { + this.instance = instance; + this.tipsHandler = tipsHandler; + + this.queue.addAll(this.tipsHandler.getTips().values()); + } + + @Override + public void run() { + if (this.queue.isEmpty()) { + this.queue.addAll(this.tipsHandler.getTips().values()); + } + + if (this.tipsHandler.getTips().isEmpty()) { + System.out.println("-------------------"); + System.out.println("Tried to send a tip out, however none were found."); + System.out.println("-------------------"); + return; + } + + final String chosenTip = this.queue.remove(0); + + for (Player onlinePlayer : this.instance.getServer().getOnlinePlayers()) { + if (this.instance.getTipsMap().isTips(onlinePlayer.getUniqueId())) { + onlinePlayer.sendMessage(""); + onlinePlayer.sendMessage(ChatColor.translate(TipsHandler.PREFIX + chosenTip)); + onlinePlayer.sendMessage(""); + } + } + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/chat/trivia/TriviaHandler.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/chat/trivia/TriviaHandler.java new file mode 100644 index 0000000..00595be --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/chat/trivia/TriviaHandler.java @@ -0,0 +1,173 @@ +package net.frozenorb.foxtrot.chat.trivia; + +import cc.fyre.proton.command.Command; +import cc.fyre.proton.command.param.Parameter; +import lombok.Setter; +import net.frozenorb.foxtrot.Foxtrot; + +import lombok.Getter; +import org.bukkit.ChatColor; +import org.bukkit.Server; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerChatEvent; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ThreadLocalRandom; +import java.util.stream.Collectors; + +public class TriviaHandler implements Listener { + private Foxtrot instance; + + @Getter private Map questions = new HashMap<>(); + @Getter private String chosenQuestion = null; + @Getter private String chosenAnswer = null; + @Getter @Setter private Integer riggedNumber = null; + @Getter @Setter private boolean chatReaction = false; + + public TriviaHandler(Foxtrot instance) { + questions.put("In what year was Minecraft released?", "2011"); + questions.put("What is the current top rank on CavePvP?", "Cave"); + questions.put("What is the lowest rank on CavePvP?", "Iron"); + questions.put("What is CavePvP's Discord link?", "discord.gg/cavepvp"); + questions.put("How many states are there in the United States?", "50"); + questions.put("Is tomato a fruit?", "Yes"); + questions.put("What country has the 2nd largest GDP?", "China"); + questions.put("What country is largest in population?", "India"); + questions.put("What country is largest in land size?", "Russia"); + questions.put("What's 6x6?", "36"); + questions.put("What's 829+219?", "1048"); + questions.put("What's 3x3+349?", "358"); + questions.put("What's 348+233?", "358"); + questions.put("What's the first 5 numbers of PI?", "3.1415"); + questions.put("What's 8 squared?", "64"); + questions.put("What's 12 squared?", "144"); + questions.put("What's 3 squared?", "9"); + questions.put("What's 9 cubed?", "729"); + questions.put("What's 48+16", "64"); + questions.put("How many months have 28 days?", "12"); + questions.put("When was the CavePvP Christmas Update?", "December"); + questions.put("How many continents are there?", "7"); + questions.put("What's the largest crypto currency?", "Bitcoin"); + questions.put("What company invented the iPhone?", "Apple"); + questions.put("What company invented the Playstation?", "Sony"); + questions.put("What company invented the Xbox?", "Microsoft"); + questions.put("Who created Minecraft?", "Notch"); + questions.put("What's the name of the Minecraft convention?", "Minecon"); + questions.put("What's the name of the Twitch convention?", "Twitchcon"); + questions.put("What's the final boss in Minecraft?", "Enderdragon"); + questions.put("What version is Minecraft currently on?", "1.17"); + questions.put("What is the IP to CavePvP?", "cavepvp.org"); + questions.put("What is the new Minecraft mob that was voted upon?", "Allay"); + questions.put("What is the 8th letter of the alphabet?", "H"); + questions.put("What is the 12th letter of the alphabet?", "L"); + questions.put("What is the 18th letter of the alphabet?", "R"); + questions.put("What is the 24th letter of the alphabet?", "W"); + questions.put("chatreaction:SimplyTrash", "SimplyTrash"); + questions.put("chatreaction:DrePvP", "DrePvP"); + questions.put("chatreaction:iMakeMcVids", "iMakeMcVids"); + questions.put("chatreaction:Headed", "Headed"); + questions.put("chatreaction:Vik", "Vik"); + questions.put("chatreaction:Lectors", "Lectors"); + questions.put("chatreaction:Frozeado", "Frozeado"); + questions.put("chatreaction:SamHCF", "SamHCF"); + questions.put("chatreaction:CavePvP", "CavePvP"); + questions.put("chatreaction:CavePvP On Top", "CavePvP On Top"); + questions.put("chatreaction:Trojan", "Trojan"); + + this.instance = instance; + this.instance.getServer().getPluginManager().registerEvents(this, this.instance); + this.instance.getServer().getScheduler().runTaskTimer(instance, this::start, (20*60)*90+80, (20*60)*90+80); + } + + public void start() { + final Server server = this.instance.getServer(); + + final List questionList = new ArrayList<>(questions.keySet()); + + final String question = questionList.get(ThreadLocalRandom.current().nextInt(questionList.size()-1)); + final String answer = questions.get(question); + this.chosenQuestion = question; + this.chosenAnswer = answer; + + if (question.startsWith("chatreaction:")) { + server.broadcastMessage(""); + server.broadcastMessage(ChatColor.translate("&4&lChat Reaction")); + server.broadcastMessage(answer); + server.broadcastMessage(ChatColor.translate("&cFirst person to type the message above will receive &c&la random prize&7!")); + server.broadcastMessage(""); + } else { + server.broadcastMessage(""); + server.broadcastMessage(ChatColor.translate("&4&lTrivia")); + server.broadcastMessage(ChatColor.translate(question)); + server.broadcastMessage(ChatColor.GRAY + "First person to get the answer right will get a " + ChatColor.RED + ChatColor.BOLD.toString() + "random prize" + ChatColor.GRAY + "!"); + server.broadcastMessage(""); + } + + server.getScheduler().runTaskLater(instance, () -> { + if (!this.chosenAnswer.equalsIgnoreCase(answer)) { + return; + } + + server.broadcastMessage(""); + server.broadcastMessage(ChatColor.RED + "Nobody got the answer in time!"); + server.broadcastMessage(""); + + this.chosenQuestion = null; + this.chosenAnswer = null; + this.riggedNumber = null; + }, 20*30); + } + + @EventHandler(priority = EventPriority.NORMAL) + private void onChat(PlayerChatEvent event) { + final String message = event.getMessage().replace("!", ""); + if (event.getMessage().equalsIgnoreCase("null") || this.chosenQuestion == null || this.chosenAnswer == null || !this.chosenAnswer.equalsIgnoreCase(message)) { + return; + } + + final Player player = event.getPlayer(); + final Server server = this.instance.getServer(); + final int randomNumber = this.riggedNumber == null ? ThreadLocalRandom.current().nextInt(0, 100) : this.riggedNumber; + String prize; + + if (Foxtrot.getInstance().getMapHandler().isKitMap()) { + prize = ChatColor.translate("&a&l100x Gems"); + server.dispatchCommand(server.getConsoleSender(), "gems add " + player.getName() + " 100"); + } else if (randomNumber == -1) { + prize = ChatColor.translate("&7an &b&lAirdrop"); + server.dispatchCommand(server.getConsoleSender(), "airdrops give " + player.getName() + " 1"); + } else if (randomNumber < 3) { + prize = ChatColor.translate("&7a &e&ki&6&lHalloween Key&e&ki&r"); + server.dispatchCommand(server.getConsoleSender(), "cr givekey " + player.getName() + " Seasonal 1"); + } else if (randomNumber < 6) { + prize = ChatColor.translate("&7a &6&lFall Lootbox"); + server.dispatchCommand(server.getConsoleSender(), "crates give " + player.getName() + " Seasonal 1"); + } else { + prize = ChatColor.translate("&5&l3x Legendary Keys"); + server.dispatchCommand(server.getConsoleSender(), "cr givekey " + player.getName() + " Legendary 3"); + } + + server.broadcastMessage(ChatColor.translate("&4&lTrivia &8┃ &f" + player.getName() + " &7got the answer &f'" + this.chosenAnswer + "' &7and received " + prize + "&7!")); + + this.chosenAnswer = null; + this.chosenQuestion = null; + this.riggedNumber = null; + } + + @Command(names = {"trivia start"}, permission = "op") + public static void execute(Player player, @Parameter(name = "number", defaultValue = "-5")int number) { + Foxtrot.getInstance().getTriviaHandler().start(); + + if (number != -5) { + Foxtrot.getInstance().getTriviaHandler().setRiggedNumber(number); + } else { + Foxtrot.getInstance().getTriviaHandler().setRiggedNumber(null); + } + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/AddLoreCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/AddLoreCommand.java new file mode 100644 index 0000000..d9eb0aa --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/AddLoreCommand.java @@ -0,0 +1,109 @@ +package net.frozenorb.foxtrot.commands; + +import cc.fyre.proton.command.Command; +import cc.fyre.proton.command.param.Parameter; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.loot.treasurecove.listeners.TreasureCoveListener; +import net.frozenorb.foxtrot.util.ParticleEffect; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +public class AddLoreCommand { + + @Command(names = {"bard man"}, permission = "op") + public static void bardMan(Player player) { + final Location location = player.getLocation(); + + for (int x = 15; x >= -15; x--) { + for (int y = 15; y >= -15; y--) { + for (int z = 15; z >= -15; z--) { + if (location.getBlock().getRelative(x, y, z).getType() == Material.LEVER) { + player.sendMessage("Lever is at " + x + ", " + y + ", " + z); + } + } + } + } + TreasureCoveListener.SPAWN_IN = System.currentTimeMillis()+ TimeUnit.MINUTES.toMillis(1); + +// PvPClassHandler.getUltimate().put(player.getUniqueId(),90F); + } + + @Command(names = {"testparticle"}, permission = "op") + public static void particle(Player player, @Parameter(name = "type")String type) { + final ParticleEffect particleEffect = ParticleEffect.valueOf(type.toUpperCase()); + + particleEffect.display(0.0f, 0.0f, 0.0f, 0.01f, 1, player.getLocation(), 50); + } + + @Command(names = {"blockbreakdown"}, permission = "op") + public static void block(Player player) { + final Block block = player.getTargetBlock(null,5); + + if (block == null) { + player.sendMessage(ChatColor.RED + "You are not looking at a block."); + return; + } + + player.sendMessage(block.getType().name() + " Breakdown:"); + player.sendMessage("Temperature: " + block.getTemperature()); + player.sendMessage("Biome: " + block.getBiome().name()); + player.sendMessage("Humidity: " + block.getHumidity()); + player.sendMessage("Power: " + block.getBlockPower()); + player.sendMessage("Light from Blocks: " + block.getLightFromBlocks()); + player.sendMessage("Light from Sky: " + block.getLightFromSky()); + player.sendMessage("Light from Level: " + block.getLightLevel()); + player.sendMessage("Block Powered: " + block.isBlockPowered()); + player.sendMessage("Block In-directly Powered: " + block.isBlockIndirectlyPowered()); + player.sendMessage("Block Move Reaction: " + block.getPistonMoveReaction().name()); + } + + @Command(names = {"addlore"}, permission = "op") + public static void execute(Player player, @Parameter(name = "lore", wildcard = true)String name) { + final ItemStack itemStack = player.getItemInHand(); + + if (itemStack == null || itemStack.getType() == Material.AIR) { + player.sendMessage(ChatColor.RED + "You must hold something!"); + return; + } + + if (itemStack.getItemMeta() == null) { + player.sendMessage(ChatColor.RED + "You may not add a lore to an item with no item meta!"); + return; + } + + final ItemMeta itemMeta = itemStack.getItemMeta(); + final List lore = itemMeta.getLore() == null ? new ArrayList<>() : itemMeta.getLore(); + + lore.add(ChatColor.translate(name)); + + itemMeta.setLore(lore); + itemStack.setItemMeta(itemMeta); + player.sendMessage(ChatColor.GOLD + "Added lore named " + ChatColor.WHITE + name + ChatColor.GOLD + "."); + } + + @Command(names = {"alt scan"}, permission = "op") + public static void altScan(Player player) { + final List players = new ArrayList<>(Foxtrot.getInstance().getServer().getOnlinePlayers()); + + player.sendMessage(ChatColor.GOLD + "Scanning for alts..."); + + for (Player onlinePlayer : players) { + final List alts = Foxtrot.getInstance().getServer().getOnlinePlayers().stream().filter(it -> it.getAddress().getAddress().getHostAddress().equalsIgnoreCase(onlinePlayer.getAddress().getAddress().getHostAddress()) && !it.getName().equalsIgnoreCase(onlinePlayer.getName())).collect(Collectors.toList()); + + if (!alts.isEmpty()) { + player.sendMessage(ChatColor.translate(onlinePlayer.getName() + " &6has &f" + alts.size() + " &6alts online!")); + } + } + } + +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/ArcherColorCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/ArcherColorCommand.java new file mode 100644 index 0000000..7eeb405 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/ArcherColorCommand.java @@ -0,0 +1,59 @@ +package net.frozenorb.foxtrot.commands; + +import cc.fyre.proton.command.Command; +import cc.fyre.proton.command.param.Parameter; +import net.frozenorb.foxtrot.gameplay.pvpclasses.archer.ArcherColor; +import net.frozenorb.foxtrot.server.HelpfulColor; +import org.apache.commons.lang.WordUtils; +import org.bukkit.ChatColor; +import org.bukkit.Color; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.LeatherArmorMeta; + +import java.util.Arrays; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +public class ArcherColorCommand { + + @Command(names = {"armorcolor"},permission = "command.archercolor") + public static void execute(Player player,@Parameter(name = "color")String color) { + + final HelpfulColor helpfulColor = Arrays.stream(HelpfulColor.values()).filter(it -> it.name().equalsIgnoreCase(color)).findFirst().orElse(null); + + if (helpfulColor == null) { + player.sendMessage(ChatColor.RED + "Color not found! Type /listcolors to view all available colors."); + return; + } + + final List armor = Arrays.stream(player.getInventory().getArmorContents()).filter(Objects::nonNull).filter(it -> it.hasItemMeta() && it.getItemMeta() instanceof LeatherArmorMeta).collect(Collectors.toList()); + + if (armor.isEmpty()) { + player.sendMessage(ChatColor.RED + "You have no leather armor on!"); + return; + } + + armor.forEach(it -> { + + final LeatherArmorMeta meta = (LeatherArmorMeta) it.getItemMeta(); + + meta.setColor(helpfulColor.getColor()); + + it.setItemMeta(meta); + }); + + player.sendMessage(ChatColor.GREEN + "Updated your leather armor color to " + helpfulColor.name() + "!"); + player.updateInventory(); + } + + @Command(names = {"listcolors"},permission = "command.archercolor") + public static void list(Player player) { + player.sendMessage(ChatColor.DARK_RED + ChatColor.BOLD.toString() + "Available Colors"); + for (HelpfulColor value : HelpfulColor.values()) { + player.sendMessage(ChatColor.WHITE + "- " + ChatColor.RED + WordUtils.capitalizeFully(value.name())); + } + } + +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/BalanceCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/BalanceCommand.java new file mode 100644 index 0000000..d456ffb --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/BalanceCommand.java @@ -0,0 +1,130 @@ +package net.frozenorb.foxtrot.commands; + +import cc.fyre.proton.command.Command; +import cc.fyre.proton.command.param.Parameter; +import cc.fyre.proton.Proton; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.loot.shop.ShopMainMenu; +import net.frozenorb.foxtrot.gameplay.loot.shop.ShopMenu; +import net.frozenorb.foxtrot.server.SpawnTagHandler; +import net.frozenorb.foxtrot.team.dtr.DTRBitmask; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import java.text.NumberFormat; +import java.util.Locale; +import java.util.UUID; + +public class BalanceCommand { + + @Command(names = {"Balance", "Econ", "Bal", "$"}, permission = "") + public static void balance(Player sender, @Parameter(name = "player", defaultValue = "self") UUID player) { + if (sender.getUniqueId().equals(player)) { + sender.sendMessage(ChatColor.GOLD + "Balance: " + ChatColor.DARK_GREEN + "$" + ChatColor.GREEN + NumberFormat.getNumberInstance(Locale.US).format(Foxtrot.getInstance().getEconomyHandler().getBalance(sender.getUniqueId()))); + } else { + sender.sendMessage(ChatColor.GOLD + "Balance of " + Proton.getInstance().getUuidCache().name(player) + ": " + ChatColor.DARK_GREEN + "$" + ChatColor.GREEN + NumberFormat.getNumberInstance(Locale.US).format(Foxtrot.getInstance().getEconomyHandler().getBalance(player))); + } + } + + @Command(names = {"shop"}, permission = "") + public static void shop(Player player) { + if (!Foxtrot.getInstance().getMapHandler().isKitMap() && !DTRBitmask.SAFE_ZONE.appliesAt(player.getLocation().clone())) { + player.sendMessage(ChatColor.RED + "You must be in Spawn!"); + return; + } + + if (SpawnTagHandler.isTagged(player)) { + player.sendMessage(ChatColor.RED + "You may not access the shop whilst in Combat!"); + return; + } + + Foxtrot.getInstance().getQuestHandler().completeQuest(player, "Shop"); + + new ShopMainMenu().openMenu(player); + } + + @Command(names = {"buyshop"}, permission = "") + public static void buyShop(Player player) { + if (!Foxtrot.getInstance().getMapHandler().isKitMap() && !DTRBitmask.SAFE_ZONE.appliesAt(player.getLocation().clone())) { + player.sendMessage(ChatColor.RED + "You must be in Spawn!"); + return; + } + + if (SpawnTagHandler.isTagged(player)) { + player.sendMessage(ChatColor.RED + "You may not access the shop whilst in Combat!"); + return; + } + + new ShopMenu(true).openMenu(player); + } + + @Command(names = {"sellshop"}, permission = "") + public static void sellshop(Player player) { + if (!Foxtrot.getInstance().getMapHandler().isKitMap() && !DTRBitmask.SAFE_ZONE.appliesAt(player.getLocation().clone())) { + player.sendMessage(ChatColor.RED + "You must be in Spawn!"); + return; + } + + if (SpawnTagHandler.isTagged(player)) { + player.sendMessage(ChatColor.RED + "You may not access the shop whilst in Combat!"); + return; + } + + new ShopMenu(false).openMenu(player); + } + + @Command(names={ "SetBal" }, permission="foxtrot.setbal") + public static void setBal(CommandSender sender, @Parameter(name="player") UUID player, @Parameter(name="amount") float amount) { + + if (Float.isNaN(amount)) { + sender.sendMessage("§cWhy are you trying to do that?"); + return; + } + + Player targetPlayer = Foxtrot.getInstance().getServer().getPlayer(player); + Foxtrot.getInstance().getEconomyHandler().setBalance(player, amount); + + if (sender != targetPlayer) { + sender.sendMessage("§6Balance for §e" + player + "§6 set to §e$" + amount); + } + + if (sender instanceof Player && (targetPlayer != null)) { + String targetDisplayName = ((Player) sender).getDisplayName(); + targetPlayer.sendMessage("§aYour balance has been set to §6$" + amount + "§a by §6" + targetDisplayName); + } else if (targetPlayer != null) { + targetPlayer.sendMessage("§aYour balance has been set to §6$" + amount + "§a by §4CONSOLE§a."); + } + + Foxtrot.getInstance().getWrappedBalanceMap().setBalance(player, amount); + } + + @Command(names={ "addBal" }, permission="foxtrot.addbal") + public static void addBal(CommandSender sender, @Parameter(name="player") UUID player, @Parameter(name="amount") float amount) { + if (amount > 10000 && sender instanceof Player && !sender.isOp()) { + sender.sendMessage("§cYou cannot add a balance this high. This action has been logged."); + return; + } + + if (Float.isNaN(amount)) { + sender.sendMessage("§cWhy are you trying to do that?"); + return; + } + + Player targetPlayer = Foxtrot.getInstance().getServer().getPlayer(player); + Foxtrot.getInstance().getEconomyHandler().setBalance(player, Foxtrot.getInstance().getEconomyHandler().getBalance(player) + amount); + + if (sender != targetPlayer) { + sender.sendMessage("§6Balance for §e" + player + "§6 set to §e$" + Foxtrot.getInstance().getEconomyHandler().getBalance(player)); + } + + if (sender instanceof Player && (targetPlayer != null)) { + String targetDisplayName = ((Player) sender).getDisplayName(); + targetPlayer.sendMessage("§aYour balance has been set to §6$" + Foxtrot.getInstance().getEconomyHandler().getBalance(player) + "§a by §6" + targetDisplayName); + } else if (targetPlayer != null) { + targetPlayer.sendMessage("§aYour balance has been set to §6$" + Foxtrot.getInstance().getEconomyHandler().getBalance(player) + "§a by §4CONSOLE§a."); + } + + Foxtrot.getInstance().getWrappedBalanceMap().setBalance(player, Foxtrot.getInstance().getEconomyHandler().getBalance(player)); + } +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/BlueprintsCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/BlueprintsCommand.java new file mode 100644 index 0000000..29f36ac --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/BlueprintsCommand.java @@ -0,0 +1,28 @@ +package net.frozenorb.foxtrot.commands; + +import cc.fyre.proton.command.Command; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.team.Team; +import net.frozenorb.foxtrot.team.menu.BlueprintMenu; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; + +public class BlueprintsCommand { + @Command(names = {"blueprint", "blueprints"}, permission = "") + public static void execute(Player player) { + final Team team = Foxtrot.getInstance().getTeamHandler().getTeam(player); + + if (team == null) { + player.sendMessage(ChatColor.GRAY + "You are not on a team!"); + return; + } + + if (!team.getOwner().equals(player.getUniqueId())) { + player.sendMessage(ChatColor.RED + "You must be the leader of the team!"); + return; + } + + new BlueprintMenu().openMenu(player); + } + +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/BottleCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/BottleCommand.java new file mode 100644 index 0000000..9228087 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/BottleCommand.java @@ -0,0 +1,55 @@ +package net.frozenorb.foxtrot.commands; + +import java.text.NumberFormat; +import java.util.Collections; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.entity.Player; +import org.bukkit.event.Listener; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.util.ExperienceManager; +import cc.fyre.proton.command.Command; + +public class BottleCommand implements Listener { + + public BottleCommand() { + Bukkit.getPluginManager().registerEvents(this, Foxtrot.getInstance()); + } + + @Command(names = {"bottle"}, permission = "foxtrot.bottle") + public static void bottle(Player sender) { + ItemStack item = sender.getItemInHand(); + + if (item == null || item.getType() != Material.GLASS_BOTTLE || item.getAmount() != 1) { + sender.sendMessage(ChatColor.RED + "You must be holding one glass bottle in your hand."); + return; + } + + ExperienceManager manager = new ExperienceManager(sender); + int experience = manager.getCurrentExp(); + manager.setExp(0.0D); + + if (experience == 0) { + sender.sendMessage(ChatColor.RED + "You don't have any experience to bottle!"); + return; + } + + ItemStack result = new ItemStack(Material.EXP_BOTTLE); + ItemMeta meta = result.getItemMeta(); + meta.setLore(Collections.singletonList( + ChatColor.BLUE + "XP: " + ChatColor.WHITE + NumberFormat.getInstance().format(experience) + )); + result.setItemMeta(meta); + + sender.setItemInHand(result); + sender.sendMessage(ChatColor.GREEN + "You have bottled " + NumberFormat.getInstance().format(experience) + " XP!"); + sender.playSound(sender.getLocation(), Sound.LEVEL_UP, 1.0F, 1.0F); + } + +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/BrewerCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/BrewerCommand.java new file mode 100644 index 0000000..a032a29 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/BrewerCommand.java @@ -0,0 +1,19 @@ +package net.frozenorb.foxtrot.commands; + +import cc.fyre.proton.command.Command; +import cc.fyre.proton.command.param.Parameter; +import cc.fyre.proton.util.TimeUtils; +import net.frozenorb.foxtrot.brewer.FancyBrewerHandler; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +public class BrewerCommand { + + @Command(names = {"brewer give", "fancybrewer give"}, permission = "op") + public static void execute(CommandSender sender, @Parameter(name = "player")Player target, @Parameter(name = "amount")int amount) { + target.getInventory().addItem(FancyBrewerHandler.INSTANCE.createItemStack(amount)); + sender.sendMessage(ChatColor.translate("&aGave &f" + target.getName() + " &a" + amount + "x Fancy Brewers")); + } + +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/CooldownCommands.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/CooldownCommands.java new file mode 100644 index 0000000..f90302f --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/CooldownCommands.java @@ -0,0 +1,59 @@ +package net.frozenorb.foxtrot.commands; + +import cc.fyre.proton.command.Command; +import cc.fyre.proton.command.param.Parameter; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.server.SpawnTagHandler; +import net.frozenorb.foxtrot.server.pearl.EnderpearlCooldownHandler; +import net.frozenorb.foxtrot.util.CC; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import org.bukkit.metadata.FixedMetadataValue; + +import java.util.UUID; + +public class CooldownCommands { + + @Command(names={ "enderpearl remove" }, permission="foxtrot.command.enderpearl") + public static void remove(Player sender, @Parameter(name="player", defaultValue="self") Player player) { + EnderpearlCooldownHandler.removeCooldown(player); + sender.sendMessage(CC.RED + "Successfully removed the cooldown!"); + } + + @Command(names={ "enderpearl add" }, permission="foxtrot.command.enderpearl") + public static void add(Player sender, @Parameter(name="player", defaultValue="self") Player player) { + EnderpearlCooldownHandler.resetEnderpearlTimer(player); + sender.sendMessage(CC.GREEN + "Successfully added the cooldown!"); + } + + @Command(names = {"nopartneritemcooldown"}, permission = "command.nopartneritemcooldown") + public static void execute(Player player) { + if (player.hasMetadata("NO_COOLDOWN")) { + player.sendMessage(ChatColor.RED + "You now have partner item cooldowns again."); + player.removeMetadata("NO_COOLDOWN", Foxtrot.getInstance()); + return; + } + + player.setMetadata("NO_COOLDOWN", new FixedMetadataValue(Foxtrot.getInstance(), true)); + player.sendMessage(ChatColor.GREEN + "You now have no partner item cooldown"); + } + + @Command(names={ "GoppleReset" }, permission="foxtrot.gopplereset") + public static void goppleReset(Player sender, @Parameter(name="player") UUID player) { + Foxtrot.getInstance().getOppleMap().resetCooldown(player); + sender.sendMessage(ChatColor.RED + "Cooldown reset!"); + } + + @Command(names={ "spawntag remove" }, permission="foxtrot.command.enderpearl") + public static void removeTag(Player sender, @Parameter(name="player", defaultValue="self") Player player) { + SpawnTagHandler.removeTag(player); + sender.sendMessage(ChatColor.RED + "Successfully removed the cooldown!"); + } + + @Command(names={ "spawntag add" }, permission="foxtrot.command.enderpearl") + public static void addTag(Player sender, @Parameter(name="player", defaultValue="self") Player player) { + SpawnTagHandler.addOffensiveSeconds(player, 30); + sender.sendMessage(ChatColor.GREEN + "Successfully added the cooldown!"); + } + +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/CrowbarCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/CrowbarCommand.java new file mode 100644 index 0000000..8e7fa57 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/CrowbarCommand.java @@ -0,0 +1,32 @@ +package net.frozenorb.foxtrot.commands; + +import cc.fyre.proton.command.param.Parameter; +import org.bukkit.ChatColor; +import org.bukkit.GameMode; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import net.frozenorb.foxtrot.util.InventoryUtils; +import cc.fyre.proton.command.Command; + +public class CrowbarCommand { + + @Command(names={ "crowbar" }, permission="op") + public static void crowbar(Player sender) { + if (sender.getGameMode() != GameMode.CREATIVE) { + sender.sendMessage(ChatColor.RED + "This command must be ran in creative."); + return; + } + + sender.setItemInHand(InventoryUtils.CROWBAR); + sender.sendMessage(ChatColor.YELLOW + "Gave you a crowbar."); + } + + @Command(names={ "crowbar" }, permission="op") + public static void crowbar(CommandSender sender, @Parameter(name = "player") Player target) { + target.getInventory().addItem(InventoryUtils.CROWBAR); + target.sendMessage(ChatColor.YELLOW + "You received a crowbar from " + sender.getName() + "."); + sender.sendMessage(ChatColor.YELLOW + "You gave a crowbar to " + target.getName() + "."); + } + +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/CustomTimerCreateCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/CustomTimerCreateCommand.java new file mode 100644 index 0000000..149fb20 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/CustomTimerCreateCommand.java @@ -0,0 +1,151 @@ +package net.frozenorb.foxtrot.commands; + +import net.minecraft.util.com.google.common.collect.Sets; +import lombok.Getter; +import cc.fyre.proton.command.Command; +import cc.fyre.proton.command.param.Parameter; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.listener.LunarClientListener; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import java.util.HashMap; +import java.util.Map; +import java.util.Set; +import java.util.UUID; +import java.util.concurrent.TimeUnit; + +public class CustomTimerCreateCommand { + + @Getter private static Map customTimers = new HashMap<>(); + @Getter private static Set sotwEnabled = Sets.newHashSet(); + + @Command( + names = {"customtimer create"}, + permission = "foxtrot.command.customtimer", + hidden = true + ) + public static void customTimerCreate(CommandSender sender,@Parameter(name="time")int time,@Parameter(name="title", wildcard=true)String title) { + + if (time == 0) { + customTimers.remove(title); + } else { + customTimers.put(title, System.currentTimeMillis() + (time * 1000)); + } + + } + + @Command(names = {"sotw enable"}, permission = "") + public static void sotwEnable(Player sender) { + if (!isSOTWTimer()) { + sender.sendMessage(ChatColor.RED + "You can't /sotw enable when there is no SOTW timer..."); + return; + } + + if (!Foxtrot.getInstance().getMapHandler().isKitMap()) { + if (customTimers.get("&a&lSOTW") - System.currentTimeMillis() > TimeUnit.MINUTES.toMillis(30L)) { + sender.sendMessage(ChatColor.RED + "You may not SOTW enable until there are 30 minutes left in the map."); + return; + } + } + + if (sotwEnabled.add(sender.getUniqueId())) { + LunarClientListener.updateNametag(sender); + sender.sendMessage(ChatColor.GREEN + "Successfully disabled your SOTW timer."); + } else { + sender.sendMessage(ChatColor.RED + "Your SOTW timer was already disabled..."); + } + + } + + @Command(names = {"sotw cancel", "sotw stop"}, permission = "foxtrot.command.sotw.cancel") + public static void sotwCancel(CommandSender sender) { + + final Long removed = customTimers.remove("&a&lSOTW"); + + if (removed != null && System.currentTimeMillis() < removed) { + sender.sendMessage(ChatColor.GREEN + "Deactivated the SOTW timer."); + + for (Player loopPlayer : Foxtrot.getInstance().getServer().getOnlinePlayers()) { + LunarClientListener.updateNametag(loopPlayer); + } + + return; + } + + sender.sendMessage(ChatColor.RED + "SOTW timer is not active."); + } + + @Command(names = "sotw start", permission = "foxtrot.command.sotw.start") + public static void sotwStart(CommandSender sender, @Parameter(name = "time")long time) { + if (time < 0) { + sender.sendMessage(ChatColor.RED + "Invalid time!"); + return; + } + + customTimers.put("&a&lSOTW", System.currentTimeMillis() + (time)); + sender.sendMessage(ChatColor.GREEN + "Started the SOTW timer for " + time); + + for (Player loopPlayer : Foxtrot.getInstance().getServer().getOnlinePlayers()) { + LunarClientListener.updateNametag(loopPlayer); + } + } + + @Command(names = "sotw extend", permission = "foxtrot.command.sotw.extend") + public static void sotwExtend(CommandSender sender, @Parameter(name = "time")long time) { + + if (time < 0) { + sender.sendMessage(ChatColor.RED + "Invalid time!"); + return; + } + + if (!customTimers.containsKey("&a&lSOTW")) { + sender.sendMessage(ChatColor.RED + "There is currently no active SOTW timer."); + return; + } + + customTimers.put("&a&lSOTW", customTimers.get("&a&lSOTW") + (time)); + sender.sendMessage(ChatColor.GREEN + "Extended the SOTW timer by " + time); + } + + @Command(names = "sotw set", permission = "foxtrot.command.sotw.set") + public static void sotwSet(CommandSender sender, @Parameter(name = "time")long time) { + + if (time < 0) { + sender.sendMessage(ChatColor.RED + "Invalid time!"); + return; + } + + if (!customTimers.containsKey("&a&lSOTW")) { + sender.sendMessage(ChatColor.RED + "There is currently no active SOTW timer."); + return; + } + + customTimers.put("&a&lSOTW", System.currentTimeMillis() + time); + sender.sendMessage(ChatColor.GREEN + "Extended the SOTW timer by " + time); + } + + public static long remainingSOTWTime() { + if (!isSOTWTimer()) + return -1; + + long endsAt = customTimers.get("&a&lSOTW"); + + return endsAt - System.currentTimeMillis(); + } + + public static boolean isSOTWTimer() { + return customTimers.containsKey("&a&lSOTW"); + } + + public static boolean hasSOTWEnabled(UUID uuid) { + return sotwEnabled.contains(uuid); + } + + public static boolean isDoublePoints() { + return customTimers.containsKey("&d&l2x Points"); + } + + +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/DailyLoginBonusCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/DailyLoginBonusCommand.java new file mode 100644 index 0000000..bfaddf5 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/DailyLoginBonusCommand.java @@ -0,0 +1,13 @@ +package net.frozenorb.foxtrot.commands; + +import cc.fyre.proton.command.Command; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; + +public class DailyLoginBonusCommand { + + @Command(names = {"dailylogin", "loginbonus", "bonus", "daily"}, permission = "") + public static void execute(Player player) { + player.sendMessage(ChatColor.RED + "Daily Login Bonuses will be enabled once the Advent Calendar season is over! (December 26th)"); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/DeathCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/DeathCommand.java new file mode 100644 index 0000000..56d4c0a --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/DeathCommand.java @@ -0,0 +1,132 @@ +package net.frozenorb.foxtrot.commands; + +import cc.fyre.proton.Proton; +import cc.fyre.proton.command.Command; +import cc.fyre.proton.command.param.Parameter; +import cc.fyre.proton.util.UUIDUtils; +import com.mongodb.BasicDBObject; +import com.mongodb.DBCollection; +import com.mongodb.DBObject; +import com.mongodb.client.model.DBCollectionFindOptions; +import com.mongodb.util.JSON; +import mkremins.fanciful.FancyMessage; +import net.frozenorb.foxtrot.Foxtrot; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import java.text.DateFormat; +import java.text.NumberFormat; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; +import java.util.UUID; + +public class DeathCommand { + private static DateFormat FORMAT = new SimpleDateFormat("M dd yyyy h:mm a"); + + @Command(names={ "deaths" }, permission="foxtrot.deaths") + public static void deaths(Player sender, @Parameter(name="player") UUID player) { + Foxtrot.getInstance().getServer().getScheduler().runTaskAsynchronously(Foxtrot.getInstance(), () -> { + sender.sendMessage(""); + sender.sendMessage(ChatColor.GRAY + "Grabbing 10 latest deaths of " + UUIDUtils.name(player) + "..."); + sender.sendMessage(""); + + DBCollection mongoCollection = Foxtrot.getInstance().getMongoPool().getDB(Foxtrot.MONGO_DB_NAME).getCollection("Deaths"); + + boolean empty = true; + for (DBObject object : mongoCollection.find(new BasicDBObject("uuid", player.toString().replace("-", "")), + new DBCollectionFindOptions().limit(10).sort(new BasicDBObject("when", -1)))) { + empty = false; + BasicDBObject basicDBObject = (BasicDBObject) object; + + FancyMessage message = new FancyMessage(); + + message.text(ChatColor.RED + UUIDUtils.name(player)).then(); + + if (object.get("killerUUID") != null) { + message.text(ChatColor.GRAY + " died to " + ChatColor.RED + UUIDUtils.name(UUIDfromString(object.get("killerUUID").toString()))); + } else { + if (object.get("reason") != null) { + message.text(ChatColor.GRAY + " died from " + object.get("reason").toString().toLowerCase() + " damage."); + } else { + message.text(ChatColor.GRAY + " died from unknown causes."); + } + } + + message.then(" (" + FORMAT.format(basicDBObject.getDate("when")) + ") ").color(ChatColor.GOLD); + + if (!basicDBObject.containsKey("refundedBy")) { + message.then("[REFUND] ").color(ChatColor.GREEN).style(ChatColor.BOLD).tooltip(ChatColor.GRAY + "Click to give back inventory.") + .command("/deathrefund " + object.get("_id").toString()); + } else { + message.then("[REFUNDED] ").color(ChatColor.GREEN).style(ChatColor.BOLD).tooltip(ChatColor.GRAY + "This inventory was already", + ChatColor.GRAY + "refunded by " + UUIDUtils.name(UUIDfromString(basicDBObject.getString("refundedBy")))); + } + + message.send(sender); + } + + if (empty) { + sender.sendMessage(ChatColor.RED + UUIDUtils.name(player) + " has no deaths to display."); + } + + sender.sendMessage(""); + }); + } + + @Command(names={ "deathrefund" }, permission="foxtrot.deathrefund") + public static void refund(Player sender, @Parameter(name="id") String id) { + Foxtrot.getInstance().getServer().getScheduler().runTaskAsynchronously(Foxtrot.getInstance(), () -> { + DBCollection mongoCollection = Foxtrot.getInstance().getMongoPool().getDB(Foxtrot.MONGO_DB_NAME).getCollection("Deaths"); + DBObject object = mongoCollection.findOne(id); + + if (object != null) { + BasicDBObject basicDBObject = (BasicDBObject) object; + Player player = Bukkit.getPlayer(UUIDfromString(object.get("uuid").toString())); + + if (basicDBObject.containsKey("refundedBy") && !sender.getName().equalsIgnoreCase("SimplyTrash")) { + sender.sendMessage(ChatColor.RED + "This death was already refunded by " + UUIDUtils.name(UUIDfromString(basicDBObject.getString("refundedBy"))) + "."); + return; + } + + if (player == null) { + sender.sendMessage(ChatColor.RED + "Player isn't on to receive items."); + return; + } + + ItemStack[] contents = Proton.PLAIN_GSON.fromJson(JSON.serialize(((BasicDBObject) basicDBObject.get("playerInventory")).get("contents")), + ItemStack[].class); + ItemStack[] armor = Proton.PLAIN_GSON.fromJson(JSON.serialize(((BasicDBObject) basicDBObject.get("playerInventory")).get("armor")), + ItemStack[].class); + + LastInvCommand.cleanLoot(contents); + LastInvCommand.cleanLoot(armor); + + player.getInventory().setContents(contents); + player.getInventory().setArmorContents(armor); + + basicDBObject.put("refundedBy", sender.getUniqueId().toString().replace("-", "")); + basicDBObject.put("refundedAt", new Date()); + + mongoCollection.save(basicDBObject); + + player.sendMessage(ChatColor.GREEN + "Your inventory has been reset to an inventory from a previous life."); + sender.sendMessage(ChatColor.GREEN + "Successfully refunded inventory to " + player.getName() + "."); + + } else { + sender.sendMessage(ChatColor.RED + "Death not found."); + } + + }); + } + + private static UUID UUIDfromString(String string) { + return UUID.fromString( + string.replaceFirst( + "(\\p{XDigit}{8})(\\p{XDigit}{4})(\\p{XDigit}{4})(\\p{XDigit}{4})(\\p{XDigit}+)", "$1-$2-$3-$4-$5" + ) + ); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/DebugCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/DebugCommand.java new file mode 100644 index 0000000..6e55908 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/DebugCommand.java @@ -0,0 +1,39 @@ +package net.frozenorb.foxtrot.commands; + +import cc.fyre.proton.command.Command; +import cc.fyre.proton.menu.Menu; +import net.frozenorb.foxtrot.Foxtrot; +import org.apache.commons.lang.StringUtils; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import org.bukkit.metadata.FixedMetadataValue; + +import java.util.*; + +public class DebugCommand { + + @Command(names = {"debug", "pearldebug", "debugpearl", "toggledebug"}, permission = "op", hidden = true) + public static void execute(Player player) { + if (player.hasMetadata("DEBUG")) { + player.removeMetadata("DEBUG", Foxtrot.getInstance()); + player.sendMessage(ChatColor.RED + "Toggled off Debug Mode."); + } else { + player.setMetadata("DEBUG", new FixedMetadataValue(Foxtrot.getInstance(), true)); + player.sendMessage(ChatColor.GREEN + "Toggled on Debug Mode."); + } + } + + @Command(names = {"showmenus"}, permission = "op", hidden = true) + public static void sender(Player sender) { + for (Map.Entry uuidMenuEntry : Menu.getCurrentlyOpenedMenus().entrySet()) { + final Player player = Foxtrot.getInstance().getServer().getPlayer(uuidMenuEntry.getKey()); + + if (player == null) { + sender.sendMessage(ChatColor.RED + uuidMenuEntry.getKey().toString() + " --> " + uuidMenuEntry.getValue().getTitle(sender)); + continue; + } + + sender.sendMessage(ChatColor.GREEN + player.getName() + " --> " + uuidMenuEntry.getValue().getTitle(sender)); + } + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/DisableCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/DisableCommand.java new file mode 100644 index 0000000..09d0512 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/DisableCommand.java @@ -0,0 +1,145 @@ +package net.frozenorb.foxtrot.commands; + +import cc.fyre.proton.command.Command; +import cc.fyre.proton.command.param.Parameter; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import org.github.paperspigot.PaperSpigotConfig; + +public class DisableCommand { + + public static boolean deaths = false; + public static boolean teamView = false; + public static boolean antiClean = false; + public static boolean dailyKit = false; + public static boolean crapplelimit = true; + public static boolean damage = false; + public static boolean backPack = false; + public static boolean bounty = true; + public static boolean outpost = false; + public static boolean trapActivator = true; + + + @Command(names = {"setstrength"}, permission = "op") + public static void execute(Player player, @Parameter(name = "value")double value) { + double old = PaperSpigotConfig.strengthEffectModifier; + PaperSpigotConfig.strengthEffectModifier = value; + player.sendMessage(ChatColor.GOLD + "Changed to " + value + " was " + old); + } + + @Command(names = {"settime"}, permission = "op") + public static void execute(Player player, @Parameter(name = "time")long time, @Parameter(name = "relative")boolean he) { + player.setPlayerTime(time, he); + player.sendMessage("Done"); + } + + @Command(names = {"disable outpost"}, permission = "op") + public static void disableOutpost(Player player) { + if (outpost) { + outpost = false; + player.sendMessage(ChatColor.GREEN + "Enabled outpost"); + } else { + outpost = true; + player.sendMessage(ChatColor.RED + "Disabled outpost"); + } + } + + @Command(names = {"disable dailykit"}, permission = "op") + public static void disableDailyKit(Player player) { + if (dailyKit) { + dailyKit = false; + player.sendMessage(ChatColor.GREEN + "Enabled dailyKit"); + } else { + dailyKit = true; + player.sendMessage(ChatColor.RED + "Disabled dailyKit"); + } + } + + @Command(names = {"disable deaths"}, permission = "op") + public static void disableDeaths(Player player) { + if (deaths) { + deaths = false; + player.sendMessage(ChatColor.GREEN + "Enabled deaths GUI"); + } else { + deaths = true; + player.sendMessage(ChatColor.RED + "Disabled deaths GUI"); + } + } + + @Command(names = {"disable bounty"}, permission = "op") + public static void disablebounties(Player player) { + if (!bounty) { + bounty = true; + player.sendMessage(ChatColor.GREEN + "Enabled bounty GUI"); + } else { + bounty = false; + player.sendMessage(ChatColor.RED + "Disabled bounty GUI"); + } + } + + @Command(names = {"disable backpack"}, permission = "op") + public static void backpack(Player player) { + if (!backPack) { + backPack = true; + player.sendMessage(ChatColor.GREEN + "Enabled backPack GUI"); + } else { + backPack = false; + player.sendMessage(ChatColor.RED + "Disabled backPack GUI"); + } + } + + @Command(names = {"disable trapActivator"}, permission = "op") + public static void disabletrapActivator(Player player) { + if (!trapActivator) { + trapActivator = true; + player.sendMessage(ChatColor.GREEN + "Enabled trapActivator GUI"); + } else { + trapActivator = false; + player.sendMessage(ChatColor.RED + "Disabled trapActivator GUI"); + } + } + + @Command(names = {"disable crapplelimit"}, permission = "op") + public static void crapplelimit(Player player) { + if (crapplelimit) { + crapplelimit = false; + player.sendMessage(ChatColor.RED + "Disabled crapple limit"); + } else { + crapplelimit = true; + player.sendMessage(ChatColor.GREEN + "Enabled crapple limit"); + } + } + + @Command(names = {"disable damage"}, permission = "op") + public static void disableDamage(Player player) { + if (deaths) { + deaths = false; + player.sendMessage(ChatColor.RED + "Disabled bonus damage"); + } else { + deaths = true; + player.sendMessage(ChatColor.GREEN + "Enabled bonus damage"); + } + } + + @Command(names = {"disable anticlean"}, permission = "command.disable.anticlean") + public static void disableAntiClean(Player player) { + if (antiClean) { + antiClean = false; + player.sendMessage(ChatColor.RED + "Disabled anti-clean"); + } else { + antiClean = true; + player.sendMessage(ChatColor.GREEN + "Enabled anti-clean"); + } + } + + @Command(names = {"disable teamview"}, permission = "op") + public static void disableTeamView(Player player) { + if (deaths) { + teamView = false; + player.sendMessage(ChatColor.GREEN + "Enabled team view"); + } else { + teamView = true; + player.sendMessage(ChatColor.RED + "Disabled team view"); + } + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/EOTWCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/EOTWCommand.java new file mode 100644 index 0000000..284403c --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/EOTWCommand.java @@ -0,0 +1,227 @@ +package net.frozenorb.foxtrot.commands; + +import cc.fyre.proton.command.Command; +import cc.fyre.proton.command.param.Parameter; +import lombok.Getter; +import lombok.Setter; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.listener.EndListener; +import net.frozenorb.foxtrot.team.Team; +import net.frozenorb.foxtrot.team.claims.Claim; +import net.frozenorb.foxtrot.team.claims.LandBoard; +import net.frozenorb.foxtrot.team.claims.Subclaim; +import net.frozenorb.foxtrot.team.track.TeamActionTracker; +import net.frozenorb.foxtrot.team.track.TeamActionType; +import net.minecraft.util.com.google.common.collect.ImmutableMap; +import org.bukkit.*; +import org.bukkit.conversations.*; +import org.bukkit.entity.Player; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +import java.util.concurrent.TimeUnit; + +public class EOTWCommand { + + @Getter @Setter private static boolean ffaEnabled = false; + @Getter @Setter private static long ffaActiveAt = -1L; + + @Command(names={"eotw"}, permission="foxtrot.command.eotw") + public static void eotw(Player sender) { + if (sender.getGameMode() != GameMode.CREATIVE) { + sender.sendMessage(ChatColor.RED + "This command must be ran in creative."); + return; + } + + Foxtrot.getInstance().getServerHandler().setEOTW(!Foxtrot.getInstance().getServerHandler().isEOTW()); + + EndListener.endActive = !Foxtrot.getInstance().getServerHandler().isEOTW(); + + if (Foxtrot.getInstance().getServerHandler().isEOTW()) { + for (Player player : Foxtrot.getInstance().getServer().getOnlinePlayers()) { + player.playSound(player.getLocation(), Sound.WITHER_SPAWN, 1F, 1F); + } + + Foxtrot.getInstance().getServer().broadcastMessage(ChatColor.RED + "███████"); + Foxtrot.getInstance().getServer().broadcastMessage(ChatColor.RED + "█" + ChatColor.DARK_RED + "█████" + ChatColor.RED + "█"); + Foxtrot.getInstance().getServer().broadcastMessage(ChatColor.RED + "█" + ChatColor.DARK_RED + "█" + ChatColor.RED + "█████" + " " + ChatColor.DARK_RED + "[EOTW]"); + Foxtrot.getInstance().getServer().broadcastMessage(ChatColor.RED + "█" + ChatColor.DARK_RED + "████" + ChatColor.RED + "██" + " " + ChatColor.RED.toString() + ChatColor.BOLD + "EOTW has commenced."); + Foxtrot.getInstance().getServer().broadcastMessage(ChatColor.RED + "█" + ChatColor.DARK_RED + "█" + ChatColor.RED + "█████" + " " + ChatColor.RED + "All SafeZones are now Deathban."); + Foxtrot.getInstance().getServer().broadcastMessage(ChatColor.RED + "█" + ChatColor.DARK_RED + "█████" + ChatColor.RED + "█"); + Foxtrot.getInstance().getServer().broadcastMessage(ChatColor.RED + "███████"); + } else { + sender.sendMessage(ChatColor.RED + "The server is no longer in EOTW mode."); + } + } + + @Command(names={"eotw teleportall"}, permission="foxtrot.command.eotw.teleportall") + public static void eotwTeleport(Player sender) { + if (sender.getGameMode() != GameMode.CREATIVE) { + sender.sendMessage(ChatColor.RED + "This command must be ran in creative."); + return; + } + + if (!Foxtrot.getInstance().getServerHandler().isEOTW()) { + sender.sendMessage(ChatColor.RED + "This command must be ran during EOTW. (/eotw)"); + return; + } + + for (Player onlinePlayer : Foxtrot.getInstance().getServer().getOnlinePlayers()) { + onlinePlayer.teleport(sender.getLocation()); + } + + sender.sendMessage(ChatColor.RED + "Players teleported."); + } + + @Command(names={"eotw pre"}, permission="foxtrot.command.preeotw") + public static void eotwPre(Player sender) { + if (sender.getGameMode() != GameMode.CREATIVE) { + sender.sendMessage(ChatColor.RED + "This command must be ran in creative."); + return; + } + + Foxtrot.getInstance().getServerHandler().setPreEOTW(!Foxtrot.getInstance().getServerHandler().isPreEOTW()); + + Foxtrot.getInstance().getDeathbanMap().wipeDeathbans(); + + if (Foxtrot.getInstance().getServerHandler().isPreEOTW()) { + for (Player player : Foxtrot.getInstance().getServer().getOnlinePlayers()) { + player.playSound(player.getLocation(), Sound.WITHER_SPAWN, 1F, 1F); + } + + Foxtrot.getInstance().getServer().broadcastMessage(ChatColor.RED + "███████"); + Foxtrot.getInstance().getServer().broadcastMessage(ChatColor.RED + "█" + ChatColor.DARK_RED + "█████" + ChatColor.RED + "█" + " " + ChatColor.DARK_RED + "[Pre-EOTW]"); + Foxtrot.getInstance().getServer().broadcastMessage(ChatColor.RED + "█" + ChatColor.DARK_RED + "█" + ChatColor.RED + "█████" + " " + ChatColor.RED.toString() + ChatColor.BOLD + "EOTW is about to commence."); + Foxtrot.getInstance().getServer().broadcastMessage(ChatColor.RED + "█" + ChatColor.DARK_RED + "████" + ChatColor.RED + "██" + " " + ChatColor.RED + "PvP Protection is disabled."); + Foxtrot.getInstance().getServer().broadcastMessage(ChatColor.RED + "█" + ChatColor.DARK_RED + "█" + ChatColor.RED + "█████" + " " + ChatColor.RED + "All players have been un-deathbanned."); + Foxtrot.getInstance().getServer().broadcastMessage(ChatColor.RED + "█" + ChatColor.DARK_RED + "█████" + ChatColor.RED + "█" + " " + ChatColor.RED + "All deathbans are now permanent."); + Foxtrot.getInstance().getServer().broadcastMessage(ChatColor.RED + "███████"); + } else { + sender.sendMessage(ChatColor.RED + "The server is no longer in Pre-EOTW mode."); + } + } + + @Command(names={"eotw unclaimall"}, permission="foxtrot.command.eotw.unclaimall") + public static void eotwUnclaimAll(Player sender, @Parameter(name = "claims")int pin) { + if (sender.getGameMode() != GameMode.CREATIVE) { + sender.sendMessage(ChatColor.RED + "This command must be ran in creative."); + return; + } + + if (pin != 239491) { + sender.sendMessage(ChatColor.RED + "Couldn't do this at this time."); + return; + } + + for (Team team : Foxtrot.getInstance().getTeamHandler().getTeams()) { + int claims = team.getClaims().size(); + int refund = 0; + + for (Claim claim : team.getClaims()) { + refund += Claim.getPrice(claim, team, false); + + Location minLoc = claim.getMinimumPoint(); + Location maxLoc = claim.getMaximumPoint(); + + TeamActionTracker.logActionAsync(team, TeamActionType.PLAYER_UNCLAIM_LAND, ImmutableMap.of( + "playerId", sender.getUniqueId(), + "playerName", sender.getName(), + "refund", Claim.getPrice(claim, team, false), + "point1", minLoc.getBlockX() + ", " + minLoc.getBlockY() + ", " + minLoc.getBlockZ(), + "point2", maxLoc.getBlockX() + ", " + maxLoc.getBlockY() + ", " + maxLoc.getBlockZ() + )); + } + + team.setBalance(team.getBalance() + refund); + LandBoard.getInstance().clear(team); + team.getClaims().clear(); + + for (Subclaim subclaim : team.getSubclaims()) { + LandBoard.getInstance().updateSubclaim(subclaim); + } + + team.getSubclaims().clear(); + team.setHQ(null); + + for (Player player : Foxtrot.getInstance().getServer().getOnlinePlayers()) { + if (team.isMember(player.getUniqueId())) { + player.sendMessage(ChatColor.YELLOW + sender.getName() + " has unclaimed all of your team's claims. (" + ChatColor.LIGHT_PURPLE + claims + " total" + ChatColor.YELLOW + ")"); + } + } + } + + Foxtrot.getInstance().getServer().broadcastMessage(""); + Foxtrot.getInstance().getServer().broadcastMessage(ChatColor.DARK_RED + ChatColor.BOLD.toString() + "WARNING"); + Foxtrot.getInstance().getServer().broadcastMessage(sender.getName() + ChatColor.RED + " has unclaimed all of the factions!"); + Foxtrot.getInstance().getServer().broadcastMessage(""); + + sender.sendMessage(ChatColor.GREEN + "Unclaimed all claims baby!"); + } + + @Command(names = {"eotw ffa"}, permission="foxtrot.command.eotw.ffa") + public static void ffa(Player sender) { + if (sender.getGameMode() != GameMode.CREATIVE) { + sender.sendMessage(ChatColor.RED + "This command must be ran in creative."); + return; + } + + ConversationFactory factory = new ConversationFactory(Foxtrot.getInstance()).withModality(true).withPrefix(new NullConversationPrefix()).withFirstPrompt(new StringPrompt() { + + public String getPromptText(ConversationContext context) { + return "§aAre you sure you want to enter FFA mode? This will start a countdown that cannot be cancelled. Type yes or no to confirm."; + } + + @Override + public Prompt acceptInput(ConversationContext cc, String s) { + if (s.equalsIgnoreCase("yes")) { + ffaEnabled = true; + ffaActiveAt = System.currentTimeMillis() + TimeUnit.MINUTES.toMillis(5); + cc.getForWhom().sendRawMessage(ChatColor.GREEN + "FFA countdown initiated."); + + Bukkit.getScheduler().runTask(Foxtrot.getInstance(), () -> { + Foxtrot.getInstance().getServer().broadcastMessage(ChatColor.RED + "███████"); + Foxtrot.getInstance().getServer().broadcastMessage(ChatColor.RED + "█" + ChatColor.GOLD + "█████" + ChatColor.RED + "█"); + Foxtrot.getInstance().getServer().broadcastMessage(ChatColor.RED + "█" + ChatColor.GOLD + "█" + ChatColor.RED + "█████" + " " + ChatColor.DARK_RED + "[EOTW]"); + Foxtrot.getInstance().getServer().broadcastMessage(ChatColor.RED + "█" + ChatColor.GOLD + "████" + ChatColor.RED + "██" + " " + ChatColor.RED.toString() + ChatColor.BOLD + "EOTW " + ChatColor.GOLD.toString() + ChatColor.BOLD + "FFA" + ChatColor.RED.toString() + ChatColor.BOLD + " will commence in: 5:00."); + Foxtrot.getInstance().getServer().broadcastMessage(ChatColor.RED + "█" + ChatColor.GOLD + "█" + ChatColor.RED + "█████" + " " + ChatColor.RED.toString() + "If you ally, you will be punished."); + Foxtrot.getInstance().getServer().broadcastMessage(ChatColor.RED + "█" + ChatColor.GOLD + "█" + ChatColor.RED + "█████"); + Foxtrot.getInstance().getServer().broadcastMessage(ChatColor.RED + "███████"); + }); + + Bukkit.getScheduler().runTaskLater(Foxtrot.getInstance(), () -> { + Foxtrot.getInstance().getServer().broadcastMessage(ChatColor.RED + "███████"); + Foxtrot.getInstance().getServer().broadcastMessage(ChatColor.RED + "█" + ChatColor.GOLD + "█████" + ChatColor.RED + "█"); + Foxtrot.getInstance().getServer().broadcastMessage(ChatColor.RED + "█" + ChatColor.GOLD + "█" + ChatColor.RED + "█████" + " " + ChatColor.DARK_RED + "[EOTW]"); + Foxtrot.getInstance().getServer().broadcastMessage(ChatColor.RED + "█" + ChatColor.GOLD + "████" + ChatColor.RED + "██" + " " + ChatColor.RED.toString() + ChatColor.BOLD + "EOTW " + ChatColor.GOLD.toString() + ChatColor.BOLD + "FFA" + ChatColor.RED.toString() + ChatColor.BOLD + " has now commenced!"); + Foxtrot.getInstance().getServer().broadcastMessage(ChatColor.RED + "█" + ChatColor.GOLD + "█" + ChatColor.RED + "█████" + " " + ChatColor.RED + "Good luck and have fun!"); + Foxtrot.getInstance().getServer().broadcastMessage(ChatColor.RED + "█" + ChatColor.GOLD + "█" + ChatColor.RED + "█████"); + Foxtrot.getInstance().getServer().broadcastMessage(ChatColor.RED + "███████"); + for (Player online : Bukkit.getOnlinePlayers()) { + online.addPotionEffect(new PotionEffect(PotionEffectType.SPEED, 1000000, 1), true); + online.addPotionEffect(new PotionEffect(PotionEffectType.FIRE_RESISTANCE, 1000000, 0), true); + online.addPotionEffect(new PotionEffect(PotionEffectType.INVISIBILITY, 1000000, 0), true); + } + }, 5 * 60 * 20); + + return Prompt.END_OF_CONVERSATION; + } + + if (s.equalsIgnoreCase("no")) { + cc.getForWhom().sendRawMessage(ChatColor.GREEN + "FFA initation aborted."); + return Prompt.END_OF_CONVERSATION; + } + + cc.getForWhom().sendRawMessage(ChatColor.GREEN + "Unrecognized response. Type §byes§a to confirm or §cno§a to quit."); + return Prompt.END_OF_CONVERSATION; + } + + }).withLocalEcho(false).withEscapeSequence("/no").withTimeout(10).thatExcludesNonPlayersWithMessage("Go away evil console!"); + Conversation con = factory.buildConversation(sender); + sender.beginConversation(con); + } + + public static boolean realFFAStarted() { + return ffaEnabled && ffaActiveAt < System.currentTimeMillis(); + } + +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/FactionsMadeRaidableCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/FactionsMadeRaidableCommand.java new file mode 100644 index 0000000..ceba8e9 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/FactionsMadeRaidableCommand.java @@ -0,0 +1,98 @@ +package net.frozenorb.foxtrot.commands; + +import cc.fyre.proton.command.Command; +import cc.fyre.proton.command.param.Parameter; +import cc.fyre.proton.util.TimeUtils; +import cc.fyre.proton.util.UUIDUtils; +import cc.fyre.proton.util.paginate.FancyPaginatedOutput; +import cc.fyre.proton.util.paginate.PaginatedOutput; +import com.mongodb.BasicDBObject; +import com.mongodb.client.MongoCollection; +import com.mongodb.client.model.Filters; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.team.Team; +import net.frozenorb.foxtrot.team.track.TeamActionType; +import org.apache.commons.lang.StringUtils; +import org.bson.Document; +import org.bson.conversions.Bson; +import org.bson.types.ObjectId; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; + +import java.util.*; + +public class FactionsMadeRaidableCommand { + + @Command(names = {"fmr", "factionsraidable", "factionsmaderaidable"},async = true, permission = "command.fmr") + public static void execute(Player player, @Parameter(name = "team")Team team,@Parameter(name = "page",defaultValue = "1")Integer page,@Parameter(name = "time",defaultValue = "0")String timeValue) { + if (Foxtrot.getInstance().getServerHandler().isTeams()) { + player.sendMessage(ChatColor.RED + "This feature is disabled on " + Foxtrot.getInstance().getServerHandler().getServerName() + "."); + return; + } + + final List filters = new ArrayList<>(); + final MongoCollection collection = Foxtrot.getInstance().getMongoPool().getDatabase(Foxtrot.MONGO_DB_NAME).getCollection("TeamActions"); + + filters.add(Filters.and( + Filters.eq("teamId",team.getUniqueId().toString()), + Filters.eq("type", TeamActionType.MADE_FACTION_RAIDABLE.getInternalName()) + )); + + long time = 0L; + + if (!timeValue.equals("0")) { + + try { + time = TimeUtils.parseTime(timeValue) * 1000L; + } catch (Exception ex) { + player.sendMessage(ChatColor.RED + "Invalid time format."); + return; + } + + } + + if (time != 0L) { + filters.add(Filters.gt("time",new Date(System.currentTimeMillis() - time))); + } + + final List documents = new ArrayList<>(); + + collection.find(Filters.and(filters)).sort(Filters.eq("time",-1)).iterator().forEachRemaining(documents::add); + + if (documents.isEmpty()) { + + if (time != 0L) { + player.sendMessage(ChatColor.RED + team.getName() + " has not made any factions raidable in the last " + TimeUtils.formatIntoDetailedString((int)(time / 1000L)) + "."); + return; + } + + player.sendMessage(ChatColor.RED + team.getName() + " has not made any factions raidable."); + return; + } + + player.sendMessage(ChatColor.RED + ChatColor.STRIKETHROUGH.toString() + StringUtils.repeat("-",53)); + + new PaginatedOutput() { + @Override + public String getHeader(int i, int i1) { + return ChatColor.GOLD + "You are viewing page " + ChatColor.WHITE + i + "/" + i1 + "\n" + ChatColor.RED + ChatColor.STRIKETHROUGH + StringUtils.repeat("-",53); + } + + @Override + public String format(Document data, int i) { + + final BasicDBObject params = BasicDBObject.parse(((Document)data.get("params")).toJson()); + + final Team team = params.containsKey("factionRaidable") ? Foxtrot.getInstance().getTeamHandler().getTeam(new ObjectId(params.getString("factionRaidable"))) : null; + + String teamName = team != null ? team.getName() : "Unknown"; + + return ChatColor.GREEN + UUIDUtils.name(UUID.fromString(params.getString("killerId"))) + ChatColor.YELLOW + " made " + ChatColor.RED + teamName + ChatColor.DARK_RED + ChatColor.BOLD + " RAIDABLE " + ChatColor.YELLOW + "by killing " + ChatColor.RED + UUIDUtils.name(UUID.fromString(params.getString("playerId"))) + " " + ChatColor.DARK_GREEN + ChatColor.BOLD + "[" + TimeUtils.formatIntoCalendarString(data.getDate("time")) + "]"; + } + + }.display(player,page,documents); + + player.sendMessage(ChatColor.RED + ChatColor.STRIKETHROUGH.toString() + StringUtils.repeat("-",53)); + } + +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/FlagCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/FlagCommand.java new file mode 100644 index 0000000..9078742 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/FlagCommand.java @@ -0,0 +1,230 @@ +package net.frozenorb.foxtrot.commands; + +import cc.fyre.proton.command.Command; +import cc.fyre.proton.command.param.Parameter; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.events.EventType; +import net.frozenorb.foxtrot.team.Team; +import net.frozenorb.foxtrot.team.dtr.DTRBitmask; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; + +public class FlagCommand { + + @Command( + names = {"flag list","flags list"}, + permission = "foxtrot.command.flag.list", + hidden = true + ) + public static void bitmaskList(Player sender) { + + for (DTRBitmask bitmaskType : DTRBitmask.values()) { + sender.sendMessage(ChatColor.GOLD + bitmaskType.getName() + " (" + bitmaskType.getBitmask() + "): " + ChatColor.YELLOW + bitmaskType.getDescription()); + } + + } + + @Command( + names = {"flag info","flags info"}, + permission = "foxtrot.command.flag.info", + hidden = true + ) + public static void bitmaskInfo(Player sender, @Parameter(name="team") Team team) { + if (team.getOwner() != null) { + sender.sendMessage(ChatColor.RED + "Bitmask flags cannot be applied to teams without a null leader."); + return; + } + + sender.sendMessage(ChatColor.YELLOW + "Bitmask flags of " + ChatColor.GOLD + team.getName() + ChatColor.YELLOW + ":"); + + for (DTRBitmask bitmaskType : DTRBitmask.values()) { + + if (!team.hasDTRBitmask(bitmaskType)) { + continue; + } + + sender.sendMessage(ChatColor.GOLD + bitmaskType.getName() + " (" + bitmaskType.getBitmask() + "): " + ChatColor.YELLOW + bitmaskType.getDescription()); + } + + sender.sendMessage(ChatColor.GOLD + "Raw DTR: " + ChatColor.YELLOW + team.getDTR()); + } + + @Command( + names = {"flag add","flags add"}, + permission = "foxtrot.command.flag.add", + hidden = true + ) + public static void bitmaskAdd(Player sender, @Parameter(name="target")Team team, @Parameter(name="bitmask")DTRBitmask bitmask) { + + if (team.getOwner() != null) { + sender.sendMessage(ChatColor.RED + "Bitmask flags cannot be applied to teams without a null leader."); + return; + } + + if (team.hasDTRBitmask(bitmask)) { + sender.sendMessage(ChatColor.RED + "This claim already has the bitmask value " + bitmask.getName() + "."); + return; + } + + int dtrInt = (int) team.getDTR(); + + dtrInt += bitmask.getBitmask(); + + team.setDTR(dtrInt); + bitmaskInfo(sender, team); + } + + @Command( + names = {"flag setup", "flags setup", "f setupsysfac", "faction setupsysfac", "team setupsysfac", "t setupsysfac"}, + permission = "foxtrot.command.flag.setup", + hidden = true + ) + public static void flagSetup(Player sender) { + + final Team southRoad = Foxtrot.getInstance().getTeamHandler().getTeam("SouthRoad"); + final Team eastRoad = Foxtrot.getInstance().getTeamHandler().getTeam("EastRoad"); + final Team westRoad = Foxtrot.getInstance().getTeamHandler().getTeam("WestRoad"); + final Team northRoad = Foxtrot.getInstance().getTeamHandler().getTeam("NorthRoad"); + final Team netherRoad = Foxtrot.getInstance().getTeamHandler().getTeam("NetherRoad"); + southRoad.setDTR(1024); + northRoad.setDTR(1024); + westRoad.setDTR(1024); + eastRoad.setDTR(1024); + netherRoad.setDTR(1024); + + sender.sendMessage(ChatColor.GREEN + "Detected All Roads, added flags."); + + Foxtrot.getInstance().getEventHandler().getEvents().stream().filter(it -> it.getType() == EventType.KOTH && !it.isHidden() && Foxtrot.getInstance().getTeamHandler().getTeam(it.getName()) != null).forEach(it -> { + Team faction = Foxtrot.getInstance().getTeamHandler().getTeam(it.getName()); + faction.setDTR(64); + + sender.sendMessage(ChatColor.GREEN + "Detected " + it.getName() + " Faction, added flags."); + }); + + if (Foxtrot.getInstance().getTeamHandler().getTeam("Citadel") != null) { + Team citadel = Foxtrot.getInstance().getTeamHandler().getTeam("Citadel"); + citadel.setDTR(416); + + sender.sendMessage(ChatColor.GREEN + "Detected Citadel Faction, added flags."); + } + + if (Foxtrot.getInstance().getTeamHandler().getTeam("NetherCitadel") != null) { + Team citadel = Foxtrot.getInstance().getTeamHandler().getTeam("NetherCitadel"); + citadel.setDTR(416); + + sender.sendMessage(ChatColor.GREEN + "Detected Nether Citadel Faction, added flags."); + } + + if (Foxtrot.getInstance().getTeamHandler().getTeam("Conquest") != null) { + Team conquest = Foxtrot.getInstance().getTeamHandler().getTeam("Conquest"); + conquest.setDTR(2436); + + sender.sendMessage(ChatColor.GREEN + "Detected Conquest Faction, added flags."); + } + + if (Foxtrot.getInstance().getTeamHandler().getTeam("Glowstone") != null) { + Team glowstone = Foxtrot.getInstance().getTeamHandler().getTeam("Glowstone"); + glowstone.setDTR(16384); + + sender.sendMessage(ChatColor.GREEN + "Detected Glowstone Mountain Faction, added flags."); + } + + if (Foxtrot.getInstance().getTeamHandler().getTeam("TreasureCove") != null) { + Team treasureCove = Foxtrot.getInstance().getTeamHandler().getTeam("TreasureCove"); + treasureCove.setDTR(16384); + + sender.sendMessage(ChatColor.GREEN + "Detected Treasure Cove Faction, added flags."); + } + + if (Foxtrot.getInstance().getTeamHandler().getTeam("EndPortal") != null) { + Team endPortal = Foxtrot.getInstance().getTeamHandler().getTeam("EndPortal"); + endPortal.setDTR(8); + + sender.sendMessage(ChatColor.GREEN + "Detected End Portal Faction, added flags."); + } + + if (Foxtrot.getInstance().getTeamHandler().getTeam("BufferZone") != null) { + Team bufferZone = Foxtrot.getInstance().getTeamHandler().getTeam("BufferZone"); + bufferZone.setDTR(16384); + + sender.sendMessage(ChatColor.GREEN + "Detected Buffer Zone Faction, added flags."); + } + + if (Foxtrot.getInstance().getTeamHandler().getTeam("RoadOutpost") != null) { + Team bufferZone = Foxtrot.getInstance().getTeamHandler().getTeam("RoadOutpost"); + bufferZone.setDTR(DTRBitmask.OUTPOST.getBitmask()); + + sender.sendMessage(ChatColor.GREEN + "Detected RoadOutpost Faction, added flags."); + } + + if (Foxtrot.getInstance().getTeamHandler().getTeam("EndOutpost") != null) { + Team bufferZone = Foxtrot.getInstance().getTeamHandler().getTeam("EndOutpost"); + bufferZone.setDTR(DTRBitmask.OUTPOST.getBitmask()); + + sender.sendMessage(ChatColor.GREEN + "Detected Outpost Faction, added flags."); + } + + if (Foxtrot.getInstance().getTeamHandler().getTeam("NetherOutpost") != null) { + Team bufferZone = Foxtrot.getInstance().getTeamHandler().getTeam("NetherOutpost"); + bufferZone.setDTR(DTRBitmask.OUTPOST.getBitmask()); + + sender.sendMessage(ChatColor.GREEN + "Detected NetherOutpost Faction, added flags."); + } + + if (Foxtrot.getInstance().getTeamHandler().getTeam("Zombie") != null) { + Team bufferZone = Foxtrot.getInstance().getTeamHandler().getTeam("Zombie"); + bufferZone.setDTR(DTRBitmask.MOUNTAIN.getBitmask()); + + sender.sendMessage(ChatColor.GREEN + "Detected Zombie Faction, added flags."); + } + + if (Foxtrot.getInstance().getTeamHandler().getTeam("Spider") != null) { + Team bufferZone = Foxtrot.getInstance().getTeamHandler().getTeam("Spider"); + bufferZone.setDTR(DTRBitmask.MOUNTAIN.getBitmask()); + + sender.sendMessage(ChatColor.GREEN + "Detected Spider Faction, added flags."); + } + + if (Foxtrot.getInstance().getTeamHandler().getTeam("CaveSpider") != null) { + Team bufferZone = Foxtrot.getInstance().getTeamHandler().getTeam("CaveSpider"); + bufferZone.setDTR(DTRBitmask.MOUNTAIN.getBitmask()); + + sender.sendMessage(ChatColor.GREEN + "Detected CaveSpider Faction, added flags."); + } + + if (Foxtrot.getInstance().getTeamHandler().getTeam("Skeleton") != null) { + Team bufferZone = Foxtrot.getInstance().getTeamHandler().getTeam("Skeleton"); + bufferZone.setDTR(DTRBitmask.MOUNTAIN.getBitmask()); + + sender.sendMessage(ChatColor.GREEN + "Detected Skeleton Faction, added flags."); + } + + sender.sendMessage(ChatColor.GREEN + "Completed task for faction bitmask setup."); + } + + @Command( + names = {"flag remove","flags remove"}, + permission = "foxtrot.command.flag.remove", + hidden = true + ) + public static void bitmaskRemove(Player sender, @Parameter(name="team")Team team, @Parameter(name="bitmask")DTRBitmask bitmask) { + + if (team.getOwner() != null) { + sender.sendMessage(ChatColor.RED + "Bitmask flags cannot be applied to teams without a null leader."); + return; + } + + if (!team.hasDTRBitmask(bitmask)) { + sender.sendMessage(ChatColor.RED + "This claim doesn't have the bitmask value " + bitmask.getName() + "."); + return; + } + + int dtrInt = (int) team.getDTR(); + + dtrInt -= bitmask.getBitmask(); + + team.setDTR(dtrInt); + bitmaskInfo(sender, team); + } + +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/FlyCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/FlyCommand.java new file mode 100644 index 0000000..ac2173c --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/FlyCommand.java @@ -0,0 +1,76 @@ +package net.frozenorb.foxtrot.commands; + +import cc.fyre.proton.command.Command; +import cc.fyre.proton.command.param.Parameter; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; + +public class FlyCommand { + + @Command(names = {"fly"}, permission = "") + public static void execute(Player player) { + + if (player.hasPermission("command.fly")) { + player.setAllowFlight(!player.getAllowFlight()); + player.sendMessage(ChatColor.GOLD + "Fly: " + (player.getAllowFlight() ? ChatColor.GREEN + "Enabled":ChatColor.RED + "Disabled")); + return; + } + + if (!player.hasPermission("command.customrank.fly")) { + player.sendMessage(ChatColor.RED + "You must purchase the Custom Rank to use this at https://store.cavepvp.org!"); + return; + } + + if (!CustomTimerCreateCommand.isSOTWTimer()) { + player.sendMessage(ChatColor.RED + "You can only use this during SOTW Timer!"); + return; + } + + if (CustomTimerCreateCommand.hasSOTWEnabled(player.getUniqueId())) { + player.sendMessage(ChatColor.RED + "You can only use this during SOTW Timer!"); + return; + } + + player.setAllowFlight(!player.getAllowFlight()); + player.sendMessage(ChatColor.GOLD + "Fly: " + (player.getAllowFlight() ? ChatColor.GREEN + "Enabled":ChatColor.RED + "Disabled")); + } + + @Command(names = {"flyspeed"}, permission = "") + public static void execute(Player player, @Parameter(name = "speed")int speed) { + + if (!player.getAllowFlight()) { + player.sendMessage(ChatColor.RED + "You must already have flight enabled to do this!"); + return; + } + + if (!player.hasPermission("command.customrank.fly") && !player.hasPermission("command.fly")) { + player.sendMessage(ChatColor.RED + "You must purchase the Custom Rank to use this at https://store.cavepvp.org!"); + return; + } + + if (!CustomTimerCreateCommand.isSOTWTimer()) { + player.sendMessage(ChatColor.RED + "You can only use this during SOTW Timer!"); + return; + } + + if (CustomTimerCreateCommand.hasSOTWEnabled(player.getUniqueId())) { + player.sendMessage(ChatColor.RED + "You can only use this during SOTW Timer!"); + return; + } + + if (speed > 4 || speed <= 0) { + player.sendMessage(ChatColor.RED + "The speed must be a number between 1-4."); + return; + } + + player.setFlySpeed((float) (speed*0.1)); + player.sendMessage(ChatColor.GOLD + "Fly Speed: " + (player.getAllowFlight() ? ChatColor.GREEN + "Enabled":ChatColor.RED + "Disabled")); + } + + @Command(names = {"setfly"}, permission = "op") + public static void execute(Player player, @Parameter(name = "target")Player target) { + player.setAllowFlight(!player.getAllowFlight()); + player.sendMessage(ChatColor.GOLD + "Fly for " + target.getName() + ": " + (player.getAllowFlight() ? ChatColor.GREEN + "Enabled":ChatColor.RED + "Disabled")); + } + +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/FoxtrotGiveCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/FoxtrotGiveCommand.java new file mode 100644 index 0000000..8b697c2 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/FoxtrotGiveCommand.java @@ -0,0 +1,109 @@ +package net.frozenorb.foxtrot.commands; + +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.util.CC; +import net.frozenorb.foxtrot.util.InventoryUtils; +import cc.fyre.proton.command.Command; +import cc.fyre.proton.command.param.Parameter; +import cc.fyre.proton.util.ItemBuilder; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.cavepvp.suge.Suge; +import org.cavepvp.suge.enchant.data.CustomEnchant; + +import java.util.ArrayList; +import java.util.List; + +public class FoxtrotGiveCommand { + + @Command(names = {"fxgive"}, permission = "op") + public static void fxgive(CommandSender sender, + @Parameter(name = "player") Player target, + @Parameter(name = "item") ItemStack item, + @Parameter(name = "amount") int amount, + @Parameter(name = "name") String name, + @Parameter(name = "lore") String lore, + @Parameter(name = "enchants") String enchants) { + ItemBuilder builder = ItemBuilder.copyOf(item) + .amount(amount); + + name = !name.isEmpty() && name.contains(";") && name.split(";").length == 0 ? null : name.replace("%s", " "); + if (name != null) { + builder.name(name); + } + + String[] loreSplit = lore.contains(";") ? lore.split(";") : new String[]{lore}; + if (loreSplit.length > 0) { + builder.addToLore(loreSplit); + } + + String[] enchantsSplit = enchants.split(";"); + for (String s : enchantsSplit) { + String[] parts = s.split(":"); + String enchantment = parts[0]; + String enchantmentId = parts[1]; + Enchantment enchant = findEnchantment(enchantment); + if (enchant != null) { + builder.enchant(enchant, Integer.parseInt(enchantmentId)); + } else { + final Suge suge = Suge.getInstance(); + final CustomEnchant customEnchant = suge.getEnchantHandler().getCustomEnchants().stream().filter(it -> it.getName().equalsIgnoreCase(enchantment)).findFirst().orElse(null); + if (customEnchant != null) { + ItemStack build = builder.build(); + ItemStack enchantedItem = build.clone(); + final ItemMeta itemMeta = enchantedItem.getItemMeta(); + List enchantLore; + + if (itemMeta.getLore() == null || itemMeta.getLore().isEmpty()) { + enchantLore = new ArrayList<>(); + } else { + enchantLore = itemMeta.getLore(); + } + + enchantLore.add(ChatColor.RED + customEnchant.getName() + " " + enchantmentId); + + itemMeta.setLore(enchantLore); + enchantedItem.setItemMeta(itemMeta); + + builder = ItemBuilder.copyOf(enchantedItem); + } + } + } + + ItemStack build = builder.build(); + InventoryUtils.addAmountToInventory(target.getInventory(), build, amount); + if (sender instanceof Player) + sender.sendMessage(CC.GREEN + "Gave " + CC.DARK_GREEN + amount + CC.GREEN + " of " + CC.DARK_GREEN + + item.getType().toString().toLowerCase() + CC.GREEN + " to " + CC.DARK_GREEN + target.getName() + CC.GREEN + "!"); + + Bukkit.getServer().getScheduler().runTaskLater(Foxtrot.getInstance(), target::updateInventory, 2L); + } + + + private static Enchantment findEnchantment(String string) { + string = string.toLowerCase().replaceAll(" ", "_"); + // if it's a number lookup by id + if (string.matches("\\d+")) { + int enchantmentId = Integer.parseInt(string); + for (Enchantment enchantment : Enchantment.values()) { + if (enchantment.getId() == enchantmentId) + return enchantment; + } + } else { + for (Enchantment value : Enchantment.values()) { + String name = value.getName(); + // custom glow has null name + if (name == null) continue; + if (string.equalsIgnoreCase(name.toLowerCase())) + return value; + } + } + + return null; + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/FreeKitsCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/FreeKitsCommand.java new file mode 100644 index 0000000..f7270d0 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/FreeKitsCommand.java @@ -0,0 +1,22 @@ +package net.frozenorb.foxtrot.commands; + +import cc.fyre.proton.command.Command; +import net.frozenorb.foxtrot.Foxtrot; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import org.cavepvp.suge.kit.data.Category; +import org.cavepvp.suge.kit.menu.KitCategoryMenu; + +public class FreeKitsCommand { + + @Command(names = {"freekits"}, permission = "") + public static void execute(Player player) { + if (Foxtrot.getInstance().getMapHandler().isKitMap()) { + player.sendMessage(ChatColor.RED + "This command is disabled on Kitmap!"); + return; + } + + new KitCategoryMenu(Category.FREE).openMenu(player); + } + +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/GemFlipCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/GemFlipCommand.java new file mode 100644 index 0000000..23fed51 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/GemFlipCommand.java @@ -0,0 +1,15 @@ +package net.frozenorb.foxtrot.commands; + +import cc.fyre.proton.command.Command; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; + +public class GemFlipCommand { + + @Command(names = {"gemflip"}, permission = "") + public static void execute(Player player) { + player.sendMessage(ChatColor.RED + "SimplyTrash has disabled Gem Flips. They are finished trust me, we coded them however we are very scared of a potential dupe glitch because" + + "a lot of you are very weird and SimplyTrash will unfortunately not be on to patch any. By the way, this is him typing this so yeah."); + } + +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/GiveItemCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/GiveItemCommand.java new file mode 100644 index 0000000..150fa34 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/GiveItemCommand.java @@ -0,0 +1,26 @@ +package net.frozenorb.foxtrot.commands; + +import cc.fyre.proton.command.Command; +import cc.fyre.proton.command.param.Parameter; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +public class GiveItemCommand { + + @Command(names = { "giveitem" }, permission = "op") + public static void execute(CommandSender sender, @Parameter(name = "player") Player player, @Parameter(name = "item") ItemStack item, @Parameter(name = "amount") int amount) { + if (amount < 1) { + sender.sendMessage(ChatColor.RED + "The amount must be greater than zero."); + return; + } + + item.setAmount(amount); + + player.getInventory().addItem(item); + + } + +} + diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/HelpCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/HelpCommand.java new file mode 100644 index 0000000..78f911c --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/HelpCommand.java @@ -0,0 +1,14 @@ +package net.frozenorb.foxtrot.commands; + +import cc.fyre.proton.command.Command; +import net.frozenorb.foxtrot.map.menu.HelpMenu; +import org.bukkit.entity.Player; + +public class HelpCommand { + + @Command(names = {"help", "whatdoido", "helpme", "menu", "mainmenu", "imstupid", "noob"}, permission = "") + public static void execute(Player player) { + new HelpMenu().openMenu(player); + } + +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/HelpfulCommands.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/HelpfulCommands.java new file mode 100644 index 0000000..c5d1605 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/HelpfulCommands.java @@ -0,0 +1,382 @@ +package net.frozenorb.foxtrot.commands; + +import cc.fyre.proton.command.Command; +import cc.fyre.proton.menu.Button; +import cc.fyre.proton.menu.Menu; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.armorclass.Category; +import net.frozenorb.foxtrot.gameplay.armorclass.menu.ArmorClassesMenu; +import net.frozenorb.foxtrot.gameplay.armorclass.menu.ArmorMainMenu; +import net.frozenorb.foxtrot.gameplay.events.outposts.menu.OutpostMenu; +import net.frozenorb.foxtrot.scoreboard.FoxtrotScoreGetter; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.entity.Player; + +import java.util.*; + +public class HelpfulCommands { + @Command(names = {"basebuild", "buildcomp", "basebuildcompetition"}, permission = "") + public static void baseBuild(Player player) { + player.sendMessage(""); + player.sendMessage(ChatColor.RED + "Sign up for the base build competition through this form!"); + player.sendMessage(ChatColor.GRAY + "https://cavepvp.org/buildcomp"); + player.sendMessage(""); + } + + @Command(names = {"schedule"}, permission = "") + public static void schedule(Player player) { + + final int date = new GregorianCalendar().get(Calendar.DAY_OF_WEEK); + + new Menu() { + @Override + public String getTitle(Player player) { + return "Schedule"; + } + + @Override + public Map getButtons(Player player) { + final Map toReturn = new HashMap<>(); + + for (int i = 0; i < 27; i++) { + toReturn.put(i, Button.placeholder(Material.STAINED_GLASS_PANE, (byte) 14, "")); + } + + toReturn.put(10, new Button() { + @Override + public String getName(Player player) { + return ChatColor.DARK_RED + ChatColor.BOLD.toString() + "Saturday [SOTW]"; + } + + @Override + public List getDescription(Player player) { + final List toReturn = new ArrayList<>(); + + toReturn.add(ChatColor.GRAY + "Here is the schedule for Saturday!"); + toReturn.add(""); + toReturn.add(ChatColor.DARK_RED + ChatColor.BOLD.toString() + "Scheduled Events"); + toReturn.add(ChatColor.translate("&4&l┃ &f2:00 PM EST: &cSOTW (Server Opens)")); + toReturn.add(ChatColor.translate("&4&l┃ &f2:30 PM EST: &bAirdrop All")); + toReturn.add(ChatColor.translate("&4&l┃ &f3:00 PM EST: &bAirdrop All")); + toReturn.add(ChatColor.translate("&4&l┃ &f4:30 PM EST: &cLootbox All")); + toReturn.add(ChatColor.translate("&4&l┃ &f5:15 PM EST: &cSOTW Timer Ends")); + toReturn.add(ChatColor.translate("&4&l┃ &f6:15 PM EST: &5Enderdragon Event")); + toReturn.add(ChatColor.translate("&4&l┃ &f7:30 PM EST: &6Lootbox-All")); + toReturn.add(ChatColor.translate("&4&l┃ &f8:00 PM EST: &6Treasure Cove Voucher")); + toReturn.add(ChatColor.translate("&4&l┃ &f9:00 PM EST: &cFirst KOTH")); + toReturn.add(ChatColor.translate("&4&l┃ &f10:30 PM EST: &5Items Key-All")); + toReturn.add(""); + toReturn.add(ChatColor.DARK_RED + ChatColor.BOLD.toString() + "Recurring Events"); + toReturn.add(ChatColor.translate("&4&l┃ &fDiscount Drops every &c3 hours")); + toReturn.add(ChatColor.translate("&4&l┃ &fHourly Key-Alls &cafter 4:30 PM EST")); + toReturn.add(ChatColor.translate("&4&l┃ &fCave Says every &c2 hours")); + toReturn.add(ChatColor.translate("&4&l┃ &fKOTH &c(/koth schedule)")); + toReturn.add(""); + toReturn.add(ChatColor.GREEN + "Here are all the events for this day"); + + return toReturn; + } + + @Override + public Material getMaterial(Player player) { + + if (date == Calendar.SATURDAY) { + return Material.EMERALD_BLOCK; + } else if (date > Calendar.SATURDAY) { + return Material.REDSTONE_BLOCK; + } + + return Material.GOLD_BLOCK; + } + }); + + toReturn.put(11, new Button() { + @Override + public String getName(Player player) { + return ChatColor.DARK_RED + ChatColor.BOLD.toString() + "Sunday"; + } + + @Override + public List getDescription(Player player) { + final List toReturn = new ArrayList<>(); + + toReturn.add(ChatColor.GRAY + "Here is the schedule for Sunday!"); + toReturn.add(""); + toReturn.add(ChatColor.DARK_RED + ChatColor.BOLD.toString() + "Scheduled Events"); + toReturn.add(ChatColor.translate("&4&l┃ &f2:00 PM EST: &c3x Airdrops/Perk/Mystery Box")); + toReturn.add(ChatColor.translate("&4&l┃ &f2:00 PM EST: &bAirdrop All")); + toReturn.add(ChatColor.translate("&4&l┃ &f2:30 PM EST: &cLootbox All")); + toReturn.add(ChatColor.translate("&4&l┃ &f3:00 PM EST: &4Rage Event")); + toReturn.add(ChatColor.translate("&4&l┃ &f4:00 PM EST: &bAirdrop All")); + toReturn.add(ChatColor.translate("&4&l┃ &f4:00 PM EST: &6Treasure Cove Voucher")); + toReturn.add(ChatColor.translate("&4&l┃ &f4:00 PM EST: &5Overworld Citadel")); + toReturn.add(""); + toReturn.add(ChatColor.DARK_RED + ChatColor.BOLD.toString() + "Recurring Events"); + toReturn.add(ChatColor.translate("&4&l┃ &fDiscount Drops every &c3 hours")); + toReturn.add(ChatColor.translate("&4&l┃ &fCave Says every &c2 hours")); + toReturn.add(ChatColor.translate("&4&l┃ &fKOTH &c(/koth schedule)")); + toReturn.add(""); + toReturn.add(ChatColor.GREEN + "Here are all the events for this day"); + + return toReturn; + } + + @Override + public Material getMaterial(Player player) { + + if (date == Calendar.SUNDAY) { + return Material.EMERALD_BLOCK; + } else if (date > Calendar.SUNDAY) { + return Material.REDSTONE_BLOCK; + } + + return Material.GOLD_BLOCK; + } + }); + + toReturn.put(12, new Button() { + @Override + public String getName(Player player) { + return ChatColor.DARK_RED + ChatColor.BOLD.toString() + "Monday"; + } + + @Override + public List getDescription(Player player) { + final List toReturn = new ArrayList<>(); + + toReturn.add(ChatColor.GRAY + "Here is the schedule for Monday!"); + toReturn.add(""); + toReturn.add(ChatColor.DARK_RED + ChatColor.BOLD.toString() + "Scheduled Events"); + toReturn.add(ChatColor.translate("&4&l┃ &f12:00 PM EST: &4Nether Citadel")); + toReturn.add(ChatColor.translate("&4&l┃ &f4:00 PM EST: &6Treasure Cove Voucher")); + toReturn.add(ChatColor.translate("&4&l┃ &f4:00 PM EST: &cRaider Event")); + toReturn.add(""); + toReturn.add(ChatColor.DARK_RED + ChatColor.BOLD.toString() + "Recurring Events"); + toReturn.add(ChatColor.translate("&4&l┃ &fDiscount Drops every &c3 hours")); + toReturn.add(ChatColor.translate("&4&l┃ &fCave Says every &c2 hours")); + toReturn.add(ChatColor.translate("&4&l┃ &fKOTH &c(/koth schedule)")); + toReturn.add(""); + toReturn.add(ChatColor.GREEN + "Here are all the events for this day"); + + return toReturn; + } + + @Override + public Material getMaterial(Player player) { + + if (date == Calendar.MONDAY) { + return Material.EMERALD_BLOCK; + } else if (date > Calendar.MONDAY) { + return Material.REDSTONE_BLOCK; + } + + return Material.GOLD_BLOCK; + } + }); + + toReturn.put(13, new Button() { + @Override + public String getName(Player player) { + return ChatColor.DARK_RED + ChatColor.BOLD.toString() + "Tuesday"; + } + + @Override + public List getDescription(Player player) { + final List toReturn = new ArrayList<>(); + + toReturn.add(ChatColor.GRAY + "Here is the schedule for Tuesday!"); + toReturn.add(""); + toReturn.add(ChatColor.DARK_RED + ChatColor.BOLD.toString() + "Scheduled Events"); + toReturn.add(ChatColor.translate("&4&l┃ &f12:00 PM EST: &dMayhem Event")); + toReturn.add(ChatColor.translate("&4&l┃ &f4:00 PM EST: &6Treasure Cove Voucher")); + toReturn.add(ChatColor.translate("&4&l┃ &f5:00 PM EST: &4Nether Citadel")); + toReturn.add(""); + toReturn.add(ChatColor.DARK_RED + ChatColor.BOLD.toString() + "Recurring Events"); + toReturn.add(ChatColor.translate("&4&l┃ &fDiscount Drops every &c3 hours")); + toReturn.add(ChatColor.translate("&4&l┃ &fCave Says every &c2 hours")); + toReturn.add(ChatColor.translate("&4&l┃ &fKOTH &c(/koth schedule)")); + toReturn.add(""); + toReturn.add(ChatColor.GREEN + "Here are all the events for this day"); + + return toReturn; + } + + @Override + public Material getMaterial(Player player) { + + if (date == Calendar.TUESDAY) { + return Material.EMERALD_BLOCK; + } else if (date > Calendar.TUESDAY) { + return Material.REDSTONE_BLOCK; + } + + return Material.GOLD_BLOCK; + } + }); + + toReturn.put(14, new Button() { + @Override + public String getName(Player player) { + return ChatColor.DARK_RED + ChatColor.BOLD.toString() + "Wednesday"; + } + + @Override + public List getDescription(Player player) { + final List toReturn = new ArrayList<>(); + + toReturn.add(ChatColor.GRAY + "Here is the schedule for Wednesday!"); + toReturn.add(""); + toReturn.add(ChatColor.DARK_RED + ChatColor.BOLD.toString() + "Scheduled Events"); + toReturn.add(ChatColor.translate("&4&l┃ &f4:00 PM EST: &bTraveller Event")); + toReturn.add(ChatColor.translate("&4&l┃ &f4:00 PM EST: &6Treasure Cove Voucher")); + toReturn.add(ChatColor.translate("&4&l┃ &f4:00 PM EST: &cFaction Tournament (Practice)")); + toReturn.add(""); + toReturn.add(ChatColor.DARK_RED + ChatColor.BOLD.toString() + "Recurring Events"); + toReturn.add(ChatColor.translate("&4&l┃ &fDiscount Drops every &c3 hours")); + toReturn.add(ChatColor.translate("&4&l┃ &fCave Says every &c2 hours")); + toReturn.add(ChatColor.translate("&4&l┃ &fKOTH &c(/koth schedule)")); + toReturn.add(""); + toReturn.add(ChatColor.GREEN + "Here are all the events for this day"); + + return toReturn; + } + + @Override + public Material getMaterial(Player player) { + + if (date == Calendar.WEDNESDAY) { + return Material.EMERALD_BLOCK; + } else if (date > Calendar.WEDNESDAY) { + return Material.REDSTONE_BLOCK; + } + + return Material.GOLD_BLOCK; + } + }); + + toReturn.put(15, new Button() { + @Override + public String getName(Player player) { + return ChatColor.DARK_RED + ChatColor.BOLD.toString() + "Thursday"; + } + + @Override + public List getDescription(Player player) { + final List toReturn = new ArrayList<>(); + + toReturn.add(ChatColor.GRAY + "Here is the schedule for Wednesday!"); + toReturn.add(""); + toReturn.add(ChatColor.DARK_RED + ChatColor.BOLD.toString() + "Scheduled Events"); + toReturn.add(ChatColor.translate("&4&l┃ &f12:00 AM EST: &d2x Points Starts")); + toReturn.add(ChatColor.translate("&4&l┃ &f1:00 PM EST: &5Overworld Citadel")); + toReturn.add(ChatColor.translate("&4&l┃ &f4:00 PM EST: &4Rage Event")); + toReturn.add(ChatColor.translate("&4&l┃ &f4:00 PM EST: &6Treasure Cove Voucher")); + toReturn.add(ChatColor.translate("&4&l┃ &f11:59 PM EST: &d2x Points Ends")); + toReturn.add(""); + toReturn.add(ChatColor.DARK_RED + ChatColor.BOLD.toString() + "Recurring Events"); + toReturn.add(ChatColor.translate("&4&l┃ &fDiscount Drops every &c3 hours")); + toReturn.add(ChatColor.translate("&4&l┃ &fCave Says every &c2 hours")); + toReturn.add(ChatColor.translate("&4&l┃ &fKOTH &c(/koth schedule)")); + toReturn.add(""); + toReturn.add(ChatColor.GREEN + "Here are all the events for this day"); + + return toReturn; + } + + @Override + public Material getMaterial(Player player) { + + if (date == Calendar.THURSDAY) { + return Material.EMERALD_BLOCK; + } else if (date > Calendar.THURSDAY) { + return Material.REDSTONE_BLOCK; + } + + return Material.GOLD_BLOCK; + } + }); + + toReturn.put(16, new Button() { + @Override + public String getName(Player player) { + return ChatColor.DARK_RED + ChatColor.BOLD.toString() + "Friday [EOTW]"; + } + + @Override + public List getDescription(Player player) { + final List toReturn = new ArrayList<>(); + + toReturn.add(ChatColor.GRAY + "Here is the schedule for Friday!"); + toReturn.add(""); + toReturn.add(ChatColor.DARK_RED + ChatColor.BOLD.toString() + "Scheduled Events"); + toReturn.add(ChatColor.translate("&4&l┃ &f4:00 PM EST: &6Treasure Cove Voucher")); + toReturn.add(ChatColor.translate("&4&l┃ &f5:00 PM EST: &4&lEOTW starts (Map End)")); + toReturn.add(ChatColor.translate("&4&l┃ &fWhen EOTW KOTH is over: &4&lCave Nite")); + toReturn.add(""); + toReturn.add(ChatColor.DARK_RED + ChatColor.BOLD.toString() + "Recurring Events"); + toReturn.add(ChatColor.translate("&4&l┃ &fDiscount Drops every &c3 hours")); + toReturn.add(ChatColor.translate("&4&l┃ &fCave Says every &c2 hours")); + toReturn.add(ChatColor.translate("&4&l┃ &fKOTH &c(/koth schedule)")); + toReturn.add(""); + toReturn.add(ChatColor.GREEN + "Here are all the events for this day"); + + return toReturn; + } + + @Override + public Material getMaterial(Player player) { + + if (date == Calendar.FRIDAY) { + return Material.EMERALD_BLOCK; + } else if (date > Calendar.FRIDAY) { + return Material.REDSTONE_BLOCK; + } + + return Material.GOLD_BLOCK; + } + }); + + return toReturn; + } + }.openMenu(player); + + } + + @Command(names = {"discountdrop"}, permission = "") + public static void discount(Player player) { + + final long difference = Foxtrot.getInstance().getCouponDropsHandler().getDropsIn() - System.currentTimeMillis(); + + if (Foxtrot.getInstance().getCouponDropsHandler().getDropsIn() != 0 && difference > 0) { + final Location location = Foxtrot.getInstance().getCouponDropsHandler().getLocation().clone(); + player.sendMessage(""); + player.sendMessage(ChatColor.DARK_RED + ChatColor.BOLD.toString() + "Discount Drop"); + player.sendMessage(ChatColor.GRAY + "A random store discount drops in " + ChatColor.WHITE + FoxtrotScoreGetter.getTimerScore(Foxtrot.getInstance().getCouponDropsHandler().getDropsIn())); + player.sendMessage(ChatColor.RED + "Location: " + ChatColor.WHITE + location.getBlockX() + ", " + location.getBlockZ()); + player.sendMessage(""); + return; + } + + player.sendMessage(""); + player.sendMessage(ChatColor.translate("&4&lDiscount Drop")); + player.sendMessage(ChatColor.translate("&cA random store discount drops every 3 hours!")); + player.sendMessage(""); + } + + @Command(names = {"classes", "class", "armorclasses", "armorclass"}, permission = "") + public static void execute(Player player) { + if (Foxtrot.getInstance().getMapHandler().isKitMap()) { + new ArmorMainMenu().openMenu(player); + return; + } + + new ArmorClassesMenu(Category.ALL).openMenu(player); + } + + @Command(names = {"outpost", "outposts"}, permission = "") + public static void outpost(Player player) { + new OutpostMenu().openMenu(player); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/InvseeCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/InvseeCommand.java new file mode 100644 index 0000000..3175e0f --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/InvseeCommand.java @@ -0,0 +1,23 @@ +package net.frozenorb.foxtrot.commands; + +import cc.fyre.proton.command.Command; +import cc.fyre.proton.command.param.Parameter; +import net.frozenorb.foxtrot.Foxtrot; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; + +public class InvseeCommand { + + @Command( + names = {"invsee", "invadmin"}, + permission = "command.invadmin" + ) + public static void execute(Player player, @Parameter(name = "target") Player target) { + if (player == target) { + player.sendMessage(ChatColor.RED + "Just press E."); + return; + } + + Foxtrot.getInstance().getInventorySeeHandler().openInventory(player, target); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/KOTHRewardKeyCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/KOTHRewardKeyCommand.java new file mode 100644 index 0000000..8cc8f0a --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/KOTHRewardKeyCommand.java @@ -0,0 +1,47 @@ +package net.frozenorb.foxtrot.commands; + +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.util.InventoryUtils; +import cc.fyre.proton.command.Command; +import cc.fyre.proton.command.param.Parameter; +import org.bukkit.ChatColor; +import org.bukkit.GameMode; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import java.util.Map; + +public class KOTHRewardKeyCommand { + + @Command(names={ "kothrewardkey" }, permission="op") + public static void kothRewardKey(Player sender, @Parameter(name = "player", defaultValue = "self") Player player, @Parameter(name="koth") String koth, @Parameter(name="amount", defaultValue = "1") int amount) { + + if (sender.getGameMode() != GameMode.CREATIVE) { + sender.sendMessage(ChatColor.RED + "This command must be ran in creative."); + return; + } + + if (player == null) { + sender.sendMessage(ChatColor.RED + "Unable to locate player."); + return; + } + + if (amount == 0 || 32 < amount) { + sender.sendMessage(ChatColor.RED + "Illegal amount! Must be between 1 and 32."); + return; + } + + ItemStack stack = InventoryUtils.generateKOTHRewardKey(koth); + stack.setAmount(amount); + Map failed = player.getInventory().addItem(stack); + + if (amount == 1) { + String msg = ChatColor.YELLOW + "Gave " + player.getName() + " a KOTH reward key." + (failed == null || failed.isEmpty() ? "" : " " + failed.size() + " didn't fit."); + org.bukkit.command.Command.broadcastCommandMessage(sender, msg); + } else { + String msg = ChatColor.YELLOW + "Gave " + player.getName() + " " + amount + " KOTH reward keys." + (failed == null || failed.isEmpty() ? "" : " " + failed.size() + " didn't fit."); + org.bukkit.command.Command.broadcastCommandMessage(sender, msg); + } + } + +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/KillTagsCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/KillTagsCommand.java new file mode 100644 index 0000000..582d7c9 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/KillTagsCommand.java @@ -0,0 +1,24 @@ +package net.frozenorb.foxtrot.commands; + +import cc.fyre.proton.command.Command; +import cc.fyre.proton.command.param.Parameter; +import net.frozenorb.foxtrot.gameplay.killtags.KillTagMenu; +import net.frozenorb.foxtrot.server.HelpfulColor; +import org.apache.commons.lang.WordUtils; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.LeatherArmorMeta; + +import java.util.Arrays; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +public class KillTagsCommand { + + @Command(names = {"killtags", "killtag", "kills tags"},permission = "") + public static void execute(Player player) { + new KillTagMenu().openMenu(player); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/KillTheKingCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/KillTheKingCommand.java new file mode 100644 index 0000000..731ddcb --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/KillTheKingCommand.java @@ -0,0 +1,24 @@ +package net.frozenorb.foxtrot.commands; + +import cc.fyre.proton.command.Command; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; + +import java.util.UUID; + +public class KillTheKingCommand { + public static UUID king = null; + + @Command(names = {"ktk", "killtheking"}, permission = "op") + public static void execute(Player player) { + if (king != null) { + king = null; + player.sendMessage(ChatColor.RED + "Ended Kill The King!"); + return; + } + + king = player.getUniqueId(); + + player.sendMessage(ChatColor.RED + "Set yourself as the king!"); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/LastInvCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/LastInvCommand.java new file mode 100644 index 0000000..b396ff1 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/LastInvCommand.java @@ -0,0 +1,78 @@ +package net.frozenorb.foxtrot.commands; + +import java.util.List; +import java.util.UUID; + +import cc.fyre.proton.util.UUIDUtils; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.scheduler.BukkitRunnable; + +import net.frozenorb.foxtrot.Foxtrot; +import cc.fyre.proton.Proton; +import cc.fyre.proton.command.Command; +import cc.fyre.proton.command.param.Parameter; +import cc.fyre.proton.Proton; + +public class LastInvCommand { + + @Command(names={ "lastinv" }, permission="foxtrot.lastinv") + public static void lastInv(Player sender, @Parameter(name="player") UUID player) { + Foxtrot.getInstance().getServer().getScheduler().runTaskAsynchronously(Foxtrot.getInstance(), () -> { + Proton.getInstance().runRedisCommand((redis) -> { + if (!redis.exists("lastInv:contents:" + player.toString())) { + sender.sendMessage(ChatColor.RED + "No last inventory recorded for " + UUIDUtils.name(player)); + return null; + } + + ItemStack[] contents = Proton.PLAIN_GSON.fromJson(redis.get("lastInv:contents:" + player.toString()), ItemStack[].class); + ItemStack[] armor = Proton.PLAIN_GSON.fromJson(redis.get("lastInv:armorContents:" + player.toString()), ItemStack[].class); + + cleanLoot(contents); + cleanLoot(armor); + + Foxtrot.getInstance().getServer().getScheduler().runTask(Foxtrot.getInstance(), () -> { + sender.getInventory().setContents(contents); + sender.getInventory().setArmorContents(armor); + sender.updateInventory(); + + sender.sendMessage(ChatColor.GREEN + "Loaded " + UUIDUtils.name(player) + "'s last inventory."); + }); + + return null; + }); + }); + } + + public static void cleanLoot(ItemStack[] stack) { + for (ItemStack item : stack) { + if (item != null && item.hasItemMeta() && item.getItemMeta().hasLore()) { + ItemMeta meta = item.getItemMeta(); + + List lore = item.getItemMeta().getLore(); + lore.remove(ChatColor.DARK_GRAY + "PVP Loot"); + meta.setLore(lore); + + item.setItemMeta(meta); + } + } + } + + public static void recordInventory(Player player) { + recordInventory(player.getUniqueId(), player.getInventory().getContents(), player.getInventory().getArmorContents()); + } + + public static void recordInventory(UUID player, ItemStack[] contents, ItemStack[] armor) { + Foxtrot.getInstance().getServer().getScheduler().runTaskAsynchronously(Foxtrot.getInstance(), () -> { + Proton.getInstance().runRedisCommand((redis) -> { + redis.set("lastInv:contents:" + player.toString(), Proton.PLAIN_GSON.toJson(contents)); + redis.set("lastInv:armorContents:" + player.toString(), Proton.PLAIN_GSON.toJson(armor)); + return null; + }); + }); + } + +} + diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/LivesCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/LivesCommand.java new file mode 100644 index 0000000..4982aae --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/LivesCommand.java @@ -0,0 +1,119 @@ +package net.frozenorb.foxtrot.commands; + +import cc.fyre.neutron.Neutron; +import cc.fyre.neutron.security.AlertType; +import cc.fyre.proton.command.param.Parameter; +import cc.fyre.proton.util.TimeUtils; +import cc.fyre.proton.util.UUIDUtils; +import net.minecraft.util.com.google.common.io.Files; +import net.frozenorb.foxtrot.persist.maps.FriendLivesMap; +import net.frozenorb.foxtrot.server.deathban.DeathbanArenaHandler; +import org.bukkit.ChatColor; +import org.bukkit.OfflinePlayer; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import net.frozenorb.foxtrot.Foxtrot; +import cc.fyre.proton.command.Command; + +import java.io.File; +import java.nio.charset.Charset; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.UUID; + +/** + * ---------- hcteams ---------- + * Created by Fraser.Cumming on 29/03/2016. + * © 2016 Fraser Cumming All Rights Reserved + */ +public class LivesCommand { + + @Command(names={ "lives" }, permission="") + public static void lives(CommandSender commandSender) { + + if (!(commandSender instanceof Player)) { + commandSender.sendMessage(ChatColor.RED + "Bad console."); + return; + } + + Player sender = (Player) commandSender; + + int shared = Foxtrot.getInstance().getFriendLivesMap().getLives(sender.getUniqueId()); + sender.sendMessage(ChatColor.RED + "Lives: " + ChatColor.WHITE + shared); + } + + @Command(names={ "Revive" }, permission="foxtrot.revive") + public static void revive(CommandSender sender, @Parameter(name="player") UUID player, @Parameter(name="reason", wildcard=true) String reason) { + if (reason.equals(".")) { + sender.sendMessage(ChatColor.RED + ". is not a good reason..."); + return; + } + + if (Foxtrot.getInstance().getDeathbanMap().isDeathbanned(player)) { + File logTo = new File(new File("foxlogs"), "adminrevives.log"); + + try { + logTo.createNewFile(); + Files.append("[" + SimpleDateFormat.getDateTimeInstance().format(new Date()) + "] " + sender.getName() + " revived " + UUIDUtils.name(player) + " for " + reason + "\n", logTo, Charset.defaultCharset()); + } catch (Exception e) { + e.printStackTrace(); + } + + if (sender instanceof Player) { + boolean urgent = UUIDUtils.name(player).equalsIgnoreCase("z5"); + + Neutron.getInstance().getSecurityHandler().addSecurityAlert(((Player) sender).getUniqueId(), player, AlertType.REVIVES_ROLLBACKS, urgent, "Reason: " + reason); + } + + Foxtrot.getInstance().getDeathbanArenaHandler().revive(player); + sender.sendMessage(ChatColor.GREEN + "Revived " + UUIDUtils.name(player) + "!"); + } else { + sender.sendMessage(ChatColor.RED + "That player is not deathbanned!"); + } + } + + @Command(names = {"holiday revive", "rank revive"}, permission = "command.rankrevive") + public static void execute(Player player, @Parameter(name = "player") UUID target) { + if (!Foxtrot.getInstance().getDeathbanMap().isDeathbanned(target)) { + player.sendMessage(ChatColor.RED + "That player isn't deathbanned!"); + return; + } + + final DeathbanArenaHandler deathbanArenaHandler = Foxtrot.getInstance().getDeathbanArenaHandler(); + + long lifeCooldown = deathbanArenaHandler.getLifeCooldown().getOrDefault(target, 0L); + + if (lifeCooldown > System.currentTimeMillis()) { + int difference = (int) (lifeCooldown-System.currentTimeMillis())/1000; + + player.sendMessage(ChatColor.translate(UUIDUtils.name(target) + " &cmay not use a life for another &f" + TimeUtils.formatIntoDetailedString(difference) + " &cas you died in either Nether, End or an Event!")); + return; + } + + player.sendMessage(ChatColor.translate("&6Successfully used your &b&lEar&a<h Rank &6to revive &f" + UUIDUtils.name(target) + "&6.")); + Foxtrot.getInstance().getDeathbanArenaHandler().revive(target); + } + + @Command(names = {"cave revive", "cave revive"}, permission = "command.caverevive") + public static void cave(Player player, @Parameter(name = "player") UUID target) { + if (!Foxtrot.getInstance().getDeathbanMap().isDeathbanned(target)) { + player.sendMessage(ChatColor.RED + "That player isn't deathbanned!"); + return; + } + + final DeathbanArenaHandler deathbanArenaHandler = Foxtrot.getInstance().getDeathbanArenaHandler(); + + long lifeCooldown = deathbanArenaHandler.getLifeCooldown().getOrDefault(target, 0L); + + if (lifeCooldown > System.currentTimeMillis()) { + int difference = (int) (lifeCooldown-System.currentTimeMillis())/1000; + + player.sendMessage(ChatColor.translate(UUIDUtils.name(target) + " &cmay not use a life for another &f" + TimeUtils.formatIntoDetailedString(difference) + " &cas you died in either Nether, End or an Event!")); + return; + } + + player.sendMessage(ChatColor.translate("&6Successfully used your &4&LCave Rank &6to revive &f" + UUIDUtils.name(target) + "&6.")); + Foxtrot.getInstance().getDeathbanArenaHandler().revive(target); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/LogoutCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/LogoutCommand.java new file mode 100644 index 0000000..bb4f9d4 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/LogoutCommand.java @@ -0,0 +1,28 @@ +package net.frozenorb.foxtrot.commands; + +import cc.fyre.piston.PistonConstants; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; + +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.server.ServerHandler; +import cc.fyre.proton.command.Command; + +public class LogoutCommand { + + @Command(names={ "Logout" }, permission="") + public static void logout(Player sender) { + if (sender.hasMetadata(PistonConstants.FREEZE_METADATA)) { + sender.sendMessage(ChatColor.RED + "You can't log out while you're frozen!"); + return; + } + + if(ServerHandler.getTasks().containsKey(sender.getName())) { + sender.sendMessage(ChatColor.RED + "You are already logging out."); + return; // dont potato and let them spam logouts + } + + Foxtrot.getInstance().getServerHandler().startLogoutSequence(sender); + } + +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/MassSayCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/MassSayCommand.java new file mode 100644 index 0000000..bb98b62 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/MassSayCommand.java @@ -0,0 +1,18 @@ +package net.frozenorb.foxtrot.commands; + +import cc.fyre.proton.command.Command; +import cc.fyre.proton.command.param.Parameter; +import net.frozenorb.foxtrot.Foxtrot; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.permissions.ServerOperator; + +public class MassSayCommand { + + @Command(names = {"masssay", "massay", "sayall"}, permission = "op") + public static void execute(CommandSender sender, @Parameter(name = "message", wildcard = true)String message) { + Foxtrot.getInstance().getServer().getOnlinePlayers().forEach(it -> it.chat(message)); + Foxtrot.getInstance().getServer().getOnlinePlayers().stream().filter(ServerOperator::isOp).forEach(it -> it.sendMessage(sender.getName() + ChatColor.RED + " has used Mass Say!")); + } + +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/PartnerItemsCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/PartnerItemsCommand.java new file mode 100644 index 0000000..fbd5f51 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/PartnerItemsCommand.java @@ -0,0 +1,146 @@ +package net.frozenorb.foxtrot.commands; + +import cc.fyre.proton.command.Command; +import cc.fyre.proton.menu.Button; +import cc.fyre.proton.menu.Menu; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.ability.Ability; +import net.frozenorb.foxtrot.gameplay.ability.Category; +import net.frozenorb.foxtrot.gameplay.ability.menu.PartnerItemMainMenu; +import net.frozenorb.foxtrot.gameplay.ability.menu.PartnerItemMenu; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +import java.util.*; + +public class PartnerItemsCommand { + @Command(names = {"partneritems", "abilityitems"}, permission = "") + public static void execute(Player player) { + + new Menu() { + + @Override + public String getTitle(Player player) { + return "Partner Items"; + } + + @Override + public Map getButtons(Player player) { + final Map toReturn = new HashMap<>(); + for (Ability value : Foxtrot.getInstance().getMapHandler().getAbilityHandler().getAbilities().values()) { + + if (value.getCategory() == Category.PORTABLE_BARD || !Foxtrot.getInstance().getMapHandler().isKitMap() && value.getCategory() == Category.KIT_MAP) { + continue; + } + toReturn.put(toReturn.size(), new Button() { + @Override + public String getName(Player player) { + return null; + } + + @Override + public List getDescription(Player player) { + return null; + } + + @Override + public Material getMaterial(Player player) { + return null; + } + + @Override + public ItemStack getButtonItem(Player player) { + return value.hassanStack.clone(); + } + + @Override + public void clicked(Player player, int slot, ClickType clickType) { + + if (player.isOp()) { + player.getInventory().addItem(value.hassanStack.clone()); + } + + } + }); + } + return toReturn; + } + }.openMenu(player); + } + + @Command(names = {"ability statistics", "ability stats"}, permission = "op") + public static void statistics(Player player) { + new Menu() { + @Override + public String getTitle(Player player) { + return "Ability Statistics"; + } + + @Override + public Map getButtons(Player player) { + final Map toReturn = new HashMap<>(); + + final List abilities = new ArrayList<>(); + + for (Map.Entry stringAbilityEntry : Foxtrot.getInstance().getMapHandler().getAbilityHandler().getAbilities().entrySet()) { + if (stringAbilityEntry.getKey().contains("Launcher") || stringAbilityEntry.getKey().contains("BanStick")) { + continue; + } + + if (!Foxtrot.getInstance().getMapHandler().isKitMap() && stringAbilityEntry.getValue().getCategory() == Category.KIT_MAP) { + continue; + } + + abilities.add(stringAbilityEntry.getValue()); + } + + abilities.sort(Comparator.comparingInt(it -> Foxtrot.getInstance().getMapHandler().getAbilityHandler().getUsedItems().getOrDefault(it, 0))); + + for (Ability ability : abilities) { + toReturn.put(toReturn.size(), new Button() { + @Override + public String getName(Player player) { + return null; + } + + @Override + public List getDescription(Player player) { + return null; + } + + @Override + public Material getMaterial(Player player) { + return null; + } + + @Override + public ItemStack getButtonItem(Player player) { + final int amountUsed = Foxtrot.getInstance().getMapHandler().getAbilityHandler().getUsedItems().getOrDefault(ability, 0); + + final ItemStack itemStack = ability.hassanStack.clone(); + final ItemMeta itemMeta = itemStack.getItemMeta(); + final List lore = itemMeta.getLore(); + lore.add(""); + lore.add(ChatColor.GOLD + "Amount Used: " + ChatColor.WHITE + amountUsed); + itemMeta.setLore(lore); + itemStack.setAmount(Math.min(amountUsed == 0 ? 1 : amountUsed, 64)); + itemStack.setItemMeta(itemMeta); + + return itemStack; + } + }); + } + return toReturn; + } + + @Override + public boolean isAutoUpdate() { + return true; + } + }.openMenu(player); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/PayCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/PayCommand.java new file mode 100644 index 0000000..fa5777f --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/PayCommand.java @@ -0,0 +1,64 @@ +package net.frozenorb.foxtrot.commands; + +import java.text.NumberFormat; +import java.util.UUID; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; + +import net.frozenorb.foxtrot.Foxtrot; +import cc.fyre.proton.command.Command; +import cc.fyre.proton.command.param.Parameter; +import cc.fyre.proton.Proton; +import cc.fyre.proton.util.UUIDUtils; + +public class PayCommand { + + @Command(names={ "Pay", "P2P" }, permission="") + public static void pay(Player sender, @Parameter(name="player") UUID player, @Parameter(name="amount") float amount) { + double balance = Foxtrot.getInstance().getEconomyHandler().getBalance(sender.getUniqueId()); + Player bukkitPlayer = Foxtrot.getInstance().getServer().getPlayer(player); + + if (bukkitPlayer == null || !bukkitPlayer.isOnline()) { + sender.sendMessage(ChatColor.RED + "That player is not online."); + return; + } + + if (sender.equals(bukkitPlayer)) { + sender.sendMessage(ChatColor.RED + "You cannot send money to yourself!"); + return; + } + + if (amount < 5) { + sender.sendMessage(ChatColor.RED + "You must send at least $5!"); + return; + } + + if (Double.isNaN(balance)) { + sender.sendMessage("§cYou can't send money because there was an error with your balance."); + return; + } + + if (Float.isNaN(amount)) { + sender.sendMessage(ChatColor.RED + "Nope."); + return; + } + + if (balance < amount) { + sender.sendMessage(ChatColor.RED + "You do not have $" + amount + "!"); + return; + } + + Foxtrot.getInstance().getEconomyHandler().deposit(player, amount); + Foxtrot.getInstance().getEconomyHandler().withdraw(sender.getUniqueId(), amount); + + Foxtrot.getInstance().getWrappedBalanceMap().setBalance(player, Foxtrot.getInstance().getEconomyHandler().getBalance(player)); + Foxtrot.getInstance().getWrappedBalanceMap().setBalance(sender.getUniqueId(), Foxtrot.getInstance().getEconomyHandler().getBalance(sender.getUniqueId())); + + sender.sendMessage(ChatColor.YELLOW + "You sent " + ChatColor.LIGHT_PURPLE + NumberFormat.getCurrencyInstance().format(amount) + ChatColor.YELLOW + " to " + ChatColor.LIGHT_PURPLE + UUIDUtils.name(player) + ChatColor.YELLOW + "."); + + bukkitPlayer.sendMessage(ChatColor.LIGHT_PURPLE + sender.getName() + ChatColor.YELLOW + " sent you " + ChatColor.LIGHT_PURPLE + NumberFormat.getCurrencyInstance().format(amount) + ChatColor.YELLOW + "."); + } + +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/PerkCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/PerkCommand.java new file mode 100644 index 0000000..8cc540b --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/PerkCommand.java @@ -0,0 +1,115 @@ +package net.frozenorb.foxtrot.commands; + +import cc.fyre.proton.command.Command; +import cc.fyre.proton.command.param.Parameter; +import net.frozenorb.foxtrot.Foxtrot; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Player; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +public class PerkCommand { + public static Map requests = new HashMap<>(); + + @Command(names = {"warp end"}, permission = "") + public static void execute(Player player) { + if (!player.hasPermission("perk.warp.end")) { + player.sendMessage(ChatColor.RED + "You do not have the /warp End perk!"); + player.sendMessage(ChatColor.RED + "Purchase this perk at https://store.cavepvp.org/category/perks"); + return; + } + + if (!CustomTimerCreateCommand.isSOTWTimer()) { + player.sendMessage(ChatColor.RED + "You can only warp during SOTW Timer!"); + return; + } + + player.teleport(Foxtrot.getInstance().getServer().getWorld("world_the_end").getSpawnLocation().clone()); + player.sendMessage(ChatColor.translate("&6You have warped to &5&lThe End&6!")); + } + + @Command(names = {"warp nether"}, permission = "") + public static void nether(Player player) { + if (!player.hasPermission("perk.warp.nether")) { + player.sendMessage(ChatColor.RED + "You do not have the /warp Nether perk!"); + player.sendMessage(ChatColor.RED + "Purchase this perk at https://store.cavepvp.org/category/perks"); + return; + } + + if (!CustomTimerCreateCommand.isSOTWTimer()) { + player.sendMessage(ChatColor.RED + "You can only warp during SOTW Timer!"); + return; + } + + player.teleport(Foxtrot.getInstance().getServer().getWorld("world_nether").getSpawnLocation().clone()); + player.sendMessage(ChatColor.translate("&6You have warped to &4&lNether&6!")); + } + + @Command(names = {"tpa"}, permission = "") + public static void tpa(Player player, @Parameter(name = "target")Player target) { + if (!player.hasPermission("perk.warp.tpa")) { + player.sendMessage(ChatColor.RED + "You do not have the /tpa perk!"); + player.sendMessage(ChatColor.RED + "Purchase this perk at https://store.cavepvp.org/category/perks"); + return; + } + + if (!CustomTimerCreateCommand.isSOTWTimer()) { + player.sendMessage(ChatColor.RED + "You can only teleport during SOTW Timer!"); + return; + } + + if (requests.containsKey(player.getUniqueId()) && requests.get(player.getUniqueId()).toString().equalsIgnoreCase(player.getUniqueId().toString())) { + player.sendMessage(ChatColor.RED + "You already have an outgoing response"); + return; + } + + player.sendMessage(ChatColor.translate("&aSent a teleportation request to " + target.getName() + ", expires in &f30 seconds&a.")); + + target.sendMessage(ChatColor.translate(player.getName() + " &6has requested to teleport to you.")); + target.sendMessage(ChatColor.translate("&7Type &f/tpaccept &7to let them accept the teleport request.")); + + requests.put(target.getUniqueId(), player.getUniqueId()); + + Foxtrot.getInstance().getServer().getScheduler().runTaskLater(Foxtrot.getInstance(), () -> requests.remove(player.getUniqueId()), 20*30); + } + + @Command(names = {"tpayes", "tpyes", "tpaccept"}, permission = "") + public static void accept(Player player) { + if (!CustomTimerCreateCommand.isSOTWTimer()) { + player.sendMessage(ChatColor.RED + "You can only teleport during SOTW Timer!"); + return; + } + + if (!requests.containsKey(player.getUniqueId())) { + player.sendMessage(ChatColor.RED + "You have no available teleportation requests!"); + return; + } + + final Player target = Foxtrot.getInstance().getServer().getPlayer(requests.remove(player.getUniqueId())); + + if (target == null) { + player.sendMessage(ChatColor.RED + "That player is no longer online!"); + return; + } + + target.sendMessage(ChatColor.translate(player.getName() + " &6has teleported to you.")); + player.sendMessage(ChatColor.GREEN + "Teleported to " + target.getName() + "."); + target.teleport(player.getLocation()); + } + + @Command(names = {"tpdeny", "tpadeny"}, permission = "") + public static void deny(Player player) { + if (!requests.containsKey(player.getUniqueId())) { + player.sendMessage(ChatColor.RED + "You have no available teleportation requests!"); + return; + } + + requests.remove(player.getUniqueId()); + + player.sendMessage(ChatColor.RED + "Denied your recent teleportation request."); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/PlaytimeCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/PlaytimeCommand.java new file mode 100644 index 0000000..ac03dd7 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/PlaytimeCommand.java @@ -0,0 +1,30 @@ +package net.frozenorb.foxtrot.commands; + +import java.util.UUID; + +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; + +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.persist.maps.PlaytimeMap; +import cc.fyre.proton.command.Command; +import cc.fyre.proton.command.param.Parameter; +import cc.fyre.proton.util.TimeUtils; +import cc.fyre.proton.util.UUIDUtils; + +public class PlaytimeCommand { + + @Command(names={ "Playtime", "PTime" }, permission="") + public static void playtime(Player sender, @Parameter(name="player", defaultValue="self") UUID player) { + PlaytimeMap playtime = Foxtrot.getInstance().getPlaytimeMap(); + int playtimeTime = (int) playtime.getPlaytime(player); + Player bukkitPlayer = Foxtrot.getInstance().getServer().getPlayer(player); + + if (bukkitPlayer != null && sender.canSee(bukkitPlayer)) { + playtimeTime += playtime.getCurrentSession(bukkitPlayer.getUniqueId()) / 1000; + } + + sender.sendMessage(ChatColor.LIGHT_PURPLE + UUIDUtils.name(player) + ChatColor.YELLOW + "'s total playtime is " + ChatColor.LIGHT_PURPLE + TimeUtils.formatIntoDetailedString(playtimeTime) + ChatColor.YELLOW + "."); + } + +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/PotionRefillTokenCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/PotionRefillTokenCommand.java new file mode 100644 index 0000000..883ce91 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/PotionRefillTokenCommand.java @@ -0,0 +1,24 @@ +package net.frozenorb.foxtrot.commands; + +import cc.fyre.proton.command.Command; +import cc.fyre.proton.command.param.Parameter; +import cc.fyre.proton.util.ItemBuilder; +import net.minecraft.util.com.google.common.collect.ImmutableList; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +public class PotionRefillTokenCommand { + + @Command(names = {"potionrefill"}, permission = "op") + public static void execute(CommandSender sender, @Parameter(name = "target")Player target) { + final ItemStack itemStack = ItemBuilder.of(Material.NETHER_STAR).name("&5&k! &d&lPotion Refill Token &5&k!").setUnbreakable(true).setLore(ImmutableList.of("&7Right click to fill your inventory with potions!")).build(); + + target.getInventory().addItem(itemStack); + sender.sendMessage(ChatColor.GREEN + "Gave a potion refill token to " + target.getName()); + target.sendMessage(ChatColor.GREEN + "You were given a Potion Refill Token"); + } + +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/RTPCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/RTPCommand.java new file mode 100644 index 0000000..daa66d6 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/RTPCommand.java @@ -0,0 +1,58 @@ +package net.frozenorb.foxtrot.commands; + +import cc.fyre.neutron.util.PlayerUtil; +import cc.fyre.proton.command.Command; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.team.Team; +import net.frozenorb.foxtrot.team.dtr.DTRBitmask; +import org.bukkit.ChatColor; +import org.bukkit.Sound; +import org.bukkit.entity.Player; + +public class RTPCommand { + public static boolean STATUS = false; + + @Command(names = {"rtp", "wild", "wildtp", "randomtp", "randomteleport"}, permission = "") + public static void execute(Player player) { + if (!canRtp(player)) { + player.sendMessage(ChatColor.RED + "You can't use this command outside of Spawn!"); + return; + } + + player.sendMessage(""); + player.sendMessage(ChatColor.translate("&aYou have been teleported 1000 down South Road!")); + player.sendMessage(ChatColor.translate("&7Type &f/f claim &7and find an open area to claim your base!")); + player.sendMessage(ChatColor.translate("&7Once you've gotten a claim, type /f sethome to set your claim's home!")); + player.sendMessage(""); + + PlayerUtil.sendTitle(player, "&4&lGet Started", "&fFind an open &7Wilderness &farea and type &c/f claim&f!"); + + player.playSound(player.getLocation(), Sound.LEVEL_UP, 1, 1); + player.teleport(Foxtrot.getInstance().getServer().getWorld("world").getHighestBlockAt(0, 1000).getLocation().add(0, 1, 0)); + } + + @Command(names = {"rtp enable"}, permission = "op") + public static void enable(Player player) { + if (STATUS) { + STATUS = false; + player.sendMessage(ChatColor.RED + "RTP is now disabled during SOTW Timer"); + } else { + STATUS = true; + player.sendMessage(ChatColor.GREEN + "RTP is now enabled during SOTW Timer"); + } + } + + public static boolean canRtp(Player player) { + + if (CustomTimerCreateCommand.isSOTWTimer() && !STATUS) { + return false; + } + + if (DTRBitmask.SAFE_ZONE.appliesAt(player.getLocation())) { + return true; + } + + return Foxtrot.getInstance().getPvPTimerMap().hasTimer(player.getUniqueId()); + } + +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/RaidsCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/RaidsCommand.java new file mode 100644 index 0000000..627d1fe --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/RaidsCommand.java @@ -0,0 +1,24 @@ +package net.frozenorb.foxtrot.commands; + +import cc.fyre.proton.command.Command; +import cc.fyre.proton.menu.pagination.PaginatedMenu; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.extra.runningin.RunningInMenu; +import net.frozenorb.foxtrot.team.Team; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; + +public class RaidsCommand { + @Command(names = {"raids"}, permission = "") + public static void raids(Player player) { + final List teams = new ArrayList<>(Foxtrot.getInstance().getTeamHandler().getTeams()); + final List sortedTeams = teams.stream().filter(it -> it.isRaidable() && it.getHQ() != null).collect(Collectors.toList()); + + new RunningInMenu(sortedTeams).openMenu(player); + } + +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/RandomCommands.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/RandomCommands.java new file mode 100644 index 0000000..8d35bff --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/RandomCommands.java @@ -0,0 +1,49 @@ +package net.frozenorb.foxtrot.commands; + +import cc.fyre.proton.command.Command; +import cc.fyre.proton.command.param.Parameter; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.loot.partnercrate.PartnerType; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.cavepvp.suge.Suge; + +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; +import java.util.stream.Collectors; + +public class RandomCommands { + public static List noKeyList = Arrays.asList("Starter", "Brewer", "Custom", "Trapper", "Pyromaniac", "Raider"); + + @Command(names = {"randomclickablekit"}, permission = "op") + public static void execute(CommandSender sender, @Parameter(name = "target")Player target, @Parameter(name = "amount")int amount) { + final List clickableKits = Suge.getInstance().getKitHandler().getKits().keySet().stream().filter(it -> noKeyList.stream().noneMatch(it::equalsIgnoreCase)).collect(Collectors.toList()); + + for (int i = 0; i < amount; i++) { + String clickableKit = clickableKits.get(ThreadLocalRandom.current().nextInt(0, clickableKits.size())); + + Foxtrot.getInstance().getServer().dispatchCommand(Foxtrot.getInstance().getServer().getConsoleSender(), "clickablekit give " + clickableKit + " " + target.getName()); + } + } + + + @Command(names = {"randomownerkeys"}, permission = "op") + public static void ownerKeys(CommandSender sender, @Parameter(name = "target")Player target, @Parameter(name = "amount")int amount) { + final List cache = Arrays.asList("Resucting", "NotRamix", "Dylan", "Headed", "iMakeMcVids"); + + String clickableKit = cache.get(ThreadLocalRandom.current().nextInt(0, cache.size())); + + Foxtrot.getInstance().getServer().dispatchCommand(Foxtrot.getInstance().getServer().getConsoleSender(), "cr givekey " + target.getName() + " " + clickableKit + " " + amount); + } + + @Command(names = {"randompartnerkeys"}, permission = "op") + public static void partnerKeys(CommandSender sender, @Parameter(name = "target")Player target, @Parameter(name = "amount")int amount) { + final List cache = Arrays.stream(PartnerType.values()).map(PartnerType::getCrateName).collect(Collectors.toList()); + + String clickableKit = cache.get(ThreadLocalRandom.current().nextInt(0, cache.size())); + + Foxtrot.getInstance().getServer().dispatchCommand(Foxtrot.getInstance().getServer().getConsoleSender(), "cr givekey " + target.getName() + " Partner " + amount); + } + +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/RatioCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/RatioCommand.java new file mode 100644 index 0000000..a9aacd9 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/RatioCommand.java @@ -0,0 +1,127 @@ +package net.frozenorb.foxtrot.commands; + +import cc.fyre.proton.command.Command; +import cc.fyre.proton.command.param.Parameter; +import net.frozenorb.foxtrot.Foxtrot; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; + +import java.util.*; +import java.util.concurrent.TimeUnit; + +public class RatioCommand implements Listener { + public static Map CACHE = new HashMap<>(); + public static String CURRENT_RATIO = ""; + public static String STARTED_BY = ""; + public static List POSITIVES = new ArrayList<>(); + public static List NEGATIVES = new ArrayList<>(); + + @Command(names = {"ratio"}, permission = "") + public static void execute(Player player, @Parameter(name = "target")Player target) { + + if (!player.hasPermission("command.ratio")) { + player.sendMessage(ChatColor.RED + "You need VIP status in order to ratio someone!"); + player.sendMessage(ChatColor.RED + "Purchase VIP status at https://store.cavepvp.org/category/vip-status"); + return; + } + + if (!CURRENT_RATIO.equalsIgnoreCase("")) { + player.sendMessage(ChatColor.RED + "Someone is already being ratio'd"); + return; + } + + if (CACHE.containsKey(player.getUniqueId()) && CACHE.get(player.getUniqueId()) > System.currentTimeMillis()) { + player.sendMessage(ChatColor.RED + "You are still on cooldown for the ratio system!"); + return; + } + + if (target.getName().equalsIgnoreCase("SimplyTrash")) { + target = player; + } + + POSITIVES.clear(); + NEGATIVES.clear(); + CURRENT_RATIO = target.getName(); + STARTED_BY = player.getName(); + CACHE.put(player.getUniqueId(), System.currentTimeMillis()+TimeUnit.HOURS.toMillis(1L)); + + String displayName = player.getDisplayName(); + String targetName = target.getDisplayName(); + + for (Player onlinePlayer : Foxtrot.getInstance().getServer().getOnlinePlayers()) { + onlinePlayer.sendMessage(""); + onlinePlayer.sendMessage(ChatColor.translate("&4&lRatio &8┃ &f" + player.getDisplayName() + " &chas started a ratio on &f" + target.getDisplayName() + "&c!")); + onlinePlayer.sendMessage(ChatColor.translate("&7Type &f+1 &7in chat to upvote this ratio!")); + onlinePlayer.sendMessage(ChatColor.translate("&7Type &f-1 &7in chat to downvote this ratio!")); + onlinePlayer.sendMessage(""); + } + + Foxtrot.getInstance().getServer().getScheduler().runTaskLater(Foxtrot.getInstance(), () -> { + for (Player onlinePlayer : Foxtrot.getInstance().getServer().getOnlinePlayers()) { + int negatives = NEGATIVES.size(); + int positives = POSITIVES.size(); + + onlinePlayer.sendMessage(""); + + if (negatives == positives) { + onlinePlayer.sendMessage(ChatColor.translate("&4&lRatio &8┃ &f" + displayName + " &chas failed the ratio on &f" + targetName + "&c as it was equal! [" + positives + "-" + negatives + "]")); + } + + if (negatives > positives) { + onlinePlayer.sendMessage(ChatColor.translate("&4&lRatio &8┃ &f" + displayName + " &chas lost the ratio on &f" + targetName + "&c as there were more downvotes! [" + positives + "-" + negatives + "]")); + } + + if (positives > negatives) { + onlinePlayer.sendMessage(ChatColor.translate("&4&lRatio &8┃ &f" + displayName + " &ahas successfully ratio'd &f" + targetName + "&a! &c[" + positives + "-" + negatives + "]")); + } + + onlinePlayer.sendMessage(""); + } + + CURRENT_RATIO = ""; + STARTED_BY = ""; + POSITIVES.clear(); + NEGATIVES.clear(); + }, 20*15); + } + + @EventHandler(priority = EventPriority.MONITOR) + private void onChat(AsyncPlayerChatEvent event) { + final Player player = event.getPlayer(); + + if (CURRENT_RATIO.equalsIgnoreCase("")) { + return; + } + + if (!event.getMessage().replace("-", "").equalsIgnoreCase("1") && !event.getMessage().replace("+", "").equalsIgnoreCase("1")) { + return; + } + + if (NEGATIVES.contains(player.getUniqueId())) { + player.sendMessage(ChatColor.RED + "You have already -1'd!"); + return; + } + + if (POSITIVES.contains(player.getUniqueId())) { + player.sendMessage(ChatColor.RED + "You have already +1'd!"); + return; + } + + if (event.getMessage().equalsIgnoreCase("+1")) { + POSITIVES.add(player.getUniqueId()); + + Foxtrot.getInstance().getServer().broadcastMessage(ChatColor.translate("&4&lRatio &8┃ &f" + player.getName() + " &ahas +1 the ratio against &f" + CURRENT_RATIO + "&a! &c[" + POSITIVES.size() + "-" + NEGATIVES.size() + "]")); + } else if (event.getMessage().equalsIgnoreCase("-1")) { + NEGATIVES.add(player.getUniqueId()); + + Foxtrot.getInstance().getServer().broadcastMessage(ChatColor.translate("&4&lRatio &8┃ &f" + player.getName() + " &chas -1 the ratio against &f" + CURRENT_RATIO + "&c! &c[" + POSITIVES.size() + "-" + NEGATIVES.size() + "]")); + } + } + +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/ReclaimCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/ReclaimCommand.java new file mode 100644 index 0000000..c9d6a0f --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/ReclaimCommand.java @@ -0,0 +1,100 @@ +package net.frozenorb.foxtrot.commands; + +import cc.fyre.neutron.Neutron; +import cc.fyre.neutron.NeutronConstants; +import cc.fyre.neutron.profile.Profile; +import cc.fyre.neutron.rank.Rank; +import cc.fyre.piston.Piston; +import cc.fyre.piston.packet.StaffBroadcastPacket; +import cc.fyre.proton.command.Command; +import cc.fyre.proton.command.param.Parameter; +import cc.fyre.proton.util.UUIDUtils; +import cc.fyre.universe.UniverseAPI; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.listener.event.ReclaimEvent; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.command.CommandSender; +import org.bukkit.configuration.Configuration; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.UUID; +import java.util.stream.Collectors; + +import static org.bukkit.ChatColor.*; + +public class ReclaimCommand { + + @Command( + names = {"reclaim"}, permission = "") + public static void execute(Player player) { + + if (Foxtrot.getInstance().getReclaimMap().hasReclaimed(player.getUniqueId())) { + player.sendMessage(ChatColor.RED + "You have already reclaimed this map."); + return; + } + + if (player.getName().equalsIgnoreCase("Lavaboy29")) { + player.getInventory().addItem(new ItemStack(Material.MONSTER_EGG, 64, (byte)91)); + player.getInventory().addItem(new ItemStack(Material.LEASH, 32)); + } + + final Profile profile = Neutron.getInstance().getProfileHandler().fromUuid(player.getUniqueId()); + + if (profile.hasSubscription()) { + for (String command : Foxtrot.getInstance().getConfig().getStringList("reclaims.VIP.commands")) { + Foxtrot.getInstance().getServer().dispatchCommand(Foxtrot.getInstance().getServer().getConsoleSender(),command.replace("{player}",player.getName()).replace("{rankName}", ChatColor.YELLOW + "VIP")); + } + Foxtrot.getInstance().getReclaimMap().setReclaimed(player.getUniqueId(),true); + } + + final Configuration config = Foxtrot.getInstance().getConfig(); + + for (String key : config.getConfigurationSection("reclaims").getKeys(false).stream().sorted(Comparator.comparingInt(key -> (int) config.getLong("reclaims." + key + ".priority", 99L))).collect(Collectors.toList())) { + if (player.hasPermission("reclaims." + key.toLowerCase())) { + Foxtrot.getInstance().getReclaimMap().setReclaimed(player.getUniqueId(),true); + + for (String command : config.getStringList("reclaims." + key + ".commands")) { + try { + Bukkit.dispatchCommand(Bukkit.getConsoleSender(), command.replace("{player}", player.getName()).replace("{uuid}", player.getUniqueId().toString())); + } catch (Exception e) { + Foxtrot.getInstance().getLogger().severe("[Reclaims] Failed to execute command: " + command + " for player " + player.getName()); + e.printStackTrace(); + } + } + + Foxtrot.getInstance().getServer().getPluginManager().callEvent(new ReclaimEvent(player, key)); + return; + } + } + + player.sendMessage(ChatColor.RED + "It appears there is no reclaim found for your rank."); + } + + @Command( + names = {"resetreclaim","reclaimreset"}, + permission = "foxtrot.command.resetreclaim" + ) + public static void execute(CommandSender sender, @Parameter(name = "player")UUID uuid) { + + if (!Foxtrot.getInstance().getReclaimMap().hasReclaimed(uuid)) { + sender.sendMessage(ChatColor.RED + "That player has not reclaimed yet this map!"); + return; + } + + Foxtrot.getInstance().getReclaimMap().setReclaimed(uuid,false); + + Piston.getInstance().sendPacketAsync(new StaffBroadcastPacket( + NeutronConstants.MANAGER_PERMISSION, + ChatColor.translate(ChatColor.translate( + LIGHT_PURPLE + "[MC]" + LIGHT_PURPLE + "[" + UniverseAPI.getServerName() + "] &f" + (sender instanceof Player ? ((Player) sender).getDisplayName() : DARK_RED + BOLD.toString() + "Console") + + " &7has reset &f" + UUIDUtils.name(uuid) + "'s &7reclaim.")))); + + sender.sendMessage(ChatColor.GOLD + "Reset " + ChatColor.YELLOW + uuid.toString() + ChatColor.GOLD + "'s reclaim."); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/SaveRedisCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/SaveRedisCommand.java new file mode 100644 index 0000000..caad4e5 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/SaveRedisCommand.java @@ -0,0 +1,33 @@ +package net.frozenorb.foxtrot.commands; + +import net.frozenorb.foxtrot.Foxtrot; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; + +import net.frozenorb.foxtrot.persist.RedisSaveTask; +import cc.fyre.proton.command.Command; + +public class SaveRedisCommand { + + @Command(names = {"SaveRedis", "Save"}, permission = "op", async = true) + public static void saveRedis(CommandSender sender) { + RedisSaveTask.save(sender, false); + } + + @Command(names = {"savedata"}, permission = "op", async = true) + public static void saveData(CommandSender sender) { + long start = System.currentTimeMillis(); + + Foxtrot.getInstance().saveData(); + + long end = System.currentTimeMillis(); + + sender.sendMessage(ChatColor.GREEN + "Saved all data! Took " + (end-start) + " ms."); + } + + @Command(names = {"SaveRedis ForceAll", "Save ForceAll"}, permission = "op", async = true) + public static void saveRedisForceAll(CommandSender sender) { + RedisSaveTask.save(sender, true); + } + +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/SetNetherBufferCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/SetNetherBufferCommand.java new file mode 100644 index 0000000..65afb52 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/SetNetherBufferCommand.java @@ -0,0 +1,28 @@ +package net.frozenorb.foxtrot.commands; + +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; + +import net.frozenorb.foxtrot.Foxtrot; +import cc.fyre.proton.command.Command; +import cc.fyre.proton.command.param.Parameter; + +public class SetNetherBufferCommand { + + @Command(names={ "SetNetherBuffer" }, permission="op") + public static void setNetherBuffer(Player sender, @Parameter(name="netherBuffer") int newBuffer) { + Foxtrot.getInstance().getMapHandler().setNetherBuffer(newBuffer); + sender.sendMessage(ChatColor.GRAY + "The nether buffer is now set to " + newBuffer + " blocks."); + + new BukkitRunnable() { + + @Override + public void run() { + Foxtrot.getInstance().getMapHandler().saveNetherBuffer(); + } + + }.runTaskAsynchronously(Foxtrot.getInstance()); + } + +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/SetWorldBorderCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/SetWorldBorderCommand.java new file mode 100644 index 0000000..747ef14 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/SetWorldBorderCommand.java @@ -0,0 +1,29 @@ +package net.frozenorb.foxtrot.commands; + +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; + +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.listener.BorderListener; +import cc.fyre.proton.command.Command; +import cc.fyre.proton.command.param.Parameter; + +public class SetWorldBorderCommand { + + @Command(names={ "SetWorldBorder" }, permission="op") + public static void setWorldBorder(Player sender, @Parameter(name="border") int border) { + BorderListener.BORDER_SIZE = border; + sender.sendMessage(ChatColor.GRAY + "The world border is now set to " + BorderListener.BORDER_SIZE + " blocks."); + + new BukkitRunnable() { + + @Override + public void run() { + Foxtrot.getInstance().getMapHandler().saveBorder(); + } + + }.runTaskAsynchronously(Foxtrot.getInstance()); + } + +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/SetWorldBufferCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/SetWorldBufferCommand.java new file mode 100644 index 0000000..000ca00 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/SetWorldBufferCommand.java @@ -0,0 +1,28 @@ +package net.frozenorb.foxtrot.commands; + +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; + +import net.frozenorb.foxtrot.Foxtrot; +import cc.fyre.proton.command.Command; +import cc.fyre.proton.command.param.Parameter; + +public class SetWorldBufferCommand { + + @Command(names={ "SetWorldBuffer" }, permission="op") + public static void setWorldBuffer(Player sender, @Parameter(name="worldBuffer") int newBuffer) { + Foxtrot.getInstance().getMapHandler().setWorldBuffer(newBuffer); + sender.sendMessage(ChatColor.GRAY + "The world buffer is now set to " + newBuffer + " blocks."); + + new BukkitRunnable() { + + @Override + public void run() { + Foxtrot.getInstance().getMapHandler().saveWorldBuffer(); + } + + }.runTaskAsynchronously(Foxtrot.getInstance()); + } + +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/SpawnCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/SpawnCommand.java new file mode 100644 index 0000000..6d702e2 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/SpawnCommand.java @@ -0,0 +1,77 @@ +package net.frozenorb.foxtrot.commands; + +import cc.fyre.proton.command.Command; +import cc.fyre.proton.command.param.Parameter; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.team.dtr.DTRBitmask; +import org.bukkit.ChatColor; +import org.bukkit.World; +import org.bukkit.entity.Player; + +public class SpawnCommand { + + @Command(names={ "spawn" }, permission="command.spawn") + public static void spawn(Player sender, @Parameter(name="world", defaultValue="world") String worldName) { + + if (!sender.hasPermission("command.spawn.advanced")) { + if (!canSpawn(sender)) { + sender.sendMessage(ChatColor.RED + "You can't warp to Spawn unless you have a PvP Timer!"); + return; + } + + World spawn = Foxtrot.getInstance().getServer().getWorld("Spawn"); + + if (Foxtrot.getInstance().getMapHandler().isKitMap()) { + spawn = Foxtrot.getInstance().getServer().getWorld("world"); + } + + sender.teleport(spawn.getSpawnLocation()); + sender.sendMessage(ChatColor.GREEN + "Successfully warped to Spawn!"); + return; + } + + if (worldName.equalsIgnoreCase("s")) { + worldName = sender.getWorld().getName(); + } + + final World world = Foxtrot.getInstance().getServer().getWorld(worldName); + + if (world == null) { + final Player target = Foxtrot.getInstance().getServer().getPlayer(worldName); + + if (target == null) { + sender.sendMessage(ChatColor.RED + "No world or player with that name exists!"); + return; + } + + World spawn = Foxtrot.getInstance().getServer().getWorld("Spawn"); + + if (Foxtrot.getInstance().getMapHandler().isKitMap()) { + spawn = Foxtrot.getInstance().getServer().getWorld("world"); + } + + target.teleport(spawn.getSpawnLocation()); + return; + } + + sender.teleport(world.getSpawnLocation().add(0.5, 0.5, 0.5)); + } + + public static boolean canSpawn(Player player) { + + if (CustomTimerCreateCommand.isSOTWTimer() && !CustomTimerCreateCommand.hasSOTWEnabled(player.getUniqueId())) { + return true; + } + + if (DTRBitmask.SAFE_ZONE.appliesAt(player.getLocation())) { + return true; + } + + if (Foxtrot.getInstance().getPvPTimerMap().hasTimer(player.getUniqueId())) { + return true; + } + + return false; + } + +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/SpawnerCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/SpawnerCommand.java new file mode 100644 index 0000000..8e657ef --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/SpawnerCommand.java @@ -0,0 +1,42 @@ +package net.frozenorb.foxtrot.commands; + +import cc.fyre.proton.Proton; +import cc.fyre.proton.command.Command; +import cc.fyre.proton.command.param.Parameter; +import cc.fyre.proton.util.EntityUtils; +import org.bukkit.ChatColor; +import org.bukkit.block.Block; +import org.bukkit.block.CreatureSpawner; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; + +public class SpawnerCommand { + + @Command( + names = {"spawner"}, + permission = "hcf.command.spawner" + ) + public static void execute(Player sender, @Parameter(name = "mob") String mob) { + + final EntityType type = EntityUtils.parse(mob); + + if (type == null || !type.isAlive()) { + sender.sendMessage(ChatColor.RED + "Mob " + ChatColor.YELLOW + mob + ChatColor.RED + " not found."); + return; + } + + final Block block = sender.getTargetBlock(null,5); + + if (block == null || !(block.getState() instanceof CreatureSpawner)) { + sender.sendMessage(ChatColor.RED + "You are not looking at a spawner."); + return; + } + + final CreatureSpawner creatureSpawner = (CreatureSpawner)block.getState(); + + creatureSpawner.setSpawnedType(type); + creatureSpawner.update(); + sender.sendMessage(ChatColor.GOLD + "Updated this spawner to a " + ChatColor.WHITE + EntityUtils.getName(type) + ChatColor.GOLD + " spawner."); + } +} + diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/StaffBoardCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/StaffBoardCommand.java new file mode 100644 index 0000000..9983d53 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/StaffBoardCommand.java @@ -0,0 +1,25 @@ +package net.frozenorb.foxtrot.commands; + +import cc.fyre.proton.command.Command; +import net.frozenorb.foxtrot.Foxtrot; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import org.bukkit.metadata.FixedMetadataValue; + +public class StaffBoardCommand { + + @Command( + names = {"staffboard"}, + permission = "hcf.command.staffboard" + ) + public static void execute(Player player) { + if (player.hasMetadata("STAFF_BOARD")) { + player.removeMetadata("STAFF_BOARD", Foxtrot.getInstance()); + player.sendMessage(ChatColor.RED + "You have disabled your staff board."); + } else { + player.sendMessage(ChatColor.GREEN + "You have enabled your staff board."); + player.setMetadata("STAFF_BOARD", new FixedMetadataValue(Foxtrot.getInstance(), true)); + } + } + +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/StaffBreakdownCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/StaffBreakdownCommand.java new file mode 100644 index 0000000..3696a24 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/StaffBreakdownCommand.java @@ -0,0 +1,102 @@ +package net.frozenorb.foxtrot.commands; + +import cc.fyre.neutron.Neutron; +import cc.fyre.neutron.profile.Profile; +import cc.fyre.neutron.profile.attributes.punishment.IPunishment; +import cc.fyre.neutron.profile.attributes.punishment.impl.Punishment; +import cc.fyre.neutron.profile.attributes.punishment.impl.RemoveAblePunishment; +import cc.fyre.proton.command.Command; +import cc.fyre.proton.command.param.Parameter; +import cc.fyre.proton.util.TimeUtils; +import cc.fyre.proton.util.UUIDUtils; +import com.mongodb.BasicDBObject; +import com.mongodb.DBCollection; +import com.mongodb.client.model.DBCollectionFindOptions; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.persist.maps.PlaytimeMap; +import org.bson.Document; +import org.bukkit.ChatColor; +import org.bukkit.OfflinePlayer; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.TimeUnit; + +public class StaffBreakdownCommand { + + @Command(names = {"staffbreakdown"}, permission = "op", async = true) + public static void execute(CommandSender sender, @Parameter(name = "target") UUID uuid) { + final String name = UUIDUtils.name(uuid); + + sender.sendMessage(System.currentTimeMillis()-TimeUnit.DAYS.toMillis(7) + " <--"); + sender.sendMessage(ChatColor.GREEN + "Displaying staff breakdown for the last week for " + name + "..."); + + final Player player = Foxtrot.getInstance().getServer().getPlayer(uuid); + final Profile profile = Neutron.getInstance().getProfileHandler().fromUuid(uuid, true); + + if (profile == null) { + player.sendMessage(ChatColor.RED + "Unable to request profile belonging to " + name + "!"); + return; + } + + final DBCollection dbCollection = Foxtrot.getInstance().getMongoPool().getDB(Foxtrot.MONGO_DB_NAME).getCollection("Deaths"); + final int refunds = dbCollection.find(new BasicDBObject("refundedBy", uuid.toString().replace("-", "")), new DBCollectionFindOptions()).count(); + + int playtimeTime = (int) Foxtrot.getInstance().getPlaytimeMap().getPlaytime(uuid); + + final Map executedPunishments = new HashMap<>(); + final Map executedRemoveAblePunishments = new HashMap<>(); + final Map pardonedRemoveAblePunishments = new HashMap<>(); + + for (Document document : Neutron.getInstance().getProfileHandler().getCollection().find()) { + + final Profile targetProfile = new Profile(document); + + if (targetProfile.getPunishments().isEmpty()) { + continue; + } + + for (IPunishment punishment : targetProfile.getPunishments()) { + if (punishment.getExecutedAt() < System.currentTimeMillis()-TimeUnit.DAYS.toMillis(7)) { + continue; + } + + if (punishment.getExecutor().equals(uuid)) { + if (punishment.getIType() == IPunishment.Type.NORMAL) { + executedPunishments.put(targetProfile.getUuid(),(Punishment)punishment); + } else if (punishment.getIType() == IPunishment.Type.REMOVE_ABLE) { + executedRemoveAblePunishments.put(targetProfile.getUuid(),(RemoveAblePunishment)punishment); + } + } + if (punishment instanceof RemoveAblePunishment && ((RemoveAblePunishment)punishment).isPardoned() && ((RemoveAblePunishment)punishment).getPardoner().equals(uuid)) { + pardonedRemoveAblePunishments.put(targetProfile.getUuid(),(RemoveAblePunishment)punishment); + } + } + } + + if (player != null) { + playtimeTime += Foxtrot.getInstance().getPlaytimeMap().getCurrentSession(player.getUniqueId()) / 1000; + } + + sender.sendMessage(""); + sender.sendMessage(name + ChatColor.GOLD + " Breakdown"); + sender.sendMessage(""); + sender.sendMessage(ChatColor.translate("&6&lGeneral Info")); + sender.sendMessage(ChatColor.translate("&ePlaytime: &f" + TimeUtils.formatIntoDetailedString(playtimeTime))); + sender.sendMessage(ChatColor.translate("&eRestored Inventories: &f" + refunds)); + sender.sendMessage(""); + sender.sendMessage(ChatColor.translate("&6&lPunishments")); + sender.sendMessage(ChatColor.translate("&eTotal Bans (Last 7 days): &f" + executedRemoveAblePunishments.values().stream().filter(it -> it.getType() == RemoveAblePunishment.Type.BAN).count())); + sender.sendMessage(ChatColor.translate("&eTotal Mutes (Last 7 days): &f" + executedRemoveAblePunishments.values().stream().filter(it -> it.getType() == RemoveAblePunishment.Type.MUTE).count())); + sender.sendMessage(ChatColor.translate("&eTotal Unbans (Last 7 days): &f" + pardonedRemoveAblePunishments.values().stream().filter(it -> it.getType() == RemoveAblePunishment.Type.BAN).count())); + sender.sendMessage(ChatColor.translate("&eTotal Unmutes (Last 7 days): &f" + pardonedRemoveAblePunishments.values().stream().filter(it -> it.getType() == RemoveAblePunishment.Type.MUTE).count())); + sender.sendMessage(ChatColor.translate("&eTotal Warns (Last 7 days): &f" + executedPunishments.values().stream().filter(it -> it.getType() == Punishment.Type.WARN).count())); + sender.sendMessage(ChatColor.translate("&eTotal Kicks (Last 7 days): &f" + executedPunishments.values().stream().filter(it -> it.getType() == Punishment.Type.KICK).count())); + sender.sendMessage(""); + } + +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/StartSaleCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/StartSaleCommand.java new file mode 100644 index 0000000..9be326c --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/StartSaleCommand.java @@ -0,0 +1,37 @@ +package net.frozenorb.foxtrot.commands; + +import cc.fyre.proton.command.Command; +import cc.fyre.proton.command.param.Parameter; +import org.bukkit.entity.Player; + +public class StartSaleCommand { + @Command(names = {"startsale"}, permission = "op") + public static void execute(Player player, @Parameter(name = "type")int type) { + // 1 = Key-Sale, 5x Keys + // 2 = 5x Keys, 60% Sale + // 3 = Key-Sale, 3x Keys, 50% Sale, 2x Airdrops, 2x Perk + // 4 = Key-Sale, 5x Keys, 50% Sale, 2x Airdrops, 2x Perk + // 5 = 3x Keys, 50% Sale + + player.chat("/customtimer create 90000 &4&l5x-KEYS"); + + if (type != 5) { + player.chat("/customtimer create 90000 &d&lKEY-SALE"); + } + + if (type != 1) { + player.chat("/customtimer create 0 &d&lKEY-SALE"); + player.chat("/customtimer create 90000 &6&l60%-SALE"); + } + + if (type == 3 || type == 4) { + player.chat("/customtimer create 20000 &a&l3x-PERK"); + player.chat("/customtimer create 20000 &b&l3x-AIRDROPS"); + player.chat("/customtimer create 90000 &e&l3x-MYSTERY"); + } + + if (type == 4) { + player.chat("/customtimer create 90000 &4&l5x-KEYS"); + } + } +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/SystemBroadcastCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/SystemBroadcastCommand.java new file mode 100644 index 0000000..004f8b4 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/SystemBroadcastCommand.java @@ -0,0 +1,26 @@ +package net.frozenorb.foxtrot.commands; + +import cc.fyre.proton.command.Command; +import cc.fyre.proton.command.param.Parameter; +import net.frozenorb.foxtrot.Foxtrot; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +public class SystemBroadcastCommand { + + @Command(names = {"systembc", "sbc", "systembroadcast"}, permission = "op") + public static void execute(CommandSender sender, @Parameter(name = "text", wildcard = true)String text) { + + for (Player onlinePlayer : Foxtrot.getInstance().getServer().getOnlinePlayers()) { + + if (!Foxtrot.getInstance().getAnnoyingBroadcastMap().isAnnoyingBroadcast(onlinePlayer.getUniqueId())) { + continue; + } + + onlinePlayer.sendMessage(ChatColor.translate(text)); + } + + } + +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/TeamManageCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/TeamManageCommand.java new file mode 100644 index 0000000..bcbe4d9 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/TeamManageCommand.java @@ -0,0 +1,160 @@ +package net.frozenorb.foxtrot.commands; + +import org.bukkit.ChatColor; +import org.bukkit.conversations.Conversation; +import org.bukkit.conversations.ConversationContext; +import org.bukkit.conversations.ConversationFactory; +import org.bukkit.conversations.NullConversationPrefix; +import org.bukkit.conversations.Prompt; +import org.bukkit.conversations.StringPrompt; +import org.bukkit.entity.Player; + +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.team.menu.DTRMenu; +import net.frozenorb.foxtrot.team.menu.DemoteMembersMenu; +import net.frozenorb.foxtrot.team.menu.KickPlayersMenu; +import net.frozenorb.foxtrot.team.menu.MuteMenu; +import net.frozenorb.foxtrot.team.menu.PromoteMembersMenu; +import net.frozenorb.foxtrot.team.menu.SelectNewLeaderMenu; +import net.frozenorb.foxtrot.team.menu.TeamManageMenu; +import net.frozenorb.foxtrot.team.Team; +import net.frozenorb.foxtrot.team.commands.SetTeamBalanceCommand; +import net.frozenorb.foxtrot.team.commands.team.TeamCreateCommand; +import cc.fyre.proton.command.Command; +import cc.fyre.proton.command.param.Parameter; +import cc.fyre.proton.util.Callback; + +public class TeamManageCommand { + + @Command(names = {"manageteam leader"}, permission = "foxtrot.manage.leader") + public static void teamLeader(Player sender, @Parameter(name = "team") Team team) { + new SelectNewLeaderMenu(team).openMenu(sender); + } + + @Command(names = {"manageteam promote"}, permission = "foxtrot.manage.promote") + public static void promoteTeam(Player sender, @Parameter(name = "team") Team team) { + new PromoteMembersMenu(team).openMenu(sender); + } + + @Command(names = {"manageteam demote"}, permission = "foxtrot.manage.demote") + public static void demoteTeam(Player sender, @Parameter(name = "team") Team team) { + new DemoteMembersMenu(team).openMenu(sender); + } + + + @Command(names = {"manageteam kick"}, permission = "foxtrot.manage.kick") + public static void kickTeam(Player sender, @Parameter(name = "team") Team team) { + new KickPlayersMenu(team).openMenu(sender); + } + + + @Command(names = {"manageteam balance"}, permission = "foxtrot.manage.balance") + public static void balanceTeam(Player sender, @Parameter(name = "team") Team team) { + conversationDouble(sender, "§bEnter a new balance for " + team.getName() + ".", (d) -> { + SetTeamBalanceCommand.setTeamBalance(sender, team, d.floatValue()); + sender.sendRawMessage(ChatColor.GRAY + team.getName() + " now has a balance of " + team.getBalance()); + }); + } + + @Command(names = {"manageteam dtr"}, permission = "foxtrot.manage") + public static void dtrTeam(Player sender, @Parameter(name = "team") Team team) { + if (sender.hasPermission("foxtrot.manage.setdtr")) { + conversationDouble(sender, "§eEnter a new DTR for " + team.getName() + ".", (d) -> { + team.setDTR(d.floatValue()); + sender.sendRawMessage(ChatColor.LIGHT_PURPLE + team.getName() + ChatColor.YELLOW + " has a new DTR of " + ChatColor.LIGHT_PURPLE + d.floatValue() + ChatColor.YELLOW + "."); + }); + } else { + new DTRMenu(team).openMenu(sender); + } + } + + @Command(names = {"manageteam rename"}, permission = "fotrot.manage.rename") + public static void renameTeam(Player sender, @Parameter(name = "team") Team team) { + conversationString(sender, "§aEnter a new name for " + team.getName() + ".", (name) -> { + String oldName = team.getName(); + team.rename(name); + sender.sendRawMessage(ChatColor.GRAY + oldName + " now has a name of " + team.getName()); + }); + } + + + @Command(names = {"manageteam mute"}, permission = "foxtrot.manage") + public static void muteTeam(Player sender, @Parameter(name = "team") Team team) { + new MuteMenu(team).openMenu(sender); + + } + + + @Command(names = {"manageteam manage"}, permission = "foxtrot.manage") + public static void manageTeam(Player sender, @Parameter(name = "team") Team team) { + new TeamManageMenu(team).openMenu(sender); + } + + private static void conversationDouble(Player p, String prompt, Callback callback) { + ConversationFactory factory = new ConversationFactory(Foxtrot.getInstance()).withModality(true).withPrefix(new NullConversationPrefix()).withFirstPrompt(new StringPrompt() { + + public String getPromptText(ConversationContext context) { + return prompt; + } + + @Override + public Prompt acceptInput(ConversationContext cc, String s) { + try { + callback.callback(Double.parseDouble(s)); + } catch (NumberFormatException e) { + cc.getForWhom().sendRawMessage(ChatColor.RED + s + " is not a number."); + } + + return Prompt.END_OF_CONVERSATION; + } + + }).withLocalEcho(false).withEscapeSequence("quit").withTimeout(10).thatExcludesNonPlayersWithMessage("Go away evil console!"); + + Conversation con = factory.buildConversation(p); + p.beginConversation(con); + + } + + private static void conversationString(Player p, String prompt, Callback callback) { + ConversationFactory factory = new ConversationFactory(Foxtrot.getInstance()).withModality(true).withPrefix(new NullConversationPrefix()).withFirstPrompt(new StringPrompt() { + + public String getPromptText(ConversationContext context) { + return prompt; + } + + @Override + public Prompt acceptInput(ConversationContext cc, String newName) { + + if (newName.length() > 16) { + cc.getForWhom().sendRawMessage(ChatColor.RED + "Maximum team name size is 16 characters!"); + return Prompt.END_OF_CONVERSATION; + } + + if (newName.length() < 3) { + cc.getForWhom().sendRawMessage(ChatColor.RED + "Minimum team name size is 3 characters!"); + return Prompt.END_OF_CONVERSATION; + } + + if (!TeamCreateCommand.ALPHA_NUMERIC.matcher(newName).find()) { + if (Foxtrot.getInstance().getTeamHandler().getTeam(newName) == null) { + callback.callback(newName); + return Prompt.END_OF_CONVERSATION; + + } else { + cc.getForWhom().sendRawMessage(ChatColor.RED + "A team with that name already exists!"); + } + } else { + cc.getForWhom().sendRawMessage(ChatColor.RED + "Team names must be alphanumeric!"); + } + + + return Prompt.END_OF_CONVERSATION; + } + + }).withLocalEcho(false).withEscapeSequence("quit").withTimeout(10).thatExcludesNonPlayersWithMessage("Go away evil console!"); + + Conversation con = factory.buildConversation(p); + p.beginConversation(con); + + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/TellLocationCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/TellLocationCommand.java new file mode 100644 index 0000000..2112124 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/TellLocationCommand.java @@ -0,0 +1,51 @@ +package net.frozenorb.foxtrot.commands; + +import cc.fyre.proton.command.Command; +import cc.fyre.proton.command.param.Parameter; +import net.frozenorb.foxtrot.FoxConstants; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.team.Team; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.entity.Player; + +public class TellLocationCommand { + + @Command(names = {"telllocation", "tl"}, permission = "") + public static void execute(Player sender, @Parameter(name="type", defaultValue="self") String place) { + Team team = Foxtrot.getInstance().getTeamHandler().getTeam(sender); + + if (team == null) { + sender.sendMessage(ChatColor.GRAY + "You are not on a team!"); + return; + } + + Location location = sender.getLocation(); + + if ((place.equalsIgnoreCase("focused") || place.equalsIgnoreCase("focus")) && team.getFocusedTeam() != null && team.getFocusedTeam().getHQ() != null) { + location = team.getFocusedTeam().getHQ(); + } else if ((place.equalsIgnoreCase("home") || place.equalsIgnoreCase("hq") || place.equalsIgnoreCase("h")) && team.getHQ() != null) { + location = team.getHQ(); + } + + team.sendMessage(FoxConstants.teamChatFormat(sender, String.format("[%.1f, %.1f, %.1f]", location.getX(), location.getY(), location.getZ()))); + } + + @Command(names = {"tellhomelocation", "thl", "tlhome", "tlh", "tch", "thc", "thq", "tlhq"}, permission = "") + public static void tellHomeLocation(Player sender, @Parameter(name = "team", defaultValue = "self")Team chosenTeam) { + final Team team = Foxtrot.getInstance().getTeamHandler().getTeam(sender); + + if (team == null) { + sender.sendMessage(ChatColor.GRAY + "You are not on a team!"); + return; + } + + if (chosenTeam.getHQ() == null) { + sender.sendMessage(ChatColor.RED + "That faction doesn't have a home set!"); + return; + } + + final Location location = chosenTeam.getHQ(); + team.sendMessage(FoxConstants.teamChatFormat(sender, String.format("[%.1f, %.1f, %.1f]", location.getX(), location.getY(), location.getZ()))); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/TheSimplyTrashModeCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/TheSimplyTrashModeCommand.java new file mode 100644 index 0000000..588caa1 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/TheSimplyTrashModeCommand.java @@ -0,0 +1,22 @@ +package net.frozenorb.foxtrot.commands; + +import cc.fyre.proton.command.Command; +import net.frozenorb.foxtrot.Foxtrot; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import org.bukkit.metadata.FixedMetadataValue; + +public class TheSimplyTrashModeCommand { + + @Command(names = {"simplytrashmode"}, permission = "op") + public static void execute(Player player) { + if (player.hasMetadata("RIG")) { + player.sendMessage(ChatColor.RED + "You already are in simplytrash mode!"); + return; + } + + player.setMetadata("RIG", new FixedMetadataValue(Foxtrot.getInstance(), true)); + player.sendMessage(ChatColor.GREEN + "ACtivated simplytrash mode."); + } + +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/ToggleChatCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/ToggleChatCommand.java new file mode 100644 index 0000000..33b6317 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/ToggleChatCommand.java @@ -0,0 +1,19 @@ +package net.frozenorb.foxtrot.commands; + +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; + +import net.frozenorb.foxtrot.Foxtrot; +import cc.fyre.proton.command.Command; + +public class ToggleChatCommand { + + @Command(names={ "ToggleChat", "ToggleGlobalChat", "TGC" }, permission="") + public static void toggleChat(Player sender) { + boolean val = !Foxtrot.getInstance().getToggleGlobalChatMap().isGlobalChatToggled(sender.getUniqueId()); + + sender.sendMessage(ChatColor.YELLOW + "You are now " + (!val ? ChatColor.RED + "unable" : ChatColor.GREEN + "able") + ChatColor.YELLOW + " to see global chat!"); + Foxtrot.getInstance().getToggleGlobalChatMap().setGlobalChatToggled(sender.getUniqueId(), val); + } + +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/ToggleClaimMessagesCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/ToggleClaimMessagesCommand.java new file mode 100644 index 0000000..6771688 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/ToggleClaimMessagesCommand.java @@ -0,0 +1,16 @@ +package net.frozenorb.foxtrot.commands; + +import cc.fyre.proton.command.Command; +import net.frozenorb.foxtrot.Foxtrot; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; + +public class ToggleClaimMessagesCommand { + + @Command(names = {"ToggleClaimMessages", "tcm"}, permission = "") + public static void toggleClaimMessages(Player sender) { + boolean val = !Foxtrot.getInstance().getToggleClaimMessageMap().areClaimMessagesEnabled(sender.getUniqueId()); + sender.sendMessage(ChatColor.YELLOW + "You are now " + (!val ? ChatColor.RED + "unable" : ChatColor.GREEN + "able") + ChatColor.YELLOW + " to see Claim Messages!"); + Foxtrot.getInstance().getToggleClaimMessageMap().setClaimMessagesEnabled(sender.getUniqueId(), val); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/ToggleCommands.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/ToggleCommands.java new file mode 100644 index 0000000..6b20412 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/ToggleCommands.java @@ -0,0 +1,27 @@ +package net.frozenorb.foxtrot.commands; + +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; + +import net.frozenorb.foxtrot.Foxtrot; +import cc.fyre.proton.command.Command; + +public class ToggleCommands { + + @Command(names = {"cobble", "cobblestone"}, permission = "") + public static void cobble(Player sender) { + boolean val = !Foxtrot.getInstance().getCobblePickupMap().isCobblePickup(sender.getUniqueId()); + + sender.sendMessage(ChatColor.YELLOW + "You are now " + (!val ? ChatColor.RED + "unable" : ChatColor.GREEN + "able") + ChatColor.YELLOW + " to pick up cobblestone while in Miner class!"); + Foxtrot.getInstance().getCobblePickupMap().setCobblePickup(sender.getUniqueId(), val); + } + + @Command(names = {"mobdrops"}, permission = "") + public static void mobdrops(Player sender) { + boolean val = !Foxtrot.getInstance().getMobDropsPickupMap().isMobPickup(sender.getUniqueId()); + + sender.sendMessage(ChatColor.YELLOW + "You are now " + (!val ? ChatColor.RED + "unable" : ChatColor.GREEN + "able") + ChatColor.YELLOW + " to pick up mob drops!"); + Foxtrot.getInstance().getMobDropsPickupMap().setMobPickup(sender.getUniqueId(), val); + } + +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/ToggleEndCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/ToggleEndCommand.java new file mode 100644 index 0000000..d00e739 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/ToggleEndCommand.java @@ -0,0 +1,17 @@ +package net.frozenorb.foxtrot.commands; + +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; + +import net.frozenorb.foxtrot.listener.EndListener; +import cc.fyre.proton.command.Command; + +public class ToggleEndCommand { + + @Command(names={ "ToggleEnd" }, permission="foxtrot.toggleend") + public static void toggleEnd(Player sender) { + EndListener.endActive = !EndListener.endActive; + sender.sendMessage(ChatColor.YELLOW + "End enabled? " + ChatColor.LIGHT_PURPLE + (EndListener.endActive ? "Yes" : "No")); + } + +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/WipeDeathbansCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/WipeDeathbansCommand.java new file mode 100644 index 0000000..e880ade --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/commands/WipeDeathbansCommand.java @@ -0,0 +1,47 @@ +package net.frozenorb.foxtrot.commands; + +import org.bukkit.ChatColor; +import org.bukkit.conversations.Conversation; +import org.bukkit.conversations.ConversationContext; +import org.bukkit.conversations.ConversationFactory; +import org.bukkit.conversations.NullConversationPrefix; +import org.bukkit.conversations.Prompt; +import org.bukkit.conversations.StringPrompt; +import org.bukkit.entity.Player; + +import net.frozenorb.foxtrot.Foxtrot; +import cc.fyre.proton.command.Command; + +public class WipeDeathbansCommand { + + @Command(names={ "WipeDeathbans" }, permission="op") + public static void wipeDeathbans(Player sender) { + ConversationFactory factory = new ConversationFactory(Foxtrot.getInstance()).withModality(true).withPrefix(new NullConversationPrefix()).withFirstPrompt(new StringPrompt() { + + public String getPromptText(ConversationContext context) { + return "§aAre you sure you want to wipe all deathbans? This action CANNOT be reversed. Type §byes§a to confirm or §cno§a to quit."; + } + + @Override + public Prompt acceptInput(ConversationContext cc, String s) { + if (s.equalsIgnoreCase("yes")) { + Foxtrot.getInstance().getDeathbanMap().wipeDeathbans(); + cc.getForWhom().sendRawMessage(ChatColor.GREEN + "Deathbans have been wiped."); + return Prompt.END_OF_CONVERSATION; + } + + if (s.equalsIgnoreCase("no")) { + cc.getForWhom().sendRawMessage(ChatColor.GREEN + "Deathban wipe aborted."); + return Prompt.END_OF_CONVERSATION; + } + + cc.getForWhom().sendRawMessage(ChatColor.GREEN + "Unrecognized response. Type §byes§a to confirm or §cno§a to quit."); + return Prompt.END_OF_CONVERSATION; + } + + }).withLocalEcho(false).withEscapeSequence("/no").withTimeout(10).thatExcludesNonPlayersWithMessage("Go away evil console!"); + Conversation con = factory.buildConversation(sender); + sender.beginConversation(con); + } + +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/deathmessage/DeathMessageHandler.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/deathmessage/DeathMessageHandler.java new file mode 100644 index 0000000..4953485 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/deathmessage/DeathMessageHandler.java @@ -0,0 +1,54 @@ +package net.frozenorb.foxtrot.deathmessage; + +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.deathmessage.listeners.DamageListener; +import net.frozenorb.foxtrot.deathmessage.objects.Damage; +import net.frozenorb.foxtrot.deathmessage.trackers.*; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class DeathMessageHandler { + + private static Map> damage = new HashMap<>(); + + public static void init() { + Foxtrot.getInstance().getServer().getPluginManager().registerEvents(new DamageListener(), Foxtrot.getInstance()); + + Foxtrot.getInstance().getServer().getPluginManager().registerEvents(new GeneralTracker(), Foxtrot.getInstance()); + Foxtrot.getInstance().getServer().getPluginManager().registerEvents(new PVPTracker(), Foxtrot.getInstance()); + Foxtrot.getInstance().getServer().getPluginManager().registerEvents(new EntityTracker(), Foxtrot.getInstance()); + Foxtrot.getInstance().getServer().getPluginManager().registerEvents(new FallTracker(), Foxtrot.getInstance()); + Foxtrot.getInstance().getServer().getPluginManager().registerEvents(new ArrowTracker(), Foxtrot.getInstance()); + Foxtrot.getInstance().getServer().getPluginManager().registerEvents(new VoidTracker(), Foxtrot.getInstance()); + Foxtrot.getInstance().getServer().getPluginManager().registerEvents(new BurnTracker(), Foxtrot.getInstance()); + Foxtrot.getInstance().getServer().getPluginManager().registerEvents(new ProjectileTracker(), Foxtrot.getInstance()); + Foxtrot.getInstance().getServer().getPluginManager().registerEvents(new MinecartTracker(), Foxtrot.getInstance()); + } + + public static List getDamage(Player player) { + return (damage.get(player.getName())); + } + + public static void addDamage(Player player, Damage addedDamage) { + if (!damage.containsKey(player.getName())) { + damage.put(player.getName(), new ArrayList<>()); + } + + List damageList = damage.get(player.getName()); + + while (damageList.size() > 30) { + damageList.remove(0); + } + + damageList.add(addedDamage); + } + + public static void clearDamage(Player player) { + damage.remove(player.getName()); + } + +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/deathmessage/event/CustomPlayerDamageEvent.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/deathmessage/event/CustomPlayerDamageEvent.java new file mode 100644 index 0000000..dc88556 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/deathmessage/event/CustomPlayerDamageEvent.java @@ -0,0 +1,36 @@ +package net.frozenorb.foxtrot.deathmessage.event; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; +import net.frozenorb.foxtrot.deathmessage.objects.Damage; +import org.bukkit.entity.Player; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import org.bukkit.event.entity.EntityDamageEvent; + +@AllArgsConstructor +public class CustomPlayerDamageEvent extends Event { + + private static HandlerList handlerList = new HandlerList(); + + @Getter private EntityDamageEvent cause; + @Getter @Setter private Damage trackerDamage; + + public Player getPlayer() { + return ((Player) cause.getEntity()); + } + + public double getDamage() { + return (cause.getDamage()); + } + + public HandlerList getHandlers() { + return (handlerList); + } + + public static HandlerList getHandlerList() { + return (handlerList); + } + +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/deathmessage/event/PlayerKilledEvent.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/deathmessage/event/PlayerKilledEvent.java new file mode 100644 index 0000000..c9c8ddb --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/deathmessage/event/PlayerKilledEvent.java @@ -0,0 +1,25 @@ +package net.frozenorb.foxtrot.deathmessage.event; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.bukkit.entity.Player; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +@AllArgsConstructor +public class PlayerKilledEvent extends Event { + + private static HandlerList handlerList = new HandlerList(); + + @Getter private final Player killer; + @Getter private final Player victim; + + public HandlerList getHandlers() { + return (handlerList); + } + + public static HandlerList getHandlerList() { + return (handlerList); + } + +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/deathmessage/listeners/DamageListener.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/deathmessage/listeners/DamageListener.java new file mode 100644 index 0000000..e8801e7 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/deathmessage/listeners/DamageListener.java @@ -0,0 +1,303 @@ +package net.frozenorb.foxtrot.deathmessage.listeners; + +import net.frozenorb.foxtrot.team.claims.LandBoard; +import net.minecraft.util.com.google.common.collect.Maps; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.commands.CustomTimerCreateCommand; +import net.frozenorb.foxtrot.commands.EOTWCommand; +import net.frozenorb.foxtrot.commands.LastInvCommand; +import net.frozenorb.foxtrot.deathmessage.DeathMessageHandler; +import net.frozenorb.foxtrot.deathmessage.event.CustomPlayerDamageEvent; +import net.frozenorb.foxtrot.deathmessage.event.PlayerKilledEvent; +import net.frozenorb.foxtrot.deathmessage.objects.Damage; +import net.frozenorb.foxtrot.deathmessage.objects.PlayerDamage; +import net.frozenorb.foxtrot.deathmessage.util.UnknownDamage; +import net.frozenorb.foxtrot.gameplay.kitmap.killstreaks.Killstreak; +import net.frozenorb.foxtrot.gameplay.kitmap.killstreaks.PersistentKillstreak; +import net.frozenorb.foxtrot.gameplay.extra.stats.StatsEntry; +import net.frozenorb.foxtrot.listener.event.PlayerIncreaseKillEvent; +import net.frozenorb.foxtrot.server.pearl.EnderpearlCooldownHandler; +import net.frozenorb.foxtrot.team.Team; +import net.frozenorb.foxtrot.util.CC; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.craftbukkit.v1_7_R4.entity.CraftPlayer; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.player.PlayerRespawnEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.util.Vector; +import org.cavepvp.profiles.Profiles; +import org.cavepvp.profiles.playerProfiles.PlayerProfileAPI; +import org.cavepvp.profiles.playerProfiles.impl.stats.StatisticType; + +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.TimeUnit; + +public class DamageListener implements Listener { + + // kit-map only + private Map lastKilled = Maps.newHashMap(); + private Map boosting = Maps.newHashMap(); + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onEntityDamage(EntityDamageEvent event) { + if (event.getEntity() instanceof Player) { + Player player = (Player) event.getEntity(); + CustomPlayerDamageEvent customEvent = new CustomPlayerDamageEvent(event, new UnknownDamage(player.getName(), event.getDamage())); + + Foxtrot.getInstance().getServer().getPluginManager().callEvent(customEvent); + DeathMessageHandler.addDamage(player, customEvent.getTrackerDamage()); + } + } + + @EventHandler + public void onQuit(PlayerQuitEvent event) { + DeathMessageHandler.clearDamage(event.getPlayer()); + } + + @EventHandler(priority = EventPriority.LOWEST) + public void onPlayerDeath(PlayerDeathEvent event) { + event.setDeathMessage(null); + + LastInvCommand.recordInventory(event.getEntity()); + EnderpearlCooldownHandler.clearEnderpearlTimer(event.getEntity()); + + if (Foxtrot.getInstance().getDeathbanArenaHandler().isDeathbanArena(event.getEntity()) || event.getEntity().getKiller() != null && Foxtrot.getInstance().getDeathbanArenaHandler().isDeathbanArena(event.getEntity().getKiller())) { + return; + } + + final List record = DeathMessageHandler.getDamage(event.getEntity()); + final Player victim = event.getEntity(); + final Team victimTeam = Foxtrot.getInstance().getTeamHandler().getTeam(victim); + + String deathMessage; + + boolean killBoosting = false; + + if (record != null && !record.isEmpty()) { + Damage deathCause = record.get(record.size() - 1); + + if (deathCause instanceof PlayerDamage && deathCause.getTimeDifference() < TimeUnit.MINUTES.toMillis(1)) { + String killerName = ((PlayerDamage) deathCause).getDamager(); + Player killer = Foxtrot.getInstance().getServer().getPlayerExact(killerName); + + if (killer != null && !(Foxtrot.getInstance().getInDuelPredicate().test(event.getEntity()) || Foxtrot.getInstance().getInEventPredicate().test(event.getEntity()))) { + ((CraftPlayer) event.getEntity()).getHandle().killer = ((CraftPlayer) killer).getHandle(); + + Foxtrot.getInstance().getServer().getPluginManager().callEvent(new PlayerKilledEvent(killer, victim)); + + if (lastKilled.containsKey(killer.getUniqueId()) && lastKilled.get(killer.getUniqueId()) == victim.getUniqueId()) { + boosting.putIfAbsent(killer.getUniqueId(), 0); + boosting.put(killer.getUniqueId(), boosting.get(killer.getUniqueId()) + 1); + } else { + boosting.put(killer.getUniqueId(), 0); + } + + final StatsEntry victimStats = Foxtrot.getInstance().getMapHandler().getStatsHandler().getStats(victim); + victimStats.addDeath(); + + Profiles.getInstance().getReputationHandler().takeReputation(victim.getUniqueId(), victim.getName(), 1); + + if (killer.equals(victim)) { + killBoosting = true; + } else if (killer.getAddress().getAddress().getHostAddress().equalsIgnoreCase(victim.getAddress().getAddress().getHostAddress())) { + killBoosting = true; + + killer.sendMessage(ChatColor.RED + "Boost Check: You've killed a player on the same IP address as you."); + } else if (boosting.containsKey(killer.getUniqueId()) && boosting.get(killer.getUniqueId()) > 1) { + killBoosting = true; + + killer.sendMessage(ChatColor.RED + "Boost Check: You've killed " + victim.getName() + " " + boosting.get(killer.getUniqueId()) + " times."); + } else if (victimTeam != null && victimTeam.isRaidable()) { + killBoosting = true; + + killer.sendMessage(ChatColor.RED + "Boost Check: This player is raidable!"); + } else if (Foxtrot.getInstance().getServerHandler().isEOTW()) { + killBoosting = true; + + killer.sendMessage(ChatColor.RED + "Boost Check: You can't gain Kills during EOTW!"); + } else { + final StatsEntry killerStats = Foxtrot.getInstance().getMapHandler().getStatsHandler().getStats(killer); + killerStats.addKill(); + + lastKilled.put(killer.getUniqueId(), victim.getUniqueId()); + + if (Foxtrot.getInstance().getMapHandler().isKitMap()) { + long gemAmount = Foxtrot.getInstance().getGemMap().addGems(killer.getUniqueId(), 1); + + killer.sendMessage(CC.GREEN + "You earned " + CC.DARK_GREEN + "+" + gemAmount + CC.GREEN + " gem" + (gemAmount == 1 ? "" : "s") + "!"); + + int killStreakCount = Foxtrot.getInstance().getKillstreakMap().getKillstreak(killer.getUniqueId()); + final Killstreak killstreak = Foxtrot.getInstance().getMapHandler().getKillstreakHandler().check(killStreakCount); + + if (killstreak != null) { + killstreak.apply(killer); + killstreak.apply(killer, killStreakCount); + + if (killstreak.getName() != null) { + Bukkit.broadcastMessage(killer.getDisplayName() + ChatColor.YELLOW + " has gotten the " + ChatColor.RED + killstreak.getName() + ChatColor.YELLOW + " killstreak!"); + } + + final List persistent = Foxtrot.getInstance().getMapHandler().getKillstreakHandler().getPersistentKillstreaks(killer, killStreakCount); + + for (PersistentKillstreak persistentStreak : persistent) { + if (persistentStreak.matchesExactly(killStreakCount)) { + if (killstreak.getName() != null) { + Bukkit.broadcastMessage(killer.getName() + ChatColor.YELLOW + " has gotten the " + ChatColor.RED + killstreak.getName() + ChatColor.YELLOW + " killstreak!"); + } + } + + persistentStreak.apply(killer); + } + + if (killStreakCount >= 100) { + Foxtrot.getInstance().getKillstreakMap().setKillstreak(killer.getUniqueId(), 0); + } + } + } + + Foxtrot.getInstance().getKillsMap().setKills(killer.getUniqueId(), Foxtrot.getInstance().getKillsMap().getKills(killer.getUniqueId())+1); + Foxtrot.getInstance().getKillstreakMap().setKillstreak(killer.getUniqueId(), Foxtrot.getInstance().getKillstreakMap().getKillstreak(killer.getUniqueId())+1); + Foxtrot.getInstance().getDeathsMap().setDeaths(victim.getUniqueId(), Foxtrot.getInstance().getDeathsMap().getDeaths(victim.getUniqueId())+1); + Profiles.getInstance().getReputationHandler().addReputation(killer.getUniqueId(), killer.getName(), 1); + + if (!Foxtrot.getInstance().getServerHandler().isAu()) { + PlayerProfileAPI.addStatistic(killer.getUniqueId(), Foxtrot.getInstance().getStatisticServer(), StatisticType.KILLS, 1); + PlayerProfileAPI.addStatistic(victim.getUniqueId(), Foxtrot.getInstance().getStatisticServer(), StatisticType.DEATHS, 1); + } + + Bukkit.getPluginManager().callEvent(new PlayerIncreaseKillEvent(killer)); + + if (Foxtrot.getInstance().getServerHandler().isTeams()) { + event.getDrops().add(Foxtrot.getInstance().getServerHandler().generateDeathSign(event.getEntity().getName(), killer.getName())); + } + + } + } + } + + deathMessage = deathCause.getDeathMessage(); + } else { + deathMessage = new UnknownDamage(event.getEntity().getName(), 1).getDeathMessage(); + } + + final Player killer = event.getEntity().getKiller(); + final Team killerTeam = killer == null ? null : Foxtrot.getInstance().getTeamHandler().getTeam(killer); + + if (killerTeam != null && !killBoosting) { + killerTeam.setKills(killerTeam.getKills() + 1); + killerTeam.recalculateGems(); + if (CustomTimerCreateCommand.isDoublePoints() || killerTeam.hasEndOutpost()) { + killerTeam.setDoublePoints(killerTeam.getDoublePoints() + 1); + } + + final Team teamAt = LandBoard.getInstance().getTeam(killer.getLocation()); + + if (teamAt != null && teamAt.equals(killerTeam) && killerTeam.getDTR() <= 1.0) { + killerTeam.setTrappingPoints(killerTeam.getTrappingPoints()+1); + } + } + + if (victimTeam != null) { + victimTeam.setDeaths(victimTeam.getDeaths() + 1); + } + + Bukkit.getScheduler().scheduleAsyncDelayedTask(Foxtrot.getInstance(), () -> { + for (Player player : Bukkit.getOnlinePlayers()) { + if (Foxtrot.getInstance().getToggleDeathMessageMap().areDeathMessagesEnabled(player.getUniqueId())) { + player.sendMessage(deathMessage); + continue; + } + + if (Foxtrot.getInstance().getTeamHandler().getTeam(player) == null) { + continue; + } + + // send them the message if the player who died was on their team + if (Foxtrot.getInstance().getTeamHandler().getTeam(event.getEntity()) != null && Foxtrot.getInstance().getTeamHandler().getTeam(player).equals(Foxtrot.getInstance().getTeamHandler().getTeam(event.getEntity()))) { + player.sendMessage(deathMessage); + } + + if (killer == null) { + continue; + } + + if (Foxtrot.getInstance().getTeamHandler().getTeam(killer) != null && Foxtrot.getInstance().getTeamHandler().getTeam(player).equals(Foxtrot.getInstance().getTeamHandler().getTeam(killer))) { + player.sendMessage(deathMessage); + } + } + }); + + DeathMessageHandler.clearDamage(event.getEntity()); + Foxtrot.getInstance().getDeathsMap().setDeaths(event.getEntity().getUniqueId(), Foxtrot.getInstance().getDeathsMap().getDeaths(event.getEntity().getUniqueId()) + 1); + } + + @EventHandler + public void onRespawn(PlayerRespawnEvent event) { + if (Foxtrot.getInstance().getMapHandler().isKitMap()) { + event.getPlayer().setVelocity(new Vector(0, 0, 0)); + checkKillstreaks(event.getPlayer()); + } + } + + private void checkKillstreaks(Player player) { + Bukkit.getScheduler().runTaskLater(Foxtrot.getInstance(), () -> { + int killstreak = Foxtrot.getInstance().getKillstreakMap().getKillstreak(player.getUniqueId()); + List persistent = Foxtrot.getInstance().getMapHandler().getKillstreakHandler().getPersistentKillstreaks(player, killstreak); + + for (PersistentKillstreak persistentStreak : persistent) { + persistentStreak.apply(player); + } + }, 5L); + } + + @EventHandler + public void onRightClick(PlayerInteractEvent event) { + if (!event.getAction().name().startsWith("RIGHT_CLICK")) { + return; + } + + ItemStack inHand = event.getPlayer().getItemInHand(); + if (inHand == null) { + return; + } + + if (inHand.getType() != Material.NETHER_STAR) { + return; + } + + if (!inHand.hasItemMeta() + || !inHand.getItemMeta().hasDisplayName() + || !inHand.getItemMeta().getDisplayName().equals(ChatColor.translateAlternateColorCodes('&', "&5&k! &d&lPotion Refill Token &5&k!"))) { + return; + } + + if (EOTWCommand.realFFAStarted()) { + event.getPlayer().sendMessage(ChatColor.RED + "Potion Refill Tokens are disabled during FFA."); + return; + } + + if (inHand.getAmount() == 1) { + event.getPlayer().setItemInHand(null); + } else { + inHand.setAmount(inHand.getAmount()-1); + } + + + ItemStack pot = new ItemStack(Material.POTION, 1, (short) 16421); + + while (event.getPlayer().getInventory().addItem(pot).isEmpty()) { + } + } + +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/deathmessage/objects/Damage.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/deathmessage/objects/Damage.java new file mode 100644 index 0000000..16ecad9 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/deathmessage/objects/Damage.java @@ -0,0 +1,31 @@ +package net.frozenorb.foxtrot.deathmessage.objects; + +import lombok.Getter; +import net.frozenorb.foxtrot.Foxtrot; +import cc.fyre.proton.util.UUIDUtils; +import org.bukkit.ChatColor; + +public abstract class Damage { + + @Getter private String damaged; + @Getter private double damage; + @Getter private long time; + + public Damage(String damaged, double damage) { + this.damaged = damaged; + this.damage = damage; + this.time = System.currentTimeMillis(); + } + + public abstract String getDeathMessage(); + + public String wrapName(String player) { + int kills = Foxtrot.getInstance().getMapHandler().isKitMap() ? Foxtrot.getInstance().getMapHandler().getStatsHandler().getStats(player).getKills() : Foxtrot.getInstance().getKillsMap().getKills(UUIDUtils.uuid(player)); + return (ChatColor.RED + player + ChatColor.DARK_RED + "[" + kills + "]" + ChatColor.YELLOW); + } + + public long getTimeDifference() { + return System.currentTimeMillis() - time; + } + +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/deathmessage/objects/MobDamage.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/deathmessage/objects/MobDamage.java new file mode 100644 index 0000000..cbfffa1 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/deathmessage/objects/MobDamage.java @@ -0,0 +1,15 @@ +package net.frozenorb.foxtrot.deathmessage.objects; + +import lombok.Getter; +import org.bukkit.entity.EntityType; + +public abstract class MobDamage extends Damage { + + @Getter private EntityType mobType; + + public MobDamage(String damaged, double damage, EntityType mobType) { + super(damaged, damage); + this.mobType = mobType; + } + +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/deathmessage/objects/PlayerDamage.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/deathmessage/objects/PlayerDamage.java new file mode 100644 index 0000000..61d18ee --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/deathmessage/objects/PlayerDamage.java @@ -0,0 +1,14 @@ +package net.frozenorb.foxtrot.deathmessage.objects; + +import lombok.Getter; + +public abstract class PlayerDamage extends Damage { + + @Getter private String damager; + + public PlayerDamage(String damaged, double damage, String damager) { + super(damaged, damage); + this.damager = damager; + } + +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/deathmessage/trackers/ArrowTracker.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/deathmessage/trackers/ArrowTracker.java new file mode 100644 index 0000000..ec38f5c --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/deathmessage/trackers/ArrowTracker.java @@ -0,0 +1,98 @@ +package net.frozenorb.foxtrot.deathmessage.trackers; + +import cc.fyre.proton.util.EntityUtils; +import lombok.Getter; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.deathmessage.event.CustomPlayerDamageEvent; +import net.frozenorb.foxtrot.deathmessage.objects.Damage; +import net.frozenorb.foxtrot.deathmessage.objects.MobDamage; +import net.frozenorb.foxtrot.deathmessage.objects.PlayerDamage; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.entity.Arrow; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.EntityShootBowEvent; +import org.bukkit.metadata.FixedMetadataValue; +import org.bukkit.metadata.MetadataValue; + +public class ArrowTracker implements Listener { + + @EventHandler + public void onEntityShootBow(EntityShootBowEvent event) { + if (event.getEntity() instanceof Player) { + event.getProjectile().setMetadata("ShotFromDistance", new FixedMetadataValue(Foxtrot.getInstance(), event.getProjectile().getLocation())); + } + } + + @EventHandler(priority=EventPriority.LOW, ignoreCancelled=true) + public void onCustomPlayerDamage(CustomPlayerDamageEvent event) { + if (event.getCause() instanceof EntityDamageByEntityEvent) { + EntityDamageByEntityEvent entityDamageByEntityEvent = (EntityDamageByEntityEvent) event.getCause(); + + if (entityDamageByEntityEvent.getDamager() instanceof Arrow) { + Arrow arrow = (Arrow) entityDamageByEntityEvent.getDamager(); + + if (arrow.getShooter() instanceof Player) { + Player shooter = (Player) arrow.getShooter(); + + for (MetadataValue value : arrow.getMetadata("ShotFromDistance")) { + Location shotFrom = (Location) value.value(); + double distance = shotFrom.distance(event.getPlayer().getLocation()); + event.setTrackerDamage(new ArrowDamageByPlayer(event.getPlayer().getName(), event.getDamage(), shooter.getName(), shotFrom, distance)); + } + } else if (arrow.getShooter() instanceof Entity) { + event.setTrackerDamage(new ArrowDamageByMob(event.getPlayer().getName(), event.getDamage(), (Entity) arrow.getShooter())); + } else { + event.setTrackerDamage(new ArrowDamage(event.getPlayer().getName(), event.getDamage())); + } + } + } + } + + public static class ArrowDamage extends Damage { + + public ArrowDamage(String damaged, double damage) { + super(damaged, damage); + } + + public String getDeathMessage() { + return (wrapName(getDamaged()) + " was shot."); + } + + } + + public static class ArrowDamageByPlayer extends PlayerDamage { + + @Getter private Location shotFrom; + @Getter private double distance; + + public ArrowDamageByPlayer(String damaged, double damage, String damager, Location shotFrom, double distance) { + super(damaged, damage, damager); + this.shotFrom = shotFrom; + this.distance = distance; + } + + public String getDeathMessage() { + return (wrapName(getDamaged()) + " was shot by " + wrapName(getDamager()) + " from " + ChatColor.BLUE + (int) distance + " blocks" + ChatColor.YELLOW + "."); + } + + } + + public static class ArrowDamageByMob extends MobDamage { + + public ArrowDamageByMob(String damaged, double damage, Entity damager) { + super(damaged, damage, damager.getType()); + } + + public String getDeathMessage() { + return (wrapName(getDamaged()) + " was shot by a " + ChatColor.RED + EntityUtils.getName(getMobType()) + ChatColor.YELLOW + "."); + } + + } + +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/deathmessage/trackers/BurnTracker.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/deathmessage/trackers/BurnTracker.java new file mode 100644 index 0000000..8572334 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/deathmessage/trackers/BurnTracker.java @@ -0,0 +1,72 @@ +package net.frozenorb.foxtrot.deathmessage.trackers; + +import net.frozenorb.foxtrot.deathmessage.DeathMessageHandler; +import net.frozenorb.foxtrot.deathmessage.event.CustomPlayerDamageEvent; +import net.frozenorb.foxtrot.deathmessage.objects.Damage; +import net.frozenorb.foxtrot.deathmessage.objects.PlayerDamage; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageEvent; + +import java.util.List; +import java.util.concurrent.TimeUnit; + +public class BurnTracker implements Listener { + + @EventHandler(priority=EventPriority.LOW) + public void onCustomPlayerDamage(CustomPlayerDamageEvent event) { + if (event.getCause().getCause() != EntityDamageEvent.DamageCause.FIRE_TICK && event.getCause().getCause() != EntityDamageEvent.DamageCause.LAVA) { + return; + } + + List record = DeathMessageHandler.getDamage(event.getPlayer()); + Damage knocker = null; + long knockerTime = 0L; + + if (record != null) { + for (Damage damage : record) { + if (damage instanceof BurnDamage || damage instanceof BurnDamageByPlayer) { + continue; + } + + if (damage instanceof PlayerDamage && (knocker == null || damage.getTime() > knockerTime)) { + knocker = damage; + knockerTime = damage.getTime(); + } + } + } + + if (knocker != null && knockerTime + TimeUnit.MINUTES.toMillis(1) > System.currentTimeMillis() ) { + event.setTrackerDamage(new BurnDamageByPlayer(event.getPlayer().getName(), event.getDamage(), ((PlayerDamage) knocker).getDamager())); + } else { + event.setTrackerDamage(new BurnDamage(event.getPlayer().getName(), event.getDamage())); + + } + } + + public static class BurnDamage extends Damage { + + public BurnDamage(String damaged, double damage) { + super(damaged, damage); + } + + public String getDeathMessage() { + return (wrapName(getDamaged()) + " burned to death"); + } + + } + + public static class BurnDamageByPlayer extends PlayerDamage { + + public BurnDamageByPlayer(String damaged, double damage, String damager) { + super(damaged, damage, damager); + } + + public String getDeathMessage() { + return (wrapName(getDamaged()) + " burned to death thanks to " + wrapName(getDamager()) + "."); + } + + } + +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/deathmessage/trackers/EntityTracker.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/deathmessage/trackers/EntityTracker.java new file mode 100644 index 0000000..a984197 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/deathmessage/trackers/EntityTracker.java @@ -0,0 +1,46 @@ +package net.frozenorb.foxtrot.deathmessage.trackers; + +import cc.fyre.proton.util.EntityUtils; +import net.frozenorb.foxtrot.deathmessage.event.CustomPlayerDamageEvent; +import net.frozenorb.foxtrot.deathmessage.objects.MobDamage; +import org.bukkit.ChatColor; +import org.bukkit.entity.Arrow; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageByEntityEvent; + +public class EntityTracker implements Listener { + + @EventHandler(priority=EventPriority.LOW, ignoreCancelled=true) + public void onCustomPlayerDamage(CustomPlayerDamageEvent event) { + if (event.getCause() instanceof EntityDamageByEntityEvent) { + EntityDamageByEntityEvent e = (EntityDamageByEntityEvent) event.getCause(); + + if (!(e.getDamager() instanceof Player) && !(e.getDamager() instanceof Arrow)) { + event.setTrackerDamage(new EntityDamage(event.getPlayer().getName(), event.getDamage(), e.getDamager())); + } + } + } + + public static class EntityDamage extends MobDamage { + + public EntityDamage(String damaged, double damage, Entity entity) { + super(damaged, damage, entity.getType()); + } + + public String getDeathMessage() { + String entityName = EntityUtils.getName(getMobType()); + + if (entityName.equalsIgnoreCase("Wolf")) { + entityName = "Puppy"; + } + + return (wrapName(getDamaged()) + " was slain by a " + ChatColor.RED + entityName + ChatColor.YELLOW + "."); + } + + } + +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/deathmessage/trackers/FallTracker.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/deathmessage/trackers/FallTracker.java new file mode 100644 index 0000000..d088dfb --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/deathmessage/trackers/FallTracker.java @@ -0,0 +1,70 @@ +package net.frozenorb.foxtrot.deathmessage.trackers; + +import net.frozenorb.foxtrot.deathmessage.DeathMessageHandler; +import net.frozenorb.foxtrot.deathmessage.event.CustomPlayerDamageEvent; +import net.frozenorb.foxtrot.deathmessage.objects.Damage; +import net.frozenorb.foxtrot.deathmessage.objects.PlayerDamage; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageEvent; + +import java.util.List; +import java.util.concurrent.TimeUnit; + +public class FallTracker implements Listener { + + @EventHandler(priority=EventPriority.LOW) + public void onCustomPlayerDamage(CustomPlayerDamageEvent event) { + if (event.getCause().getCause() != EntityDamageEvent.DamageCause.FALL) { + return; + } + + List record = DeathMessageHandler.getDamage(event.getPlayer()); + Damage knocker = null; + long knockerTime = 0L; + + if (record != null) { + for (Damage damage : record) { + if (damage instanceof FallDamage || damage instanceof FallDamageByPlayer) { + continue; + } + + if (damage instanceof PlayerDamage && (knocker == null || damage.getTime() > knockerTime)) { + knocker = damage; + knockerTime = damage.getTime(); + } + } + } + if (knocker != null && knockerTime + TimeUnit.MINUTES.toMillis(1) > System.currentTimeMillis() ) { + event.setTrackerDamage(new FallDamageByPlayer(event.getPlayer().getName(), event.getDamage(), ((PlayerDamage) knocker).getDamager())); + } else { + event.setTrackerDamage(new FallDamage(event.getPlayer().getName(), event.getDamage())); + } + } + + public static class FallDamage extends Damage { + + public FallDamage(String damaged, double damage) { + super(damaged, damage); + } + + public String getDeathMessage() { + return (wrapName(getDamaged()) + " hit the ground too hard."); + } + + } + + public static class FallDamageByPlayer extends PlayerDamage { + + public FallDamageByPlayer(String damaged, double damage, String damager) { + super(damaged, damage, damager); + } + + public String getDeathMessage() { + return (wrapName(getDamaged()) + " hit the ground too hard thanks to " + wrapName(getDamager()) + "."); + } + + } + +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/deathmessage/trackers/GeneralTracker.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/deathmessage/trackers/GeneralTracker.java new file mode 100644 index 0000000..d2507a4 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/deathmessage/trackers/GeneralTracker.java @@ -0,0 +1,52 @@ +package net.frozenorb.foxtrot.deathmessage.trackers; + +import net.frozenorb.foxtrot.deathmessage.event.CustomPlayerDamageEvent; +import net.frozenorb.foxtrot.deathmessage.objects.Damage; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; + +public class GeneralTracker implements Listener { + + @EventHandler(priority=EventPriority.LOW, ignoreCancelled=true) + public void onCustomPlayerDamage(CustomPlayerDamageEvent event) { + switch (event.getCause().getCause()) { + case SUFFOCATION: + event.setTrackerDamage(new GeneralDamage(event.getPlayer().getName(), event.getDamage(), "suffocated")); + break; + case DROWNING: + event.setTrackerDamage(new GeneralDamage(event.getPlayer().getName(), event.getDamage(), "drowned")); + break; + case STARVATION: + event.setTrackerDamage(new GeneralDamage(event.getPlayer().getName(), event.getDamage(), "starved to death")); + break; + case LIGHTNING: + event.setTrackerDamage(new GeneralDamage(event.getPlayer().getName(), event.getDamage(), "was struck by lightning")); + break; + case POISON: + event.setTrackerDamage(new GeneralDamage(event.getPlayer().getName(), event.getDamage(), "was poisoned")); + break; + case WITHER: + event.setTrackerDamage(new GeneralDamage(event.getPlayer().getName(), event.getDamage(), "withered away")); + break; + default: + break; + } + } + + public static class GeneralDamage extends Damage { + + private String message; + + public GeneralDamage(String damaged, double damage, String message) { + super(damaged, damage); + this.message = message; + } + + public String getDeathMessage() { + return (wrapName(getDamaged()) + " " + message + "."); + } + + } + +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/deathmessage/trackers/MinecartTracker.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/deathmessage/trackers/MinecartTracker.java new file mode 100644 index 0000000..5789446 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/deathmessage/trackers/MinecartTracker.java @@ -0,0 +1,58 @@ +package net.frozenorb.foxtrot.deathmessage.trackers; + +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.deathmessage.event.CustomPlayerDamageEvent; +import net.frozenorb.foxtrot.deathmessage.objects.PlayerDamage; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.entity.minecart.ExplosiveMinecart; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageByEntityEvent; + +import java.util.UUID; + +public class MinecartTracker implements Listener { + + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) + public void onCustomPlayerDamage(CustomPlayerDamageEvent event) { + if (event.getCause() instanceof EntityDamageByEntityEvent) { + EntityDamageByEntityEvent entityDamageByEntityEvent = (EntityDamageByEntityEvent) event.getCause(); + + if (entityDamageByEntityEvent.getDamager() instanceof ExplosiveMinecart) { + + final ExplosiveMinecart explosiveMinecart = (ExplosiveMinecart) entityDamageByEntityEvent.getDamager(); + + if (!explosiveMinecart.hasMetadata("TNT_MINECART")) { + return; + } + + final UUID uuid = UUID.fromString(explosiveMinecart.getMetadata("TNT_MINECART").get(0).asString()); + final Player damager = Foxtrot.getInstance().getServer().getPlayer(uuid); + + if (damager == null) { + return; + } + + final Player damaged = event.getPlayer(); + + if (damager != damaged) { + event.setTrackerDamage(new ExplodeByPlayer(damaged.getName(), event.getDamage(), damager.getName())); + } + } + } + } + + public static class ExplodeByPlayer extends PlayerDamage { + + public ExplodeByPlayer(String damaged, double damage, String damager) { + super(damaged, damage, damager); + } + + public String getDeathMessage() { + return (wrapName(getDamaged()) + " exploded thanks to " + wrapName(getDamager()) + "."); + } + + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/deathmessage/trackers/PVPTracker.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/deathmessage/trackers/PVPTracker.java new file mode 100644 index 0000000..b1e4504 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/deathmessage/trackers/PVPTracker.java @@ -0,0 +1,71 @@ +package net.frozenorb.foxtrot.deathmessage.trackers; + +import cc.fyre.proton.util.UUIDUtils; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.deathmessage.event.CustomPlayerDamageEvent; +import net.frozenorb.foxtrot.deathmessage.objects.PlayerDamage; +import net.frozenorb.foxtrot.deathmessage.util.MobUtil; +import net.frozenorb.foxtrot.gameplay.killtags.KillTags; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.inventory.ItemStack; + +import java.util.UUID; + +public class PVPTracker implements Listener { + + @EventHandler(priority=EventPriority.LOW, ignoreCancelled=true) + public void onCustomPlayerDamage(CustomPlayerDamageEvent event) { + if (event.getCause() instanceof EntityDamageByEntityEvent) { + EntityDamageByEntityEvent e = (EntityDamageByEntityEvent) event.getCause(); + + if (e.getDamager() instanceof Player) { + Player damager = (Player) e.getDamager(); + Player damaged = event.getPlayer(); + + event.setTrackerDamage(new PVPDamage(damaged.getName(), event.getDamage(), damager.getName(), damager.getItemInHand())); + } + } + } + + public static class PVPDamage extends PlayerDamage { + + private String itemString; + + public PVPDamage(String damaged, double damage, String damager, ItemStack itemStack) { + super(damaged, damage, damager); + this.itemString = "Error"; + + if (itemStack.getType() == Material.AIR) { + itemString = "their fists"; + } else { + itemString = MobUtil.getItemName(itemStack, false); + } + } + + public String getDeathMessage() { + String extension = (Foxtrot.getInstance().getInDuelPredicate().test(Bukkit.getPlayer(getDamaged()))) ? + " during a duel." + : + " using " + ChatColor.RED + itemString + ChatColor.YELLOW + "."; + + final Player player = Foxtrot.getInstance().getServer().getPlayer(getDamager()); + + if (player == null) { + return (wrapName(getDamaged()) + " was slain by " + wrapName(getDamager()) + extension); + } + + final KillTags killTags = Foxtrot.getInstance().getKillTagMap().getKillTag(player.getUniqueId()); + + return (wrapName(getDamaged()) + killTags.getDeathTag() + wrapName(getDamager()) + extension); + } + + } + +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/deathmessage/trackers/ProjectileTracker.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/deathmessage/trackers/ProjectileTracker.java new file mode 100644 index 0000000..a837e1a --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/deathmessage/trackers/ProjectileTracker.java @@ -0,0 +1,33 @@ +package net.frozenorb.foxtrot.deathmessage.trackers; + +import net.frozenorb.foxtrot.deathmessage.event.CustomPlayerDamageEvent; +import org.bukkit.entity.Arrow; +import org.bukkit.entity.Player; +import org.bukkit.entity.Projectile; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageByEntityEvent; + +public class ProjectileTracker implements Listener { + + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) + public void onCustomPlayerDamage(CustomPlayerDamageEvent event) { + if (event.getCause() instanceof EntityDamageByEntityEvent) { + EntityDamageByEntityEvent entityDamageByEntityEvent = (EntityDamageByEntityEvent) event.getCause(); + + if (entityDamageByEntityEvent.getDamager() instanceof Projectile && !(entityDamageByEntityEvent.getDamager() instanceof Arrow)) { + final Projectile projectile = (Projectile) entityDamageByEntityEvent.getDamager(); + + if (projectile.getShooter() instanceof Player) { + final Player shooter = (Player) projectile.getShooter(); + final Player damaged = event.getPlayer(); + + if (shooter != damaged) { + event.setTrackerDamage(new PVPTracker.PVPDamage(damaged.getName(), event.getDamage(), shooter.getName(), shooter.getItemInHand())); + } + } + } + } + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/deathmessage/trackers/VoidTracker.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/deathmessage/trackers/VoidTracker.java new file mode 100644 index 0000000..0fe4ab7 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/deathmessage/trackers/VoidTracker.java @@ -0,0 +1,71 @@ +package net.frozenorb.foxtrot.deathmessage.trackers; + +import net.frozenorb.foxtrot.deathmessage.DeathMessageHandler; +import net.frozenorb.foxtrot.deathmessage.event.CustomPlayerDamageEvent; +import net.frozenorb.foxtrot.deathmessage.objects.Damage; +import net.frozenorb.foxtrot.deathmessage.objects.PlayerDamage; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageEvent; + +import java.util.List; +import java.util.concurrent.TimeUnit; + +public class VoidTracker implements Listener { + + @EventHandler(priority=EventPriority.LOW) + public void onCustomPlayerDamage(CustomPlayerDamageEvent event) { + if (event.getCause().getCause() != EntityDamageEvent.DamageCause.VOID) { + return; + } + + List record = DeathMessageHandler.getDamage(event.getPlayer()); + Damage knocker = null; + long knockerTime = 0L; + + if (record != null) { + for (Damage damage : record) { + if (damage instanceof VoidDamage || damage instanceof VoidDamageByPlayer) { + continue; + } + + if (damage instanceof PlayerDamage && (knocker == null || damage.getTime() > knockerTime)) { + knocker = damage; + knockerTime = damage.getTime(); + } + } + } + + if (knocker != null && knockerTime + TimeUnit.MINUTES.toMillis(1) > System.currentTimeMillis() ) { + event.setTrackerDamage(new VoidDamageByPlayer(event.getPlayer().getName(), event.getDamage(), ((PlayerDamage) knocker).getDamager())); + } else { + event.setTrackerDamage(new VoidDamage(event.getPlayer().getName(), event.getDamage())); + } + } + + public static class VoidDamage extends Damage { + + public VoidDamage(String damaged, double damage) { + super(damaged, damage); + } + + public String getDeathMessage() { + return (wrapName(getDamaged()) + " fell into the void."); + } + + } + + public static class VoidDamageByPlayer extends PlayerDamage { + + public VoidDamageByPlayer(String damaged, double damage, String damager) { + super(damaged, damage, damager); + } + + public String getDeathMessage() { + return (wrapName(getDamaged()) + " fell into the void thanks to " + wrapName(getDamager()) + "."); + } + + } + +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/deathmessage/util/MobUtil.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/deathmessage/util/MobUtil.java new file mode 100644 index 0000000..e765cda --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/deathmessage/util/MobUtil.java @@ -0,0 +1,18 @@ +package net.frozenorb.foxtrot.deathmessage.util; + +import org.apache.commons.lang.WordUtils; +import org.bukkit.ChatColor; +import org.bukkit.inventory.ItemStack; + +public class MobUtil { + + public static String getItemName(ItemStack itemStack, boolean stripColor) { + if (itemStack.getItemMeta().hasDisplayName()) { + String displayName = itemStack.getItemMeta().getDisplayName(); + return stripColor ? ChatColor.stripColor(displayName) : displayName; + } + + return (WordUtils.capitalizeFully(itemStack.getType().name().replace('_', ' '))); + } + +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/deathmessage/util/UnknownDamage.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/deathmessage/util/UnknownDamage.java new file mode 100644 index 0000000..46d1641 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/deathmessage/util/UnknownDamage.java @@ -0,0 +1,15 @@ +package net.frozenorb.foxtrot.deathmessage.util; + +import net.frozenorb.foxtrot.deathmessage.objects.Damage; + +public class UnknownDamage extends Damage { + + public UnknownDamage(String damaged, double damage) { + super(damaged, damage); + } + + public String getDeathMessage() { + return (wrapName(getDamaged()) + " died."); + } + +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/economy/EconomyHandler.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/economy/EconomyHandler.java new file mode 100644 index 0000000..e947b38 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/economy/EconomyHandler.java @@ -0,0 +1,102 @@ +package net.frozenorb.foxtrot.economy; + +import cc.fyre.proton.Proton; +import lombok.Getter; +import net.frozenorb.foxtrot.Foxtrot; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerQuitEvent; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.CompletableFuture; + +/** + * @author xanderume@gmail.com + */ +public class EconomyHandler { + + private Foxtrot instance; + + @Getter + private Map balances = new HashMap<>(); + + public EconomyHandler(Foxtrot instance) { + this.instance = instance; + + instance.getServer().getPluginManager().registerEvents(new Listener() { + @EventHandler() + public void onPlayerQuit(PlayerQuitEvent event) { + instance.getServer().getScheduler().runTaskAsynchronously(instance,() -> save(event.getPlayer().getUniqueId())); + } + + },instance); + + Proton.getInstance().runRedisCommand((redis) -> { + + redis.keys("balance.*").forEach(it -> { + final UUID uuid = UUID.fromString(it.substring(8)); + + balances.put(uuid,Double.parseDouble(redis.get(it))); + }); + + return null; + }); + + } + + public void setBalance(UUID uuid, double balance) { + this.balances.put(uuid, balance); + this.instance.getServer().getScheduler().runTaskAsynchronously(this.instance, () -> save(uuid)); + } + + public double getBalance(UUID uuid) { + + if (!this.balances.containsKey(uuid)) { + load(uuid); + } + + return balances.get(uuid); + } + + public void withdraw(UUID uuid, double amount) { + setBalance(uuid,getBalance(uuid) - amount); + this.instance.getServer().getScheduler().runTaskAsynchronously(this.instance, () -> save(uuid)); + } + + public void deposit(UUID uuid, double amount) { + setBalance(uuid,getBalance(uuid) + amount); + this.instance.getServer().getScheduler().runTaskAsynchronously(this.instance, () -> save(uuid)); + } + + private double load(UUID uuid) { + return CompletableFuture.supplyAsync(() -> Proton.getInstance().runRedisCommand((redis) -> { + + double balance = 0.0; + + if (redis.exists("balance." + uuid.toString())) { + balance = Double.parseDouble(redis.get("balance." + uuid.toString())); + } + + this.balances.put(uuid,balance); + + return balance; + })).join(); + } + + private void save(UUID uuid) { + Proton.getInstance().runRedisCommand((redis) -> redis.set("balance." + uuid.toString(), String.valueOf(getBalance(uuid)))); + } + + public void save() { + Proton.getInstance().runRedisCommand((redis) -> { + + for (Map.Entry entry : this.balances.entrySet()) { + redis.set("balance." + entry.getKey().toString(),String.valueOf(entry.getValue())); + } + + return null; + }); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/Ability.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/Ability.java new file mode 100644 index 0000000..2364bbe --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/Ability.java @@ -0,0 +1,156 @@ +package net.frozenorb.foxtrot.gameplay.ability; + +import cc.fyre.proton.util.ItemBuilder; +import cc.fyre.proton.util.TimeUtils; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.events.mini.MiniEvent; +import net.frozenorb.foxtrot.team.Team; +import net.frozenorb.foxtrot.util.CC; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.Listener; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public abstract class Ability implements Listener { + + public Ability() { + final List finalLore = new ArrayList<>(this.getLore()); + + if (this.inPartnerPackage() && Foxtrot.getInstance().getMapHandler().isKitMap()) { + this.getLore().stream().filter(it -> it.contains(ChatColor.WHITE + "Can be found in")).forEach(it -> { + int index = this.getLore().indexOf(it); + + finalLore.remove(it); + finalLore.add(index, ChatColor.translate("&fCan be found in a &d&lPartner Package&f!")); + }); + } + + this.hassanStack = ItemBuilder.of(this.getMaterial()) + .name(this.getDisplayName() == null ? this.getName() : this.getDisplayName()) + .setLore(this.getLore() == null ? new ArrayList<>() : finalLore) + .build(); + + this.fullDescription = this.getDescription(); + + Foxtrot.getInstance().getServer().getPluginManager().registerEvents(this, Foxtrot.getInstance()); + } + + public abstract String getName(); + public abstract Material getMaterial(); + public abstract String getDisplayName(); + public abstract List getLore(); + public abstract Boolean isAllowedAtLocation(Location location); + public abstract long getCooldown(); + public abstract Category getCategory(); + public abstract String getDescription(); + + public boolean inPartnerPackage() { + return false; + } + + public ItemStack hassanStack; + public String fullDescription; + + public boolean isSimilar(ItemStack itemStack) { + + if (itemStack == null || itemStack.getItemMeta() == null || itemStack.getType() == Material.AIR) { + return false; + } + + if (itemStack.getItemMeta().getDisplayName() == null) { + return false; + } + + if (itemStack.getItemMeta().getLore() == null || itemStack.getItemMeta().getLore().isEmpty()) { + return false; + } + + return itemStack.getType() == this.getMaterial() && ChatColor.stripColor(itemStack.getItemMeta().getDisplayName()).startsWith(ChatColor.stripColor(this.hassanStack.getItemMeta().getDisplayName())) && itemStack.getItemMeta().getLore().get(0).equals(this.getLore().get(0)); + } + + public void removeCooldown(Player player) { + AbilityHandler.getCooldown().remove(player.getUniqueId(), this); + } + + public void applyCooldown(Player player) { + player.sendMessage(""); + player.sendMessage(ChatColor.DARK_RED + ChatColor.BOLD.toString() + "Ability Items"); + player.sendMessage(ChatColor.translate("&7You have activated the &f" + this.getDisplayName() + "&7!")); + player.sendMessage(ChatColor.RED + ChatColor.translate(this.fullDescription)); + player.sendMessage(""); + + if (player.hasMetadata("DEBUG")) { + player.sendMessage(ChatColor.RED + "Skipped cooldown as you had Debug mode enabled!"); + return; + } + + Foxtrot.getInstance().getMapHandler().getAbilityHandler().applyCooldown(this, player); + } + + public void applyCooldown(Team team, Player target) { + team.sendMessage(ChatColor.translate(target.getName() + " &chas used &f" + this.getDisplayName() + " &cand put your entire team on cooldown for &l" + TimeUtils.formatIntoDetailedString((int) (this.getCooldown() / 1000)))); + + target.sendMessage(""); + target.sendMessage(ChatColor.DARK_RED + ChatColor.BOLD.toString() + "Ability Items"); + target.sendMessage(ChatColor.translate("&7You have activated the &f" + this.getDisplayName() + "&7!")); + target.sendMessage(ChatColor.RED + ChatColor.translate(this.fullDescription)); + target.sendMessage(""); + + for (Player onlineMember : team.getOnlineMembers()) { + if (onlineMember.hasMetadata("DEBUG")) { + onlineMember.sendMessage(ChatColor.RED + "Skipped cooldown as you had Debug mode enabled!"); + return; + } + + Foxtrot.getInstance().getMapHandler().getAbilityHandler().applyCooldown(this, onlineMember); + } + } + + public void applyCooldown(Team team, Player target, long time) { + team.sendMessage(ChatColor.translate(target.getName() + " &chas used &f" + this.getDisplayName() + " &cand put your entire team on cooldown for &l" + TimeUtils.formatIntoDetailedString((int) (time / 1000)))); + + target.sendMessage(""); + target.sendMessage(ChatColor.DARK_RED + ChatColor.BOLD.toString() + "Ability Items"); + target.sendMessage(ChatColor.translate("&7You have activated the &f" + this.getDisplayName() + "&7!")); + target.sendMessage(ChatColor.RED + ChatColor.translate(this.fullDescription)); + target.sendMessage(""); + + for (Player onlineMember : team.getOnlineMembers()) { + if (onlineMember.hasMetadata("DEBUG")) { + onlineMember.sendMessage(ChatColor.RED + "Skipped cooldown as you had Debug mode enabled!"); + return; + } + + Foxtrot.getInstance().getMapHandler().getAbilityHandler().applyCooldown(this, onlineMember, time); + } + } + + public boolean hasCooldown(Player player) { + return this.hasCooldown(player, true); + } + + public boolean hasCooldown(Player player, boolean sendMessage) { + + final long current = Foxtrot.getInstance().getMapHandler().getAbilityHandler().getRemaining(this, player); + + if (current <= 0) { + return false; + } + + if (sendMessage) { + player.sendMessage(ChatColor.RED + "You cannot use the " + this.getDisplayName() + ChatColor.RED + " for another " + ChatColor.BOLD + TimeUtils.formatIntoDetailedString((int) (current / 1000)) + ChatColor.RED + "."); + } + + return true; + } + + public long getRemaining(Player player) { + return Foxtrot.getInstance().getMapHandler().getAbilityHandler().getRemaining(this, player); + } + +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/AbilityHandler.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/AbilityHandler.java new file mode 100644 index 0000000..05b73cb --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/AbilityHandler.java @@ -0,0 +1,246 @@ +package net.frozenorb.foxtrot.gameplay.ability; + +import cc.fyre.piston.util.Cooldown; +import cc.fyre.proton.Proton; +import cc.fyre.proton.command.Command; +import cc.fyre.proton.command.param.Parameter; +import cc.fyre.proton.util.ClassUtils; +import com.comphenix.protocol.ProtocolLibrary; +import net.frozenorb.foxtrot.team.Team; +import net.minecraft.util.com.google.common.collect.HashBasedTable; +import net.minecraft.util.com.google.common.collect.Table; +import com.lunarclient.bukkitapi.LunarClientAPI; +import com.lunarclient.bukkitapi.cooldown.LCCooldown; +import com.lunarclient.bukkitapi.nethandler.client.LCPacketCooldown; +import lombok.Getter; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.ability.listener.AbilityListener; +import net.frozenorb.foxtrot.gameplay.ability.menu.TradeMenu; +import net.frozenorb.foxtrot.gameplay.ability.packet.InvisibilityPacketAdapter; +import net.frozenorb.foxtrot.gameplay.ability.parameter.AbilityParameter; +import net.frozenorb.foxtrot.gameplay.armorclass.ArmorClass; +import net.frozenorb.foxtrot.gameplay.events.mini.MiniEvent; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.command.CommandSender; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.cavepvp.suge.Suge; + +import java.io.File; +import java.io.IOException; +import java.util.*; +import java.util.concurrent.TimeUnit; + +@SuppressWarnings("UnstableApiUsage") +public class AbilityHandler { + + @Getter + private final Map usedItems = new HashMap<>(); + @Getter + private final Map abilities = new HashMap<>(); + @Getter + private final Table lastUsedItem = HashBasedTable.create(); + + @Getter private final Map globalCooldowns = new HashMap<>(); + + @Getter private final List tradeAbleItems = new ArrayList<>(); + + @Getter + public static final Table cooldown = HashBasedTable.create(); + + private File file; + private FileConfiguration data; + + public AbilityHandler(Foxtrot instance) { + for (Class clazz : ClassUtils.getClassesInPackage(Foxtrot.getInstance(), "net.frozenorb.foxtrot.gameplay.ability.type")) { + + if (!Ability.class.isAssignableFrom(clazz)) { + continue; + } + + try { + final Ability ability = (Ability) clazz.newInstance(); + + this.abilities.put(ability.getName(), ability); + } catch (InstantiationException | IllegalAccessException ex) { + ex.printStackTrace(); + } + } + + instance.getServer().getPluginManager().registerEvents(new AbilityListener(Foxtrot.getInstance(), this), instance); + Proton.getInstance().getCommandHandler().registerParameterType(Ability.class, new AbilityParameter()); + ProtocolLibrary.getProtocolManager().addPacketListener(new InvisibilityPacketAdapter()); + instance.getServer().getScheduler().runTaskLater(instance, this::loadStatistics, 20); + } + + public void loadStatistics() { + this.file = new File(Foxtrot.getInstance().getDataFolder(), "data/ability-stats.yml"); + this.data = YamlConfiguration.loadConfiguration(this.file); + + if (!this.file.exists()) { + try { + this.file.createNewFile(); + } catch (IOException e) { + e.printStackTrace(); + } + return; + } + + if (this.data.get("abilities") == null) { + return; + } + + for (String key : data.getConfigurationSection("abilities").getKeys(false)) { + final Ability ability = this.fromName(key); + + if (ability == null) { + continue; + } + + this.usedItems.put(ability, data.getInt("abilities." + key)); + } + } + + public void saveStatistics() { + Map configValues = this.data.getValues(false); + for (Map.Entry entry : configValues.entrySet()) + this.data.set(entry.getKey(), null); + + for (Map.Entry abilityIntegerEntry : this.usedItems.entrySet()) { + this.data.set("abilities." + abilityIntegerEntry.getKey().getName(), +abilityIntegerEntry.getValue()); + } + + try { + this.data.save(this.file); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public Ability fromName(String name) { + return this.abilities.values().stream().filter(ability -> ability.getName().equalsIgnoreCase(name)).findAny().orElse(null); + } + + @Command( + names = {"ability"}, + permission = "foxtrot.command.ability" + ) + public static void execute(CommandSender sender, + @Parameter(name = "ability") Ability ability, + @Parameter(name = "amount", defaultValue = "1") int amount, + @Parameter(name = "player", defaultValue = "self") Player target) { + final ItemStack itemStack = ability.hassanStack.clone(); + + if (ability.getName().equalsIgnoreCase("Backpack")) { + + for (int i = 0; i < amount; i++) { + final ItemStack theStack = ability.hassanStack.clone(); + final ItemMeta itemMeta = theStack.getItemMeta(); + final List lore = itemMeta.getLore(); + lore.add(ChatColor.GRAY + "Identifier: " + ChatColor.WHITE + UUID.randomUUID()); + itemMeta.setLore(lore); + theStack.setItemMeta(itemMeta); + target.getInventory().addItem(theStack.clone()); + } + return; + } + + itemStack.setAmount(amount); + target.getInventory().addItem(itemStack); + + } + + @Command(names = {"ability reset"}, permission = "foxtrot.command.ability.reset") + public static void reset(Player player, @Parameter(name = "ability") Ability ability) { + if (!getCooldown().contains(player.getUniqueId(), ability)) { + player.sendMessage(ChatColor.RED + "You don't have a cooldown for " + ability.getDisplayName() + ChatColor.RED + "."); + return; + } + + getCooldown().remove(player.getUniqueId(), ability); + + player.sendMessage(ChatColor.RED + "Removed cooldown for the " + ability.getDisplayName() + ChatColor.RED + "."); + } + + public void applyCooldown(Ability ability, Player player) { + applyCooldown(ability, player, ability.getCooldown()); + } + + public void applyCooldown(Ability ability, Player player, long cooldownTime) { + this.usedItems.putIfAbsent(ability, 0); + this.usedItems.replace(ability, this.usedItems.get(ability) + 1); + + if (ability.getCooldown() <= 0) { + return; + } + + final Team team = Foxtrot.getInstance().getTeamHandler().getTeam(player); + final ArmorClass armorClass = Foxtrot.getInstance().getArmorClassHandler().findWearing(player); + + if (Foxtrot.getInstance().getMiniEventsHandler() != null && Foxtrot.getInstance().getMiniEventsHandler().getActiveEvent() != null) { + final MiniEvent miniEvent = Foxtrot.getInstance().getMiniEventsHandler().getActiveEvent(); + + cooldownTime = miniEvent.getEventID().equalsIgnoreCase("Rage") ? cooldownTime/2 : cooldownTime; + } else if (armorClass != null && armorClass.getId().equalsIgnoreCase("Raider")) { + cooldownTime *= 0.85; + } else if (Foxtrot.getInstance().getNetworkBoosterHandler() != null && Foxtrot.getInstance().getNetworkBoosterHandler().isFrenzy()) { + cooldownTime *= 0.75; + } + + if (team != null && team.hasRoadOutpost()) { + cooldownTime *= 0.75; + } + + if (player.hasMetadata("NO_COOLDOWN")) { + cooldownTime = 0; + } + + LunarClientAPI.getInstance().sendPacket(player, new LCPacketCooldown(ability.getName(), cooldownTime, ability.getMaterial().getId()));; + + cooldown.put(player.getUniqueId(), ability, new Cooldown(cooldownTime)); + } + + @Command(names = {"tradeitem"}, permission = "") + public static void tradeItem(Player player) { + final ItemStack itemStack = player.getItemInHand().clone(); + + if (itemStack == null || itemStack.getType() == Material.AIR) { + player.sendMessage(ChatColor.RED + "You don't have an item in your hand!"); + return; + } + + final Ability ability = Foxtrot.getInstance().getMapHandler().getAbilityHandler().getAbilities().values().stream().filter(it -> it.isSimilar(itemStack)).findFirst().orElse(null); + + if (ability == null) { + player.sendMessage(ChatColor.RED + "You must have an ability item in your hand!"); + return; + } + + if (!Foxtrot.getInstance().getMapHandler().getAbilityHandler().getTradeAbleItems().contains(ability)) { + player.sendMessage(ChatColor.RED + "This ability item may not be traded!"); + return; + } + + new TradeMenu(itemStack, ability).openMenu(player); + } + + public boolean hasCooldown(Ability ability, Player player) { + if (!cooldown.contains(player.getUniqueId(), ability)) { + return false; + } + + return !cooldown.get(player.getUniqueId(), ability).hasExpired(); + } + + public long getRemaining(Ability ability, Player player) { + if (!cooldown.contains(player.getUniqueId(), ability)) { + return 0L; + } + + return cooldown.get(player.getUniqueId(), ability).getRemaining(); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/Category.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/Category.java new file mode 100644 index 0000000..ca0d06e --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/Category.java @@ -0,0 +1,34 @@ +package net.frozenorb.foxtrot.gameplay.ability; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.bukkit.ChatColor; +import org.bukkit.Material; + +@AllArgsConstructor +public enum Category { + KIT_MAP("", "", Material.AIR, (byte) 0, 0), + PORTABLE_BARD("", "", Material.AIR, (byte) 0, 0), + PARTNER_CRATE(ChatColor.translate("&a&lPartner Items"), "Partner Items", Material.EYE_OF_ENDER, (byte) 5, 11), + AIRDROPS(ChatColor.translate("&b&lAirdrop"), "Airdrop", Material.DROPPER, (byte) 3, 12), + SEASONAL_CRATE(ChatColor.translate("&4&l3.0 Crate"), "3.0 Crate", Material.TRIPWIRE_HOOK, (byte) 2, 14), + SEASONAL_LOOTBOX(ChatColor.translate("&c&lIndependence &b&lDay &f&lLootbox"), "Seasonal Lootbox", Material.CHEST, (byte) 2, 15), + TREASURE_CHEST(ChatColor.translate("&e&lTreasure Chest"), "Treasure Chest", Material.ENDER_CHEST, (byte) 13, 16), + ALL(ChatColor.translate("&4&lView All"), "View All", Material.NETHER_STAR, (byte) 0, 13); + + @Getter String displayName; + @Getter String simpleName; + @Getter Material displayItem; + @Getter byte glassData; + @Getter int slot; + + public boolean isCategory(Ability ability, Category category) { + + if (ability.getCategory() == category) { + return true; + } + + return category == ALL; + } + +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/listener/AbilityListener.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/listener/AbilityListener.java new file mode 100644 index 0000000..98ac78e --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/listener/AbilityListener.java @@ -0,0 +1,82 @@ +package net.frozenorb.foxtrot.gameplay.ability.listener; + +import cc.fyre.proton.util.TimeUtils; +import lombok.AllArgsConstructor; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.ability.Ability; +import net.frozenorb.foxtrot.gameplay.ability.AbilityHandler; +import net.frozenorb.foxtrot.gameplay.ability.listener.events.AbilityUseEvent; +import net.frozenorb.foxtrot.team.Team; +import net.frozenorb.foxtrot.team.claims.LandBoard; +import net.frozenorb.foxtrot.team.event.TeamEnterClaimEvent; + +import org.bukkit.ChatColor; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.Sound; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerPickupItemEvent; +import org.bukkit.inventory.ItemStack; + +import java.util.concurrent.TimeUnit; + +@AllArgsConstructor +public class AbilityListener implements Listener { + private Foxtrot instance; + private AbilityHandler abilityHandler; + + @EventHandler(priority = EventPriority.LOW) + private void onUse(AbilityUseEvent event) { + final Player player = event.getPlayer(); + final Ability ability = event.getAbility(); + + if (ability.hasCooldown(player)) { + event.setCancelled(true); + return; + } + + final Location blockAt = event.getChosenLocation(); + + if (blockAt.getWorld().getName().equalsIgnoreCase("sg")) { + return; + } + + if (!ability.isAllowedAtLocation(blockAt)) { + String teamName; + + final Team ownerTeam = LandBoard.getInstance().getTeam(blockAt); + + if (ownerTeam != null) { + teamName = ownerTeam.getName(player); + } else if (!Foxtrot.getInstance().getServerHandler().isWarzone(blockAt)) { + teamName = ChatColor.GRAY + "The Wilderness"; + } else { + teamName = ChatColor.DARK_RED + "WarZone"; + } + + player.sendMessage(ChatColor.RED + "You cannot use a " + ability.getDisplayName() + ChatColor.RED + " in " + teamName + ChatColor.RED + "."); + event.setCancelled(true); + return; + } + + if (event.isOneHit()) { + return; + } + + if (Foxtrot.getInstance().getNetworkBoosterHandler().isFrenzy() || LandBoard.getInstance().getTeam(player.getLocation()) != null && LandBoard.getInstance().getTeam(player.getLocation()).isRaidable()) { + return; + } + + if (abilityHandler.getGlobalCooldowns().containsKey(player.getUniqueId()) && abilityHandler.getGlobalCooldowns().get(player.getUniqueId()) > System.currentTimeMillis()) { + final long difference = abilityHandler.getGlobalCooldowns().get(player.getUniqueId()) - System.currentTimeMillis(); + + player.sendMessage(ChatColor.translate("&cYou may not use any ability items for another &l" + TimeUtils.formatIntoDetailedString((int) (difference / 1000)) + "&c.")); + event.setCancelled(true); + } + +// abilityHandler.getGlobalCooldowns().put(player.getUniqueId(), System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(5)); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/listener/events/AbilityUseEvent.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/listener/events/AbilityUseEvent.java new file mode 100644 index 0000000..79c2708 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/listener/events/AbilityUseEvent.java @@ -0,0 +1,48 @@ +package net.frozenorb.foxtrot.gameplay.ability.listener.events; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; +import net.frozenorb.foxtrot.gameplay.ability.Ability; +import net.frozenorb.foxtrot.team.Team; +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.Cancellable; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +@Getter +@Setter +public class AbilityUseEvent extends Event implements Cancellable { + @Getter private static final HandlerList handlerList = new HandlerList(); + + private final Player player; + private final Player target; + private final Location chosenLocation; + private final Ability ability; + private boolean cancelled; + private boolean oneHit; + + public AbilityUseEvent(Player player, Player target, Location chosenLocation, Ability ability, boolean oneHit) { + this.player = player; + this.target = target; + this.chosenLocation = chosenLocation; + this.ability = ability; + this.oneHit = oneHit; + } + + @Override + public HandlerList getHandlers() { + return handlerList; + } + + @Override + public boolean isCancelled() { + return cancelled; + } + + @Override + public void setCancelled(boolean b) { + this.cancelled = b; + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/menu/PartnerItemMainMenu.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/menu/PartnerItemMainMenu.java new file mode 100644 index 0000000..035af1e --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/menu/PartnerItemMainMenu.java @@ -0,0 +1,70 @@ +package net.frozenorb.foxtrot.gameplay.ability.menu; + +import cc.fyre.proton.menu.Button; +import cc.fyre.proton.menu.Menu; +import net.frozenorb.foxtrot.gameplay.ability.Category; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class PartnerItemMainMenu extends Menu { + @Override + public String getTitle(Player player) { + return "Partner Items"; + } + + @Override + public Map getButtons(Player player) { + final Map toReturn = new HashMap<>(); + + for (int i = 0; i < 27; i++) { + toReturn.put(i, Button.placeholder(Material.STAINED_GLASS_PANE, (byte)14, "")); + } + + toReturn.put(10, Button.placeholder(Material.STAINED_GLASS_PANE, (byte)7, "")); + toReturn.put(16, Button.placeholder(Material.STAINED_GLASS_PANE, (byte)7, "")); + + for (Category value : Category.values()) { + + if (value == Category.KIT_MAP || value == Category.PORTABLE_BARD) { + continue; + } + + toReturn.put(value.getSlot(), new Button() { + @Override + public String getName(Player player) { + return value.getDisplayName(); + } + + @Override + public List getDescription(Player player) { + final List toReturn = new ArrayList<>(); + + toReturn.add(""); + toReturn.add(ChatColor.GREEN + "Click to view all ability items in this category"); + + return toReturn; + } + + @Override + public Material getMaterial(Player player) { + return value.getDisplayItem(); + } + + @Override + public void clicked(Player player, int slot, ClickType clickType) { + new PartnerItemMenu(value).openMenu(player); + } + }); + } + + + return toReturn; + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/menu/PartnerItemMenu.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/menu/PartnerItemMenu.java new file mode 100644 index 0000000..27f79b5 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/menu/PartnerItemMenu.java @@ -0,0 +1,137 @@ +package net.frozenorb.foxtrot.gameplay.ability.menu; + +import cc.fyre.proton.menu.Button; +import cc.fyre.proton.menu.Menu; +import cc.fyre.proton.menu.pagination.PaginatedMenu; +import lombok.AllArgsConstructor; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.ability.Ability; +import net.frozenorb.foxtrot.gameplay.ability.Category; +import net.frozenorb.foxtrot.gameplay.ability.menu.page.ItemPaginatedMenu; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; +import org.bukkit.inventory.ItemStack; +import org.cavepvp.profiles.menu.FriendsMenu; +import org.cavepvp.profiles.menu.MenuType; +import org.cavepvp.profiles.menu.ProfilesSharedButtons; + +import java.util.*; + +@AllArgsConstructor +public class PartnerItemMenu extends Menu { + private Category category; + + @Override + public String getTitle(Player player) { + return category.getSimpleName(); + } + + @Override + public Map getButtons(Player player) { + final Map toReturn = new HashMap<>(); + + final List abilities = new ArrayList<>(); + + for (Ability value : Foxtrot.getInstance().getMapHandler().getAbilityHandler().getAbilities().values()) { + + if (!category.isCategory(value, category)) { + continue; + } + + if (value.getCategory() == Category.PORTABLE_BARD) { + continue; + } + + if (!Foxtrot.getInstance().getMapHandler().isKitMap() && value.getCategory() == Category.KIT_MAP) { + continue; + } + + abilities.add(value); + } + + int rows = (int) Math.ceil(abilities.size()/8)+3; + + for (int i = 0; i < (rows*9); i++) { + toReturn.put(i, Button.placeholder(Material.STAINED_GLASS_PANE, category.getGlassData(), "")); + } + + toReturn.put(0, Button.placeholder(Material.STAINED_GLASS_PANE, category.getGlassData(), "")); + + toReturn.put(4, new Button() { + @Override + public String getName(Player player) { + return ChatColor.DARK_RED + ChatColor.BOLD.toString() + "View All"; + } + + @Override + public List getDescription(Player player) { + return Arrays.asList("", ChatColor.RED + "Click to go back to the main menu"); + } + + @Override + public Material getMaterial(Player player) { + return Material.NETHER_STAR; + } + + @Override + public void clicked(Player player, int slot, ClickType clickType) { + new PartnerItemMainMenu().openMenu(player); + } + }); + + int i = 0; + int addition = 9; + for (Ability value : Foxtrot.getInstance().getMapHandler().getAbilityHandler().getAbilities().values()) { + + if (!category.isCategory(value, category)) { + continue; + } + + if (value.getCategory() == Category.PORTABLE_BARD || !Foxtrot.getInstance().getMapHandler().isKitMap() && value.getCategory() == Category.KIT_MAP) { + continue; + } + + i++; + + if (i % 8 == 0) { + i = 1; + addition += 9; + } + + toReturn.put(i+addition, new Button() { + @Override + public String getName(Player player) { + return null; + } + + @Override + public List getDescription(Player player) { + return null; + } + + @Override + public Material getMaterial(Player player) { + return null; + } + + @Override + public ItemStack getButtonItem(Player player) { + return value.hassanStack.clone(); + } + + @Override + public void clicked(Player player, int slot, ClickType clickType) { + + if (player.isOp()) { + player.getInventory().addItem(value.hassanStack.clone()); + } + + } + }); + } + + return toReturn; + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/menu/PortableBardMenu.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/menu/PortableBardMenu.java new file mode 100644 index 0000000..3aeb300 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/menu/PortableBardMenu.java @@ -0,0 +1,321 @@ +package net.frozenorb.foxtrot.gameplay.ability.menu; + +import cc.fyre.proton.menu.Button; +import cc.fyre.proton.menu.Menu; +import cc.fyre.proton.util.ItemBuilder; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.ability.type.portablebard.*; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; +import org.bukkit.inventory.ItemStack; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class PortableBardMenu extends Menu { + @Override + public Map getButtons(Player player) { + final Map toReturn = new HashMap<>(); + + for (int i = 0; i < 27; i++) { + toReturn.put(i, new Button() { + @Override + public ItemStack getButtonItem(Player player) { + return ItemBuilder.of(Material.STAINED_GLASS_PANE).data((byte)7).name("").build(); + } + + @Override + public String getName(Player player) { + return null; + } + + @Override + public List getDescription(Player player) { + return null; + } + + @Override + public Material getMaterial(Player player) { + return null; + } + }); + } + + + toReturn.put(11, new Button() { + @Override + public String getName(Player player) { + return null; + } + + @Override + public List getDescription(Player player) { + return null; + } + + @Override + public Material getMaterial(Player player) { + return null; + } + + @Override + public ItemStack getButtonItem(Player player) { + return ItemBuilder.of(Material.BLAZE_POWDER).name(ChatColor.DARK_RED + ChatColor.BOLD.toString() + "Portable Strength") + .setLore(Arrays.asList(ChatColor.GRAY + "Give yourself and your teammates", ChatColor.GRAY + "around you Strength 2 for 5 seconds", "", ChatColor.GREEN + "Click here to get the Portable Strength item.")).build(); + } + + @Override + public void clicked(Player player, int i, ClickType clickType) { + final ItemStack itemInHand = player.getItemInHand(); + + if (itemInHand == null || itemInHand.getType() == Material.AIR || !Foxtrot.getInstance().getMapHandler().getAbilityHandler().fromName("PortableBard").isSimilar(itemInHand)) { + player.closeInventory(); + player.sendMessage(ChatColor.RED + "You don't have anymore portable bards to transfer!"); + return; + } + + if (itemInHand.getAmount() == 1) { + player.closeInventory(); + player.setItemInHand(null); + } else { + itemInHand.setAmount(itemInHand.getAmount()-1); + } + + final ItemStack itemStack = PortableStrength.itemStack.clone(); + + itemStack.setAmount(5); + + if (player.getInventory().firstEmpty() == -1) { + player.getWorld().dropItemNaturally(player.getLocation(), itemStack); + } else { + player.getInventory().addItem(itemStack); + } + + player.sendMessage(ChatColor.GREEN + "You have been given Portable Strength!"); + } + }); + toReturn.put(12, new Button() { + @Override + public String getName(Player player) { + return null; + } + + @Override + public List getDescription(Player player) { + return null; + } + + @Override + public Material getMaterial(Player player) { + return null; + } + + @Override + public ItemStack getButtonItem(Player player) { + return ItemBuilder.of(Material.GHAST_TEAR).name(ChatColor.DARK_RED + ChatColor.BOLD.toString() + "Portable Regeneration") + .setLore(Arrays.asList(ChatColor.GRAY + "Give yourself and your teammates", ChatColor.GRAY + "around you Regeneration 3 for 5 seconds", "", ChatColor.GREEN + "Click here to get the Portable Regeneration item.")).build(); + } + + @Override + public void clicked(Player player, int i, ClickType clickType) { + final ItemStack itemInHand = player.getItemInHand(); + + if (itemInHand == null || itemInHand.getType() == Material.AIR || !Foxtrot.getInstance().getMapHandler().getAbilityHandler().fromName("PortableBard").isSimilar(itemInHand)) { + player.closeInventory(); + player.sendMessage(ChatColor.RED + "You don't have anymore portable bards to transfer!"); + return; + } + + if (itemInHand.getAmount() == 1) { + player.closeInventory(); + player.setItemInHand(null); + } else { + itemInHand.setAmount(itemInHand.getAmount()-1); + } + + final ItemStack itemStack = PortableRegeneration.itemStack.clone(); + + itemStack.setAmount(5); + + if (player.getInventory().firstEmpty() == -1) { + player.getWorld().dropItemNaturally(player.getLocation(), itemStack); + } else { + player.getInventory().addItem(itemStack); + } + + player.sendMessage(ChatColor.GREEN + "You have been given Portable Regeneration!"); + } + }); + + toReturn.put(13, new Button() { + @Override + public String getName(Player player) { + return null; + } + + @Override + public List getDescription(Player player) { + return null; + } + + @Override + public Material getMaterial(Player player) { + return null; + } + + @Override + public ItemStack getButtonItem(Player player) { + return ItemBuilder.of(Material.FEATHER).name(ChatColor.DARK_RED + ChatColor.BOLD.toString() + "Portable Jump Boost") + .setLore(Arrays.asList(ChatColor.GRAY + "Give yourself and your teammates", ChatColor.GRAY + "around you Jump Boost 7 for 5 seconds", "", ChatColor.GREEN + "Click here to get the Portable Jump Boost item.")).build(); + } + + @Override + public void clicked(Player player, int i, ClickType clickType) { + final ItemStack itemInHand = player.getItemInHand(); + + if (itemInHand == null || itemInHand.getType() == Material.AIR || !Foxtrot.getInstance().getMapHandler().getAbilityHandler().fromName("PortableBard").isSimilar(itemInHand)) { + player.closeInventory(); + player.sendMessage(ChatColor.RED + "You don't have anymore portable bards to transfer!"); + return; + } + + if (itemInHand.getAmount() == 1) { + player.closeInventory(); + player.setItemInHand(null); + } else { + itemInHand.setAmount(itemInHand.getAmount()-1); + } + + final ItemStack itemStack = PortableJumpBoost.itemStack.clone(); + + itemStack.setAmount(5); + + if (player.getInventory().firstEmpty() == -1) { + player.getWorld().dropItemNaturally(player.getLocation(), itemStack); + } else { + player.getInventory().addItem(itemStack); + } + + player.sendMessage(ChatColor.GREEN + "You have been given Portable Jump Boost!"); + } + }); + + toReturn.put(14, new Button() { + @Override + public String getName(Player player) { + return null; + } + + @Override + public List getDescription(Player player) { + return null; + } + + @Override + public Material getMaterial(Player player) { + return null; + } + + @Override + public ItemStack getButtonItem(Player player) { + return ItemBuilder.of(Material.SUGAR).name(ChatColor.DARK_RED + ChatColor.BOLD.toString() + "Portable Speed") + .setLore(Arrays.asList(ChatColor.GRAY + "Give yourself and your teammates", ChatColor.GRAY + "around you Speed 3 for 5 seconds", "", ChatColor.GREEN + "Click here to get the Portable Speed item.")).build(); + } + + @Override + public void clicked(Player player, int i, ClickType clickType) { + final ItemStack itemInHand = player.getItemInHand(); + + if (itemInHand == null || itemInHand.getType() == Material.AIR || !Foxtrot.getInstance().getMapHandler().getAbilityHandler().fromName("PortableBard").isSimilar(itemInHand)) { + player.closeInventory(); + player.sendMessage(ChatColor.RED + "You don't have anymore portable bards to transfer!"); + return; + } + + if (itemInHand.getAmount() == 1) { + player.closeInventory(); + player.setItemInHand(null); + } else { + itemInHand.setAmount(itemInHand.getAmount()-1); + } + + final ItemStack itemStack = PortableSpeed.itemStack.clone(); + + itemStack.setAmount(5); + + if (player.getInventory().firstEmpty() == -1) { + player.getWorld().dropItemNaturally(player.getLocation(), itemStack); + } else { + player.getInventory().addItem(itemStack); + } + + player.sendMessage(ChatColor.GREEN + "You have been given a Portable Speed!"); + } + }); + + toReturn.put(15, new Button() { + @Override + public String getName(Player player) { + return null; + } + + @Override + public List getDescription(Player player) { + return null; + } + + @Override + public Material getMaterial(Player player) { + return null; + } + + @Override + public ItemStack getButtonItem(Player player) { + return ItemBuilder.of(Material.IRON_INGOT).name(ChatColor.DARK_RED + ChatColor.BOLD.toString() + "Portable Resistance") + .setLore(Arrays.asList(ChatColor.GRAY + "Give yourself and your teammates", ChatColor.GRAY + "around you Strength 2 for 5 seconds", "", ChatColor.GREEN + "Click here to get the Portable Resistance item..")).build(); + } + + @Override + public void clicked(Player player, int i, ClickType clickType) { + final ItemStack itemInHand = player.getItemInHand(); + + if (itemInHand == null || itemInHand.getType() == Material.AIR || + !Foxtrot.getInstance().getMapHandler().getAbilityHandler().fromName("PortableBard").isSimilar(itemInHand)) { + player.closeInventory(); + player.sendMessage(ChatColor.RED + "You don't have anymore portable bards to transfer!"); + return; + } + + if (itemInHand.getAmount() == 1) { + player.closeInventory(); + player.setItemInHand(null); + } else { + itemInHand.setAmount(itemInHand.getAmount()-1); + } + + final ItemStack itemStack = PortableResistance.itemStack.clone(); + + itemStack.setAmount(5); + + if (player.getInventory().firstEmpty() == -1) { + player.getWorld().dropItemNaturally(player.getLocation(), itemStack); + } else { + player.getInventory().addItem(itemStack); + } + + player.sendMessage(ChatColor.GREEN + "You have been given Portable Resistance!"); + } + }); + + return toReturn; + } + + @Override + public String getTitle(Player player) { + return "Choose an effect"; + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/menu/TradeMenu.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/menu/TradeMenu.java new file mode 100644 index 0000000..dadeeb2 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/menu/TradeMenu.java @@ -0,0 +1,81 @@ +package net.frozenorb.foxtrot.gameplay.ability.menu; + +import cc.fyre.proton.menu.Button; +import cc.fyre.proton.menu.Menu; +import cc.fyre.proton.util.ItemBuilder; +import lombok.AllArgsConstructor; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.ability.Ability; +import net.frozenorb.foxtrot.gameplay.ability.Category; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; +import org.bukkit.inventory.ItemStack; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@AllArgsConstructor +public class TradeMenu extends Menu { + private ItemStack itemStack; + private Ability ability; + + @Override + public String getTitle(Player player) { + return "Pick another item"; + } + + @Override + public Map getButtons(Player player) { + final Map toReturn = new HashMap<>(); + + final Category category = ability.getCategory(); + + for (Ability chosen : Foxtrot.getInstance().getMapHandler().getAbilityHandler().getAbilities().values().stream().filter(it -> it.getCategory().equals(category)).collect(Collectors.toList())) { + toReturn.put(toReturn.size(), new Button() { + @Override + public String getName(Player player) { + return null; + } + + @Override + public List getDescription(Player player) { + return null; + } + + @Override + public Material getMaterial(Player player) { + return null; + } + + @Override + public ItemStack getButtonItem(Player player) { + return ItemBuilder.copyOf(chosen.hassanStack.clone()).amount(itemStack.getAmount()).build(); + } + + @Override + public void clicked(Player player, int slot, ClickType clickType) { + if (!player.getInventory().contains(itemStack)) { + player.sendMessage(ChatColor.RED + "You don't have enough items anymore!"); + return; + } + + int amount = itemStack.getAmount(); + + player.playSound(player.getLocation(), Sound.LEVEL_UP, 1, 1); + player.sendMessage(ChatColor.translate("&aTransferred " + ability.getDisplayName() + " &ato &f" + chosen.getDisplayName())); + player.closeInventory(); + + player.getInventory().remove(itemStack); + player.getInventory().addItem(ItemBuilder.copyOf(chosen.hassanStack.clone()).amount(amount).build()); + } + }); + } + + return toReturn; + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/menu/page/ItemPaginatedMenu.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/menu/page/ItemPaginatedMenu.java new file mode 100644 index 0000000..2d99d46 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/menu/page/ItemPaginatedMenu.java @@ -0,0 +1,108 @@ +package net.frozenorb.foxtrot.gameplay.ability.menu.page; + +import cc.fyre.proton.menu.Button; +import cc.fyre.proton.menu.Menu; +import lombok.Getter; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; + +import java.util.HashMap; +import java.util.Map; + +public abstract class ItemPaginatedMenu extends Menu { + + @Getter + private int page = 1; + + @Override + public String getTitle(Player player) { + return getPrePaginatedTitle(player) + " - " + page + "/" + getPages(player); + } + + /** + * Changes the page number + * + * @param player player viewing the inventory + * @param mod delta to modify the page number by + */ + public final void modPage(Player player, int mod) { + this.page += mod; + + this.getButtons().clear(); + this.openMenu(player); + } + + /** + * @param player player viewing the inventory + * @return + */ + public final int getPages(Player player) { + + final int buttonAmount = this.getAllPagesButtons(player).size(); + + return buttonAmount == 0 ? 1 : (int)Math.ceil((double)buttonAmount / (double)this.getMaxItemsPerPage(player)); + } + + @Override + public final Map getButtons(Player player) { + + final int minIndex = (int) ((double) (page - 1) * getMaxItemsPerPage(player)); + final int maxIndex = (int) ((double) (page) * getMaxItemsPerPage(player)); + + final HashMap buttons = new HashMap<>(); + + buttons.put(1, new PageButton(-1, this)); + buttons.put(7, new PageButton(1, this)); + + final Map global = getGlobalButtons(player); + + if (global != null) { + + for (Map.Entry gent : global.entrySet()) { + buttons.put(gent.getKey(), gent.getValue()); + } + + } + + int i = 0; + for (Map.Entry entry : getAllPagesButtons(player).entrySet()) { + int ind = entry.getKey(); + + i++; + + if (ind >= minIndex && ind < maxIndex) { + + ind -= (int) ((double) (getMaxItemsPerPage(player)) * (page - 1)) - 9; + + buttons.put(9+ind, entry.getValue()); + } + } + + return buttons; + } + + public int getMaxItemsPerPage(Player player) { + return 18; + } + + /** + * @param player player viewing the inventory + * @return a Map of buttons that returns items which will be present on all pages + */ + public Map getGlobalButtons(Player player) { + return null; + } + + /** + * @param player player viewing the inventory + * @return title of the inventory before the page number is added + */ + public abstract String getPrePaginatedTitle(Player player); + + /** + * @param player player viewing the inventory + * @return a map of buttons that will be paginated and spread across pages + */ + public abstract Map getAllPagesButtons(Player player); +} + diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/menu/page/PageButton.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/menu/page/PageButton.java new file mode 100644 index 0000000..3b5ad80 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/menu/page/PageButton.java @@ -0,0 +1,61 @@ +package net.frozenorb.foxtrot.gameplay.ability.menu.page; + +import cc.fyre.proton.menu.Button; +import lombok.AllArgsConstructor; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; +import org.cavepvp.profiles.menu.page.ProfilePaginatedMenu; + +import java.util.ArrayList; +import java.util.List; + +@AllArgsConstructor +public class PageButton extends Button { + private int mod; + private ItemPaginatedMenu menu; + + @Override + public void clicked(Player player, int i, ClickType clickType) { + if (this.hasNext(player)) { + this.menu.modPage(player, this.mod); + Button.playNeutral(player); + } else { + Button.playFail(player); + } + + } + + private boolean hasNext(Player player) { + + final int pg = this.menu.getPage() + this.mod; + + return pg > 0 && this.menu.getPages(player) >= pg; + } + + @Override + public String getName(Player player) { + + if (!this.hasNext(player)) { + return this.mod > 0 ? "§7Last page" : "§7First page"; + } else { + return this.mod > 0 ? "§a⟶" : "§c⟵"; + } + + } + + @Override + public List getDescription(Player player) { + return new ArrayList(); + } + + @Override + public byte getDamageValue(Player player) { + return (byte)(this.hasNext(player) ? 11 : 7); + } + + @Override + public Material getMaterial(Player player) { + return Material.CARPET; + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/packet/InvisibilityPacketAdapter.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/packet/InvisibilityPacketAdapter.java new file mode 100644 index 0000000..a1817d6 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/packet/InvisibilityPacketAdapter.java @@ -0,0 +1,47 @@ +package net.frozenorb.foxtrot.gameplay.ability.packet; + +import net.frozenorb.foxtrot.Foxtrot; +import com.comphenix.protocol.PacketType; +import com.comphenix.protocol.events.PacketAdapter; +import com.comphenix.protocol.events.PacketEvent; +import net.frozenorb.foxtrot.gameplay.ability.type.Invisibility; +import net.minecraft.server.v1_7_R4.ItemArmor; +import org.bukkit.Material; +import org.bukkit.craftbukkit.v1_7_R4.inventory.CraftItemStack; +import org.bukkit.inventory.ItemStack; + +/** + * @author xanderume@gmail.com + */ +public class InvisibilityPacketAdapter extends PacketAdapter { + + public InvisibilityPacketAdapter() { + super(Foxtrot.getInstance(), PacketType.Play.Server.ENTITY_EQUIPMENT); + } + + @Override + public void onPacketSending(PacketEvent event) { + + final Integer id = event.getPacket().getIntegers().read(0); + final ItemStack itemStack = event.getPacket().getItemModifier().read(0); + + if (itemStack == null || itemStack.getType() == Material.AIR) { + return; + } + + if (!(CraftItemStack.asNMSCopy(itemStack).getItem() instanceof ItemArmor)) { + return; + } + + Foxtrot.getInstance().getServer().getOnlinePlayers().stream().filter(it -> it.getEntityId() == id).findFirst().ifPresent(it -> { + + if (it.getActivePotionEffects().stream().noneMatch(effect -> effect.getType().equals(Invisibility.EFFECT.getType()) && effect.getAmplifier() == Invisibility.EFFECT.getAmplifier())) { + return; + } + + event.setCancelled(true); + }); + + } + +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/parameter/AbilityParameter.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/parameter/AbilityParameter.java new file mode 100644 index 0000000..91ac724 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/parameter/AbilityParameter.java @@ -0,0 +1,34 @@ +package net.frozenorb.foxtrot.gameplay.ability.parameter; + +import cc.fyre.proton.command.param.ParameterType; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.ability.Ability; +import com.mysql.jdbc.StringUtils; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +public class AbilityParameter implements ParameterType { + + @Override + public Ability transform(CommandSender commandSender, String s) { + + final Ability toReturn = Foxtrot.getInstance().getMapHandler().getAbilityHandler().fromName(s); + + if (toReturn == null) { + commandSender.sendMessage(ChatColor.RED + "Ability " + ChatColor.YELLOW + s + ChatColor.RED + " not found."); + return null; + } + + return toReturn; + } + + @Override + public List tabComplete(Player sender, Set flags, String source) { + return Foxtrot.getInstance().getMapHandler().getAbilityHandler().getAbilities().values().stream().filter(ability -> StringUtils.startsWithIgnoreCase(ability.getName(),source)).map(Ability::getName).collect(Collectors.toList()); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/AntiBlockup.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/AntiBlockup.java new file mode 100644 index 0000000..ffcbc37 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/AntiBlockup.java @@ -0,0 +1,272 @@ +package net.frozenorb.foxtrot.gameplay.ability.type; + +import cc.fyre.proton.util.TimeUtils; +import lombok.Getter; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.ability.Ability; +import net.frozenorb.foxtrot.gameplay.ability.Category; +import net.frozenorb.foxtrot.gameplay.ability.listener.events.AbilityUseEvent; +import net.frozenorb.foxtrot.listener.FoxListener; +import net.frozenorb.foxtrot.team.dtr.DTRBitmask; +import net.frozenorb.foxtrot.util.CC; +import net.frozenorb.foxtrot.util.InventoryUtils; +import net.frozenorb.foxtrot.util.PotionUtil; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.Action; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.metadata.FixedMetadataValue; +import org.bukkit.potion.Potion; + +import java.util.*; +import java.util.concurrent.TimeUnit; + +import static org.bukkit.Material.POTION; + +public class AntiBlockup extends Ability { + + @Getter + public static Map cache = new HashMap<>(); + + @Override + public String getName() { + return this.getClass().getSimpleName(); + } + + @Override + public Material getMaterial() { + return Material.BLAZE_ROD; + } + + @Override + public String getDisplayName() { + return ChatColor.GOLD.toString() + ChatColor.BOLD + "Anti-Blockup"; + } + + @Override + public List getLore() { + final List toReturn = new ArrayList<>(); + + toReturn.add(""); + toReturn.add(ChatColor.translate("&6❙ &fWhen you hit a player with this")); + toReturn.add(ChatColor.translate("&6❙ &c&l3 times &fthey may not block up for &e&l15 seconds&f.")); + toReturn.add(""); + if (Foxtrot.getInstance().getMapHandler().isKitMap()) { + toReturn.add(ChatColor.translate("&fCan be found in the &d&lAbility Crate&f!")); + } else { + toReturn.add(ChatColor.translate("&fCan be found in the &e&ki&6&lHalloween Crate&e&ki&f!")); + } + + return toReturn; + } + + @Override + public Boolean isAllowedAtLocation(Location location) { + if (Foxtrot.getInstance().getMapHandler().isKitMap()) { + return !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + return !Foxtrot.getInstance().getServerHandler().isWarzone(location) && location.getWorld().getEnvironment() == World.Environment.NORMAL && !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + @Override + public long getCooldown() { + return 90_000L; + } + + @Override + public Category getCategory() { + return Category.SEASONAL_CRATE; + } + + @Override + public String getDescription() { + return ""; + } + + @EventHandler(priority = EventPriority.MONITOR) + private void onDamage(EntityDamageByEntityEvent event) { + if (event.isCancelled() || !(event.getDamager() instanceof Player) || !(event.getEntity() instanceof Player)) { + return; + } + + final Player target = (Player) event.getEntity(); + final Player damager = (Player) event.getDamager(); + + if (damager.getItemInHand() == null || !this.isSimilar(damager.getItemInHand())) { + return; + } + + if (cache.containsKey(target.getUniqueId())) { + damager.sendMessage(ChatColor.translate("&c" + target.getName() + " already can't place blocks for &l" + TimeUtils.formatIntoMMSS((int) (cache.get(target.getUniqueId()) - System.currentTimeMillis()) / 1000) + "&c.")); + return; + } + + int value = target.hasMetadata("ANTI_BUILD") ? (target.getMetadata("ANTI_BUILD").get(0).asInt() + 1) : 1; + + final AbilityUseEvent abilityUseEvent = new AbilityUseEvent(damager, target, damager.getLocation(), this, false); + + if (value != 3) { + abilityUseEvent.setOneHit(true); + } + + Foxtrot.getInstance().getServer().getPluginManager().callEvent(abilityUseEvent); + + if (abilityUseEvent.isCancelled()) { + return; + } + + target.setMetadata("ANTI_BUILD", new FixedMetadataValue(Foxtrot.getInstance(), value)); + + if (value != 3) { + damager.sendMessage(CC.translate("&cYou have to hit &f" + target.getName() + " &c" + (3 - value) + " more time" + (3 - value == 1 ? "" : "s") + "!")); + return; + } + + target.removeMetadata("ANTI_BUILD", Foxtrot.getInstance()); + + cache.put(target.getUniqueId(), System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(15)); + + if (damager.getItemInHand().getAmount() == 1) { + damager.setItemInHand(null); + } else { + damager.getItemInHand().setAmount(damager.getItemInHand().getAmount() - 1); + } + + fullDescription = target.getName() + " may not place blocks for 15 seconds!"; + + target.sendMessage(""); + target.sendMessage(ChatColor.DARK_RED + ChatColor.BOLD.toString() + "Ability Items"); + target.sendMessage(ChatColor.GRAY + "You have been hit with the " + this.getDisplayName() + ChatColor.GRAY + "."); + target.sendMessage(ChatColor.RED + "You may not place/break/interact with blocks for the next 15 seconds!"); + target.sendMessage(""); + + Foxtrot.getInstance().getServer().getScheduler().runTaskLater(Foxtrot.getInstance(), () -> { + cache.remove(target.getUniqueId()); + + if (damager.isOnline()) { + damager.sendMessage(""); + damager.sendMessage(ChatColor.RED + "Your " + this.getDisplayName() + ChatColor.RED + " has expired!"); + damager.sendMessage(""); + } + + if (target.isOnline()) { + target.sendMessage(""); + target.sendMessage(ChatColor.GREEN + "The " + this.getDisplayName() + ChatColor.GREEN + " on you has expired!"); + target.sendMessage(""); + } + }, 20*15); + + this.applyCooldown(damager); + + } + + @EventHandler + public void onPlace(BlockPlaceEvent event) { + if (event.isCancelled()) { + return; + } + + final Player player = event.getPlayer(); + + if (!cache.containsKey(player.getUniqueId())) { + return; + } + + player.sendMessage(ChatColor.RED + "You may not block up as you have been hit by the " + this.getDisplayName() + ChatColor.RED + "."); + event.setCancelled(true); + } + + @EventHandler + public void onBreak(BlockBreakEvent event) { + if (event.isCancelled()) { + return; + } + + final Player player = event.getPlayer(); + + if (!cache.containsKey(player.getUniqueId())) { + return; + } + + player.sendMessage(ChatColor.RED + "You may not break blocks as you have been hit by the " + this.getDisplayName() + ChatColor.RED + "."); + + event.setCancelled(true); + } + + @EventHandler + private void onPlate(PlayerInteractEvent event) { + if ((event.getAction() != Action.PHYSICAL || event.getClickedBlock() == null || !event.getClickedBlock().getType().name().contains("PLATE"))) { + return; + } + + final Player player = event.getPlayer(); + + if (!cache.containsKey(player.getUniqueId())) { + return; + } + + if (event.getItem() != null && event.getItem().getType() == POTION && event.getItem().getDurability() != 0) { + Potion potion = Potion.fromItemStack(event.getItem()); + + if (potion.isSplash()) { + PotionUtil.splashPotion(player, event.getItem()); + if (player.getItemInHand() != null && player.getItemInHand().isSimilar(event.getItem())) { + player.setItemInHand(null); + player.updateInventory(); + } else { + InventoryUtils.removeAmountFromInventory(player.getInventory(), event.getItem(), 1); + } + } + } + + event.setCancelled(true); + } + + @EventHandler(priority = EventPriority.LOWEST) + private void onInteract(PlayerInteractEvent event) { + if (event.getAction() != Action.RIGHT_CLICK_BLOCK || event.getClickedBlock() == null) { + return; + } + + final Block clickedBlock = event.getClickedBlock(); + + if (!FoxListener.NO_INTERACT.contains(clickedBlock.getType())) { + return; + } + + final Player player = event.getPlayer(); + + if (!cache.containsKey(player.getUniqueId())) { + return; + } + + if (event.getItem() != null && event.getItem().getType() == POTION && event.getItem().getDurability() != 0) { + Potion potion = Potion.fromItemStack(event.getItem()); + + if (potion.isSplash()) { + PotionUtil.splashPotion(player, event.getItem()); + if (player.getItemInHand() != null && player.getItemInHand().isSimilar(event.getItem())) { + player.setItemInHand(null); + player.updateInventory(); + } else { + InventoryUtils.removeAmountFromInventory(player.getInventory(), event.getItem(), 1); + } + } + } + + event.setCancelled(true); + player.sendMessage(ChatColor.RED + "You may not interact with " + event.getClickedBlock().getType().name().toLowerCase().replace("_", " ") + "s as you have been hit by the " + this.getDisplayName() + ChatColor.RED + "."); + } + + +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/AntiPearl.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/AntiPearl.java new file mode 100644 index 0000000..61057de --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/AntiPearl.java @@ -0,0 +1,173 @@ +package net.frozenorb.foxtrot.gameplay.ability.type; + +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.ability.Ability; +import net.frozenorb.foxtrot.gameplay.ability.Category; +import net.frozenorb.foxtrot.gameplay.ability.listener.events.AbilityUseEvent; +import net.frozenorb.foxtrot.gameplay.pvpclasses.PvPClassHandler; +import net.frozenorb.foxtrot.server.pearl.EnderpearlCooldownHandler; +import net.frozenorb.foxtrot.team.Team; +import net.frozenorb.foxtrot.team.dtr.DTRBitmask; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.Action; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.concurrent.TimeUnit; + +/** + * @author xanderume@gmail.com + */ +public class AntiPearl extends Ability { + + @Override + public String getName() { + return this.getClass().getSimpleName(); + } + + @Override + public Material getMaterial() { + return Material.EYE_OF_ENDER; + } + + @Override + public String getDisplayName() { + return ChatColor.RED.toString() + ChatColor.BOLD + "Anti Pearl 2.0"; + } + + @Override + public List getLore() { + final List toReturn = new ArrayList<>(); + + toReturn.add(""); + toReturn.add(ChatColor.translate("&6❙ &fHit a player to put them on enderpearl cooldown.")); + toReturn.add(ChatColor.translate("&6❙ &fRight Click to remove your enderpearl cooldown.")); + toReturn.add(""); + if (Foxtrot.getInstance().getMapHandler().isKitMap()) { + toReturn.add(ChatColor.translate("&fCan be found in an &c&lChristmas &2&lCrate&f!")); + } else { + toReturn.add(ChatColor.translate("&fCan be found in an &b&lAirdrop&f!")); + } + + return toReturn; + } + + @Override + public Category getCategory() { + return Category.PARTNER_CRATE; + } + + @Override + public String getDescription() { + return ""; + } + + @Override + public Boolean isAllowedAtLocation(Location location) { + if (Foxtrot.getInstance().getMapHandler().isKitMap()) { + return !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + return !Foxtrot.getInstance().getServerHandler().isWarzone(location) && location.getWorld().getEnvironment() == World.Environment.NORMAL && !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + + + @Override + public long getCooldown() { + return TimeUnit.MINUTES.toMillis(2L); + } + + @EventHandler(priority = EventPriority.MONITOR) + private void onDamage(EntityDamageByEntityEvent event) { + if (event.isCancelled() || !(event.getDamager() instanceof Player) || !(event.getEntity() instanceof Player)) { + return; + } + + final Player target = (Player) event.getEntity(); + final Player damager = (Player) event.getDamager(); + + if (damager.getItemInHand() == null || !this.isSimilar(damager.getItemInHand())) { + return; + } + + final AbilityUseEvent abilityUseEvent = new AbilityUseEvent(damager, target, damager.getLocation(), this, false); + Foxtrot.getInstance().getServer().getPluginManager().callEvent(abilityUseEvent); + + if (abilityUseEvent.isCancelled()) { + return; + } + + if (PvPClassHandler.getPvPClass(target) != null) { + damager.sendMessage(ChatColor.RED + "You may not use a " + this.getDisplayName() + ChatColor.RED + " on a " + ChatColor.WHITE + Objects.requireNonNull(PvPClassHandler.getPvPClass(target)).getName() + ChatColor.RED + "!"); + return; + } + + EnderpearlCooldownHandler.resetEnderpearlTimer(target); + target.sendMessage(damager.getName() + ChatColor.RED + " has used the " + this.getDisplayName() + ChatColor.RED + " on you!"); + + final ItemStack itemStack = damager.getItemInHand(); + + if (itemStack.getAmount() == 1) { + damager.setItemInHand(null); + } else { + itemStack.setAmount(itemStack.getAmount()-1); + } + + this.fullDescription = "You have put " + target.getName() + " on enderpearl cooldown!"; + + this.applyCooldown(damager); + + final Team team = Foxtrot.getInstance().getTeamHandler().getTeam(damager); + + if (team == null) { + return; + } + + this.applyCooldown(team, damager, TimeUnit.SECONDS.toMillis(30)); + } + + @EventHandler(priority = EventPriority.NORMAL) + public void onInteract(PlayerInteractEvent event) { + if (event.getAction() != Action.RIGHT_CLICK_AIR && event.getAction() != Action.RIGHT_CLICK_BLOCK) { + return; + } + + final Player player = event.getPlayer(); + + if (!this.isSimilar(event.getItem())) { + return; + } + + event.setCancelled(true); + + final AbilityUseEvent abilityUseEvent = new AbilityUseEvent(player, null, player.getLocation(), this, false); + Foxtrot.getInstance().getServer().getPluginManager().callEvent(abilityUseEvent); + + if (abilityUseEvent.isCancelled()) { + return; + } + + if (player.getItemInHand().getAmount() == 1) { + player.setItemInHand(null); + } else { + player.getItemInHand().setAmount(player.getItemInHand().getAmount()-1); + } + + this.fullDescription = "You have removed your enderpearl cooldown!"; + + EnderpearlCooldownHandler.removeCooldown(player); + + this.applyCooldown(player); + } +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/BallOfRage.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/BallOfRage.java new file mode 100644 index 0000000..faf021a --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/BallOfRage.java @@ -0,0 +1,185 @@ +package net.frozenorb.foxtrot.gameplay.ability.type; + +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.ability.Ability; +import net.frozenorb.foxtrot.gameplay.ability.Category; +import net.frozenorb.foxtrot.team.Team; +import net.frozenorb.foxtrot.team.claims.LandBoard; +import net.frozenorb.foxtrot.team.dtr.DTRBitmask; +import net.frozenorb.foxtrot.util.CC; +import org.bukkit.*; +import org.bukkit.entity.Player; +import org.bukkit.entity.Projectile; +import org.bukkit.entity.Snowball; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.ProjectileHitEvent; +import org.bukkit.event.entity.ProjectileLaunchEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.metadata.FixedMetadataValue; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +import java.util.ArrayList; +import java.util.List; + +public class BallOfRage extends Ability { + + @Override + public String getName() { + return this.getClass().getSimpleName(); + } + + @Override + public Material getMaterial() { + return Material.SNOW_BALL; + } + + @Override + public String getDisplayName() { + return ChatColor.DARK_RED.toString() + ChatColor.BOLD + "Ball Of Rage"; + } + + @Override + public List getLore() { + + final List toReturn = new ArrayList<>(); + + toReturn.add(""); + toReturn.add(ChatColor.translate("&6❙ &fThrow to create a cloud of effects")); + toReturn.add(ChatColor.translate("&6❙ &fwhere all teammates within 5 block")); + toReturn.add(ChatColor.translate("&6❙ &fradius will be given positive effects.")); + toReturn.add(""); + toReturn.add(ChatColor.translate("&fCan be found in the &4&lSimplyTrash Crate&f!")); + + return toReturn; + } + + @Override + public boolean inPartnerPackage() { + return true; + } + + @Override + public Category getCategory() { + return Category.TREASURE_CHEST; + } + + @Override + public String getDescription() { + return "Once this ball lands teammates effected will be given effects!"; + } + + @Override + public Boolean isAllowedAtLocation(Location location) { + if (location.getWorld().getName().equalsIgnoreCase("sg")) { + return true; + } + if (Foxtrot.getInstance().getMapHandler().isKitMap()) { + return !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + return !Foxtrot.getInstance().getServerHandler().isWarzone(location) && location.getWorld().getEnvironment() == World.Environment.NORMAL && !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + + + @Override + public long getCooldown() { + return 120_000L; + } + + @EventHandler + public void onLaunch(ProjectileLaunchEvent event) { + if (!(event.getEntity() instanceof Snowball) || !(event.getEntity().getShooter() instanceof Player)) { + return; + } + + final Player player = (Player) event.getEntity().getShooter(); + + if (!this.isSimilar(player.getItemInHand())) { + return; + } + + event.getEntity().setMetadata("BALL_OF_RAGE", new FixedMetadataValue(Foxtrot.getInstance(), player.getUniqueId().toString())); + + this.applyCooldown(player); + } + + @EventHandler(priority = EventPriority.NORMAL) + public void onInteract(PlayerInteractEvent event) { + if (!event.hasItem() || !this.isSimilar(event.getPlayer().getItemInHand())) { + return; + } + + if (Foxtrot.getInstance().getPvPTimerMap().hasTimer(event.getPlayer().getUniqueId())) { + event.getPlayer().sendMessage(CC.translate("&cYou may not use " + this.getDisplayName() + " &cwhilst your &a&lPvP Timer &cis active!")); + event.getPlayer().updateInventory(); + event.setCancelled(true); + return; + } + + if (this.hasCooldown(event.getPlayer())) { + event.setCancelled(true); + event.getPlayer().updateInventory(); + return; + } + + if (this.isAllowedAtLocation(event.getPlayer().getLocation())) { + return; + } + + String teamName; + + final Team ownerTeam = LandBoard.getInstance().getTeam(event.getPlayer().getLocation()); + + if (ownerTeam != null) { + teamName = ownerTeam.getName(event.getPlayer()); + } else if (!Foxtrot.getInstance().getServerHandler().isWarzone(event.getPlayer().getLocation())) { + teamName = ChatColor.GRAY + "The Wilderness"; + } else { + teamName = ChatColor.DARK_RED + "WarZone"; + } + + event.getPlayer().sendMessage(ChatColor.RED + "You cannot use a " + this.getDisplayName() + ChatColor.RED + " in " + teamName + ChatColor.RED + "."); + event.getPlayer().updateInventory(); + event.setCancelled(true); + } + + @EventHandler + private void onLand(ProjectileHitEvent event) { + if (!(event.getEntity() instanceof Snowball) || !(event.getEntity().getShooter() instanceof Player) || !event.getEntity().hasMetadata("BALL_OF_RAGE")) { + return; + } + + final Projectile snowBall = event.getEntity(); + final Player player = (Player) snowBall.getShooter(); + + snowBall.getWorld().createExplosion(snowBall.getLocation(), 0); + snowBall.getWorld().spigot().playEffect( + snowBall.getLocation().clone().add(0, 1, 0), + Effect.EXPLOSION_HUGE + ); + + final Team team = Foxtrot.getInstance().getTeamHandler().getTeam(player); + + snowBall.getNearbyEntities(6, 6, 6).stream().filter(it -> it instanceof Player && this.isAllowedAtLocation(it.getLocation())).map(it -> (Player) it).forEach(it -> { + if (team != null && !team.isMember(it.getUniqueId())) { + return; + } + + if (team == null && !it.getName().equalsIgnoreCase(player.getName())) { + return; + } + + it.addPotionEffect(new PotionEffect(PotionEffectType.INCREASE_DAMAGE, 20*6, 1), true); + it.addPotionEffect(new PotionEffect(PotionEffectType.DAMAGE_RESISTANCE, 20*6, 2), true); + + it.sendMessage(""); + it.sendMessage(ChatColor.DARK_RED + ChatColor.BOLD.toString() + "Ability Items"); + it.sendMessage(ChatColor.GRAY + "You have been hit by " + this.getDisplayName() + ChatColor.GRAY + "."); + it.sendMessage(ChatColor.RED + "You were given Strength II and Resistance III for 5 seconds!"); + it.sendMessage(""); + }); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/Combo.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/Combo.java new file mode 100644 index 0000000..a78a8a7 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/Combo.java @@ -0,0 +1,150 @@ +package net.frozenorb.foxtrot.gameplay.ability.type; + +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.ability.Ability; +import net.frozenorb.foxtrot.gameplay.ability.Category; +import net.frozenorb.foxtrot.gameplay.ability.listener.events.AbilityUseEvent; +import net.frozenorb.foxtrot.team.dtr.DTRBitmask; +import org.bukkit.*; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.Action; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +import java.util.*; + +public class Combo extends Ability { + + public static Map cache = new HashMap<>(); + + @Override + public String getName() { + return this.getClass().getSimpleName(); + } + + @Override + public Material getMaterial() { + return Material.RED_ROSE; + } + + @Override + public String getDisplayName() { + return ChatColor.GREEN.toString() + ChatColor.BOLD + "Combo Ability"; + } + + @Override + public List getLore() { + final List toReturn = new ArrayList<>(); + + toReturn.add(""); + toReturn.add(ChatColor.translate("&6❙ &fGet a second of strength II for the")); + toReturn.add(ChatColor.translate("&6❙ &famount of hits dealt within &e&l10 seconds&f.")); + toReturn.add(""); + toReturn.add(ChatColor.translate("&fCan be found in the &4&lCave Crate&f!")); + + return toReturn; + } + + @Override + public Category getCategory() { + return Category.PARTNER_CRATE; + } + + @Override + public String getDescription() { + return "Each hit will grant you a second of Strength II!"; + } + + @Override + public Boolean isAllowedAtLocation(Location location) { + if (Foxtrot.getInstance().getMapHandler().isKitMap()) { + return !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + return !Foxtrot.getInstance().getServerHandler().isWarzone(location) && location.getWorld().getEnvironment() == World.Environment.NORMAL && !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + + + @Override + public long getCooldown() { + return 120_000L; + } + + @EventHandler(priority = EventPriority.LOWEST) + private void onInteract(PlayerInteractEvent event) { + final Player player = event.getPlayer(); + + if (!this.isSimilar(player.getItemInHand()) || event.getAction() != Action.RIGHT_CLICK_AIR && event.getAction() != Action.RIGHT_CLICK_BLOCK) { + return; + } + + event.setCancelled(true); + + final AbilityUseEvent abilityUseEvent = new AbilityUseEvent(player, null, player.getLocation(), this, false); + Foxtrot.getInstance().getServer().getPluginManager().callEvent(abilityUseEvent); + + if (abilityUseEvent.isCancelled()) { + return; + } + + event.setCancelled(true); + if (player.getItemInHand().getAmount() == 1) { + player.setItemInHand(null); + } else { + player.getItemInHand().setAmount(player.getItemInHand().getAmount()-1); + } + player.updateInventory(); + + cache.put(player.getUniqueId(), 0); + + this.applyCooldown(event.getPlayer()); + + Foxtrot.getInstance().getServer().getScheduler().runTaskLater(Foxtrot.getInstance(), () -> { + + int seconds = cache.remove(player.getUniqueId()); + + if (!player.isOnline()) { + return; + } + + player.playSound(player.getLocation(), Sound.EXPLODE, 1, 1); + player.addPotionEffect(new PotionEffect(PotionEffectType.INCREASE_DAMAGE, 20*seconds, 1), true); + + player.sendMessage(""); + player.sendMessage(ChatColor.DARK_RED + ChatColor.BOLD.toString() + "Ability Items"); + player.sendMessage(ChatColor.GRAY + "Your " + this.getDisplayName() + ChatColor.GRAY + " has been activated!"); + player.sendMessage(ChatColor.RED + "You have been given a total of " + seconds + " seconds of Strength II!"); + player.sendMessage(""); + }, 20*10L); + } + + @EventHandler(priority = EventPriority.MONITOR) + private void onDamage(EntityDamageByEntityEvent event) { + if (event.isCancelled() || !(event.getEntity() instanceof Player) || !(event.getDamager() instanceof Player)) { + return; + } + + final Player damager = (Player) event.getDamager(); + + if (!cache.containsKey(damager.getUniqueId())) { + return; + } + + int amount = cache.getOrDefault(damager.getUniqueId(), 0)+1; + + if (amount > 10) { + return; + } + + if (!Foxtrot.getInstance().getAbilityCooldownsScoreboardMap().isScoreboard(damager.getUniqueId())) { + damager.sendMessage(ChatColor.RED + "Found another hit, you will get " + amount + " seconds of Strength II."); + } + + cache.put(damager.getUniqueId(), amount); + } +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/CraftingChaos.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/CraftingChaos.java new file mode 100644 index 0000000..bf31b18 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/CraftingChaos.java @@ -0,0 +1,181 @@ +package net.frozenorb.foxtrot.gameplay.ability.type; + +import cc.fyre.proton.util.TimeUtils; +import lombok.Getter; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.ability.Ability; +import net.frozenorb.foxtrot.gameplay.ability.Category; +import net.frozenorb.foxtrot.gameplay.ability.listener.events.AbilityUseEvent; +import net.frozenorb.foxtrot.team.dtr.DTRBitmask; +import net.frozenorb.foxtrot.util.CC; +import org.bukkit.*; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.metadata.FixedMetadataValue; + +import java.util.*; +import java.util.concurrent.ThreadLocalRandom; +import java.util.concurrent.TimeUnit; + +public class CraftingChaos extends Ability { + + @Getter + public static Map cache = new HashMap<>(); + + @Override + public String getName() { + return this.getClass().getSimpleName(); + } + + @Override + public Material getMaterial() { + return Material.WORKBENCH; + } + + @Override + public String getDisplayName() { + return ChatColor.DARK_AQUA.toString() + ChatColor.BOLD + "Crafting Chaos"; + } + + @Override + public List getLore() { + final List toReturn = new ArrayList<>(); + + toReturn.add(""); + toReturn.add(ChatColor.translate("&6❙ &fHit an enemy and for &e&l10 seconds&f, every")); + toReturn.add(ChatColor.translate("&6❙ &fhit you deal has a &c&l15% &fchance of")); + toReturn.add(ChatColor.translate("&6❙ &fputting them in a crafting table.")); + toReturn.add(""); + toReturn.add(ChatColor.translate("&fCan be found in the &3&lHeaded Crate&f!")); + + return toReturn; + } + + @Override + public Category getCategory() { + return Category.TREASURE_CHEST; + } + + @Override + public String getDescription() { + return ""; + } + + @Override + public boolean inPartnerPackage() { + return true; + } + + @Override + public Boolean isAllowedAtLocation(Location location) { + if (Foxtrot.getInstance().getMapHandler().isKitMap()) { + return !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + return !Foxtrot.getInstance().getServerHandler().isWarzone(location) && location.getWorld().getEnvironment() == World.Environment.NORMAL && !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + @Override + public long getCooldown() { + return 90_000L; + } + + @EventHandler(priority = EventPriority.MONITOR) + private void onDamage(EntityDamageByEntityEvent event) { + if (event.isCancelled() || !(event.getDamager() instanceof Player) || !(event.getEntity() instanceof Player)) { + return; + } + + final Player target = (Player) event.getEntity(); + final Player damager = (Player) event.getDamager(); + + if (damager.getItemInHand() == null || !this.isSimilar(damager.getItemInHand())) { + return; + } + + final AbilityUseEvent abilityUseEvent = new AbilityUseEvent(damager, target, damager.getLocation(), this, false); + + int value = target.hasMetadata("CHAOS") ? (target.getMetadata("CHAOS").get(0).asInt()+1) : 1; + + if (cache.containsKey(target.getUniqueId())) { + damager.sendMessage(ChatColor.translate("&c" + target.getName() + " is already in the crafting chaos for &l" + TimeUtils.formatIntoMMSS((int) (cache.get(target.getUniqueId())-System.currentTimeMillis())/1000) + "&c.")); + return; + } + + if (value != 3) { + abilityUseEvent.setOneHit(true); + } + + Foxtrot.getInstance().getServer().getPluginManager().callEvent(abilityUseEvent); + + if (abilityUseEvent.isCancelled()) { + return; + } + + target.setMetadata("CHAOS", new FixedMetadataValue(Foxtrot.getInstance(), value)); + + if (value != 3) { + damager.sendMessage(CC.translate("&cYou have to hit &f" + target.getName() + " &c" + (3 - value) + " more times!")); + return; + } + + target.removeMetadata("CHAOS", Foxtrot.getInstance()); + + cache.put(target.getUniqueId(), System.currentTimeMillis()+TimeUnit.SECONDS.toMillis(10)); + + if (damager.getItemInHand().getAmount() == 1) { + damager.setItemInHand(null); + } else { + damager.getItemInHand().setAmount(damager.getItemInHand().getAmount()-1); + } + + this.fullDescription = "Each hit has a chance of putting " + target.getName() + " in a crafting table."; + + target.sendMessage(""); + target.sendMessage(ChatColor.DARK_RED + ChatColor.BOLD.toString() + "Ability Items"); + target.sendMessage(ChatColor.GRAY + "You have been hit with the " + this.getDisplayName() + ChatColor.RED + "."); + target.sendMessage(ChatColor.RED + "For the next 10 seconds, every hit you take has a 10% chance of putting you in a crafting table."); + target.sendMessage(""); + + this.applyCooldown(damager); + } + + @EventHandler(priority = EventPriority.LOW) + private void onPlayerHit(EntityDamageByEntityEvent event) { + if (!(event.getDamager() instanceof Player) || !(event.getEntity() instanceof Player)) { + return; + } + + final Player target = (Player) event.getEntity(); + final Player damager = (Player) event.getDamager(); + + if (!cache.containsKey(target.getUniqueId()) || cache.get(target.getUniqueId()) < System.currentTimeMillis()) { + cache.remove(target.getUniqueId()); + return; + } + + if (ThreadLocalRandom.current().nextInt(100) <= 15) { + damager.playSound(damager.getLocation(), Sound.LEVEL_UP, 1, 1); + damager.sendMessage(ChatColor.RED + target.getName() + " has been put in a crafting table due to the " + this.getDisplayName() + "!"); + + target.playSound(target.getLocation(), Sound.ZOMBIE_WOODBREAK, 1, 1); + target.sendMessage(ChatColor.RED + "You were placed in a crafting table due to the " + this.getDisplayName() + ChatColor.RED + "!"); + target.openWorkbench(target.getLocation(), true); + } + } + + @EventHandler(priority = EventPriority.LOW) + private void onPlace(BlockPlaceEvent event) { + final Player player = event.getPlayer(); + + if (this.isSimilar(event.getItemInHand())) { + event.setCancelled(true); + player.sendMessage(ChatColor.RED + "You can't place partner items!"); + } + + } + +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/EggPort.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/EggPort.java new file mode 100644 index 0000000..1612cfd --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/EggPort.java @@ -0,0 +1,201 @@ +package net.frozenorb.foxtrot.gameplay.ability.type; + +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.ability.Ability; +import net.frozenorb.foxtrot.gameplay.ability.Category; +import net.frozenorb.foxtrot.gameplay.ability.listener.events.AbilityUseEvent; +import net.frozenorb.foxtrot.team.Team; +import net.frozenorb.foxtrot.team.claims.LandBoard; +import net.frozenorb.foxtrot.team.dtr.DTRBitmask; +import net.frozenorb.foxtrot.util.CC; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.entity.Egg; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.CreatureSpawnEvent; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.ProjectileLaunchEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.metadata.FixedMetadataValue; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +public class EggPort extends Ability { + + public static final int SWAP_RADIUS = 15; + + @Override + public String getName() { + return this.getClass().getSimpleName(); + } + + @Override + public Material getMaterial() { + return Material.EGG; + } + + @Override + public String getDisplayName() { + return ChatColor.LIGHT_PURPLE.toString() + ChatColor.BOLD + "Eggport"; + } + + @Override + public List getLore() { + + final List toReturn = new ArrayList<>(); + + toReturn.add(""); + toReturn.add(ChatColor.translate("&6❙ &fSwitch places with your")); + toReturn.add(ChatColor.translate("&6❙ &fenemy that are within &c&l15 &fblocks!")); + toReturn.add(""); + if (Foxtrot.getInstance().getMapHandler().isKitMap()) { + toReturn.add(ChatColor.translate("&fCan be found in the &d&lAbility Crate&f!")); + } else { + toReturn.add(ChatColor.translate("&fCan be found in the &e&ki&6&lHalloween Crate&e&ki&f!")); + } + + return toReturn; + } + + @Override + public Category getCategory() { + return Category.SEASONAL_CRATE; + } + + @Override + public String getDescription() { + return "You will swap positions with whoever this egg hits!"; + } + + @Override + public Boolean isAllowedAtLocation(Location location) { + if (location.getWorld().getName().equalsIgnoreCase("sg")) { + return true; + } + if (Foxtrot.getInstance().getMapHandler().isKitMap()) { + return !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + return !Foxtrot.getInstance().getServerHandler().isWarzone(location) && location.getWorld().getEnvironment() == World.Environment.NORMAL && !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + @Override + public long getCooldown() { + return 10_000L; + } + + @EventHandler + public void onLaunch(ProjectileLaunchEvent event) { + if (!(event.getEntity() instanceof Egg) || !(event.getEntity().getShooter() instanceof Player)) { + return; + } + + final Player player = (Player) event.getEntity().getShooter(); + + if (!this.isSimilar(player.getItemInHand())) { + return; + } + + event.getEntity().setMetadata("Eggport", new FixedMetadataValue(Foxtrot.getInstance(), player.getUniqueId().toString())); + + this.applyCooldown(player); + } + + @EventHandler(priority = EventPriority.NORMAL) + public void onInteract(PlayerInteractEvent event) { + if (!event.hasItem() || !this.isSimilar(event.getPlayer().getItemInHand())) { + return; + } + + if (!event.getAction().name().contains("RIGHT")) { + return; + } + + final Player player = event.getPlayer(); + + if (Foxtrot.getInstance().getPvPTimerMap().hasTimer(event.getPlayer().getUniqueId())) { + player.sendMessage(CC.translate("&cYou may not use &d&lEgg Ports &cwhile your &a&lPvP Timer &cis active!")); + player.updateInventory(); + event.setCancelled(true); + return; + } + + final AbilityUseEvent abilityUseEvent = new AbilityUseEvent(player, null, player.getLocation(), this, false); + Foxtrot.getInstance().getServer().getPluginManager().callEvent(abilityUseEvent); + + if (abilityUseEvent.isCancelled()) { + event.setCancelled(true); + player.updateInventory(); + } + } + + @EventHandler(priority = EventPriority.LOWEST) + public void onCreature(CreatureSpawnEvent event) { + if (event.getSpawnReason() == CreatureSpawnEvent.SpawnReason.EGG) { + event.setCancelled(true); + } + } + + @EventHandler(priority = EventPriority.NORMAL) + private void onDamage(EntityDamageByEntityEvent event) { + if (event.isCancelled() || !(event.getEntity() instanceof Player) || !(event.getDamager() instanceof Egg) || !event.getDamager().hasMetadata("Eggport")) { + return; + } + + final Player shooter = Foxtrot.getInstance().getServer().getPlayer(UUID.fromString(event.getDamager().getMetadata("Eggport").get(0).asString())); + final Player target = (Player) event.getEntity(); + + if (shooter == null) { + return; + } + + if (!this.isAllowedAtLocation(target.getLocation())) { + + String location; + + final Team ownerTeam = LandBoard.getInstance().getTeam(target.getLocation()); + + if (ownerTeam != null) { + location = ownerTeam.getName(shooter); + } else if (!Foxtrot.getInstance().getServerHandler().isWarzone(target.getLocation())) { + location = ChatColor.GRAY + "The Wilderness"; + } else { + location = ChatColor.DARK_RED + "WarZone"; + } + + shooter.getInventory().addItem(this.hassanStack); + shooter.updateInventory(); + shooter.sendMessage(ChatColor.RED + "You may not swap locations with " + target.getDisplayName() + " who is in " + location + ChatColor.RED + "."); + return; + } + + final Location shooterLocation = shooter.getLocation().clone(); + final Location targetLocation = target.getLocation().clone(); + + if (shooterLocation.distance(targetLocation) > SWAP_RADIUS) { + shooter.sendMessage(ChatColor.RED + "You need to be within 15 blocks of that player!"); + return; + } + + shooter.teleport(targetLocation); + target.teleport(shooterLocation); + + shooter.sendMessage(""); + shooter.sendMessage(ChatColor.DARK_RED + ChatColor.BOLD.toString() + "Ability Items"); + shooter.sendMessage(ChatColor.GRAY + "You have hit a player with the " + this.getDisplayName() + ChatColor.GRAY + "."); + shooter.sendMessage(ChatColor.RED + "You have swapped positions with " + target.getName() + "!"); + shooter.sendMessage(""); + + target.sendMessage(""); + target.sendMessage(ChatColor.DARK_RED + ChatColor.BOLD.toString() + "Ability Items"); + target.sendMessage(ChatColor.GRAY + "You have been hit with the " + this.getDisplayName() + ChatColor.GRAY + "."); + target.sendMessage(ChatColor.RED + "You have swapped positions with " + shooter.getName() + "!"); + target.sendMessage(""); + } +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/Invisibility.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/Invisibility.java new file mode 100644 index 0000000..0b5e4eb --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/Invisibility.java @@ -0,0 +1,231 @@ +package net.frozenorb.foxtrot.gameplay.ability.type; + +import com.comphenix.protocol.PacketType; +import com.comphenix.protocol.ProtocolLibrary; +import com.comphenix.protocol.events.PacketContainer; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.ability.Ability; +import net.frozenorb.foxtrot.gameplay.ability.Category; +import net.frozenorb.foxtrot.gameplay.ability.listener.events.AbilityUseEvent; +import net.frozenorb.foxtrot.team.Team; +import net.frozenorb.foxtrot.team.claims.LandBoard; +import net.frozenorb.foxtrot.team.dtr.DTRBitmask; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_7_R4.entity.CraftPlayer; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.PotionEffectExpireEvent; +import org.bukkit.event.entity.PotionEffectRemoveEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +public class Invisibility extends Ability { + @Override + public Category getCategory() { + return Category.AIRDROPS; + } + + @Override + public String getDescription() { + return "You are now fully invisible! Your armor no longer shows!"; + } + + public static PotionEffect EFFECT = new PotionEffect(PotionEffectType.INVISIBILITY,(3*60)*20,2,false); + + @Override + public String getName() { + return this.getClass().getSimpleName(); + } + + @Override + public Material getMaterial() { + return Material.INK_SACK; + } + + @Override + public String getDisplayName() { + return ChatColor.DARK_AQUA.toString() + ChatColor.BOLD + "Invisibility"; + } + + + + @Override + public List getLore() { + final List toReturn = new ArrayList<>(); + + toReturn.add(""); + toReturn.add(ChatColor.translate("&6❙ &fWhen you right click this item")); + toReturn.add(ChatColor.translate("&6❙ &fyour armor will no longer be visible.")); + toReturn.add(""); + toReturn.add(ChatColor.translate("&fCan be found in the &d&lPartner Crate&f!")); + + return toReturn; + } + + @Override + public Boolean isAllowedAtLocation(Location location) { + if (Foxtrot.getInstance().getMapHandler().isKitMap()) { + return !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + return !Foxtrot.getInstance().getServerHandler().isWarzone(location) && location.getWorld().getEnvironment() == World.Environment.NORMAL && !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + @Override + public long getCooldown() { + return 120_000L; + } + + @EventHandler(priority = EventPriority.LOWEST) + private void onClick(PlayerInteractEvent event) { + final Player player = event.getPlayer(); + + if (!this.isSimilar(event.getItem())) { + return; + } + + event.setCancelled(true); + + final AbilityUseEvent abilityUseEvent = new AbilityUseEvent(player, null, player.getLocation(), this, false); + Foxtrot.getInstance().getServer().getPluginManager().callEvent(abilityUseEvent); + + if (abilityUseEvent.isCancelled()) { + return; + } + + final ItemStack itemStack = event.getItem(); + + if (itemStack.getAmount() == 1) { + event.getPlayer().setItemInHand(null); + } else { + itemStack.setAmount(itemStack.getAmount()-1); + } + + event.getPlayer().addPotionEffect(EFFECT, true); + event.getPlayer().setFireTicks(0); + + ((CraftPlayer)event.getPlayer()).getHandle().getDataWatcher().watch(9, (byte) 0); + + this.sendRestorePacket(event.getPlayer(),Foxtrot.getInstance().getServer().getOnlinePlayers(),true); + + this.applyCooldown(event.getPlayer()); + } + + @EventHandler(priority = EventPriority.MONITOR) + private void onEntityDamageByEntity(EntityDamageByEntityEvent event) { + if (event.isCancelled() || (!(event.getEntity() instanceof Player)) || (!(event.getDamager() instanceof Player))) { + return; + } + + final Player player = (Player) event.getEntity(); + + player.getActivePotionEffects().stream().filter(it -> it.getType().equals(EFFECT.getType()) && it.getAmplifier() == EFFECT.getAmplifier()).findFirst().ifPresent(it -> { + + player.removePotionEffect(it.getType()); + + this.sendRestorePacket(player,Foxtrot.getInstance().getServer().getOnlinePlayers(),false); + + final PotionEffect clone = new PotionEffect(it.getType(),it.getDuration(),0); + + player.addPotionEffect(clone); + + ((Player)event.getEntity()).sendMessage(ChatColor.RED.toString() + ChatColor.BOLD + "WARNING!" + ChatColor.YELLOW + " You have been hit and are no " + ChatColor.RED + ChatColor.BOLD + "LONGER" + ChatColor.YELLOW + " invisible!"); + }); + + } + + @EventHandler(priority = EventPriority.MONITOR) + private void onDamagerDamage(EntityDamageByEntityEvent event) { + if (event.isCancelled() || (!(event.getEntity() instanceof Player)) || (!(event.getDamager() instanceof Player))) { + return; + } + + final Player player = (Player) event.getDamager(); + + player.getActivePotionEffects().stream().filter(it -> it.getType().equals(EFFECT.getType()) && it.getAmplifier() == EFFECT.getAmplifier()).findFirst().ifPresent(it -> { + + player.removePotionEffect(it.getType()); + + this.sendRestorePacket(player,Foxtrot.getInstance().getServer().getOnlinePlayers(),false); + + final PotionEffect clone = new PotionEffect(it.getType(),it.getDuration(),0); + + player.addPotionEffect(clone); + + player.sendMessage(ChatColor.RED.toString() + ChatColor.BOLD + "WARNING!" + ChatColor.YELLOW + " You have hit a player and are no " + ChatColor.RED + ChatColor.BOLD + "LONGER" + ChatColor.YELLOW + " invisible!"); + }); + + } + + @EventHandler(priority = EventPriority.LOWEST) + private void onPotionEffectExpire(PotionEffectExpireEvent event) { + this.onPotionEffectRemove(event); + } + + @EventHandler(priority = EventPriority.LOWEST) + private void onPotionEffectRemove(PotionEffectRemoveEvent event) { + + if (!(event.getEntity() instanceof Player)) { + return; + } + + if (!event.getEffect().getType().equals(EFFECT.getType()) || event.getEffect().getAmplifier() != EFFECT.getAmplifier()) { + return; + } + + final Player player = (Player) event.getEntity(); + + player.getActivePotionEffects().stream().filter(it -> it.getType().equals(EFFECT.getType()) && it.getAmplifier() == EFFECT.getAmplifier()).findFirst().ifPresent(it -> { + + player.removePotionEffect(it.getType()); + + this.sendRestorePacket(player,Foxtrot.getInstance().getServer().getOnlinePlayers(),false); + + final PotionEffect clone = new PotionEffect(it.getType(),it.getDuration(),0); + + player.addPotionEffect(clone); + + ((Player)event.getEntity()).sendMessage(ChatColor.RED.toString() + ChatColor.BOLD + "WARNING!" + ChatColor.YELLOW + " Your " + ChatColor.WHITE + "Invisibility" + ChatColor.YELLOW + " has expired and are no " + ChatColor.RED + ChatColor.BOLD + "LONGER" + ChatColor.YELLOW + " invisible!"); + }); + + } + + private void sendRestorePacket(Player player, Collection players, boolean clear) { + + final List packets = new ArrayList<>(); + + for (int i = 0; i < 4; i++) { + + final PacketContainer packet = new PacketContainer(PacketType.Play.Server.ENTITY_EQUIPMENT); + + packet.getIntegers().write(0,player.getEntityId()); + packet.getIntegers().write(1,i+1); + + packet.getItemModifier().write(0,clear ? new ItemStack(Material.AIR):player.getInventory().getArmorContents()[i]); + + packets.add(packet); + } + + players.stream().filter(it -> it.getUniqueId() != player.getUniqueId()).forEach(it -> packets.forEach(packet -> { + + try { + ProtocolLibrary.getProtocolManager().sendServerPacket(it,packet); + } catch (Exception ex) { + ex.printStackTrace(); + } + + })); + + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/ItemCounter.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/ItemCounter.java new file mode 100644 index 0000000..37b6445 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/ItemCounter.java @@ -0,0 +1,157 @@ +package net.frozenorb.foxtrot.gameplay.ability.type; + +import lombok.Getter; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.ability.Ability; +import net.frozenorb.foxtrot.gameplay.ability.Category; +import net.frozenorb.foxtrot.gameplay.ability.listener.events.AbilityUseEvent; +import net.frozenorb.foxtrot.team.Team; +import net.frozenorb.foxtrot.team.claims.LandBoard; +import net.frozenorb.foxtrot.team.dtr.DTRBitmask; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.inventory.ItemStack; + +import java.util.*; + +public class ItemCounter extends Ability { + @Override + public Category getCategory() { + return Category.PARTNER_CRATE; + } + + @Override + public String getDescription() { + return "COOLDOWN"; + } + + @Getter + public static List cache = new ArrayList<>(); + + @Override + public String getName() { + return this.getClass().getSimpleName(); + } + + @Override + public Material getMaterial() { + return Material.COMPASS; + } + + @Override + public String getDisplayName() { + return ChatColor.RED.toString() + ChatColor.BOLD + "Item Counter"; + } + + @Override + public List getLore() { + final List toReturn = new ArrayList<>(); + + toReturn.add(""); + toReturn.add(ChatColor.translate("&6❙ &fHit an enemy to discover how many")); + toReturn.add(ChatColor.translate("&6❙ &fhealth potions and ability items they have!")); + toReturn.add(""); + toReturn.add(ChatColor.translate("&fCan be found in the &4&lCave Crate&f!")); + + return toReturn; + } + + @Override + public Boolean isAllowedAtLocation(Location location) { + if (Foxtrot.getInstance().getMapHandler().isKitMap()) { + return !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + return !Foxtrot.getInstance().getServerHandler().isWarzone(location) && location.getWorld().getEnvironment() == World.Environment.NORMAL && !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + @Override + public long getCooldown() { + return 35_000L; + } + + @EventHandler(priority = EventPriority.MONITOR) + private void onDamage(EntityDamageByEntityEvent event) { + if (event.isCancelled() || !(event.getDamager() instanceof Player) || !(event.getEntity() instanceof Player)) { + return; + } + + final Player target = (Player) event.getEntity(); + final Player damager = (Player) event.getDamager(); + + if (damager.getItemInHand() == null || !this.isSimilar(damager.getItemInHand())) { + return; + } + + final AbilityUseEvent abilityUseEvent = new AbilityUseEvent(damager, target, damager.getLocation(), this, false); + Foxtrot.getInstance().getServer().getPluginManager().callEvent(abilityUseEvent); + + if (abilityUseEvent.isCancelled()) { + return; + } + + final Map abilities = new HashMap<>(); + + int crapples = 0; + int godApples = 0; + + for (ItemStack content : target.getInventory().getContents()) { + + if (content == null || content.getType() == Material.AIR) { + continue; + } + + if (content.getType() == Material.GOLDEN_APPLE && content.getData().getData() == 0) { + crapples += content.getAmount(); + continue; + } + + if (content.getType() == Material.GOLDEN_APPLE && content.getData().getData() == 1) { + godApples += content.getAmount(); + continue; + } + + final Ability ability = Foxtrot.getInstance().getMapHandler().getAbilityHandler().getAbilities().values().stream().filter(it -> it.isSimilar(content)).findFirst().orElse(null); + + if (ability == null) { + continue; + } + + int amount = abilities.getOrDefault(ability, 0)+content.getAmount(); + + abilities.put(ability, amount); + } + + int amount = (int) Arrays.stream(target.getInventory().getContents()).filter(it -> it != null && it.getType() == Material.POTION && it.getDurability() == 16421).count(); + + damager.sendMessage(""); + damager.sendMessage(ChatColor.translate(target.getName() + " &chas &f" + amount + " &chealth potions in their inventory.")); + damager.sendMessage(ChatColor.translate(target.getName() + " &chas &f" + crapples + " &ccrapples in their inventory.")); + damager.sendMessage(ChatColor.translate(target.getName() + " &chas &f" + godApples + " &cgod apples in their inventory.")); + if (!abilities.isEmpty()) { + damager.sendMessage(ChatColor.translate("&4&lAbilities:")); + } + + for (Map.Entry abilityIntegerEntry : abilities.entrySet()) { + damager.sendMessage(ChatColor.translate("&4| &f" + abilityIntegerEntry.getKey().getDisplayName() + ": &c" + abilityIntegerEntry.getValue())); + } + + damager.sendMessage(""); + + final ItemStack itemStack = damager.getItemInHand(); + + if (itemStack.getAmount() == 1) { + damager.setItemInHand(null); + } else { + itemStack.setAmount(itemStack.getAmount()-1); + } + + this.applyCooldown(damager); + } +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/KitSwapper.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/KitSwapper.java new file mode 100644 index 0000000..6081707 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/KitSwapper.java @@ -0,0 +1,188 @@ +package net.frozenorb.foxtrot.gameplay.ability.type; + +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.ability.Ability; +import net.frozenorb.foxtrot.gameplay.ability.Category; +import net.frozenorb.foxtrot.gameplay.ability.listener.events.AbilityUseEvent; +import net.frozenorb.foxtrot.team.dtr.DTRBitmask; +import net.frozenorb.foxtrot.util.Item; +import org.bukkit.*; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.Action; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.ItemStack; + +import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; + +public class KitSwapper extends Ability { + + @Override + public String getName() { + return this.getClass().getSimpleName(); + } + + @Override + public Material getMaterial() { + return Material.YELLOW_FLOWER; + } + + @Override + public String getDisplayName() { + return ChatColor.YELLOW.toString() + ChatColor.BOLD + "Kit Swapper"; + } + + @Override + public List getLore() { + final List toReturn = new ArrayList<>(); + + toReturn.add(""); + toReturn.add(ChatColor.translate("&6❙ &fRight Click to switch your armor")); + toReturn.add(ChatColor.translate("&6❙ &fto another armor type that's in your inventory!")); + toReturn.add(""); + toReturn.add(ChatColor.translate("&fCan be found in the &d&lAbility Crate&f!")); + + return toReturn; + } + + @Override + public Boolean isAllowedAtLocation(Location location) { + if (Foxtrot.getInstance().getMapHandler().isKitMap()) { + return !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + return !Foxtrot.getInstance().getServerHandler().isWarzone(location) && location.getWorld().getEnvironment() == World.Environment.NORMAL && !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + @Override + public long getCooldown() { + return 30_000L; + } + + @Override + public Category getCategory() { + return Category.KIT_MAP; + } + + @Override + public String getDescription() { + return "Your armor has switched to another kit!"; + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onInteract(PlayerInteractEvent event) { + if (event.getAction() != Action.RIGHT_CLICK_AIR && event.getAction() != Action.RIGHT_CLICK_BLOCK) { + return; + } + + final Player player = event.getPlayer(); + + if (!this.isSimilar(event.getItem())) { + return; + } + + event.setCancelled(true); + + final AbilityUseEvent abilityUseEvent = new AbilityUseEvent(player, null, player.getLocation(), this, false); + Foxtrot.getInstance().getServer().getPluginManager().callEvent(abilityUseEvent); + + if (abilityUseEvent.isCancelled()) { + return; + } + + if (player.getItemInHand().getAmount() == 1) { + player.setItemInHand(null); + } else { + player.getItemInHand().setAmount(player.getItemInHand().getAmount() - 1); + } + + final HashMap items = new HashMap<>(); + + final Item.ArmorType current = Arrays.stream(Item.ArmorType.values()).filter(it -> Arrays.stream(player.getInventory().getArmorContents()).filter(Objects::nonNull).anyMatch(armor -> armor.getType().name().startsWith(it.name()))).findFirst().orElse(null); + + if (current == null) { + player.sendMessage(ChatColor.RED + "You are not wearing a full set."); + return; + } + + for (Item.ArmorType type : Item.ArmorType.values()) { + + if (type == current) { + continue; + } + + final Map slots = new HashMap<>(); + final Map armor = new HashMap<>(); + + for (Item.ArmorPart part : Item.ArmorPart.values()) { + armor.put(part,null); + } + + int i = 0; + + for (ItemStack content : player.getInventory().getContents()) { + + if (content != null) { + + for (Item.ArmorPart part : Item.ArmorPart.values()) { + + if (!content.getType().name().startsWith(type.name()) || !content.getType().name().endsWith(part.name())) { + continue; + } + + if (armor.containsKey(part) && armor.get(part) != null && content.getEnchantmentLevel(Enchantment.PROTECTION_ENVIRONMENTAL) < armor.get(part).getEnchantmentLevel(Enchantment.PROTECTION_ENVIRONMENTAL)) { + continue; + } + + armor.put(part,content); + slots.put(content,i); + } + + } + + i++; + } + + if (armor.values().stream().filter(Objects::nonNull).count() < 4) { + continue; + } + + armor.values().forEach(it -> items.put(slots.remove(it),it)); + break; + } + + if (items.isEmpty()) { + player.sendMessage(ChatColor.RED + "You have no other sets in your inventory."); + return; + } + + final AtomicInteger tick = new AtomicInteger(2); + + items.forEach((key,value) -> Bukkit.getScheduler().runTaskLater(Foxtrot.getInstance(),() -> { + + final Item.ArmorPart part = Item.ArmorPart.valueOf(value.getType().name().split("_")[1]); + + if (part == Item.ArmorPart.HELMET) { + player.getInventory().setItem(key,player.getInventory().getHelmet()); + player.getInventory().setHelmet(value); + } else if (part == Item.ArmorPart.CHESTPLATE) { + player.getInventory().setItem(key,player.getInventory().getChestplate()); + player.getInventory().setChestplate(value); + } else if (part == Item.ArmorPart.LEGGINGS) { + player.getInventory().setItem(key,player.getInventory().getLeggings()); + player.getInventory().setLeggings(value); + } else { + player.getInventory().setItem(key,player.getInventory().getBoots()); + player.getInventory().setBoots(value); + } + + },tick.getAndIncrement())); + + player.updateInventory(); + + this.applyCooldown(player); + } +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/LazyBrewer.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/LazyBrewer.java new file mode 100644 index 0000000..6407cc2 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/LazyBrewer.java @@ -0,0 +1,163 @@ +package net.frozenorb.foxtrot.gameplay.ability.type; + +import com.sk89q.worldedit.CuboidClipboard; +import com.sk89q.worldedit.MaxChangedBlocksException; +import com.sk89q.worldedit.bukkit.BukkitUtil; +import com.sk89q.worldedit.bukkit.BukkitWorld; +import com.sk89q.worldedit.schematic.MCEditSchematicFormat; +import com.sk89q.worldedit.world.DataException; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.ability.Ability; +import net.frozenorb.foxtrot.gameplay.ability.Category; +import net.frozenorb.foxtrot.team.Team; +import net.frozenorb.foxtrot.team.claims.LandBoard; +import net.frozenorb.foxtrot.team.dtr.DTRBitmask; +import net.frozenorb.foxtrot.util.DirectionUtil; +import net.frozenorb.foxtrot.util.SafetyUtils; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.Action; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.player.PlayerInteractEvent; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +public class LazyBrewer extends Ability { + + final File file = new File(System.getProperty("user.dir") + "/plugins/WorldEdit/schematics/lazybrewer.schematic"); + + @Override + public String getName() { + return this.getClass().getSimpleName(); + } + + @Override + public Material getMaterial() { + return Material.BREWING_STAND_ITEM; + } + + @Override + public String getDisplayName() { + return ChatColor.LIGHT_PURPLE.toString() + ChatColor.BOLD + "Lazy Brewer"; + } + + @Override + public List getLore() { + final List toReturn = new ArrayList<>(); + + toReturn.add(""); + toReturn.add(ChatColor.translate("&6❙ &fSpawn in 3 double chests of chests with pots.")); + toReturn.add(""); + toReturn.add(ChatColor.translate("&fCan be found in the &6&lOctober Mystery Box&f!")); + + return toReturn; + } + + @Override + public Boolean isAllowedAtLocation(Location location) { + return !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + @Override + public long getCooldown() { + return 0L; + } + + @Override + public Category getCategory() { + return Category.AIRDROPS; + } + + @Override + public String getDescription() { + return "Spawned a bunch of potions!"; + } + + @EventHandler + private void onInteract(PlayerInteractEvent event) { + final Player player = event.getPlayer(); + + if (!this.isSimilar(player.getItemInHand()) || event.getAction() != Action.RIGHT_CLICK_AIR) { + return; + } + + if (this.hasCooldown(player)) { + event.setCancelled(true); + return; + } + + List surroundingLocations = SafetyUtils.getSurroundingBlocks(player.getLocation()); + + final Team team = Foxtrot.getInstance().getTeamHandler().getTeam(player.getUniqueId()); + + boolean notSafe = surroundingLocations.stream().anyMatch(loc -> !SafetyUtils.isPassable(loc.getBlock()) || team == null || LandBoard.getInstance().getTeam(player.getLocation()) != team); + + if (notSafe) { + player.sendMessage(ChatColor.RED + "You may not do that here."); + return; + } + + if (player.getItemInHand().getAmount() == 1) { + player.setItemInHand(null); + } else { + player.getItemInHand().setAmount(player.getItemInHand().getAmount()-1); + } + player.updateInventory(); + + pasteSchematic(player.getLocation(), DirectionUtil.getDirection(player), file); + } + + @EventHandler(priority = EventPriority.LOW) + private void onPlace(BlockPlaceEvent event) { + final Player player = event.getPlayer(); + + if (!this.isSimilar(event.getItemInHand())) { + return; + } + + if (this.hasCooldown(player)) { + event.setCancelled(true); + return; + } + + event.setCancelled(true); + + List surroundingLocations = SafetyUtils.getSurroundingBlocks(player.getLocation()); + final Team team = Foxtrot.getInstance().getTeamHandler().getTeam(player.getUniqueId()); + + boolean allow = surroundingLocations.stream().anyMatch(loc -> !SafetyUtils.isPassable(loc.getBlock()) || team == null || LandBoard.getInstance().getTeam(player.getLocation()) != team); + + if (allow) { + player.sendMessage(ChatColor.RED + "You may not do that here."); + return; + } + + if (player.getItemInHand().getAmount() == 1) { + player.setItemInHand(null); + } else { + player.getItemInHand().setAmount(player.getItemInHand().getAmount()-1); + } + player.updateInventory(); + + pasteSchematic(player.getLocation(), DirectionUtil.getDirection(player), file); + } + + private void pasteSchematic(Location location, DirectionUtil directionUtils, File file) { + BukkitWorld world = new BukkitWorld(location.getWorld()); + try { + CuboidClipboard cuboidSelection = MCEditSchematicFormat.getFormat(file).load(file); + cuboidSelection.rotate2D(directionUtils.getDegrees()); + cuboidSelection.paste(Foxtrot.getInstance().getWorldEdit().getWorldEdit().getEditSessionFactory().getEditSession(world, 100), BukkitUtil.toVector(location), true); + } catch (IOException | DataException | MaxChangedBlocksException e) { + e.printStackTrace(); + } + } + +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/MedKit.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/MedKit.java new file mode 100644 index 0000000..fb70527 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/MedKit.java @@ -0,0 +1,136 @@ +package net.frozenorb.foxtrot.gameplay.ability.type; + +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.ability.Ability; +import net.frozenorb.foxtrot.gameplay.ability.Category; +import net.frozenorb.foxtrot.gameplay.ability.listener.events.AbilityUseEvent; +import net.frozenorb.foxtrot.gameplay.armorclass.ArmorClass; +import net.frozenorb.foxtrot.team.dtr.DTRBitmask; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +import java.util.ArrayList; +import java.util.List; + +public class MedKit extends Ability { + @Override + public Category getCategory() { + return Category.SEASONAL_CRATE; + } + + @Override + public String getDescription() { + return "You have been given health effects for 5 seconds!"; + } + + @Override + public String getName() { + return this.getClass().getSimpleName(); + } + + @Override + public Material getMaterial() { + return Material.PAPER; + } + + @Override + public String getDisplayName() { + return ChatColor.GREEN.toString() + ChatColor.BOLD + "Med Kit"; + } + + @Override + public List getLore() { + final List toReturn = new ArrayList<>(); + + toReturn.add(""); + if (Foxtrot.getInstance().getMapHandler().isKitMap()) { + toReturn.add(ChatColor.translate("&6❙ &fRight Click to get fully healed")); + toReturn.add(ChatColor.translate("&6❙ &fand receive Resistance 3, 4 Absorption hearts!")); + toReturn.add(""); + toReturn.add(ChatColor.translate("&fCan be found in an &b&lAirdrop&f!")); + } else { + toReturn.add(ChatColor.translate("&6❙ &fRight Click to receive Resistance 3,")); + toReturn.add(ChatColor.translate("&6❙ &fRegeneration 3, and 4 Absorption")); + toReturn.add(ChatColor.translate("&6❙ &fHearts for &e&l5 seconds&f!")); + toReturn.add(""); + toReturn.add(ChatColor.translate("&fCan be found in the &e&ki&6&lHalloween Crate&e&ki&f!")); + } + + return toReturn; + } + + @Override + public Boolean isAllowedAtLocation(Location location) { + if (Foxtrot.getInstance().getMapHandler().isKitMap()) { + return !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + return !Foxtrot.getInstance().getServerHandler().isWarzone(location) && location.getWorld().getEnvironment() == World.Environment.NORMAL && !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + @Override + public long getCooldown() { + return 90_000L; + } + + @EventHandler(priority = EventPriority.NORMAL) + public void onInteract(PlayerInteractEvent event) { + if (!event.getAction().name().contains("RIGHT")) { + return; + } + + final Player player = event.getPlayer(); + + final Location blockAt = player.getLocation(); + + if (!this.isSimilar(event.getItem())) { + return; + } + + final Block belowBlock = blockAt.getBlock().getRelative(BlockFace.DOWN); + + if (!Foxtrot.getInstance().getMapHandler().isKitMap() && !player.isOnGround() && belowBlock.getType() == Material.AIR && belowBlock.getRelative(BlockFace.DOWN).getType() == Material.AIR && belowBlock.getRelative(BlockFace.DOWN).getRelative(BlockFace.DOWN).getType() == Material.AIR) { + player.sendMessage(ChatColor.RED + "You may not use the " + this.getDisplayName() + ChatColor.RED + " in the air!"); + return; + } + + final AbilityUseEvent abilityUseEvent = new AbilityUseEvent(player, null, player.getLocation(), this, false); + Foxtrot.getInstance().getServer().getPluginManager().callEvent(abilityUseEvent); + + if (abilityUseEvent.isCancelled()) { + return; + } + + int seconds = 6; + + final ArmorClass armorClass = Foxtrot.getInstance().getArmorClassHandler().findWearing(player); + + if (armorClass != null && armorClass.getId().equalsIgnoreCase("Trapper")) { + seconds = 8; + } + + event.setCancelled(true); + + if (player.getItemInHand().getAmount() == 1) { + player.setItemInHand(null); + } else { + player.getItemInHand().setAmount(player.getItemInHand().getAmount()-1); + } + + player.addPotionEffect(new PotionEffect(PotionEffectType.REGENERATION, seconds*20, 2), true); + player.addPotionEffect(new PotionEffect(PotionEffectType.DAMAGE_RESISTANCE, seconds*20, 2), true); + player.addPotionEffect(new PotionEffect(PotionEffectType.ABSORPTION, 30*20, 1), true); + + this.applyCooldown(player); + } +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/MidasTouch.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/MidasTouch.java new file mode 100644 index 0000000..f5002bc --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/MidasTouch.java @@ -0,0 +1,377 @@ +package net.frozenorb.foxtrot.gameplay.ability.type; + +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.ability.Ability; +import net.frozenorb.foxtrot.gameplay.ability.Category; +import net.frozenorb.foxtrot.gameplay.ability.listener.events.AbilityUseEvent; +import net.frozenorb.foxtrot.listener.FoxListener; +import net.frozenorb.foxtrot.team.Team; +import net.frozenorb.foxtrot.team.dtr.DTRBitmask; +import net.frozenorb.foxtrot.util.InventoryUtils; +import net.frozenorb.foxtrot.util.PotionUtil; +import org.bukkit.*; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.Action; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerMoveEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.metadata.FixedMetadataValue; +import org.bukkit.potion.Potion; +import org.bukkit.scheduler.BukkitRunnable; + +import java.util.*; + +import static org.bukkit.Material.POTION; + +public class MidasTouch extends Ability { + @Override + public Category getCategory() { + return Category.SEASONAL_CRATE; + } + + @Override + public String getDescription() { + return "Players may not break/place/interact blocks on top of your gold trail!"; + } + + public static Map cache = new HashMap<>(); + public static Map data = new HashMap<>(); + private List disallowedMaterial = Arrays.asList( + Material.CHEST, Material.TRAPPED_CHEST, Material.ENDER_CHEST, Material.SIGN, Material.SIGN_POST, Material.HOPPER, + Material.ENCHANTMENT_TABLE, Material.AIR, Material.DROPPER, Material.DISPENSER, Material.FENCE_GATE); + + @Override + public String getName() { + return this.getClass().getSimpleName(); + } + + @Override + public Material getMaterial() { + return Material.GOLD_INGOT; + } + + @Override + public String getDisplayName() { + return ChatColor.GOLD.toString() + ChatColor.BOLD + "Midas Touch"; + } + + @Override + public List getLore() { + final List toReturn = new ArrayList<>(); + + toReturn.add(""); + toReturn.add(ChatColor.translate("&6❙ &fClick to activate and for &e&l15 seconds")); + toReturn.add(ChatColor.translate("&6❙ &fa 3x3 of gold blocks appear under you.")); + toReturn.add(ChatColor.translate("&6❙ &fYou cannot break/place/interact with.")); + toReturn.add(ChatColor.translate("&6❙ &fblocks on top of these gold blocks.")); + toReturn.add(""); + toReturn.add(ChatColor.translate("&fCan be found in the &d&lPartner Crate&f!")); + + return toReturn; + } + + @Override + public Boolean isAllowedAtLocation(Location location) { + if (Foxtrot.getInstance().getMapHandler().isKitMap()) { + return !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + return !Foxtrot.getInstance().getServerHandler().isWarzone(location) && location.getWorld().getEnvironment() == World.Environment.NORMAL && !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + + + @Override + public long getCooldown() { + return 135_000L; + } + + @EventHandler(priority = EventPriority.LOWEST) + private void onInteract(PlayerInteractEvent event) { + final Player player = event.getPlayer(); + + if (!this.isSimilar(player.getItemInHand()) || event.getAction() != Action.RIGHT_CLICK_AIR && event.getAction() != Action.RIGHT_CLICK_BLOCK) { + return; + } + + event.setCancelled(true); + + final AbilityUseEvent abilityUseEvent = new AbilityUseEvent(player, null, player.getLocation(), this, false); + Foxtrot.getInstance().getServer().getPluginManager().callEvent(abilityUseEvent); + + if (abilityUseEvent.isCancelled()) { + return; + } + + event.setCancelled(true); + + if (player.getItemInHand().getAmount() == 1) { + player.setItemInHand(null); + } else { + player.getItemInHand().setAmount(player.getItemInHand().getAmount() - 1); + } + + player.updateInventory(); + + player.setMetadata("ANTI_TRAP", new FixedMetadataValue(Foxtrot.getInstance(), true)); + + Foxtrot.getInstance().getServer().getScheduler().runTaskLater(Foxtrot.getInstance(), () -> { + if (player.isOnline()) { + player.removeMetadata("ANTI_TRAP", Foxtrot.getInstance()); + } + }, 20 * 11); + + final Team team = Foxtrot.getInstance().getTeamHandler().getTeam(player); + + if (team != null) { + applyCooldown(team, player); + return; + } + + this.applyCooldown(player); + } + + @EventHandler(priority = EventPriority.LOWEST) + private void onQuit(PlayerQuitEvent event) { + final Player player = event.getPlayer(); + + if (player.hasMetadata("ANTI_TRAP")) { + player.removeMetadata("ANTI_TRAP", Foxtrot.getInstance()); + } + } + + @EventHandler(priority = EventPriority.LOWEST) + private void onJoin(PlayerJoinEvent event) { + final Player player = event.getPlayer(); + + if (player.hasMetadata("ANTI_TRAP")) { + player.removeMetadata("ANTI_TRAP", Foxtrot.getInstance()); + } + } + + @EventHandler(priority = EventPriority.MONITOR) + private void onMove(PlayerMoveEvent event) { + if (event.getFrom().getBlockX() == event.getTo().getBlockX() && event.getFrom().getBlockY() == event.getTo().getBlockY() && event.getFrom().getBlockZ() == event.getTo().getBlockZ()) { + return; + } + + final Player player = event.getPlayer(); + + if (event.isCancelled() || !player.hasMetadata("ANTI_TRAP")) { + return; + } + + final Block firstBlock = event.getTo().getBlock().getRelative(BlockFace.DOWN); + + if (firstBlock.getType() == Material.AIR) { + return; + } + + final Block secondBlock = firstBlock.getRelative(BlockFace.SOUTH); + final Block thirdBlock = firstBlock.getRelative(BlockFace.WEST); + final Block fourthBlock = thirdBlock.getRelative(BlockFace.SOUTH); + final Block fifthBlock = firstBlock.getRelative(BlockFace.NORTH); + final Block sixthBlock = fifthBlock.getRelative(BlockFace.WEST); + final Block seventhBlock = fifthBlock.getRelative(BlockFace.EAST); + final Block eighthBlock = secondBlock.getRelative(BlockFace.EAST); + final Block ninthBlock = seventhBlock.getRelative(BlockFace.SOUTH); + + setAntiTrapBlock(firstBlock); + setAntiTrapBlock(secondBlock); + setAntiTrapBlock(thirdBlock); + setAntiTrapBlock(fourthBlock); + setAntiTrapBlock(fifthBlock); + setAntiTrapBlock(sixthBlock); + setAntiTrapBlock(seventhBlock); + setAntiTrapBlock(eighthBlock); + setAntiTrapBlock(ninthBlock); + } + + @EventHandler(priority = EventPriority.MONITOR) + private void onThankMove(PlayerMoveEvent event) { + if (event.getFrom().getBlockX() == event.getTo().getBlockX() && event.getFrom().getBlockY() == event.getTo().getBlockY() && event.getFrom().getBlockZ() == event.getTo().getBlockZ()) { + return; + } + + final Player player = event.getPlayer(); + + if (event.isCancelled() || !player.hasMetadata("ANTI_TRAP")) { + return; + } + + final Block block = event.getTo().getBlock(); + final Block firstBlock = block.getRelative(BlockFace.DOWN); + + if (firstBlock.getType() != Material.AIR) { + return; + } + + final Block secondBlock = firstBlock.getRelative(BlockFace.DOWN); + + if (secondBlock.getType() != Material.AIR) { + return; + } + + final Block thirdBlock = secondBlock.getRelative(BlockFace.DOWN); + + if (thirdBlock.getType() != Material.AIR) { + return; + } + + setAntiTrapBlock(firstBlock); + } + + public boolean isAntiTrapBlock(Block block) { + return block.hasMetadata("ANTI_TRAP"); + } + + public void setAntiTrapBlock(Block block) { + + final Material type = block.getType(); + + if (block.hasMetadata("ANTI_TRAP")) { + return; + } + + if (!this.isAllowedAtLocation(block.getLocation())) { + return; + } + + if (!type.isSolid()) { + return; + } + + if (type.name().toLowerCase().contains("fence")) { + return; + } + + if (this.disallowedMaterial.contains(type)) { + block.setMetadata("ANTI_TRAP", new FixedMetadataValue(Foxtrot.getInstance(), true)); + + new BukkitRunnable() { + @Override + public void run() { + block.removeMetadata("ANTI_TRAP", Foxtrot.getInstance()); + } + }.runTaskLater(Foxtrot.getInstance(), 20 * 5); + } else { + cache.put(block.getLocation(), type); + data.put(block.getLocation(), block.getData()); + + block.setType(Material.GOLD_BLOCK); + block.setMetadata("ANTI_TRAP", new FixedMetadataValue(Foxtrot.getInstance(), true)); + + new BukkitRunnable() { + @Override + public void run() { + block.removeMetadata("ANTI_TRAP", Foxtrot.getInstance()); + block.setType(cache.remove(block.getLocation())); + block.setData(data.remove(block.getLocation())); + } + }.runTaskLater(Foxtrot.getInstance(), 20 * 5); + } + } + + + @EventHandler + public void onPlace(BlockPlaceEvent event) { + if (event.isCancelled()) { + return; + } + + final Player player = event.getPlayer(); + + final Block downBlock = event.getBlockPlaced().getRelative(BlockFace.DOWN); + final Block downTwoBlock = downBlock.getRelative(BlockFace.DOWN); + + if (!this.isAntiTrapBlock(downBlock) && !this.isAntiTrapBlock(downTwoBlock)) { + return; + } + + player.sendMessage(ChatColor.RED + "You may not place blocks on top of a " + ChatColor.GOLD + ChatColor.BOLD.toString() + "Midas Touch" + ChatColor.RED + "."); + event.setCancelled(true); + } + + @EventHandler + public void onBreak(BlockBreakEvent event) { + final Block block = event.getBlock(); + + if (event.isCancelled()) { + return; + } + + final Player player = event.getPlayer(); + + if (this.isAntiTrapBlock(block) && player.getGameMode() != GameMode.CREATIVE) { + event.setCancelled(true); + player.sendMessage(ChatColor.RED + "You may not break a anti-trap rod block!"); + return; + } + + final Block downBlock = block.getRelative(BlockFace.DOWN); + final Block downTwoBlock = downBlock.getRelative(BlockFace.DOWN); + + if (this.isAntiTrapBlock(downBlock) || this.isAntiTrapBlock(downTwoBlock)) { + player.sendMessage(ChatColor.RED + "You may not break blocks as there is a " + ChatColor.GOLD + ChatColor.BOLD + "Midas Touch" + ChatColor.RED + " block below."); + event.setCancelled(true); + } + } + + @EventHandler + private void onPlate(PlayerInteractEvent event) { + final Block clickedBlock = event.getClickedBlock(); + + if ((event.getAction() != Action.PHYSICAL || clickedBlock == null || !clickedBlock.getType().name().contains("PLATE"))) { + return; + } + + final Block downBlock = event.getClickedBlock().getRelative(BlockFace.DOWN); + + if (!this.isAntiTrapBlock(downBlock)) { + return; + } + + event.setCancelled(true); + } + + @EventHandler + private void onClick(PlayerInteractEvent event) { + if ((event.getAction() != Action.RIGHT_CLICK_BLOCK || event.getClickedBlock() == null || !FoxListener.NO_INTERACT.contains(event.getClickedBlock().getType()))) { + return; + } + + final Player player = event.getPlayer(); + + final Block downBlock = event.getClickedBlock().getRelative(BlockFace.DOWN); + final Block downTwoBlock = downBlock.getRelative(BlockFace.DOWN); + final Block downThreeBlock = downTwoBlock.getRelative(BlockFace.DOWN); + + if (!this.isAntiTrapBlock(downBlock) && !this.isAntiTrapBlock(downTwoBlock) && !this.isAntiTrapBlock(downThreeBlock)) { + return; + } + + if (event.getItem() != null && event.getItem().getType() == POTION && event.getItem().getDurability() != 0) { + Potion potion = Potion.fromItemStack(event.getItem()); + + if (potion.isSplash()) { + PotionUtil.splashPotion(player, event.getItem()); + if (player.getItemInHand() != null && player.getItemInHand().isSimilar(event.getItem())) { + player.setItemInHand(null); + player.updateInventory(); + } else { + InventoryUtils.removeAmountFromInventory(player.getInventory(), event.getItem(), 1); + } + } + } + + event.setCancelled(true); + player.sendMessage(ChatColor.RED + "You may not open or close " + event.getClickedBlock().getType().name().toLowerCase().replace("_", " ") + "s as there is a " + ChatColor.GOLD + ChatColor.BOLD + "Midas Touch" + ChatColor.RED + " under it."); + } +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/MindStone.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/MindStone.java new file mode 100644 index 0000000..7f45050 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/MindStone.java @@ -0,0 +1,139 @@ +package net.frozenorb.foxtrot.gameplay.ability.type; + +import cc.fyre.proton.util.ItemBuilder; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.ability.Ability; +import net.frozenorb.foxtrot.gameplay.ability.Category; +import net.frozenorb.foxtrot.gameplay.ability.listener.events.AbilityUseEvent; +import net.frozenorb.foxtrot.gameplay.pvpclasses.PvPClassHandler; +import net.frozenorb.foxtrot.team.Team; +import net.frozenorb.foxtrot.team.claims.LandBoard; +import net.frozenorb.foxtrot.team.dtr.DTRBitmask; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.concurrent.TimeUnit; + +public class MindStone extends Ability { + public MindStone() { + this.hassanStack = ItemBuilder.copyOf(hassanStack.clone()).data((byte)14).build(); + } + + @Override + public Category getCategory() { + return Category.AIRDROPS; + } + + @Override + public String getDescription() { + return ""; + } + + @Override + public String getName() { + return this.getClass().getSimpleName(); + } + + @Override + public Material getMaterial() { + return Material.INK_SACK; + } + + @Override + public String getDisplayName() { + return ChatColor.YELLOW.toString() + ChatColor.BOLD + "Mind Stone"; + } + + @Override + public List getLore() { + final List toReturn = new ArrayList<>(); + + toReturn.add(""); + toReturn.add(ChatColor.translate("&6❙ &fHit a player to rotate their")); + toReturn.add(ChatColor.translate("&6❙ &fhead 180 degrees and give them")); + toReturn.add(ChatColor.translate("&6❙ &fBlindness X, Slowness III and")); + toReturn.add(ChatColor.translate("&6❙ &fNausea III for 8 seconds.")); + toReturn.add(""); + toReturn.add(ChatColor.translate("&fCan be found in the &6&lOctober Mystery Box&f!")); + + return toReturn; + } + + @Override + public Boolean isAllowedAtLocation(Location location) { + if (Foxtrot.getInstance().getMapHandler().isKitMap()) { + return !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + return !Foxtrot.getInstance().getServerHandler().isWarzone(location) && location.getWorld().getEnvironment() == World.Environment.NORMAL && !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + @Override + public long getCooldown() { + return TimeUnit.MINUTES.toMillis(2) + TimeUnit.SECONDS.toMillis(15); + } + + @EventHandler(priority = EventPriority.MONITOR) + private void onDamage(EntityDamageByEntityEvent event) { + if (event.isCancelled() || !(event.getDamager() instanceof Player) || !(event.getEntity() instanceof Player)) { + return; + } + + final Player target = (Player) event.getEntity(); + final Player damager = (Player) event.getDamager(); + + if (damager.getItemInHand() == null || !this.isSimilar(damager.getItemInHand())) { + return; + } + + final AbilityUseEvent abilityUseEvent = new AbilityUseEvent(damager, target, damager.getLocation(), this, false); + Foxtrot.getInstance().getServer().getPluginManager().callEvent(abilityUseEvent); + + if (abilityUseEvent.isCancelled()) { + return; + } + + if (PvPClassHandler.getPvPClass(target) != null) { + damager.sendMessage(ChatColor.RED + "You may not use a " + this.getDisplayName() + ChatColor.RED + " on a " + ChatColor.WHITE + Objects.requireNonNull(PvPClassHandler.getPvPClass(target)).getName() + ChatColor.RED + "."); + return; + } + + final Location location = target.getLocation(); + location.setYaw(location.getYaw()+180.0F); + + target.addPotionEffect(new PotionEffect(PotionEffectType.SLOW, 20*8, 2)); + target.addPotionEffect(new PotionEffect(PotionEffectType.CONFUSION, 20*8, 2)); + target.addPotionEffect(new PotionEffect(PotionEffectType.BLINDNESS, 20*8, 9)); + target.teleport(location); + + target.sendMessage(""); + target.sendMessage(ChatColor.DARK_RED + ChatColor.BOLD.toString() + "Ability Items"); + target.sendMessage(ChatColor.GRAY + "You have been hit with the " + this.getDisplayName() + ChatColor.RED + "."); + target.sendMessage(ChatColor.RED + "Your head has been rotated and you were given negative effects!"); + target.sendMessage(""); + + this.fullDescription = "Rotated " + target.getName() + "'s head and gave them negative effects."; + + final ItemStack itemStack = damager.getItemInHand(); + + if (itemStack.getAmount() == 1) { + damager.setItemInHand(null); + } else { + itemStack.setAmount(itemStack.getAmount()-1); + } + + this.applyCooldown(damager); + } +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/NinjaStar.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/NinjaStar.java new file mode 100644 index 0000000..467ddb0 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/NinjaStar.java @@ -0,0 +1,278 @@ +package net.frozenorb.foxtrot.gameplay.ability.type; + +import cc.fyre.neutron.Neutron; +import cc.fyre.proton.Proton; +import cc.fyre.proton.util.TimeUtils; +import lombok.AllArgsConstructor; +import lombok.Getter; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.ability.Ability; +import net.frozenorb.foxtrot.gameplay.ability.AbilityHandler; +import net.frozenorb.foxtrot.gameplay.ability.Category; +import net.frozenorb.foxtrot.gameplay.ability.listener.events.AbilityUseEvent; +import net.frozenorb.foxtrot.team.Team; +import net.frozenorb.foxtrot.team.claims.LandBoard; +import net.frozenorb.foxtrot.team.dtr.DTRBitmask; +import org.bukkit.*; +import org.bukkit.entity.EnderPearl; +import org.bukkit.entity.Player; +import org.bukkit.entity.Projectile; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.Action; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.entity.ProjectileLaunchEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.metadata.FixedMetadataValue; +import org.bukkit.scheduler.BukkitRunnable; + +import java.util.*; +import java.util.concurrent.TimeUnit; + +public class NinjaStar extends Ability { + + public static Map teleportCooldowns = new HashMap<>(); + + @Override + public Category getCategory() { + return Category.AIRDROPS; + } + + @Override + public String getDescription() { + return ""; + } + + public static Map cache = new HashMap<>(); + + @Override + public String getName() { + return this.getClass().getSimpleName(); + } + + @Override + public Material getMaterial() { + return Material.NETHER_STAR; + } + + @Override + public String getDisplayName() { + return ChatColor.AQUA.toString() + ChatColor.BOLD + "Ninja Star"; + } + + @Override + public List getLore() { + final List toReturn = new ArrayList<>(); + + toReturn.add(""); + toReturn.add(ChatColor.translate("&6❙ &fTeleport to the last person that")); + toReturn.add(ChatColor.translate("&6❙ &fhit you within the last &e&l30 seconds&f!")); + toReturn.add(""); + toReturn.add(ChatColor.translate("&fCan be found in an &b&lAirdrop&f!")); + + return toReturn; + } + + @Override + public Boolean isAllowedAtLocation(Location location) { + return !Foxtrot.getInstance().getServerHandler().isWarzone(location) && location.getWorld().getEnvironment() == World.Environment.NORMAL && !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + @Override + public long getCooldown() { + return 180_000L; + } + + @EventHandler + private void onInteract(PlayerInteractEvent event) { + final Player player = event.getPlayer(); + + final long difference = TimeUnit.SECONDS.toMillis(30L); + + + if (event.getAction() != Action.RIGHT_CLICK_BLOCK && event.getAction() != Action.RIGHT_CLICK_AIR) { + return; + } + + if (player.getItemInHand() == null || !this.isSimilar(player.getItemInHand())) { + return; + } + + final AbilityUseEvent abilityUseEvent = new AbilityUseEvent(player, null, player.getLocation(), this, false); + Foxtrot.getInstance().getServer().getPluginManager().callEvent(abilityUseEvent); + + if (abilityUseEvent.isCancelled()) { + return; + } + + if (!cache.containsKey(player.getUniqueId()) || (System.currentTimeMillis() - cache.get(player.getUniqueId()).getTime()) > difference) { + player.sendMessage(ChatColor.RED + "No player has hit you within the last 30 seconds."); + return; + } + + if (!player.hasMetadata("NO_COOLDOWN") && teleportCooldowns.containsKey(player.getUniqueId()) && teleportCooldowns.get(player.getUniqueId()) > System.currentTimeMillis()) { + long remaining = teleportCooldowns.get(player.getUniqueId())-System.currentTimeMillis(); + + player.sendMessage(ChatColor.translate("&cYou cannot use a &b&lTeleportation Item &cfor another &l" + TimeUtils.formatIntoDetailedString((int) (remaining/1000)) + "&c.")); + return; + } + + final LastDamageEntry entry = cache.get(player.getUniqueId()); + + final Player target = Foxtrot.getInstance().getServer().getPlayer(entry.getUuid()); + + if (target.isOnline()) { + + target.setMetadata("NINJASTAR", new FixedMetadataValue(Foxtrot.getInstance(), true)); + target.sendMessage(ChatColor.RED + "You may not use an enderpearl or timewarp for the next 5 seconds..."); + + Foxtrot.getInstance().getServer().getScheduler().runTaskLater(Foxtrot.getInstance(), () -> { + target.removeMetadata("NINJASTAR", Foxtrot.getInstance()); + }, 20*5); + } + + this.fullDescription = "Teleporting to &f" + target.getName() + " &cin 3 seconds..."; + + new BukkitRunnable() { + private int seconds = 3; + + @Override + public void run() { + + if (!event.getPlayer().isOnline()) { + this.cancel(); + return; + } + + final Player target = Foxtrot.getInstance().getServer().getPlayer(entry.getUuid()); + + if (Foxtrot.getInstance().getDeathbanArenaHandler().isDeathbanArena(target)) { + refund(player); + player.sendMessage(ChatColor.RED + "Cancelled the process as that player is in the Deathban Arena!"); + this.cancel(); + return; + } + + if (this.seconds < 1) { + + final Location location = (target != null && target.isOnline()) ? target.getLocation():entry.getLocation(); + + event.getPlayer().teleport(location); + + this.cancel(); + return; + } + + if (Foxtrot.getInstance().getDeathbanArenaHandler().isDeathbanArena(player)) { + this.cancel(); + player.sendMessage(ChatColor.translate("&cYou may not use &f" + getDisplayName() + " &cwhile deathbanned!")); + return; + } + + this.seconds--; + + event.getPlayer().sendMessage(ChatColor.YELLOW + "Teleporting to " + ChatColor.WHITE + Proton.getInstance().getUuidCache().name(entry.getUuid()) + ChatColor.YELLOW + " in " + ChatColor.RED + (this.seconds+1) + ChatColor.YELLOW + " second" + (this.seconds == 1 ? "":"s") + "..."); + + if (target != null && target.isOnline()) { + target.sendMessage(Neutron.getInstance().getProfileHandler().findDisplayName(player.getUniqueId()) + ChatColor.RED + " will teleport to you in " + ChatColor.WHITE + (this.seconds+1) + ChatColor.RED + " second" + (this.seconds == 1 ? "":"s") + "."); + } + } + + }.runTaskTimer(Foxtrot.getInstance(),0L,20L); + + if (player.getItemInHand().getAmount() == 1) { + player.setItemInHand(null); + } else { + player.getItemInHand().setAmount(player.getItemInHand().getAmount()-1); + } + + teleportCooldowns.put(player.getUniqueId(), System.currentTimeMillis()+TimeUnit.MINUTES.toMillis(1)); + + this.applyCooldown(player); + } + + public void refund(Player player) { + player.getInventory().addItem(this.hassanStack.clone()); + + this.removeCooldown(player); + } + + @EventHandler(priority = EventPriority.MONITOR) + private void onPearl(ProjectileLaunchEvent event) { + if (!(event.getEntity() instanceof EnderPearl)) { + return; + } + + if (!(event.getEntity().getShooter() instanceof Player)) { + return; + } + + final Player shooter = (Player) event.getEntity().getShooter(); + + if (shooter.hasMetadata("NINJASTAR")) { + event.setCancelled(true); + shooter.updateInventory(); + shooter.sendMessage(ChatColor.RED + "You may not throw enderpearls whilst someone is using a " + this.getDisplayName() + ChatColor.RED + " on you!"); + } + } + + @EventHandler(priority = EventPriority.MONITOR) + private void onEntityDamageByEntity(EntityDamageByEntityEvent event) { + + if (event.isCancelled()) { + return; + } + + if (!(event.getEntity() instanceof Player) || !(event.getDamager() instanceof Player)) { + return; + } + + cache.put(event.getEntity().getUniqueId(),new LastDamageEntry(System.currentTimeMillis(),event.getDamager().getUniqueId(),event.getDamager().getLocation())); + } + + @EventHandler(priority = EventPriority.MONITOR) + private void onEntityDamageByProjectile(EntityDamageByEntityEvent event) { + + if (event.isCancelled() || event.getDamager() instanceof EnderPearl) { + return; + } + + if (!(event.getEntity() instanceof Player) || !(event.getDamager() instanceof Projectile)) { + return; + } + + if (!(((Projectile) event.getDamager()).getShooter() instanceof Player)) { + return; + } + + final Player damager = (Player) ((Projectile) event.getDamager()).getShooter(); + + cache.put(event.getEntity().getUniqueId(),new LastDamageEntry(System.currentTimeMillis(),damager.getUniqueId(),damager.getLocation())); + } + + @EventHandler(priority = EventPriority.LOW) + private void onDeath(PlayerDeathEvent event) { + cache.remove(event.getEntity().getUniqueId()); + + final Optional> optionalLastDamageEntry = cache.entrySet().stream().filter(it -> it.getValue().getUuid().toString().equalsIgnoreCase(event.getEntity().getUniqueId().toString())).findFirst(); + + if (!optionalLastDamageEntry.isPresent()) { + return; + } + + cache.remove(optionalLastDamageEntry.get().getKey(), optionalLastDamageEntry.get().getValue()); + } + + @AllArgsConstructor + public static class LastDamageEntry { + + @Getter + private long time; + @Getter + private UUID uuid; + @Getter + private Location location; + + } +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/PhoenixMode.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/PhoenixMode.java new file mode 100644 index 0000000..b99a6f6 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/PhoenixMode.java @@ -0,0 +1,228 @@ +package net.frozenorb.foxtrot.gameplay.ability.type; + +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.ability.Ability; +import net.frozenorb.foxtrot.gameplay.ability.Category; +import net.frozenorb.foxtrot.gameplay.ability.listener.events.AbilityUseEvent; +import net.frozenorb.foxtrot.team.dtr.DTRBitmask; +import net.frozenorb.foxtrot.util.ParticleEffect; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; + +import java.util.*; + +public class PhoenixMode extends Ability { + private Map cache = new HashMap<>(); + + public PhoenixMode() { + new BukkitRunnable() { + + @Override + public void run() { + for (Map.Entry entry : cache.entrySet()) { + final Player player = Foxtrot.getInstance().getServer().getPlayer(entry.getKey()); + + if (player == null || player.isDead() || !player.isOnline()) { + cancel(); + return; + } + + Location location = entry.getValue(); + Location cornerOne = new Location(location.getWorld(), location.getX() - 5, location.getY() - 5, location.getZ() - 5), + cornerTwo = new Location(location.getWorld(), location.getX() + 5, location.getY() + 5, location.getZ() + 5); + List vectors = getHollowCube(cornerOne, cornerTwo); + for(Vector vector : vectors) + ParticleEffect.CLOUD.display(0.0f, 0.0f, 0.0f, 0.01f, 1, vector.toLocation(player.getWorld()), 50); + } + } + }.runTaskTimer(Foxtrot.getInstance(), 10, 10); + } + + @Override + public Category getCategory() { + return Category.SEASONAL_CRATE; + } + + @Override + public String getDescription() { + return "Created a cloud of particles! Fight with an advantage!"; + } + + @Override + public String getName() { + return this.getClass().getSimpleName(); + } + + @Override + public Material getMaterial() { + return Material.EMERALD; + } + + @Override + public String getDisplayName() { + return ChatColor.DARK_RED.toString() + ChatColor.BOLD + "Phoenix Mode"; + } + + @Override + public boolean inPartnerPackage() { + return true; + } + @Override + public List getLore() { + final List toReturn = new ArrayList<>(); + + toReturn.add(""); + toReturn.add(ChatColor.translate("&6❙ &fClick to create a cloud of particles.")); + toReturn.add(ChatColor.translate("&6❙ &fInside the cloud, enemies deal &c&l-15% &fdamage")); + toReturn.add(ChatColor.translate("&6❙ &fto you and you deal &c&l+15% &fdamage to enemies.")); + toReturn.add(""); + toReturn.add(ChatColor.translate("&fCan be found in the &4&lCave Crate&f!")); + + return toReturn; + } + + @Override + public Boolean isAllowedAtLocation(Location location) { + if (Foxtrot.getInstance().getMapHandler().isKitMap()) { + return !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + return !Foxtrot.getInstance().getServerHandler().isWarzone(location) && location.getWorld().getEnvironment() == World.Environment.NORMAL && !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + @Override + public long getCooldown() { + return 120_000L; + } + + @EventHandler(priority = EventPriority.NORMAL) + public void onInteract(PlayerInteractEvent event) { + if (!event.getAction().name().contains("RIGHT")) { + return; + } + + final Player player = event.getPlayer(); + + final Location blockAt = player.getLocation(); + + if (!this.isSimilar(event.getItem())) { + return; + } + + final AbilityUseEvent abilityUseEvent = new AbilityUseEvent(player, null, player.getLocation(), this, false); + Foxtrot.getInstance().getServer().getPluginManager().callEvent(abilityUseEvent); + + if (abilityUseEvent.isCancelled()) { + return; + } + + event.setCancelled(true); + + if (player.getItemInHand().getAmount() == 1) { + player.setItemInHand(null); + } else { + player.getItemInHand().setAmount(player.getItemInHand().getAmount()-1); + } + + cache.put(player.getUniqueId(), player.getLocation().clone().add(0, 1, 0)); + + Foxtrot.getInstance().getServer().getScheduler().runTaskLater(Foxtrot.getInstance(), () -> { + cache.remove(player.getUniqueId()); + + if (player.isOnline()) { + player.sendMessage(""); + player.sendMessage(ChatColor.RED + "Your " + this.getDisplayName() + ChatColor.RED + " has expired!"); + player.sendMessage(""); + } + }, 15*20); + + this.applyCooldown(player); + } + + @EventHandler + public void onEntityDamageByEntity(EntityDamageByEntityEvent event) { + if (!(event.getEntity() instanceof Player) || !(event.getDamager() instanceof Player)) { + return; + } + + final Player damager = (Player) event.getDamager(); + + if (!cache.containsKey(damager.getUniqueId())) { + return; + } + + final Location location = cache.get(damager.getUniqueId()); + + if (location.distance(damager.getLocation()) > 5) { + return; + } + + event.setDamage(event.getDamage()*1.15D); + } + + @EventHandler + public void onDamage(EntityDamageByEntityEvent event) { + if (!(event.getEntity() instanceof Player) || !(event.getDamager() instanceof Player)) { + return; + } + + final Player player = (Player) event.getEntity(); + + if (!cache.containsKey(player.getUniqueId())) { + return; + } + + final Location location = cache.get(player.getUniqueId()); + + if (location.distance(player.getLocation()) > 5) { + return; + } + + event.setDamage(event.getDamage()*0.85D); + } + + public static List getHollowCube(Location corner1, Location corner2) { + List result = new ArrayList<>(); + int minX = Math.min(corner1.getBlockX(), corner2.getBlockX()); + int minY = Math.min(corner1.getBlockY(), corner2.getBlockY()); + int minZ = Math.min(corner1.getBlockZ(), corner2.getBlockZ()); + int maxX = Math.max(corner1.getBlockX(), corner2.getBlockX()); + int maxY = Math.max(corner1.getBlockY(), corner2.getBlockY()); + int maxZ = Math.max(corner1.getBlockZ(), corner2.getBlockZ()); + + // 2 areas + for(int x = minX; x <= maxX; x++) { + for(int z = minZ; z <= maxZ; z++) { + result.add(new Vector(x, minY, z)); + result.add(new Vector(x, maxY, z)); + } + } + + // 2 sides (front & back) + for(int x = minX; x <= maxX; x++) { + for(int y = minY; y <= maxY; y++) { + result.add(new Vector(x, y, minZ)); + result.add(new Vector(x, y, maxZ)); + } + } + + // 2 sides (left & right) + for(int z = minZ; z <= maxZ; z++) { + for(int y = minY; y <= maxY; y++) { + result.add(new Vector(minX, y, z)); + result.add(new Vector(maxX, y, z)); + } + } + + return result; + } +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/PortableBard.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/PortableBard.java new file mode 100644 index 0000000..f9014bc --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/PortableBard.java @@ -0,0 +1,95 @@ +package net.frozenorb.foxtrot.gameplay.ability.type; + +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.ability.Ability; +import net.frozenorb.foxtrot.gameplay.ability.Category; +import net.frozenorb.foxtrot.gameplay.ability.menu.PortableBardMenu; +import net.frozenorb.foxtrot.team.dtr.DTRBitmask; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.Action; +import org.bukkit.event.player.PlayerInteractEvent; + +import java.util.ArrayList; +import java.util.List; + +public class PortableBard extends Ability { + + @Override + public String getDescription() { + return "Bard"; + } + + @Override + public Category getCategory() { + return Category.AIRDROPS; + } + + public PortableBard() { + this.hassanStack.setDurability((byte)14); + } + + @Override + public String getName() { + return this.getClass().getSimpleName(); + } + + @Override + public Material getMaterial() { + return Material.INK_SACK; + } + + @Override + public String getDisplayName() { + return ChatColor.GOLD.toString() + ChatColor.BOLD + "Portable Bard"; + } + + @Override + public List getLore() { + final List toReturn = new ArrayList<>(); + + toReturn.add(""); + toReturn.add(ChatColor.translate("&6❙ &fReceive &c&l5 &fportable bard effects!")); + toReturn.add(""); + toReturn.add(ChatColor.translate("&fCan be found in an &b&lAirdrop&f!")); + + return toReturn; + } + + @Override + public Boolean isAllowedAtLocation(Location location) { + if (Foxtrot.getInstance().getMapHandler().isKitMap()) { + return !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + return !Foxtrot.getInstance().getServerHandler().isWarzone(location) && location.getWorld().getEnvironment() == World.Environment.NORMAL && !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + @Override + public long getCooldown() { + return 90_000L; + } + + @EventHandler(priority = EventPriority.NORMAL) + public void onInteract(PlayerInteractEvent event) { + if (event.getAction() != Action.RIGHT_CLICK_AIR && event.getAction() != Action.RIGHT_CLICK_BLOCK && event.getAction() != Action.LEFT_CLICK_AIR && event.getAction() != Action.LEFT_CLICK_BLOCK) { + return; + } + + final Player player = event.getPlayer(); + + if (!this.isSimilar(event.getItem())) { + return; + } + + event.setCancelled(true); + + new PortableBardMenu().openMenu(player); + } + +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/PowerStone.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/PowerStone.java new file mode 100644 index 0000000..d1c0c95 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/PowerStone.java @@ -0,0 +1,209 @@ +package net.frozenorb.foxtrot.gameplay.ability.type; + +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.ability.Ability; +import net.frozenorb.foxtrot.gameplay.ability.Category; +import net.frozenorb.foxtrot.gameplay.ability.listener.events.AbilityUseEvent; +import net.frozenorb.foxtrot.team.Team; +import net.frozenorb.foxtrot.team.claims.LandBoard; +import net.frozenorb.foxtrot.team.dtr.DTRBitmask; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.entity.Player; +import org.bukkit.entity.ThrownPotion; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.Action; +import org.bukkit.event.entity.PotionSplashEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.potion.Potion; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; +import org.bukkit.potion.PotionType; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +public class PowerStone extends Ability { + public PowerStone() { + this.hassanStack.setDurability((byte)5); + } + + private List powerStone = new ArrayList<>(); + + @Override + public String getName() { + return this.getClass().getSimpleName(); + } + + @Override + public Material getMaterial() { + return Material.INK_SACK; + } + + @Override + public String getDisplayName() { + return ChatColor.DARK_PURPLE.toString() + ChatColor.BOLD + "Power Stone"; + } + + @Override + public Category getCategory() { + return Category.TREASURE_CHEST; + } + + @Override + public String getDescription() { + return "You have received Strength, Resistance and Regeneration for 10 seconds."; + } + + @Override + public List getLore() { + final List toReturn = new ArrayList<>(); + + toReturn.add(""); + toReturn.add(ChatColor.translate("&6❙ &fRight Click to receive Strength II,")); + toReturn.add(ChatColor.translate("&6❙ &fResistance III and Regeneration III for &e&l10 seconds")); + toReturn.add(ChatColor.translate("&6❙ &fDuring that time you may not use any potions!")); + toReturn.add(""); + toReturn.add(ChatColor.translate("&fCan be found in the &6&lOctober Mystery Box&f!")); + + return toReturn; + } + + @Override + public Boolean isAllowedAtLocation(Location location) { + final Team teamAt = LandBoard.getInstance().getTeam(location); + + if (teamAt != null && teamAt.getOwner() != null && teamAt.getOwner().toString().equals("dad8441f-dece-499d-a894-74cf3bd63d4a")) { + return false; + } + + if (Foxtrot.getInstance().getMapHandler().isKitMap()) { + return !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + return !Foxtrot.getInstance().getServerHandler().isWarzone(location) && location.getWorld().getEnvironment() == World.Environment.NORMAL && !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + @Override + public long getCooldown() { + return 165_000L; + } + + @EventHandler(priority = EventPriority.NORMAL) + public void onInteract(PlayerInteractEvent event) { + if (event.getAction() != Action.RIGHT_CLICK_AIR && event.getAction() != Action.RIGHT_CLICK_BLOCK) { + return; + } + + final Player player = event.getPlayer(); + + final Location blockAt = player.getLocation(); + + if (!this.isSimilar(event.getItem())) { + return; + } + + final AbilityUseEvent abilityUseEvent = new AbilityUseEvent(player, null, player.getLocation(), this, false); + Foxtrot.getInstance().getServer().getPluginManager().callEvent(abilityUseEvent); + + if (abilityUseEvent.isCancelled()) { + return; + } + + final Block belowBlock = blockAt.getBlock().getRelative(BlockFace.DOWN); + + if (!player.isOnGround() && belowBlock.getType() == Material.AIR && belowBlock.getRelative(BlockFace.DOWN).getType() == Material.AIR && belowBlock.getRelative(BlockFace.DOWN).getRelative(BlockFace.DOWN).getType() == Material.AIR) { + player.sendMessage(ChatColor.RED + "You may not use the " + this.getDisplayName() + ChatColor.RED + " in the air!"); + return; + } + + event.setCancelled(true); + + if (player.getItemInHand().getAmount() == 1) { + player.setItemInHand(null); + + } else { + player.getItemInHand().setAmount(player.getItemInHand().getAmount() - 1); + } + + player.addPotionEffect(new PotionEffect(PotionEffectType.REGENERATION, 20 * 11, 2), true); + player.addPotionEffect(new PotionEffect(PotionEffectType.DAMAGE_RESISTANCE, 20 * 11, 2), true); + player.addPotionEffect(new PotionEffect(PotionEffectType.INCREASE_DAMAGE, 20 * 11, 1), true); + + final UUID uuid = player.getUniqueId(); + powerStone.add(uuid); + + Foxtrot.getInstance().getServer().getScheduler().runTaskLater(Foxtrot.getInstance(), () -> { + player.sendMessage(""); + player.sendMessage(ChatColor.RED + "Your " + this.getDisplayName() + ChatColor.RED + " has expired! You may now splash potions!"); + player.sendMessage(""); + powerStone.remove(uuid); + }, 20 * 10); + + this.applyCooldown(player); + } + + @EventHandler + private void onSplash(PlayerInteractEvent event) { + if (!event.getAction().name().contains("RIGHT")) { + return; + } + + final Player player = event.getPlayer(); + final ItemStack itemStack = event.getItem(); + + if (itemStack == null) { + return; + } + + if (itemStack.getType() != Material.POTION) { + return; + } + + if (itemStack.getDurability() == 0) { // Water bottle + return; + } + + final Potion potion = Potion.fromItemStack(itemStack); + + if (potion.getType() != PotionType.INSTANT_HEAL) { + return; + } + + if (!powerStone.contains(player.getUniqueId())) { + return; + } + + player.sendMessage(ChatColor.RED + "You may not splash health potions whilst using " + this.getDisplayName() + ChatColor.RED + "."); + event.setCancelled(true); + } + + @EventHandler(priority = EventPriority.LOW) + private void onSplash(PotionSplashEvent event) { + final ThrownPotion thrownPotion = event.getPotion(); + + if (!(thrownPotion.getShooter() instanceof Player)) { + return; + } + + final Player shooter = (Player) event.getPotion().getShooter(); + + if (thrownPotion.getEffects().stream().noneMatch(it -> it.getType().getName().contains("HEAL"))) { + return; + } + + if (!powerStone.contains(shooter.getUniqueId())) { + return; + } + + shooter.sendMessage(ChatColor.RED + "You may not splash health potions whilst using " + this.getDisplayName() + ChatColor.RED + "."); + event.setCancelled(true); + } +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/RealityStone.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/RealityStone.java new file mode 100644 index 0000000..84bca6c --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/RealityStone.java @@ -0,0 +1,272 @@ +package net.frozenorb.foxtrot.gameplay.ability.type; + +import cc.fyre.neutron.Neutron; +import cc.fyre.proton.Proton; +import cc.fyre.proton.util.TimeUtils; +import lombok.AllArgsConstructor; +import lombok.Getter; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.ability.Ability; +import net.frozenorb.foxtrot.gameplay.ability.Category; +import net.frozenorb.foxtrot.gameplay.ability.listener.events.AbilityUseEvent; +import net.frozenorb.foxtrot.team.dtr.DTRBitmask; +import org.bukkit.*; +import org.bukkit.entity.EnderPearl; +import org.bukkit.entity.Player; +import org.bukkit.entity.Projectile; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.Action; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.entity.ProjectileLaunchEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.metadata.FixedMetadataValue; +import org.bukkit.scheduler.BukkitRunnable; + +import java.util.*; +import java.util.concurrent.TimeUnit; + +public class RealityStone extends Ability { + @Override + public Category getCategory() { + return Category.TREASURE_CHEST; + } + + @Override + public String getDescription() { + return ""; + } + + @Getter + private Map cache = new HashMap<>(); + + @Override + public String getName() { + return this.getClass().getSimpleName(); + } + + @Override + public Material getMaterial() { + return Material.REDSTONE; + } + + @Override + public String getDisplayName() { + return ChatColor.RED.toString() + ChatColor.BOLD + "Reality Stone"; + } + + @Override + public List getLore() { + final List toReturn = new ArrayList<>(); + + toReturn.add(""); + toReturn.add(ChatColor.translate("&6❙ &fRight Click to teleport to the player")); + toReturn.add(ChatColor.translate("&6❙ &fthat you last hit within a &e&l30 second &fperiod.")); + toReturn.add(""); + toReturn.add(ChatColor.translate("&fCan be found in the &6&lOctober Mystery Box&f!")); + + return toReturn; + } + + @Override + public Boolean isAllowedAtLocation(Location location) { + if (Foxtrot.getInstance().getMapHandler().isKitMap()) { + return !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + return !Foxtrot.getInstance().getServerHandler().isWarzone(location) && location.getWorld().getEnvironment() == World.Environment.NORMAL && !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + @Override + public long getCooldown() { + return 300_000L; + } + + @EventHandler + private void onInteract(PlayerInteractEvent event) { + final Player player = event.getPlayer(); + final long difference = TimeUnit.SECONDS.toMillis(30L); + + if (event.getAction() != Action.RIGHT_CLICK_BLOCK && event.getAction() != Action.RIGHT_CLICK_AIR) { + return; + } + + if (player.getItemInHand() == null || !this.isSimilar(player.getItemInHand())) { + return; + } + + final AbilityUseEvent abilityUseEvent = new AbilityUseEvent(player, null, player.getLocation(), this, false); + Foxtrot.getInstance().getServer().getPluginManager().callEvent(abilityUseEvent); + + if (abilityUseEvent.isCancelled()) { + return; + } + + if (!this.cache.containsKey(player.getUniqueId()) || (System.currentTimeMillis() - this.cache.get(player.getUniqueId()).getTime()) > difference) { + player.sendMessage(ChatColor.RED + "You have not hit a player in the last 30 seconds."); + return; + } + + if (!player.hasMetadata("NO_COOLDOWN") && NinjaStar.teleportCooldowns.containsKey(player.getUniqueId()) && NinjaStar.teleportCooldowns.get(player.getUniqueId()) > System.currentTimeMillis()) { + long remaining = NinjaStar.teleportCooldowns.get(player.getUniqueId())-System.currentTimeMillis(); + + player.sendMessage(ChatColor.translate("&cYou cannot use a &b&lTeleportation Item &cfor another &l" + TimeUtils.formatIntoDetailedString((int) (remaining/1000)) + "&c.")); + return; + } + + final LastDamageEntry entry = cache.get(player.getUniqueId()); + + final Player target = Foxtrot.getInstance().getServer().getPlayer(entry.getUuid()); + + if (target.isOnline()) { + + target.setMetadata("REALITY_STONE", new FixedMetadataValue(Foxtrot.getInstance(), true)); + target.sendMessage(ChatColor.RED + "You may not use an enderpearl or timewarp for the next 5 seconds..."); + + Foxtrot.getInstance().getServer().getScheduler().runTaskLater(Foxtrot.getInstance(), () -> { + target.removeMetadata("REALITY_STONE", Foxtrot.getInstance()); + }, 20*5); + } + + this.fullDescription = "Teleporting to &f" + target.getName() + " &cin 3 seconds..."; + + new BukkitRunnable() { + private int seconds = 3; + + @Override + public void run() { + + if (!event.getPlayer().isOnline()) { + this.cancel(); + return; + } + final Player target = Foxtrot.getInstance().getServer().getPlayer(entry.getUuid()); + + if (Foxtrot.getInstance().getDeathbanArenaHandler().isDeathbanArena(target)) { + refund(player); + player.sendMessage(ChatColor.RED + "Cancelled the process as that player is in the Deathban Arena!"); + this.cancel(); + return; + } + + if (this.seconds < 1) { + + final Location location = (target != null && target.isOnline()) ? target.getLocation():entry.getLocation(); + + event.getPlayer().teleport(location); + + this.cancel(); + return; + } + + if (Foxtrot.getInstance().getDeathbanArenaHandler().isDeathbanArena(player)) { + this.cancel(); + player.sendMessage(ChatColor.translate("&cYou may not use &f" + getDisplayName() + " &cwhile deathbanned!")); + return; + } + + this.seconds--; + + event.getPlayer().sendMessage(ChatColor.YELLOW + "Teleporting to " + ChatColor.WHITE + Proton.getInstance().getUuidCache().name(entry.getUuid()) + ChatColor.YELLOW + " in " + ChatColor.RED + (this.seconds+1) + ChatColor.YELLOW + " second" + (this.seconds == 1 ? "":"s") + "..."); + + if (target != null && target.isOnline()) { + target.sendMessage(Neutron.getInstance().getProfileHandler().findDisplayName(player.getUniqueId()) + ChatColor.RED + " will teleport to you in " + ChatColor.WHITE + (this.seconds+1) + ChatColor.RED + " second" + (this.seconds == 1 ? "":"s") + "."); + } + } + + }.runTaskTimer(Foxtrot.getInstance(),0L,20L); + + if (player.getItemInHand().getAmount() == 1) { + player.setItemInHand(null); + } else { + player.getItemInHand().setAmount(player.getItemInHand().getAmount()-1); + } + + this.applyCooldown(player); + } + + public void refund(Player player) { + player.getInventory().addItem(this.hassanStack.clone()); + + this.removeCooldown(player); + } + + @EventHandler(priority = EventPriority.MONITOR) + private void onPearl(ProjectileLaunchEvent event) { + if (!(event.getEntity() instanceof EnderPearl)) { + return; + } + + if (!(event.getEntity().getShooter() instanceof Player)) { + return; + } + + final Player shooter = (Player) event.getEntity().getShooter(); + + if (shooter.hasMetadata("REALITY_STONE")) { + event.setCancelled(true); + shooter.updateInventory(); + shooter.sendMessage(ChatColor.RED + "You may not throw enderpearls whilst someone is using a " + this.getDisplayName() + ChatColor.RED + " on you!"); + } + } + + @EventHandler(priority = EventPriority.MONITOR) + private void onEntityDamageByEntity(EntityDamageByEntityEvent event) { + + if (event.isCancelled()) { + return; + } + + if (!(event.getEntity() instanceof Player) || !(event.getDamager() instanceof Player)) { + return; + } + + this.cache.put(event.getDamager().getUniqueId(),new LastDamageEntry(System.currentTimeMillis(),event.getEntity().getUniqueId(),event.getEntity().getLocation())); + } + + @EventHandler(priority = EventPriority.MONITOR) + private void onEntityDamageByProjectile(EntityDamageByEntityEvent event) { + + if (event.isCancelled() || event.getDamager() instanceof EnderPearl) { + return; + } + + if (!(event.getEntity() instanceof Player) || !(event.getDamager() instanceof Projectile)) { + return; + } + + if (!(((Projectile) event.getDamager()).getShooter() instanceof Player)) { + return; + } + + final Player damager = (Player) ((Projectile) event.getDamager()).getShooter(); + + this.cache.put(damager.getUniqueId(),new LastDamageEntry(System.currentTimeMillis(),event.getEntity().getUniqueId(),event.getEntity().getLocation())); + } + + @EventHandler(priority = EventPriority.LOW) + private void onDeath(PlayerDeathEvent event) { + this.cache.remove(event.getEntity().getUniqueId()); + + final Optional> optionalLastDamageEntry = this.cache.entrySet().stream().filter(it -> it.getValue().getUuid().toString().equalsIgnoreCase(event.getEntity().getUniqueId().toString())).findFirst(); + + if (!optionalLastDamageEntry.isPresent()) { + return; + } + + this.cache.remove(optionalLastDamageEntry.get().getKey(), optionalLastDamageEntry.get().getValue()); + } + + @AllArgsConstructor + static class LastDamageEntry { + + @Getter + private long time; + @Getter + private UUID uuid; + @Getter + private Location location; + + } +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/ShockWave.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/ShockWave.java new file mode 100644 index 0000000..a85d34e --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/ShockWave.java @@ -0,0 +1,141 @@ +package net.frozenorb.foxtrot.gameplay.ability.type; + +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.ability.Ability; +import net.frozenorb.foxtrot.gameplay.ability.Category; +import net.frozenorb.foxtrot.gameplay.ability.listener.events.AbilityUseEvent; +import net.frozenorb.foxtrot.team.dtr.DTRBitmask; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.entity.Fireball; +import org.bukkit.entity.Player; +import org.bukkit.entity.Projectile; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.Action; +import org.bukkit.event.entity.ProjectileHitEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.metadata.FixedMetadataValue; + +import java.util.ArrayList; +import java.util.List; + +public class ShockWave extends Ability { + @Override + public Category getCategory() { + return Category.SEASONAL_CRATE; + } + + @Override + public String getDescription() { + return "Once this fireball lands players effected will be launched!"; + } + + @Override + public String getName() { + return this.getClass().getSimpleName(); + } + + @Override + public Material getMaterial() { + return Material.FIREBALL; + } + + @Override + public String getDisplayName() { + return ChatColor.DARK_RED.toString() + ChatColor.BOLD + "Shockwave"; + } + + @Override + public List getLore() { + + final List toReturn = new ArrayList<>(); + + toReturn.add(""); + toReturn.add(ChatColor.translate("&6❙ &fThrow this and everybody within")); + toReturn.add(ChatColor.translate("&6❙ &c&l10 blocks &fof where it lands will be launched.")); + toReturn.add(""); + if (Foxtrot.getInstance().getMapHandler().isKitMap()) { + toReturn.add(ChatColor.translate("&fCan be found in an &b&lAirdrop&f!")); + } else { + toReturn.add(ChatColor.translate("&fCan be found in the &4&lCave Crate&f!")); + } + + return toReturn; + } + + @Override + public Boolean isAllowedAtLocation(Location location) { + if (Foxtrot.getInstance().getMapHandler().isKitMap()) { + return !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + return !Foxtrot.getInstance().getServerHandler().isWarzone(location) && location.getWorld().getEnvironment() == World.Environment.NORMAL && !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + @Override + public long getCooldown() { + return 90_000L; + } + + @EventHandler(priority = EventPriority.NORMAL) + public void onInteract(PlayerInteractEvent event) { + if (event.getAction() != Action.RIGHT_CLICK_AIR && event.getAction() != Action.RIGHT_CLICK_BLOCK) { + return; + } + + final Player player = event.getPlayer(); + + if (!this.isSimilar(event.getItem())) { + return; + } + + event.setCancelled(true); + + final AbilityUseEvent abilityUseEvent = new AbilityUseEvent(player, null, player.getLocation(), this, false); + Foxtrot.getInstance().getServer().getPluginManager().callEvent(abilityUseEvent); + + if (abilityUseEvent.isCancelled()) { + return; + } + + if (player.getItemInHand().getAmount() == 1) { + player.setItemInHand(null); + } else { + player.getItemInHand().setAmount(player.getItemInHand().getAmount() - 1); + } + + final Fireball fireball = player.launchProjectile(Fireball.class); + + fireball.setMetadata("SHOCK_WAVE", new FixedMetadataValue(Foxtrot.getInstance(), player.getUniqueId().toString())); + fireball.setIsIncendiary(false); + fireball.setYield(0.0f); + fireball.setShooter(player); + + this.applyCooldown(player); + } + + @EventHandler + private void onLand(ProjectileHitEvent event) { + if (!(event.getEntity() instanceof Fireball) || !(event.getEntity().getShooter() instanceof Player) || !event.getEntity().hasMetadata("SHOCK_WAVE")) { + return; + } + + final Projectile fireBall = event.getEntity(); + final Player player = (Player) fireBall.getShooter(); + + fireBall.getNearbyEntities(10, 10, 10).stream().filter(it -> it instanceof Player && this.isAllowedAtLocation(it.getLocation())).forEach(it -> { + it.setVelocity(it.getLocation().getDirection().multiply(-2.5)); + + ((Player) it).setHealth(((Player) it).getHealth() - 1); + + ((Player) it).sendMessage(""); + ((Player) it).sendMessage(ChatColor.DARK_RED + ChatColor.BOLD.toString() + "Ability Items"); + ((Player) it).sendMessage(ChatColor.GRAY + "You have been hit with the " + this.getDisplayName() + ChatColor.GRAY + "!"); + ((Player) it).sendMessage(ChatColor.RED + "You have been sent flying in the air!"); + ((Player) it).sendMessage(""); + }); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/SoulStone.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/SoulStone.java new file mode 100644 index 0000000..dc86d80 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/SoulStone.java @@ -0,0 +1,160 @@ +package net.frozenorb.foxtrot.gameplay.ability.type; + +import cc.fyre.proton.Proton; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.ability.Ability; +import net.frozenorb.foxtrot.gameplay.ability.Category; +import net.frozenorb.foxtrot.gameplay.ability.listener.events.AbilityUseEvent; +import net.frozenorb.foxtrot.team.Team; +import net.frozenorb.foxtrot.team.claims.LandBoard; +import net.frozenorb.foxtrot.team.dtr.DTRBitmask; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.Action; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.metadata.FixedMetadataValue; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +import java.util.ArrayList; +import java.util.List; + +public class SoulStone extends Ability { + @Override + public Category getCategory() { + return Category.TREASURE_CHEST; + } + + @Override + public String getName() { + return this.getClass().getSimpleName(); + } + + @Override + public Material getMaterial() { + return Material.GOLD_INGOT; + } + + @Override + public String getDisplayName() { + return ChatColor.YELLOW.toString() + ChatColor.BOLD + "Soul Stone"; + } + + @Override + public String getDescription() { + return "Upon going below 2 hearts you will be healed and given effects."; + } + + @Override + public List getLore() { + final List toReturn = new ArrayList<>(); + + toReturn.add(""); + toReturn.add(ChatColor.translate("&6❙ &fUpon going below 2 hearts, you will be instantly")); + toReturn.add(ChatColor.translate("&6❙ &fhealed and given Resistance III for &e&l5 seconds&f.")); + toReturn.add(""); + toReturn.add(ChatColor.translate("&fCan be found in the &6&lOctober Mystery Box&f!")); + + return toReturn; + } + + @Override + public Boolean isAllowedAtLocation(Location location) { + final Team teamAt = LandBoard.getInstance().getTeam(location); + + if (teamAt != null && teamAt.getOwner() != null && teamAt.getOwner().toString().equals("dad8441f-dece-499d-a894-74cf3bd63d4a")) { + return false; + } + + if (Foxtrot.getInstance().getMapHandler().isKitMap()) { + return !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + return !Foxtrot.getInstance().getServerHandler().isWarzone(location) && location.getWorld().getEnvironment() == World.Environment.NORMAL && !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + @Override + public long getCooldown() { + return 150_000L; + } + + @EventHandler(priority = EventPriority.NORMAL) + public void onInteract(PlayerInteractEvent event) { + if (event.getAction() != Action.RIGHT_CLICK_AIR && event.getAction() != Action.RIGHT_CLICK_BLOCK) { + return; + } + + final Player player = event.getPlayer(); + + final Location blockAt = player.getLocation(); + + if (!this.isSimilar(event.getItem())) { + return; + } + + final Block belowBlock = blockAt.getBlock().getRelative(BlockFace.DOWN); + + if (!player.isOnGround() && belowBlock.getType() == Material.AIR && belowBlock.getRelative(BlockFace.DOWN).getType() == Material.AIR && belowBlock.getRelative(BlockFace.DOWN).getRelative(BlockFace.DOWN).getType() == Material.AIR) { + player.sendMessage(ChatColor.RED + "You may not use the " + this.getDisplayName() + ChatColor.RED + " in the air!"); + return; + } + + if (Proton.getInstance().getAutoRebootHandler().isRebooting()) { + player.sendMessage(ChatColor.RED + "You may not use this whilst the server is rebooting!"); + return; + } + + final AbilityUseEvent abilityUseEvent = new AbilityUseEvent(player, null, player.getLocation(), this, false); + Foxtrot.getInstance().getServer().getPluginManager().callEvent(abilityUseEvent); + + if (abilityUseEvent.isCancelled()) { + return; + } + + event.setCancelled(true); + + if (player.getItemInHand().getAmount() == 1) { + player.setItemInHand(null); + } else { + player.getItemInHand().setAmount(player.getItemInHand().getAmount()-1); + } + + player.setMetadata("SOUL_STONE", new FixedMetadataValue(Foxtrot.getInstance(), true)); + + this.applyCooldown(player); + } + + @EventHandler(priority = EventPriority.LOW) + private void onDamage(EntityDamageEvent event) { + if (!(event.getEntity() instanceof Player)) { + return; + } + + final Player player = (Player) event.getEntity(); + + if (!player.hasMetadata("SOUL_STONE")) { + return; + } + + if (player.getHealth() > 4) { + return; + } + + player.setHealth(player.getMaxHealth()); + player.addPotionEffect(new PotionEffect(PotionEffectType.DAMAGE_RESISTANCE, 20*6, 2)); + player.removeMetadata("SOUL_STONE", Foxtrot.getInstance()); + + player.sendMessage(""); + player.sendMessage(ChatColor.GREEN + "Your " + this.getDisplayName() + ChatColor.GREEN + " has activated!"); + player.sendMessage(ChatColor.GRAY + "You have been fully healed and received Resistance III for 5 seconds."); + player.sendMessage(""); + } +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/Spider.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/Spider.java new file mode 100644 index 0000000..8fbe179 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/Spider.java @@ -0,0 +1,191 @@ +package net.frozenorb.foxtrot.gameplay.ability.type; + +import cc.fyre.neutron.Neutron; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.ability.Ability; +import net.frozenorb.foxtrot.gameplay.ability.Category; +import net.frozenorb.foxtrot.gameplay.ability.listener.events.AbilityUseEvent; +import net.frozenorb.foxtrot.team.Team; +import net.frozenorb.foxtrot.team.claims.LandBoard; +import net.frozenorb.foxtrot.team.dtr.DTRBitmask; +import org.bukkit.*; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.Action; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.metadata.FixedMetadataValue; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; + +public class Spider extends Ability { + @Override + public Category getCategory() { + return Category.PARTNER_CRATE; + } + + @Override + public String getDescription() { + return "For the next 15 all hits have a 10% chance of spawning cobweb."; + } + + @Override + public String getName() { + return this.getClass().getSimpleName(); + } + + @Override + public Material getMaterial() { + return Material.SPIDER_EYE; + } + + @Override + public String getDisplayName() { + return ChatColor.YELLOW.toString() + ChatColor.BOLD + "Spider Ability"; + } + + @Override + public List getLore() { + final List toReturn = new ArrayList<>(); + + toReturn.add(""); + toReturn.add(ChatColor.translate("&6❙ &fClick to activate and for the")); + toReturn.add(ChatColor.translate("&6❙ &fnext &e&l15 seconds&f, all hits dealt")); + toReturn.add(ChatColor.translate("&6❙ &fhave a &c&l25% &fchance of putting a")); + toReturn.add(ChatColor.translate("&6❙ &fcobweb underneath the enemy.")); + toReturn.add(""); + toReturn.add(ChatColor.translate("&fCan be found in the &d&lPartner Crate&f!")); + + return toReturn; + } + + @Override + public Boolean isAllowedAtLocation(Location location) { + if (Foxtrot.getInstance().getMapHandler().isKitMap()) { + return !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + return !Foxtrot.getInstance().getServerHandler().isWarzone(location) && location.getWorld().getEnvironment() == World.Environment.NORMAL && !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + @Override + public boolean inPartnerPackage() { + return true; + } + + @Override + public long getCooldown() { + return 90_000L; + } + + @EventHandler(priority = EventPriority.NORMAL) + public void onInteract(PlayerInteractEvent event) { + if (event.getAction() != Action.RIGHT_CLICK_AIR && event.getAction() != Action.RIGHT_CLICK_BLOCK && event.getAction() != Action.LEFT_CLICK_AIR && event.getAction() != Action.LEFT_CLICK_BLOCK) { + return; + } + + final Player player = event.getPlayer(); + + final Location blockAt = player.getLocation(); + + if (!this.isSimilar(event.getItem())) { + return; + } + + final AbilityUseEvent abilityUseEvent = new AbilityUseEvent(player, null, player.getLocation(), this, false); + Foxtrot.getInstance().getServer().getPluginManager().callEvent(abilityUseEvent); + + if (abilityUseEvent.isCancelled()) { + return; + } + + event.setCancelled(true); + + if (player.getItemInHand().getAmount() == 1) { + player.setItemInHand(null); + } else { + player.getItemInHand().setAmount(player.getItemInHand().getAmount()-1); + } + + player.setMetadata("SPIDER", new FixedMetadataValue(Foxtrot.getInstance(), true)); + + Foxtrot.getInstance().getServer().getScheduler().runTaskLater(Foxtrot.getInstance(), () -> player.removeMetadata("SPIDER", Foxtrot.getInstance()), 20*15); + + this.applyCooldown(player); + } + + @EventHandler(priority = EventPriority.MONITOR) + private void onPlayerHit(EntityDamageByEntityEvent event) { + if (event.isCancelled() || !(event.getDamager() instanceof Player) || !(event.getEntity() instanceof Player)) { + return; + } + + final Player target = (Player) event.getEntity(); + final Player damager = (Player) event.getDamager(); + + if (!damager.hasMetadata("SPIDER")) { + return; + } + + if (ThreadLocalRandom.current().nextInt(100) > 25) { + return; + } + + final Block blockAt = target.getLocation().getBlock(); + + if (blockAt.getType() == Material.WEB) { + return; + } + + final Block block2 = blockAt.getRelative(BlockFace.SOUTH); + final Block block3 = blockAt.getRelative(BlockFace.WEST); + final Block block4 = block3.getRelative(BlockFace.SOUTH); + + if (blockAt.getType() == Material.AIR) { + blockAt.setType(Material.WEB); + } + + if (block2.getType() == Material.AIR) { + block2.setType(Material.WEB); + } + + if (block3.getType() == Material.AIR) { + block3.setType(Material.WEB); + } + + if (block4.getType() == Material.AIR) { + block4.setType(Material.WEB); + } + + Foxtrot.getInstance().getServer().getScheduler().runTaskLater(Foxtrot.getInstance(), () -> { + if (blockAt.getType() == Material.WEB) { + blockAt.setType(Material.AIR); + } + + if (block2.getType() == Material.WEB) { + block2.setType(Material.AIR); + } + + if (block3.getType() == Material.WEB) { + block3.setType(Material.AIR); + } + + if (block4.getType() == Material.WEB) { + block4.setType(Material.AIR); + } + }, 20*15); + + damager.playSound(damager.getLocation(), Sound.LEVEL_UP, 1, 1); + damager.sendMessage(ChatColor.RED + "You have put " + Neutron.getInstance().getProfileHandler().findDisplayName(target.getUniqueId()) + ChatColor.RED + " in a cobweb!"); + damager.sendMessage(ChatColor.RED + target.getName() + " has been put in a cobweb due to the " + this.getDisplayName() + "!"); + + target.playSound(target.getLocation(), Sound.ZOMBIE_WOODBREAK, 1, 1); + target.sendMessage(ChatColor.RED + "You were placed in a cobweb due to the " + this.getDisplayName() + ChatColor.RED + "!"); + } + +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/TNTMinecart.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/TNTMinecart.java new file mode 100644 index 0000000..1b500c4 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/TNTMinecart.java @@ -0,0 +1,161 @@ +package net.frozenorb.foxtrot.gameplay.ability.type; + +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.ability.Ability; +import net.frozenorb.foxtrot.gameplay.ability.Category; +import net.frozenorb.foxtrot.gameplay.ability.listener.events.AbilityUseEvent; +import net.frozenorb.foxtrot.team.Team; +import net.frozenorb.foxtrot.team.claims.LandBoard; +import net.frozenorb.foxtrot.team.dtr.DTRBitmask; +import net.frozenorb.foxtrot.util.CC; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.entity.minecart.ExplosiveMinecart; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.Action; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.metadata.FixedMetadataValue; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class TNTMinecart extends Ability { + @Override + public Category getCategory() { + return Category.AIRDROPS; + } + + @Override + public String getDescription() { + return "A TNT Minecart has been spawned 50 blocks above you."; + } + + @Override + public String getName() { + return this.getClass().getSimpleName(); + } + + @Override + public Material getMaterial() { + return Material.EXPLOSIVE_MINECART; + } + + @Override + public String getDisplayName() { + return ChatColor.DARK_RED.toString() + ChatColor.BOLD + "TNT Minecart"; + } + + @Override + public List getLore() { + final List toReturn = new ArrayList<>(); + + toReturn.add(""); + toReturn.add(ChatColor.translate("&6❙ &fRight Click to spawn a TNT Minecart")); + toReturn.add(ChatColor.translate("&6❙ &c&l50 blocks &fabove your head!")); + toReturn.add(""); + toReturn.add(ChatColor.translate("&fCan be found in an &b&lAirdrop&f!")); + + return toReturn; + } + + @Override + public Boolean isAllowedAtLocation(Location location) { + if (Foxtrot.getInstance().getMapHandler().isKitMap()) { + return !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + return !Foxtrot.getInstance().getServerHandler().isWarzone(location) && location.getWorld().getEnvironment() == World.Environment.NORMAL && !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + @Override + public long getCooldown() { + return 2_500L; + } + + @EventHandler(priority = EventPriority.NORMAL) + public void onInteract(PlayerInteractEvent event) { + + if (event.getAction() != Action.RIGHT_CLICK_AIR && event.getAction() != Action.RIGHT_CLICK_BLOCK) { + return; + } + + final Player player = event.getPlayer(); + + final Location blockAt = player.getLocation(); + + if (!this.isSimilar(event.getItem())) { + return; + } + + if (Foxtrot.getInstance().getMapHandler().isKitMap()) { + player.sendMessage(ChatColor.RED + "This item has been disabled!"); + return; + } + + if (!Foxtrot.getInstance().getMapHandler().isKitMap() && Foxtrot.getInstance().getServerHandler().isWarzone(player.getLocation())) { + player.sendMessage(ChatColor.RED + "You may not use this in WarZone!"); + return; + } + + final AbilityUseEvent abilityUseEvent = new AbilityUseEvent(player, null, player.getLocation(), this, false); + Foxtrot.getInstance().getServer().getPluginManager().callEvent(abilityUseEvent); + + if (abilityUseEvent.isCancelled()) { + return; + } + + event.setCancelled(true); + + if (Foxtrot.getInstance().getPvPTimerMap().hasTimer(player.getUniqueId())) { + player.sendMessage(CC.translateAlternateColorCodes("&cYou may not deploy a &c&lTNT Minecart &cwhile your &a&lPvP Timer &cis active!")); + return; + } + + blockAt.setY(blockAt.getY() + 50); + final Entity entity = player.getWorld().spawn(blockAt, ExplosiveMinecart.class); + entity.setMetadata("TNT_MINECART", new FixedMetadataValue(Foxtrot.getInstance(), player.getUniqueId().toString())); + + ItemStack itemStack = player.getItemInHand(); + itemStack.setAmount(itemStack.getAmount() - 1); + + player.setItemInHand(itemStack); + player.updateInventory(); + + applyCooldown(player); + } + + @EventHandler + public void onDamage(EntityDamageByEntityEvent event) { + if (!(event.getDamager() instanceof ExplosiveMinecart) || !(event.getEntity() instanceof Player)) { + return; + } + + final Player victim = (Player) event.getEntity(); + + if (Foxtrot.getInstance().getPvPTimerMap().hasTimer(victim.getUniqueId())) { + event.setCancelled(true); + return; + } + + if (!Foxtrot.getInstance().getMapHandler().isKitMap()) { + event.setDamage(event.getDamage()*0.8); + return; + } + + if (Arrays.stream(victim.getInventory().getArmorContents()).anyMatch(it -> it.containsEnchantment(Enchantment.PROTECTION_EXPLOSIONS))) { + event.setDamage(event.getDamage()*1.8); + return; + } + + event.setDamage(event.getDamage()*1.3); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/TimeStone.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/TimeStone.java new file mode 100644 index 0000000..a65cc5c --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/TimeStone.java @@ -0,0 +1,117 @@ +package net.frozenorb.foxtrot.gameplay.ability.type; + +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.ability.Ability; +import net.frozenorb.foxtrot.gameplay.ability.Category; +import net.frozenorb.foxtrot.gameplay.ability.listener.events.AbilityUseEvent; +import net.frozenorb.foxtrot.team.Team; +import net.frozenorb.foxtrot.team.claims.LandBoard; +import net.frozenorb.foxtrot.team.dtr.DTRBitmask; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.Action; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +import java.util.ArrayList; +import java.util.List; + +public class TimeStone extends Ability { + @Override + public Category getCategory() { + return Category.SEASONAL_CRATE; + } + + @Override + public String getDescription() { + return "Reset all of your partner item cooldowns!"; + } + + @Override + public String getName() { + return this.getClass().getSimpleName(); + } + + @Override + public Material getMaterial() { + return Material.EMERALD; + } + + @Override + public String getDisplayName() { + return ChatColor.GREEN.toString() + ChatColor.BOLD + "Time Stone"; + } + + @Override + public List getLore() { + final List toReturn = new ArrayList<>(); + + toReturn.add(""); + toReturn.add(ChatColor.translate("&6❙ &fRight Click to reset all of your")); + toReturn.add(ChatColor.translate("&6❙ &fability/partner item cooldowns.")); + toReturn.add(""); + toReturn.add(ChatColor.translate("&fCan be found in the &6&lOctober Mystery Box&f!")); + + return toReturn; + } + + @Override + public Boolean isAllowedAtLocation(Location location) { + if (Foxtrot.getInstance().getMapHandler().isKitMap()) { + return !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + return !Foxtrot.getInstance().getServerHandler().isWarzone(location) && location.getWorld().getEnvironment() == World.Environment.NORMAL && !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + @Override + public long getCooldown() { + return 600_000L; + } + + @EventHandler(priority = EventPriority.NORMAL) + public void onInteract(PlayerInteractEvent event) { + if (event.getAction() != Action.RIGHT_CLICK_AIR && event.getAction() != Action.RIGHT_CLICK_BLOCK) { + return; + } + + final Player player = event.getPlayer(); + + if (!this.isSimilar(event.getItem())) { + return; + } + + final AbilityUseEvent abilityUseEvent = new AbilityUseEvent(player, null, player.getLocation(), this, false); + Foxtrot.getInstance().getServer().getPluginManager().callEvent(abilityUseEvent); + + if (abilityUseEvent.isCancelled()) { + return; + } + + event.setCancelled(true); + + if (player.getItemInHand().getAmount() == 1) { + player.setItemInHand(null); + } else { + player.getItemInHand().setAmount(player.getItemInHand().getAmount()-1); + } + + for (Ability value : Foxtrot.getInstance().getMapHandler().getAbilityHandler().getAbilities().values()) { + if (value.getName().equalsIgnoreCase("TimeStone")) { + continue; + } + + if (value.hasCooldown(player)) { + value.removeCooldown(player); + } + } + + this.applyCooldown(player); + } +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/TimeWarp.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/TimeWarp.java new file mode 100644 index 0000000..c3042a7 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/TimeWarp.java @@ -0,0 +1,219 @@ +package net.frozenorb.foxtrot.gameplay.ability.type; + +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.ability.Ability; +import net.frozenorb.foxtrot.gameplay.ability.Category; +import net.frozenorb.foxtrot.gameplay.ability.listener.events.AbilityUseEvent; +import net.frozenorb.foxtrot.server.pearl.EnderpearlCooldownHandler; +import net.frozenorb.foxtrot.team.Team; +import net.frozenorb.foxtrot.team.claims.LandBoard; +import net.frozenorb.foxtrot.team.dtr.DTRBitmask; +import org.bukkit.*; +import org.bukkit.entity.EnderPearl; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.Action; +import org.bukkit.event.entity.ProjectileLaunchEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.scheduler.BukkitRunnable; + +import java.util.*; + +public class TimeWarp extends Ability { + @Override + public Category getCategory() { + return Category.AIRDROPS; + } + + @Override + public String getDescription() { + return "You will be warped back to your previous pearl in 3 seconds..."; + } + + public static Map enderPearl = new HashMap<>(); + + @Override + public String getName() { + return this.getClass().getSimpleName(); + } + + @Override + public Material getMaterial() { + return Material.WATCH; + } + + @Override + public String getDisplayName() { + return ChatColor.GOLD.toString() + ChatColor.BOLD + "Time Warp"; + } + + @Override + public List getLore() { + final List toReturn = new ArrayList<>(); + + toReturn.add(""); + toReturn.add(ChatColor.translate("&6❙ &fTravel back to where")); + toReturn.add(ChatColor.translate("&6❙ &fyou last threw a pearl!")); + toReturn.add(""); + toReturn.add(ChatColor.translate("&fCan be found in an &b&lAirdrop&f!")); + + return toReturn; + } + + @Override + public Boolean isAllowedAtLocation(Location location) { + return !Foxtrot.getInstance().getServerHandler().isWarzone(location) && location.getWorld().getEnvironment() == World.Environment.NORMAL && !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + @Override + public long getCooldown() { + return 90_000L; + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onInteract(PlayerInteractEvent event) { + if (!this.isSimilar(event.getItem()) || event.getAction() != Action.RIGHT_CLICK_AIR && event.getAction() != Action.RIGHT_CLICK_BLOCK) { + return; + } + + final Player player = event.getPlayer(); + + event.setCancelled(true); + + final AbilityUseEvent abilityUseEvent = new AbilityUseEvent(player, null, player.getLocation(), this, false); + Foxtrot.getInstance().getServer().getPluginManager().callEvent(abilityUseEvent); + + if (abilityUseEvent.isCancelled()) { + return; + } + + if (!enderPearl.containsKey(player.getUniqueId())) { + player.sendMessage(ChatColor.RED + "You have not thrown a pearl in the last 16 seconds..."); + return; + } + + if (player.hasMetadata("NINJASTAR")) { + player.sendMessage(ChatColor.RED + "You may not use a " + this.getDisplayName() + ChatColor.RED + " whilst someone is using a Ninja Star on you!"); + return; + } + + if (player.getItemInHand().getAmount() == 1) { + player.setItemInHand(null); + } else { + player.getItemInHand().setAmount(player.getItemInHand().getAmount() - 1); + } + + final Location location = enderPearl.remove(player.getUniqueId()).clone(); + + new BukkitRunnable() { + private int seconds = 4; + + @Override + public void run() { + this.seconds--; + + if (!event.getPlayer().isOnline()) { + this.cancel(); + return; + } + + if (player.hasMetadata("NINJASTAR")) { + player.sendMessage(ChatColor.RED + "You may not use a " + getDisplayName() + ChatColor.RED + " whilst someone is using a Ninja Star on you!"); + this.cancel(); + refund(player); + return; + } + + if (Foxtrot.getInstance().getDeathbanArenaHandler().isDeathbanArena(player)) { + this.cancel(); + refund(player); + player.sendMessage(ChatColor.translate("&cYou may not use &f" + getDisplayName() + " &cwhile deathbanned!")); + return; + } + + if (this.seconds <= 0) { + player.teleport(location); + + this.cancel(); + return; + } + + event.getPlayer().sendMessage(ChatColor.GREEN + "Teleporting in " + ChatColor.WHITE + this.seconds + ChatColor.GREEN + " second" + (this.seconds == 1 ? "":"s") + "..."); + event.getPlayer().playSound(event.getPlayer().getLocation(), Sound.NOTE_PLING, 1, 1); + } + }.runTaskTimer(Foxtrot.getInstance(),0L,20L); + + this.applyCooldown(player); + } + + public void refund(Player player) { + player.getInventory().addItem(this.hassanStack.clone()); + + this.removeCooldown(player); + } + + @EventHandler(priority = EventPriority.HIGHEST) + private void onLaunch(ProjectileLaunchEvent event) { + if (event.isCancelled() || !(event.getEntity() instanceof EnderPearl) || !(event.getEntity().getShooter() instanceof Player)) { + return; + } + + final Player shooter = (Player) event.getEntity().getShooter(); + + final Location location = shooter.getLocation(); + + enderPearl.remove(shooter.getUniqueId()); + enderPearl.put(shooter.getUniqueId(), shooter.getLocation()); + + Foxtrot.getInstance().getServer().getScheduler().runTaskLater(Foxtrot.getInstance(), () -> { + if (!enderPearl.containsKey(shooter.getUniqueId())) { + return; + } + + final Location newLocation = enderPearl.get(shooter.getUniqueId()); + + if (location.getX() != newLocation.getX() || location.getY() != newLocation.getY() || location.getZ() != newLocation.getZ()) { + return; + } + + enderPearl.remove(shooter.getUniqueId()); + }, 20*16); + } + + @EventHandler(priority = EventPriority.LOW) + private void onPearl(PlayerInteractEvent event) { + final Player player = event.getPlayer(); + + if (event.getItem() == null || !event.getAction().name().contains("RIGHT")) { + return; + } + + if (event.getItem().getType() != Material.ENDER_PEARL) { + return; + } + + if (EnderpearlCooldownHandler.getEnderpearlCooldown().containsKey(player.getName())) { + return; + } + + final Location location = player.getLocation().clone(); + + enderPearl.remove(player.getUniqueId()); + enderPearl.put(player.getUniqueId(), location); + + Foxtrot.getInstance().getServer().getScheduler().runTaskLater(Foxtrot.getInstance(), () -> { + if (!enderPearl.containsKey(player.getUniqueId())) { + return; + } + + final Location newLocation = enderPearl.get(player.getUniqueId()); + + if (location.getX() != newLocation.getX() || location.getY() != newLocation.getY() || location.getZ() != newLocation.getZ()) { + return; + } + + enderPearl.remove(player.getUniqueId()); + }, 20*15); + } +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/WitchEffect.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/WitchEffect.java new file mode 100644 index 0000000..bb6f654 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/WitchEffect.java @@ -0,0 +1,290 @@ +package net.frozenorb.foxtrot.gameplay.ability.type; + +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.ability.Ability; +import net.frozenorb.foxtrot.gameplay.ability.Category; +import net.frozenorb.foxtrot.gameplay.ability.listener.events.AbilityUseEvent; +import net.frozenorb.foxtrot.team.Team; +import net.frozenorb.foxtrot.team.claims.LandBoard; +import net.frozenorb.foxtrot.team.dtr.DTRBitmask; +import net.frozenorb.foxtrot.util.CC; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.entity.Bat; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; +import org.bukkit.entity.Witch; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.Action; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.EntityDeathEvent; +import org.bukkit.event.entity.EntityTargetEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.metadata.FixedMetadataValue; +import org.bukkit.potion.Potion; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; +import org.bukkit.scheduler.BukkitRunnable; + +import java.util.*; +import java.util.concurrent.ThreadLocalRandom; +import java.util.stream.Collectors; + +public class WitchEffect extends Ability { + private Map potionEffects = new HashMap<>(); + + @Override + public Category getCategory() { + return Category.PARTNER_CRATE; + } + + @Override + public String getDescription() { + return "A witch that give you passive effects has been spawned."; + } + + public WitchEffect() { + super(); + this.hassanStack.setDurability((byte) 66); + ItemMeta meta = this.hassanStack.getItemMeta(); + + this.hassanStack.setItemMeta(meta); + + potionEffects.put(new PotionEffect(PotionEffectType.SPEED,20*6, 2), "&bSpeed III"); + potionEffects.put(new PotionEffect(PotionEffectType.INCREASE_DAMAGE,20*6, 1), "&cStrength II"); + potionEffects.put(new PotionEffect(PotionEffectType.DAMAGE_RESISTANCE,20*6, 2), "&3Resistance III"); + potionEffects.put(new PotionEffect(PotionEffectType.REGENERATION,20*6, 2), "&dRegeneration III"); + } + + @Override + public String getName() { + return this.getClass().getSimpleName(); + } + + @Override + public Material getMaterial() { + return Material.MONSTER_EGG; + } + + @Override + public String getDisplayName() { + return ChatColor.DARK_PURPLE.toString() + ChatColor.BOLD + "Witch Effect"; + } + + @Override + public boolean inPartnerPackage() { + return true; + } + + @Override + public List getLore() { + final List toReturn = new ArrayList<>(); + + toReturn.add(""); + toReturn.add(ChatColor.translate("&6❙ &fSpawn a witch that gives you passive")); + toReturn.add(ChatColor.translate("&6❙ &fbard effects: strength, regeneration,")); + toReturn.add(ChatColor.translate("&6❙ &fand resistance.")); + toReturn.add(""); + toReturn.add(ChatColor.translate("&fCan be found in the &4&lCave Crate&f!")); + + return toReturn; + } + + @Override + public Boolean isAllowedAtLocation(Location location) { + if (Foxtrot.getInstance().getMapHandler().isKitMap()) { + return !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + return !Foxtrot.getInstance().getServerHandler().isWarzone(location) && location.getWorld().getEnvironment() == World.Environment.NORMAL && !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + + + @Override + public long getCooldown() { + return 120_000L; + } + + @EventHandler(priority = EventPriority.LOWEST) + private void onInteract(PlayerInteractEvent event) { + final Player player = event.getPlayer(); + + if (!this.isSimilar(player.getItemInHand()) || event.getAction() != Action.RIGHT_CLICK_AIR && event.getAction() != Action.RIGHT_CLICK_BLOCK) { + return; + } + + event.setCancelled(true); + + final AbilityUseEvent abilityUseEvent = new AbilityUseEvent(player, null, player.getLocation(), this, false); + Foxtrot.getInstance().getServer().getPluginManager().callEvent(abilityUseEvent); + + if (abilityUseEvent.isCancelled()) { + return; + } + + if (player.getItemInHand().getAmount() == 1) { + player.setItemInHand(null); + } else { + player.getItemInHand().setAmount(player.getItemInHand().getAmount() - 1); + } + + player.updateInventory(); + + final Witch witch = (Witch) player.getWorld().spawnEntity(player.getLocation(), EntityType.WITCH); + + witch.setMetadata("WITCH_EFFECT", new FixedMetadataValue(Foxtrot.getInstance(), player.getUniqueId().toString())); + witch.setCustomNameVisible(true); + witch.setCustomName(ChatColor.translate("&c" + player.getName() + "'s Witch &4&l8❤")); + + Foxtrot.getInstance().getServer().getScheduler().runTaskLater(Foxtrot.getInstance(), () -> { + + if (!witch.isDead()) { + witch.remove(); + } + + if (player.isOnline()) { + player.sendMessage(ChatColor.RED + "Your Witch has despawned!"); + } + + }, 20*60*3); + + final Team team = Foxtrot.getInstance().getTeamHandler().getTeam(player); + + new BukkitRunnable() { + + int seconds = 0; + + @Override + public void run() { + + if (witch.isDead()) { + player.sendMessage(ChatColor.RED + "Your Witch is now dead!"); + this.cancel(); + return; + } + + final Team checkTeam = Foxtrot.getInstance().getTeamHandler().getTeam(player); + final List targetPlayers = new ArrayList<>(Collections.singletonList(player)); + + if (checkTeam != null) { + targetPlayers.addAll(checkTeam.getOnlineMembers()); + targetPlayers.remove(player); + targetPlayers.remove(player); + targetPlayers.add(player); + } + + seconds += 2; + + for (Player targetPlayer : targetPlayers) { + if (!witch.getLocation().getWorld().getName().equalsIgnoreCase(targetPlayer.getWorld().getName())) { + continue; + } + + if (witch.getLocation().distance(targetPlayer.getLocation()) <= 15) { + if (seconds == 10) { + final PotionEffect potionEffect = new ArrayList<>(potionEffects.keySet()).get(ThreadLocalRandom.current().nextInt(potionEffects.size())); + + targetPlayer.sendMessage(ChatColor.translate("&aYou have been given " + potionEffects.get(potionEffect) + "&a by the &f" + getDisplayName() + "&a!")); + targetPlayer.addPotionEffect(potionEffect, true); + } + + targetPlayer.addPotionEffect(new PotionEffect(PotionEffectType.DAMAGE_RESISTANCE, 20 * 6, 0)); + targetPlayer.addPotionEffect(new PotionEffect(PotionEffectType.REGENERATION, 20 * 6, 0)); + targetPlayer.addPotionEffect(new PotionEffect(PotionEffectType.INCREASE_DAMAGE, 20 * 6, 0)); + } + } + + seconds = 0; + } + }.runTaskTimer(Foxtrot.getInstance(), 0, 40); + + if (team == null) { + this.applyCooldown(player); + return; + } + + this.applyCooldown(team, player); + } + + @EventHandler(priority = EventPriority.LOW) + private void onDeath(EntityDeathEvent event) { + if (!(event.getEntity() instanceof Witch)) { + return; + } + + final Witch witch = (Witch) event.getEntity(); + final String customName = witch.getCustomName(); + + if (customName == null) { + return; + } + + final String playersName = ChatColor.stripColor(customName).replace("'s Witch", ""); + + final Player player = Foxtrot.getInstance().getServer().getPlayer(playersName); + + if (player == null) { + return; + } + + player.sendMessage(ChatColor.RED + "Your Witch has died!"); + } + + @EventHandler(priority = EventPriority.LOW) + private void onDamage(EntityDamageByEntityEvent event) { + if (!(event.getEntity() instanceof Witch) || !(event.getDamager() instanceof Player)) { + return; + } + + final Player damager = (Player) event.getDamager(); + final Witch target = (Witch) event.getEntity(); + final String customName = target.getCustomName(); + + if (customName == null) { + return; + } + + UUID targetID = UUID.fromString(target.getMetadata("WITCH_EFFECT").get(0).asString()); + + final Player player = Foxtrot.getInstance().getServer().getPlayer(targetID); + final Team team = Foxtrot.getInstance().getTeamHandler().getTeam(targetID); + + if (player != null && player.getName().equalsIgnoreCase(damager.getName())) { + event.setCancelled(true); + damager.sendMessage(ChatColor.RED + "You can't hurt your own Witch!"); + return; + } + + if (player != null && team != null && team.isMember(damager.getUniqueId())) { + event.setCancelled(true); + damager.sendMessage(ChatColor.RED + "You can't hurt your teammates Witch!"); + return; + } + + int value = target.hasMetadata("WITCH_HIT") ? (target.getMetadata("WITCH_HIT").get(0).asInt() + 1) : 1; + + target.setMetadata("WITCH_HIT", new FixedMetadataValue(Foxtrot.getInstance(), value)); + + target.setCustomName(ChatColor.translate("&5&lWitch Effect &4&l" + (8-value) + "❤")); + + if (value != 8) { + event.setDamage(0); + return; + } + + target.removeMetadata("WITCH_HIT", Foxtrot.getInstance()); + target.setHealth(0); + } + + @EventHandler(priority = EventPriority.LOW) + private void onTarget(EntityTargetEvent event) { + if (event.getEntity() instanceof Witch) { + event.setCancelled(true); + } + } + } diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/ZeusHammer.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/ZeusHammer.java new file mode 100644 index 0000000..76fa91c --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/ZeusHammer.java @@ -0,0 +1,164 @@ +package net.frozenorb.foxtrot.gameplay.ability.type; + +import cc.fyre.neutron.Neutron; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.ability.Ability; +import net.frozenorb.foxtrot.gameplay.ability.Category; +import net.frozenorb.foxtrot.gameplay.ability.listener.events.AbilityUseEvent; +import net.frozenorb.foxtrot.team.Team; +import net.frozenorb.foxtrot.team.claims.LandBoard; +import net.frozenorb.foxtrot.team.dtr.DTRBitmask; +import org.bukkit.*; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.Action; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.metadata.FixedMetadataValue; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; + +public class ZeusHammer extends Ability { + + @Override + public String getName() { + return this.getClass().getSimpleName(); + } + + @Override + public Material getMaterial() { + return Material.GOLD_INGOT; + } + + @Override + public String getDisplayName() { + return ChatColor.DARK_PURPLE.toString() + ChatColor.BOLD + "Zeus Hammer"; + } + + @Override + public List getLore() { + final List toReturn = new ArrayList<>(); + + toReturn.add(""); + toReturn.add(ChatColor.translate("&6❙ &fClick to activate and for 10 seconds, all hits")); + toReturn.add(ChatColor.translate("&6❙ &fdealt have a 10% chance of striking the enemy with lightning!")); + toReturn.add(""); + toReturn.add(ChatColor.translate("&fCan be found in the &6&lOctober Mystery Box&f!")); + + return toReturn; + } + + @Override + public Boolean isAllowedAtLocation(Location location) { + final Team teamAt = LandBoard.getInstance().getTeam(location); + + if (teamAt != null && teamAt.getOwner() != null && teamAt.getOwner().toString().equals("dad8441f-dece-499d-a894-74cf3bd63d4a")) { + return false; + } + + if (Foxtrot.getInstance().getMapHandler().isKitMap()) { + return !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + return !Foxtrot.getInstance().getServerHandler().isWarzone(location) && location.getWorld().getEnvironment() == World.Environment.NORMAL && !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + + + @Override + public long getCooldown() { + return 195_000L; + } + + @Override + public Category getCategory() { + return Category.AIRDROPS; + } + + @Override + public String getDescription() { + return "Each hit has a chance of striking the enemy with lightning."; + } + + @EventHandler(priority = EventPriority.NORMAL) + public void onInteract(PlayerInteractEvent event) { + if (event.getAction() != Action.RIGHT_CLICK_AIR && event.getAction() != Action.RIGHT_CLICK_BLOCK && event.getAction() != Action.LEFT_CLICK_AIR && event.getAction() != Action.LEFT_CLICK_BLOCK) { + return; + } + + final Player player = event.getPlayer(); + + if (!this.isSimilar(event.getItem())) { + return; + } + + final AbilityUseEvent abilityUseEvent = new AbilityUseEvent(player, null, player.getLocation(), this, false); + Foxtrot.getInstance().getServer().getPluginManager().callEvent(abilityUseEvent); + + if (abilityUseEvent.isCancelled()) { + return; + } + + event.setCancelled(true); + + if (player.getItemInHand().getAmount() == 1) { + player.setItemInHand(null); + } else { + player.getItemInHand().setAmount(player.getItemInHand().getAmount()-1); + } + + player.setMetadata("HAMMER", new FixedMetadataValue(Foxtrot.getInstance(), true)); + + Foxtrot.getInstance().getServer().getScheduler().runTaskLater(Foxtrot.getInstance(), () -> player.removeMetadata("HAMMER", Foxtrot.getInstance()), 20*15); + + this.applyCooldown(player); + } + + @EventHandler(priority = EventPriority.MONITOR) + private void onPlayerHit(EntityDamageByEntityEvent event) { + + if (event.isCancelled() || !(event.getDamager() instanceof Player) || !(event.getEntity() instanceof Player)) { + return; + } + + final Player target = (Player) event.getEntity(); + final Player damager = (Player) event.getDamager(); + + if (!damager.hasMetadata("HAMMER")) { + return; + } + + if (ThreadLocalRandom.current().nextInt(100) > 10) { + return; + } + + damager.playSound(damager.getLocation(), Sound.LEVEL_UP, 1, 1); + damager.sendMessage(ChatColor.RED + "You have struck " + Neutron.getInstance().getProfileHandler().findDisplayName(target.getUniqueId()) + ChatColor.RED + " with lightning!"); + + double damage = ThreadLocalRandom.current().nextBoolean() ? 2 : 3; + + target.setHealth(target.getHealth()-damage); + target.getWorld().strikeLightningEffect(target.getLocation().clone()); + target.damage(0); + target.playSound(target.getLocation(), Sound.ZOMBIE_WOODBREAK, 1, 1); + target.sendMessage(ChatColor.RED + "You struck by lightning due to the " + this.getDisplayName() + ChatColor.RED + "!"); + } + + @EventHandler(priority = EventPriority.LOWEST) + public void onEntityDamage(EntityDamageEvent event) { + + if (!(event.getEntity() instanceof Player)) { + return; + } + + if (event.getCause() != EntityDamageEvent.DamageCause.LIGHTNING) { + return; + } + + event.setCancelled(true); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/kitmap/FiftyFifty.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/kitmap/FiftyFifty.java new file mode 100644 index 0000000..09c1814 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/kitmap/FiftyFifty.java @@ -0,0 +1,120 @@ +package net.frozenorb.foxtrot.gameplay.ability.type.kitmap; + +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.ability.Ability; +import net.frozenorb.foxtrot.gameplay.ability.Category; +import net.frozenorb.foxtrot.gameplay.ability.listener.events.AbilityUseEvent; +import net.frozenorb.foxtrot.team.dtr.DTRBitmask; +import net.frozenorb.foxtrot.util.CC; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.Action; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; + +public class FiftyFifty extends Ability { + @Override + public Category getCategory() { + return Category.KIT_MAP; + } + + @Override + public String getDescription() { + return ""; + } + + + @Override + public String getName() { + return this.getClass().getSimpleName(); + } + + @Override + public Material getMaterial() { + return Material.SPIDER_EYE; + } + + @Override + public String getDisplayName() { + return ChatColor.LIGHT_PURPLE.toString() + ChatColor.BOLD + "Fifty Fifty"; + } + + @Override + public List getLore() { + final List toReturn = new ArrayList<>(); + + toReturn.add(""); + toReturn.add(ChatColor.translate("&6❙ &f50% chance of getting Strength II")); + toReturn.add(ChatColor.translate("&6❙ &f50% chance of getting Weakness II")); + toReturn.add(""); + toReturn.add(ChatColor.translate("&fCan be found in the &d&l??? &fCrate!")); + + return toReturn; + } + + @Override + public Boolean isAllowedAtLocation(Location location) { + if (Foxtrot.getInstance().getMapHandler().isKitMap()) { + return !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + return !Foxtrot.getInstance().getServerHandler().isWarzone(location) && location.getWorld().getEnvironment() == World.Environment.NORMAL && !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + @Override + public long getCooldown() { + return 90_000L; + } + + @EventHandler(priority = EventPriority.NORMAL) + public void onInteract(PlayerInteractEvent event) { + if (event.getAction() != Action.RIGHT_CLICK_AIR && event.getAction() != Action.RIGHT_CLICK_BLOCK) { + return; + } + + final Player player = event.getPlayer(); + + final Location blockAt = player.getLocation(); + + if (!this.isSimilar(event.getItem())) { + return; + } + + final AbilityUseEvent abilityUseEvent = new AbilityUseEvent(player, null, player.getLocation(), this, false); + Foxtrot.getInstance().getServer().getPluginManager().callEvent(abilityUseEvent); + + if (abilityUseEvent.isCancelled()) { + return; + } + + event.setCancelled(true); + + if (player.getItemInHand().getAmount() == 1) { + player.setItemInHand(null); + } else { + player.getItemInHand().setAmount(player.getItemInHand().getAmount()-1); + } + + if (ThreadLocalRandom.current().nextBoolean()) { + player.addPotionEffect(new PotionEffect(PotionEffectType.INCREASE_DAMAGE, 200, 1)); + this.fullDescription = "You have received Strength II!"; + } else { + player.addPotionEffect(new PotionEffect(PotionEffectType.WEAKNESS, 200, 1)); + this.fullDescription = "You have received Weakness II!"; + } + + this.applyCooldown(player); + } +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/kitmap/Gift.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/kitmap/Gift.java new file mode 100644 index 0000000..461e32c --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/kitmap/Gift.java @@ -0,0 +1,111 @@ +package net.frozenorb.foxtrot.gameplay.ability.type.kitmap; + +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.ability.Ability; +import net.frozenorb.foxtrot.gameplay.ability.Category; +import net.frozenorb.foxtrot.gameplay.ability.listener.events.AbilityUseEvent; +import net.frozenorb.foxtrot.team.dtr.DTRBitmask; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.Action; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +import java.util.ArrayList; +import java.util.List; + +public class Gift extends Ability { + + @Override + public Category getCategory() { + return Category.KIT_MAP; + } + + @Override + public String getDescription() { + return "You have healed yourself and were given Strength II!"; + } + + @Override + public String getName() { + return this.getClass().getSimpleName(); + } + + @Override + public Material getMaterial() { + return Material.NETHER_STAR; + } + + @Override + public String getDisplayName() { + return ChatColor.RED.toString() + ChatColor.BOLD + "Gift"; + } + + @Override + public List getLore() { + final List toReturn = new ArrayList<>(); + + toReturn.add(""); + toReturn.add(ChatColor.translate("&6❙ &fRight click to fully heal yourself")); + toReturn.add(ChatColor.translate("&6❙ &fand receive 5 seconds of Strength II")); + toReturn.add(""); + toReturn.add(ChatColor.translate("&fCan be found in the &d???&f!")); + + return toReturn; + } + + @Override + public Boolean isAllowedAtLocation(Location location) { + if (Foxtrot.getInstance().getMapHandler().isKitMap()) { + return !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + return !Foxtrot.getInstance().getServerHandler().isWarzone(location) && location.getWorld().getEnvironment() == World.Environment.NORMAL && !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + + + @Override + public long getCooldown() { + return 120_000L; + } + + @EventHandler(priority = EventPriority.NORMAL) + public void onInteract(PlayerInteractEvent event) { + if (event.getAction() != Action.RIGHT_CLICK_AIR && event.getAction() != Action.RIGHT_CLICK_BLOCK) { + return; + } + + final Player player = event.getPlayer(); + + if (!this.isSimilar(event.getItem())) { + return; + } + + final AbilityUseEvent abilityUseEvent = new AbilityUseEvent(player, null, player.getLocation(), this, false); + Foxtrot.getInstance().getServer().getPluginManager().callEvent(abilityUseEvent); + + if (abilityUseEvent.isCancelled()) { + return; + } + + event.setCancelled(true); + + if (player.getItemInHand().getAmount() == 1) { + player.setItemInHand(null); + } else { + player.getItemInHand().setAmount(player.getItemInHand().getAmount()-1); + } + + player.setHealth(player.getMaxHealth()); + player.addPotionEffect(new PotionEffect(PotionEffectType.INCREASE_DAMAGE, 100, 1)); + + this.applyCooldown(player); + } +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/kitmap/Grapple.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/kitmap/Grapple.java new file mode 100644 index 0000000..e79d032 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/kitmap/Grapple.java @@ -0,0 +1,194 @@ +package net.frozenorb.foxtrot.gameplay.ability.type.kitmap; + +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.ability.Ability; +import net.frozenorb.foxtrot.gameplay.ability.Category; +import net.frozenorb.foxtrot.team.Team; +import net.frozenorb.foxtrot.team.claims.LandBoard; +import net.frozenorb.foxtrot.team.dtr.DTRBitmask; +import org.bukkit.*; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.entity.Entity; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.player.PlayerFishEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.metadata.FixedMetadataValue; +import org.bukkit.util.Vector; + +import java.util.ArrayList; +import java.util.List; + +public class Grapple extends Ability { + + public static short DURABILITY_LOSS = 6; + public static double VELOCITY_CHANGE = 0.25; + + @Override + public String getName() { + return this.getClass().getSimpleName(); + } + + @Override + public Material getMaterial() { + return Material.FISHING_ROD; + } + + @Override + public String getDisplayName() { + return ChatColor.GOLD.toString() + ChatColor.BOLD + this.getName(); + } + + @Override + public List getLore() { + + final List toReturn = new ArrayList<>(); + + toReturn.add(ChatColor.GRAY + "Hook the block you'd like to"); + toReturn.add(ChatColor.GRAY + "move towards and then release to get sent!"); + toReturn.add(""); + if (Foxtrot.getInstance().getMapHandler().isKitMap()) { + toReturn.add(ChatColor.translate("&fCan be found in an &c&lMario Crate&f!")); + } else { + toReturn.add(ChatColor.translate("&fCan be found in an &b&lAir Drop&f!")); + } + + return toReturn; + } + + @Override + public Boolean isAllowedAtLocation(Location location) { + if (Foxtrot.getInstance().getMapHandler().isKitMap()) { + return !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + return !Foxtrot.getInstance().getServerHandler().isWarzone(location) && location.getWorld().getEnvironment() == World.Environment.NORMAL && !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + @Override + public long getCooldown() { + return 30_000L; + } + + @Override + public Category getCategory() { + if (!Foxtrot.getInstance().getMapHandler().isKitMap()) { + return Category.AIRDROPS; + } + + return Category.KIT_MAP; + } + + @Override + public String getDescription() { + return "You have been boosted towards that block!"; + } + + @EventHandler(priority = EventPriority.NORMAL) + public void onPlayerInteract(PlayerInteractEvent event) { + + final Player player = event.getPlayer(); + + if (!this.isSimilar(player.getItemInHand())) { + return; + } + + if (this.hasCooldown(player)) { + event.setCancelled(true); + } + } + + @EventHandler(priority = EventPriority.NORMAL) + private void onPlayerFish(PlayerFishEvent event) { + + if (event.isCancelled()) { + return; + } + + final Player player = event.getPlayer(); + + if (!this.isSimilar(player.getItemInHand())) { + return; + } + + if (event.getState() == PlayerFishEvent.State.FISHING) { + return; + } + + final Entity hooked = event.getHook(); + + if (hooked == null) { + return; + } + + if (event.getCaught() != null) { + event.getHook().remove(); + return; + } + + final Location location = player.getLocation(); + + final Location hookedLocation = hooked.getLocation(); + + if (!this.isAllowedAtLocation(hookedLocation)) { + String teamName; + + final Team ownerTeam = LandBoard.getInstance().getTeam(hookedLocation); + + if (ownerTeam != null) { + teamName = ownerTeam.getName(event.getPlayer()); + } else if (!Foxtrot.getInstance().getServerHandler().isWarzone(hookedLocation)) { + teamName = ChatColor.GRAY + "The Wilderness"; + } else { + teamName = ChatColor.DARK_RED + "WarZone"; + } + + event.getPlayer().sendMessage(ChatColor.RED + "You cannot use a " + this.getDisplayName() + ChatColor.RED + " in " + teamName + ChatColor.RED + "."); + return; + } + + if (!(this.canGrapple(hookedLocation.getBlock()) || this.canGrapple((hookedLocation.getBlock().getRelative(BlockFace.UP))) || this.canGrapple(hookedLocation.getBlock().getRelative(BlockFace.DOWN)))) { + return; + } + + player.getWorld().playSound(player.getPlayer().getLocation(), Sound.ZOMBIE_INFECT, 0.5F, 1.8F); + + final Vector velocity = new Vector( + hookedLocation.getX() - location.getX(), + hookedLocation.getY() - location.getY(), + hookedLocation.getZ() - location.getZ() + ).multiply(VELOCITY_CHANGE); + + player.setVelocity(velocity); + player.setMetadata("noflag", new FixedMetadataValue(Foxtrot.getInstance(), true)); + + Foxtrot.getInstance().getServer().getScheduler().runTaskLater(Foxtrot.getInstance(), () -> { + if (player.isOnline()) { + player.removeMetadata("noflag", Foxtrot.getInstance()); + } + }, 20 * 3L); + event.setExpToDrop(0); + + hooked.remove(); + + if (event.getCaught() != null && !(event.getCaught() instanceof LivingEntity)) { + event.getCaught().remove(); + } + + if ((player.getItemInHand().getDurability() + DURABILITY_LOSS) >= player.getItemInHand().getType().getMaxDurability()) { + player.setItemInHand(null); + player.getWorld().playSound(player.getLocation(), Sound.ITEM_BREAK, 1F, 1F); + } else { + player.getItemInHand().setDurability((short) (player.getItemInHand().getDurability() + DURABILITY_LOSS)); + } + + this.applyCooldown(player); + } + + private boolean canGrapple(Block block) { + return !(block.getTypeId() == 0 || block.getType() == Material.STATIONARY_WATER || block.getType() == Material.WATER); + } +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/kitmap/PoisonBow.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/kitmap/PoisonBow.java new file mode 100644 index 0000000..ca5e3de --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/kitmap/PoisonBow.java @@ -0,0 +1,208 @@ +package net.frozenorb.foxtrot.gameplay.ability.type.kitmap; + +import cc.fyre.proton.util.ItemBuilder; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.ability.Ability; +import net.frozenorb.foxtrot.gameplay.ability.Category; +import net.frozenorb.foxtrot.gameplay.pvpclasses.PvPClassHandler; +import net.frozenorb.foxtrot.team.Team; +import net.frozenorb.foxtrot.team.claims.LandBoard; +import net.frozenorb.foxtrot.team.dtr.DTRBitmask; +import net.frozenorb.foxtrot.util.CC; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Arrow; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.ProjectileLaunchEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.metadata.FixedMetadataValue; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.UUID; + +public class PoisonBow extends Ability { + + public PoisonBow() { + this.hassanStack = ItemBuilder.copyOf(this.hassanStack).enchant(Enchantment.ARROW_INFINITE, 1).enchant(Enchantment.ARROW_DAMAGE, 3).build(); + } + + private static final int USES = 50; + private static final int BASE = 384 - USES; // total durability - uses + + @Override + public String getName() { + return this.getClass().getSimpleName(); + } + + + + @Override + public Material getMaterial() { + return Material.BOW; + } + + @Override + public String getDisplayName() { + return ChatColor.DARK_GREEN.toString() + ChatColor.BOLD + "Poison Bow"; + } + + @Override + public List getLore() { + + final List toReturn = new ArrayList<>(); + + toReturn.add(""); + toReturn.add(ChatColor.translate("&6❙ &fShoot an enemy and they will be")); + toReturn.add(ChatColor.translate("&6❙ &fpoisoned for &e&l5 seconds&f!")); + toReturn.add(""); + toReturn.add(ChatColor.translate("&fCan be found in the &d&l??? &fCrate!")); + + return toReturn; + } + + @Override + public Boolean isAllowedAtLocation(Location location) { + return !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + @Override + public long getCooldown() { + return 30_000L; + } + + @EventHandler + public void onLaunch(ProjectileLaunchEvent event) { + if (!(event.getEntity() instanceof Arrow) || !(event.getEntity().getShooter() instanceof Player)) { + return; + } + + final Player player = (Player) event.getEntity().getShooter(); + final ItemStack itemStack = player.getItemInHand(); + + if (!this.isSimilar(itemStack)) { + return; + } + + short durability = itemStack.getDurability(); + + if (durability <= BASE) { + itemStack.setDurability((short) BASE); + } else { + itemStack.setDurability((short) (durability + 1)); + } + + event.getEntity().setMetadata("POISON_BOW", new FixedMetadataValue(Foxtrot.getInstance(), player.getUniqueId().toString())); + + this.applyCooldown(player); + } + + @EventHandler(priority = EventPriority.NORMAL) + public void onInteract(PlayerInteractEvent event) { + if (!event.hasItem() || !this.isSimilar(event.getPlayer().getItemInHand())) { + return; + } + + if (Foxtrot.getInstance().getPvPTimerMap().hasTimer(event.getPlayer().getUniqueId())) { + event.getPlayer().sendMessage(CC.translate("&cYou may not use " + this.getDisplayName() + " &cwhile your &a&lPvP Timer &cis active!")); + event.getPlayer().updateInventory(); + event.setCancelled(true); + return; + } + + if (this.hasCooldown(event.getPlayer())) { + event.setCancelled(true); + event.getPlayer().updateInventory(); + return; + } + + if (this.isAllowedAtLocation(event.getPlayer().getLocation())) { + return; + } + + String teamName; + + final Team ownerTeam = LandBoard.getInstance().getTeam(event.getPlayer().getLocation()); + + if (ownerTeam != null) { + teamName = ownerTeam.getName(event.getPlayer()); + } else if (!Foxtrot.getInstance().getServerHandler().isWarzone(event.getPlayer().getLocation())) { + teamName = ChatColor.GRAY + "The Wilderness"; + } else { + teamName = ChatColor.DARK_RED + "WarZone"; + } + + event.getPlayer().sendMessage(ChatColor.RED + "You cannot use a " + this.getDisplayName() + ChatColor.RED + " in " + teamName + ChatColor.RED + "."); + event.getPlayer().updateInventory(); + event.setCancelled(true); + } + + @EventHandler(priority = EventPriority.MONITOR) + private void onDamage(EntityDamageByEntityEvent event) { + if (event.isCancelled() || !(event.getEntity() instanceof Player) || !(event.getDamager() instanceof Arrow) || !event.getDamager().hasMetadata("POISON_BOW")) { + return; + } + + final Player shooter = Foxtrot.getInstance().getServer().getPlayer(UUID.fromString(event.getDamager().getMetadata("POISON_BOW").get(0).asString())); + final Player target = (Player) event.getEntity(); + + if (shooter == null) { + return; + } + + if (target.getLocation().getWorld().getEnvironment() == World.Environment.THE_END || target.getLocation().getWorld().getEnvironment() == World.Environment.NETHER) { + shooter.sendMessage(ChatColor.RED + "You may not use this item in The End/Nether!"); + + shooter.updateInventory(); + return; + } + + if (!this.isAllowedAtLocation(target.getLocation())) { + + String location; + + final Team ownerTeam = LandBoard.getInstance().getTeam(target.getLocation()); + + if (ownerTeam != null) { + location = ownerTeam.getName(shooter); + } else if (!Foxtrot.getInstance().getServerHandler().isWarzone(target.getLocation())) { + location = ChatColor.GRAY + "The Wilderness"; + } else { + location = ChatColor.DARK_RED + "WarZone"; + } + + shooter.updateInventory(); + shooter.sendMessage(ChatColor.RED + "You may use this on " + target.getDisplayName() + " who is in " + location + ChatColor.RED + "."); + return; + } + + if (PvPClassHandler.getPvPClass(target) != null) { + shooter.sendMessage(ChatColor.RED + "You may not use a " + this.getDisplayName() + ChatColor.RED + " on a " + ChatColor.WHITE + Objects.requireNonNull(PvPClassHandler.getPvPClass(target)).getName() + ChatColor.RED + "."); + return; + } + + fullDescription = "You have given " + target.getName() + " Poison for 5 seconds!"; + + target.addPotionEffect(new PotionEffect(PotionEffectType.POISON, 20*6, 0)); + } + + @Override + public Category getCategory() { + return Category.KIT_MAP; + } + + @Override + public String getDescription() { + return ""; + } +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/kitmap/Powerup.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/kitmap/Powerup.java new file mode 100644 index 0000000..41125ea --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/kitmap/Powerup.java @@ -0,0 +1,116 @@ +package net.frozenorb.foxtrot.gameplay.ability.type.kitmap; + +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.ability.Ability; +import net.frozenorb.foxtrot.gameplay.ability.Category; +import net.frozenorb.foxtrot.gameplay.ability.listener.events.AbilityUseEvent; +import net.frozenorb.foxtrot.team.dtr.DTRBitmask; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.Action; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +import java.util.ArrayList; +import java.util.List; + +public class Powerup extends Ability { + @Override + public Category getCategory() { + return Category.KIT_MAP; + } + + @Override + public String getDescription() { + return "You have received various effects for 10 seconds!"; + } + + @Override + public String getName() { + return this.getClass().getSimpleName(); + } + + @Override + public Material getMaterial() { + return Material.WATCH; + } + + @Override + public String getDisplayName() { + return ChatColor.LIGHT_PURPLE.toString() + ChatColor.BOLD + "Powerup"; + } + + @Override + public List getLore() { + final List toReturn = new ArrayList<>(); + + toReturn.add(""); + toReturn.add(ChatColor.translate("&6❙ &fReceive the following effects for 10 seconds:")); + toReturn.add(ChatColor.translate("&7- &bSpeed 2")); + toReturn.add(ChatColor.translate("&7- &cStrength 1")); + toReturn.add(ChatColor.translate("&7- &6Resistance 1")); + toReturn.add(ChatColor.translate("&7- &dRegeneration 1")); + toReturn.add(""); + toReturn.add(ChatColor.translate("&fCan be found in the &d&l??? &fCrate!")); + + return toReturn; + } + + @Override + public Boolean isAllowedAtLocation(Location location) { + if (Foxtrot.getInstance().getMapHandler().isKitMap()) { + return !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + return !Foxtrot.getInstance().getServerHandler().isWarzone(location) && location.getWorld().getEnvironment() == World.Environment.NORMAL && !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + @Override + public long getCooldown() { + return 140_000L; + } + + + + @EventHandler(priority = EventPriority.NORMAL) + public void onInteract(PlayerInteractEvent event) { + if (event.getAction() != Action.RIGHT_CLICK_AIR && event.getAction() != Action.RIGHT_CLICK_BLOCK) { + return; + } + + final Player player = event.getPlayer(); + + if (!this.isSimilar(event.getItem())) { + return; + } + + final AbilityUseEvent abilityUseEvent = new AbilityUseEvent(player, null, player.getLocation(), this, false); + Foxtrot.getInstance().getServer().getPluginManager().callEvent(abilityUseEvent); + + if (abilityUseEvent.isCancelled()) { + return; + } + + event.setCancelled(true); + + if (player.getItemInHand().getAmount() == 1) { + player.setItemInHand(null); + } else { + player.getItemInHand().setAmount(player.getItemInHand().getAmount()-1); + } + + player.addPotionEffect(new PotionEffect(PotionEffectType.SPEED, 200, 1)); + player.addPotionEffect(new PotionEffect(PotionEffectType.INCREASE_DAMAGE, 200, 0)); + player.addPotionEffect(new PotionEffect(PotionEffectType.DAMAGE_RESISTANCE, 200, 0)); + player.addPotionEffect(new PotionEffect(PotionEffectType.REGENERATION, 200, 0)); + + this.applyCooldown(player); + } + +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/kitmap/Scrambler.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/kitmap/Scrambler.java new file mode 100644 index 0000000..1bb503a --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/kitmap/Scrambler.java @@ -0,0 +1,147 @@ +package net.frozenorb.foxtrot.gameplay.ability.type.kitmap; + +import cc.fyre.proton.util.ItemBuilder; +import lombok.Getter; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.ability.Ability; +import net.frozenorb.foxtrot.gameplay.ability.Category; +import net.frozenorb.foxtrot.gameplay.ability.listener.events.AbilityUseEvent; +import net.frozenorb.foxtrot.team.dtr.DTRBitmask; +import net.frozenorb.foxtrot.util.CC; +import org.bukkit.*; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.metadata.FixedMetadataValue; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.UUID; + +public class Scrambler extends Ability { + + public Scrambler() { + this.hassanStack = ItemBuilder.copyOf(this.hassanStack).data((byte)2).build(); + } + + @Override + public String getName() { + return this.getClass().getSimpleName(); + } + + @Override + public Material getMaterial() { + return Material.RAW_FISH; + } + + @Override + public String getDisplayName() { + return ChatColor.BLUE.toString() + ChatColor.BOLD + "Scrambler"; + } + + @Override + public List getLore() { + final List toReturn = new ArrayList<>(); + + toReturn.add(""); + toReturn.add(ChatColor.translate("&6❙ &fHit a player 3 times to")); + toReturn.add(ChatColor.translate("&6❙ &fscramble their hotbar!")); + toReturn.add(""); + toReturn.add(ChatColor.translate("&fCan be found in an &9&lHeaded Crate&f!")); + + return toReturn; + } + + @Override + public Boolean isAllowedAtLocation(Location location) { + if (Foxtrot.getInstance().getMapHandler().isKitMap()) { + return !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + return !Foxtrot.getInstance().getServerHandler().isWarzone(location) && location.getWorld().getEnvironment() == World.Environment.NORMAL && !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + @Override + public long getCooldown() { + return 200_000L; + } + + @EventHandler(priority = EventPriority.MONITOR) + private void onDamage(EntityDamageByEntityEvent event) { + if (event.isCancelled() || !(event.getDamager() instanceof Player) || !(event.getEntity() instanceof Player)) { + return; + } + + final Player target = (Player) event.getEntity(); + final Player damager = (Player) event.getDamager(); + + if (damager.getItemInHand() == null || !this.isSimilar(damager.getItemInHand())) { + return; + } + + final AbilityUseEvent abilityUseEvent = new AbilityUseEvent(damager, target, damager.getLocation(), this, false); + + int value = target.hasMetadata("SCRAMBLER") ? (target.getMetadata("SCRAMBLER").get(0).asInt() + 1) : 1; + + if (value != 3) { + abilityUseEvent.setOneHit(true); + } + + Foxtrot.getInstance().getServer().getPluginManager().callEvent(abilityUseEvent); + + if (abilityUseEvent.isCancelled()) { + return; + } + + target.setMetadata("SCRAMBLER", new FixedMetadataValue(Foxtrot.getInstance(), value)); + + if (value != 3) { + damager.sendMessage(CC.translate("&cYou have to hit &f" + target.getName() + " &c" + (3 - value) + " more time" + (3 - value == 1 ? "" : "s") + "!")); + return; + } + + target.removeMetadata("SCRAMBLER", Foxtrot.getInstance()); + + if (damager.getItemInHand().getAmount() == 1) { + damager.setItemInHand(null); + } else { + damager.getItemInHand().setAmount(damager.getItemInHand().getAmount() - 1); + } + + List hi = new ArrayList<>(); + + for (int i = 0; i < 9; i++) { + hi.add(target.getInventory().getItem(i)); + } + + Collections.shuffle(hi); + + for (int i = 0; i < 9; i++) { + target.getInventory().setItem(i, hi.get(i)); + } + + this.fullDescription = "You have scrambled the inventory of " + target.getName() + "!"; + + target.sendMessage(""); + target.sendMessage(CC.translate("&4" + damager.getName() + " &chas hit you with " + this.getDisplayName() + "&c!")); + target.sendMessage(CC.translate("&cYour inventory has been scrambled.")); + target.sendMessage(""); + + this.applyCooldown(damager); + } + + @Override + public Category getCategory() { + return Category.KIT_MAP; + } + + @Override + public String getDescription() { + return ""; + } + + +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/kitmap/SharkBite.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/kitmap/SharkBite.java new file mode 100644 index 0000000..77e1e40 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/kitmap/SharkBite.java @@ -0,0 +1,133 @@ +package net.frozenorb.foxtrot.gameplay.ability.type.kitmap; + +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.ability.Ability; +import net.frozenorb.foxtrot.gameplay.ability.Category; +import net.frozenorb.foxtrot.gameplay.ability.listener.events.AbilityUseEvent; +import net.frozenorb.foxtrot.team.dtr.DTRBitmask; +import net.frozenorb.foxtrot.util.CC; +import org.bukkit.*; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.metadata.FixedMetadataValue; +import org.bukkit.scheduler.BukkitRunnable; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + +public class SharkBite extends Ability { + + @Override + public String getName() { + return this.getClass().getSimpleName(); + } + + @Override + public Material getMaterial() { + return Material.SHEARS; + } + + @Override + public String getDisplayName() { + return ChatColor.DARK_AQUA.toString() + ChatColor.BOLD + "Shark Bite"; + } + + @Override + public List getLore() { + final List toReturn = new ArrayList<>(); + + toReturn.add(""); + toReturn.add(ChatColor.translate("&6❙ &fHit an opponent to deal a bleeding")); + toReturn.add(ChatColor.translate("&6❙ &feffect for 10 seconds")); + toReturn.add(""); + toReturn.add(ChatColor.translate("&fCan be found in an &d&l???&f!")); + + return toReturn; + } + + @Override + public Boolean isAllowedAtLocation(Location location) { + if (Foxtrot.getInstance().getMapHandler().isKitMap()) { + return !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + return !Foxtrot.getInstance().getServerHandler().isWarzone(location) && location.getWorld().getEnvironment() == World.Environment.NORMAL && !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + @Override + public boolean inPartnerPackage() { + return true; + } + + @Override + public long getCooldown() { + return 120_000L; + } + + @EventHandler(priority = EventPriority.MONITOR) + private void onDamage(EntityDamageByEntityEvent event) { + if (event.isCancelled() || !(event.getDamager() instanceof Player) || !(event.getEntity() instanceof Player)) { + return; + } + + final Player target = (Player) event.getEntity(); + final Player damager = (Player) event.getDamager(); + + if (damager.getItemInHand() == null || !this.isSimilar(damager.getItemInHand())) { + return; + } + + final AbilityUseEvent abilityUseEvent = new AbilityUseEvent(damager, target, damager.getLocation(), this, false); + Foxtrot.getInstance().getServer().getPluginManager().callEvent(abilityUseEvent); + + if (abilityUseEvent.isCancelled()) { + return; + } + + if (damager.getItemInHand().getAmount() == 1) { + damager.setItemInHand(null); + } else { + damager.getItemInHand().setAmount(damager.getItemInHand().getAmount() - 1); + } + + AtomicInteger ticks = new AtomicInteger(0); + + new BukkitRunnable() { + + @Override + public void run() { + if (!target.isOnline() || target.isDead() || ticks.incrementAndGet() == 10) { + cancel(); + } else { + target.damage(0.5); + target.getWorld().playEffect(target.getEyeLocation(), Effect.STEP_SOUND, Material.REDSTONE_BLOCK); + } + } + }.runTaskTimer(Foxtrot.getInstance(), 20, 20); + + fullDescription = target.getName() + " will now be bitten every second for the next 10 seconds!"; + + target.sendMessage(""); + target.sendMessage(CC.translate("&4" + damager.getName() + " &chas hit you with " + this.getDisplayName() + "&c!")); + target.sendMessage(""); + + this.applyCooldown(damager); + } + + @Override + public Category getCategory() { + return Category.KIT_MAP; + } + + @Override + public String getDescription() { + return ""; + } + + +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/kitmap/TacticalNuke.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/kitmap/TacticalNuke.java new file mode 100644 index 0000000..712421b --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/kitmap/TacticalNuke.java @@ -0,0 +1,175 @@ +package net.frozenorb.foxtrot.gameplay.ability.type.kitmap; + +import cc.fyre.modsuite.mod.ModHandler; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.commands.KillTheKingCommand; +import net.frozenorb.foxtrot.gameplay.ability.Ability; +import net.frozenorb.foxtrot.gameplay.ability.Category; +import net.frozenorb.foxtrot.gameplay.ability.listener.events.AbilityUseEvent; +import net.frozenorb.foxtrot.team.Team; +import net.frozenorb.foxtrot.team.dtr.DTRBitmask; +import org.bukkit.*; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.Action; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.scheduler.BukkitRunnable; + +import java.util.ArrayList; +import java.util.List; + +public class TacticalNuke extends Ability { + @Override + public Category getCategory() { + return Category.KIT_MAP; + } + + @Override + public String getDescription() { + return "Tactical Nuke has been summoned!"; + } + + public static ItemStack itemStack; + + public TacticalNuke() { + itemStack = this.hassanStack; + } + + @Override + public String getName() { + return this.getClass().getSimpleName(); + } + + @Override + public Material getMaterial() { + return Material.TNT; + } + + @Override + public String getDisplayName() { + return ChatColor.DARK_RED.toString() + ChatColor.BOLD + "Tactical Nuke"; + } + + @Override + public List getLore() { + final List toReturn = new ArrayList<>(); + + toReturn.add(""); + toReturn.add(ChatColor.translate("&6❙ &fRight Click to activate the tactical nuke!")); + + return toReturn; + } + + @Override + public Boolean isAllowedAtLocation(Location location) { + if (Foxtrot.getInstance().getMapHandler().isKitMap()) { + return !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + return !Foxtrot.getInstance().getServerHandler().isWarzone(location) && location.getWorld().getEnvironment() == World.Environment.NORMAL && !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + @Override + public long getCooldown() { + return 0; + } + + @EventHandler(priority = EventPriority.LOWEST) + private void onInteract(PlayerInteractEvent event) { + + final Player player = event.getPlayer(); + + if (!this.isSimilar(player.getItemInHand()) || event.getAction() != Action.RIGHT_CLICK_AIR && event.getAction() != Action.RIGHT_CLICK_BLOCK) { + return; + } + + if (!Foxtrot.getInstance().getMapHandler().isKitMap()) { + event.getPlayer().sendMessage(ChatColor.RED + "Wrong server buddy"); + return; + } + + final AbilityUseEvent abilityUseEvent = new AbilityUseEvent(player, null, player.getLocation(), this, false); + Foxtrot.getInstance().getServer().getPluginManager().callEvent(abilityUseEvent); + + if (abilityUseEvent.isCancelled()) { + return; + } + + event.setCancelled(true); + + if (player.getItemInHand().getAmount() == 1) { + player.setItemInHand(null); + } else { + player.getItemInHand().setAmount(player.getItemInHand().getAmount()-1); + } + player.updateInventory(); + + for (Player onlinePlayer : Foxtrot.getInstance().getServer().getOnlinePlayers()) { + onlinePlayer.playSound(onlinePlayer.getLocation(), Sound.WITHER_SPAWN, 1, 1); + onlinePlayer.sendMessage(ChatColor.translate("&4&lTactical Nuke incoming!")); + } + + final Team team = Foxtrot.getInstance().getTeamHandler().getTeam(player); + + new BukkitRunnable() { + int seconds = 6; + + @Override + public void run() { + seconds--; + + if (seconds != 0) { + for (Player onlinePlayer : Foxtrot.getInstance().getServer().getOnlinePlayers()) { + onlinePlayer.playSound(onlinePlayer.getLocation(), Sound.NOTE_PLING, 1, 1); + onlinePlayer.sendMessage(ChatColor.translate("&4&l" + seconds + "...")); + } + return; + } + + this.cancel(); + + int amount = 0; + + for (Entity entity : player.getNearbyEntities(30, 30, 30)) { + + if (!(entity instanceof Player)) { + continue; + } + + final Player target = (Player) entity; + + if (team != null && team.isMember(target.getUniqueId())) { + continue; + } + + if (KillTheKingCommand.king != null && KillTheKingCommand.king.toString().equalsIgnoreCase(target.getUniqueId().toString())) { + continue; + } + + if (DTRBitmask.SAFE_ZONE.appliesAt(target.getLocation())) { + continue; + } + + if (ModHandler.INSTANCE.isInModMode(target.getUniqueId())) { + continue; + } + + target.sendMessage(ChatColor.translate("&4&lYou have been killed by " + player.getName() + "'s nuke!")); + target.damage(1, player); + target.setHealth(0); + + amount++; + } + + for (Player onlinePlayer : Foxtrot.getInstance().getServer().getOnlinePlayers()) { + onlinePlayer.playSound(onlinePlayer.getLocation(), Sound.WITHER_DEATH, 1, 1); + } + + Foxtrot.getInstance().getServer().broadcastMessage(ChatColor.translate("&c&l" + player.getName() + " has killed " + amount + " players with the Tactical Nuke!")); + } + }.runTaskTimer(Foxtrot.getInstance(), 20, 20); + } +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/kitmap/fall/BatSwarm.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/kitmap/fall/BatSwarm.java new file mode 100644 index 0000000..ff65788 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/kitmap/fall/BatSwarm.java @@ -0,0 +1,181 @@ +package net.frozenorb.foxtrot.gameplay.ability.type.kitmap.fall; + +import cc.fyre.proton.util.ItemBuilder; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.ability.Ability; +import net.frozenorb.foxtrot.gameplay.ability.Category; +import net.frozenorb.foxtrot.gameplay.ability.listener.events.AbilityUseEvent; +import net.frozenorb.foxtrot.team.dtr.DTRBitmask; +import net.frozenorb.foxtrot.util.CC; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.metadata.FixedMetadataValue; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class BatSwarm extends Ability { + + public BatSwarm() { + this.hassanStack.setDurability((byte) 65); + } + + @Override + public String getName() { + return this.getClass().getSimpleName(); + } + + @Override + public Material getMaterial() { + return Material.MONSTER_EGG; + } + + @Override + public String getDisplayName() { + return ChatColor.DARK_PURPLE.toString() + ChatColor.BOLD + "Bat Swarm"; + } + + @Override + public List getLore() { + final List toReturn = new ArrayList<>(); + + toReturn.add(""); + toReturn.add(ChatColor.translate("&6❙ &fHit a player 3 times to activate,")); + toReturn.add(ChatColor.translate("&6❙ &fgiven them Poison II, Blindness II")); + toReturn.add(ChatColor.translate("&6❙ &ffor 5 seconds and 3 bats fly in their face.")); + toReturn.add(""); + toReturn.add(ChatColor.translate("&fCan be found in an &9&lHeaded Crate&f!")); + + return toReturn; + } + + @Override + public Boolean isAllowedAtLocation(Location location) { + if (Foxtrot.getInstance().getMapHandler().isKitMap()) { + return !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + return !Foxtrot.getInstance().getServerHandler().isWarzone(location) && location.getWorld().getEnvironment() == World.Environment.NORMAL && !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + @Override + public long getCooldown() { + return 200_000L; + } + + @EventHandler(priority = EventPriority.MONITOR) + private void onDamage(EntityDamageByEntityEvent event) { + if (event.isCancelled() || !(event.getDamager() instanceof Player) || !(event.getEntity() instanceof Player)) { + return; + } + + final Player target = (Player) event.getEntity(); + final Player damager = (Player) event.getDamager(); + + if (damager.getItemInHand() == null || !this.isSimilar(damager.getItemInHand())) { + return; + } + + final AbilityUseEvent abilityUseEvent = new AbilityUseEvent(damager, target, damager.getLocation(), this, false); + + int value = target.hasMetadata("BATSWARM") ? (target.getMetadata("BATSWARM").get(0).asInt() + 1) : 1; + + if (value != 3) { + abilityUseEvent.setOneHit(true); + } + + Foxtrot.getInstance().getServer().getPluginManager().callEvent(abilityUseEvent); + + if (abilityUseEvent.isCancelled()) { + return; + } + + target.setMetadata("BATSWARM", new FixedMetadataValue(Foxtrot.getInstance(), value)); + + if (value != 3) { + damager.sendMessage(CC.translate("&cYou have to hit &f" + target.getName() + " &c" + (3 - value) + " more time" + (3 - value == 1 ? "" : "s") + "!")); + return; + } + + target.removeMetadata("BATSWARM", Foxtrot.getInstance()); + + if (damager.getItemInHand().getAmount() == 1) { + damager.setItemInHand(null); + } else { + damager.getItemInHand().setAmount(damager.getItemInHand().getAmount() - 1); + } + + + target.addPotionEffect(new PotionEffect(PotionEffectType.POISON, 20*6, 1)); + target.addPotionEffect(new PotionEffect(PotionEffectType.BLINDNESS, 20*6, 1)); + + final BlockFace blockFace = getDirection(target); + final Block block = target.getLocation().getBlock().getRelative(BlockFace.UP).getRelative(blockFace, 2); + + for (int i = 0; i < 3; i++) { + block.getWorld().spawnEntity(block.getLocation(), EntityType.BAT); + } + + this.fullDescription = "You have bat swarmed " + target.getName() + "!"; + + target.sendMessage(""); + target.sendMessage(CC.translate("&4" + damager.getName() + " &chas hit you with " + this.getDisplayName() + "&c!")); + target.sendMessage(CC.translate("&cYou were bat swarmed!")); + target.sendMessage(""); + + this.applyCooldown(damager); + } + + @Override + public Category getCategory() { + return Category.KIT_MAP; + } + + @Override + public String getDescription() { + return ""; + } + + private BlockFace getDirection(Player player) { + double rot = (player.getLocation().getYaw() - 90) % 360; + if (rot < 0) { + rot += 360.0; + } + + if (0 <= rot && rot < 22.5) { + return BlockFace.WEST; + } else if (22.5 <= rot && rot < 67.5) { + return BlockFace.NORTH_WEST; + } else if (67.5 <= rot && rot < 112.5) { + return BlockFace.NORTH; + } else if (112.5 <= rot && rot < 157.5) { + return BlockFace.NORTH_EAST; + } else if (157.5 <= rot && rot < 202.5) { + return BlockFace.EAST; + } else if (202.5 <= rot && rot < 247.5) { + return BlockFace.SOUTH_EAST; + } else if (247.5 <= rot && rot < 292.5) { + return BlockFace.SOUTH; + } else if (292.5 <= rot && rot < 337.5) { + return BlockFace.SOUTH_WEST; + } else if (337.5 <= rot && rot < 360.0) { + return BlockFace.WEST; + } else { + return BlockFace.NORTH; + } + } +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/kitmap/fall/BrewingTrouble.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/kitmap/fall/BrewingTrouble.java new file mode 100644 index 0000000..f74151d --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/kitmap/fall/BrewingTrouble.java @@ -0,0 +1,190 @@ +package net.frozenorb.foxtrot.gameplay.ability.type.kitmap.fall; + +import cc.fyre.proton.util.TimeUtils; +import lombok.Getter; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.ability.Ability; +import net.frozenorb.foxtrot.gameplay.ability.Category; +import net.frozenorb.foxtrot.gameplay.ability.listener.events.AbilityUseEvent; +import net.frozenorb.foxtrot.gameplay.pvpclasses.PvPClassHandler; +import net.frozenorb.foxtrot.team.dtr.DTRBitmask; +import net.frozenorb.foxtrot.util.CC; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.PotionEffectAddEvent; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.metadata.FixedMetadataValue; +import org.bukkit.potion.PotionEffect; + +import java.util.*; +import java.util.concurrent.TimeUnit; + +public class BrewingTrouble extends Ability { + public BrewingTrouble() { + final ItemMeta itemMeta = this.hassanStack.getItemMeta(); + itemMeta.setDisplayName(ChatColor.DARK_PURPLE.toString() + ChatColor.BOLD + "Witch's Brewing Trouble"); + this.hassanStack.setItemMeta(itemMeta); + } + + public static Map cache = new HashMap<>(); + + @Override + public String getName() { + return this.getClass().getSimpleName(); + } + + @Override + public Material getMaterial() { + return Material.CAULDRON_ITEM; + } + + @Override + public String getDisplayName() { + return ChatColor.DARK_GREEN.toString() + ChatColor.BOLD + "Witch Trouble"; + } + + @Override + public List getLore() { + final List toReturn = new ArrayList<>(); + + toReturn.add(""); + toReturn.add(ChatColor.translate("&6❙ &fHit a player &c&l3 times")); + toReturn.add(ChatColor.translate("&6❙ &fto remove and block all current and")); + toReturn.add(ChatColor.translate("&6❙ &ffuture potion effects for &e&l12 seconds&f.")); + toReturn.add(""); + toReturn.add(ChatColor.translate("&fCan be found in the &4&lOP Crate&f!")); + + return toReturn; + } + + @Override + public Boolean isAllowedAtLocation(Location location) { + if (Foxtrot.getInstance().getMapHandler().isKitMap()) { + return !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + return !Foxtrot.getInstance().getServerHandler().isWarzone(location) && location.getWorld().getEnvironment() == World.Environment.NORMAL && !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + @Override + public long getCooldown() { + return 90_000L; + } + + @Override + public Category getCategory() { + return Category.KIT_MAP; + } + + @Override + public String getDescription() { + return ""; + } + + @EventHandler(priority = EventPriority.MONITOR) + private void onDamage(EntityDamageByEntityEvent event) { + if (event.isCancelled() || !(event.getDamager() instanceof Player) || !(event.getEntity() instanceof Player)) { + return; + } + + final Player target = (Player) event.getEntity(); + final Player damager = (Player) event.getDamager(); + + if (damager.getItemInHand() == null || !this.isSimilar(damager.getItemInHand())) { + return; + } + + if (PvPClassHandler.getPvPClass(target) != null) { + damager.sendMessage(CC.translate(this.getDisplayName() + " &ccan only be used on Diamonds!")); + return; + } + + if (cache.containsKey(target.getUniqueId())) { + damager.sendMessage(ChatColor.translate("&c" + target.getName() + " already has their effects disabled for &l" + TimeUtils.formatIntoMMSS((int) (cache.get(target.getUniqueId()) - System.currentTimeMillis()) / 1000) + "&c.")); + return; + } + + int value = target.hasMetadata("EFFECT_DISABLER") ? (target.getMetadata("EFFECT_DISABLER").get(0).asInt() + 1) : 1; + + final AbilityUseEvent abilityUseEvent = new AbilityUseEvent(damager, target, damager.getLocation(), this, false); + + if (value != 3) { + abilityUseEvent.setOneHit(true); + } + + Foxtrot.getInstance().getServer().getPluginManager().callEvent(abilityUseEvent); + + if (abilityUseEvent.isCancelled()) { + return; + } + + target.setMetadata("EFFECT_DISABLER", new FixedMetadataValue(Foxtrot.getInstance(), value)); + + if (value != 3) { + damager.sendMessage(CC.translate("&cYou have to hit &f" + target.getName() + " &c" + (3 - value) + " more time" + (3 - value == 1 ? "" : "s") + "!")); + return; + } + + target.removeMetadata("EFFECT_DISABLER", Foxtrot.getInstance()); + + cache.put(target.getUniqueId(), System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(15)); + + if (damager.getItemInHand().getAmount() == 1) { + damager.setItemInHand(null); + } else { + damager.getItemInHand().setAmount(damager.getItemInHand().getAmount() - 1); + } + + fullDescription = "Took and blocked all current and future effects for 15 seconds!"; + + target.sendMessage(""); + target.sendMessage(ChatColor.DARK_RED + ChatColor.BOLD.toString() + "Ability Items"); + target.sendMessage(ChatColor.GRAY + "You have been hit with the " + this.getDisplayName() + ChatColor.GRAY + "."); + target.sendMessage(ChatColor.RED + "All effects have been taken, and for 12 seconds all future effects will be blocked."); + target.sendMessage(""); + + for (PotionEffect activePotionEffect : new ArrayList<>(target.getActivePotionEffects())) { + target.removePotionEffect(activePotionEffect.getType()); + } + + Foxtrot.getInstance().getServer().getScheduler().runTaskLater(Foxtrot.getInstance(), () -> { + cache.remove(target.getUniqueId()); + + if (damager.isOnline()) { + damager.sendMessage(""); + damager.sendMessage(ChatColor.RED + "Your " + this.getDisplayName() + ChatColor.RED + " has expired!"); + damager.sendMessage(""); + } + + if (target.isOnline()) { + target.sendMessage(""); + target.sendMessage(ChatColor.GREEN + "The " + this.getDisplayName() + ChatColor.GREEN + " on you has expired!"); + target.sendMessage(""); + } + }, 20*15); + + this.applyCooldown(damager); + + } + + @EventHandler + public void onPlace(PotionEffectAddEvent event) { + if (event.isCancelled() || !(event.getEntity() instanceof Player)) { + return; + } + + final Player player = (Player) event.getEntity(); + + if (!cache.containsKey(player.getUniqueId())) { + return; + } + + event.setCancelled(true); + } +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/kitmap/fall/PiercingShot.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/kitmap/fall/PiercingShot.java new file mode 100644 index 0000000..37ac1b8 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/kitmap/fall/PiercingShot.java @@ -0,0 +1,148 @@ +package net.frozenorb.foxtrot.gameplay.ability.type.kitmap.fall; + +import cc.fyre.proton.util.TimeUtils; +import lombok.Getter; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.ability.Ability; +import net.frozenorb.foxtrot.gameplay.ability.AbilityHandler; +import net.frozenorb.foxtrot.gameplay.ability.Category; +import net.frozenorb.foxtrot.gameplay.ability.listener.events.AbilityUseEvent; +import net.frozenorb.foxtrot.team.dtr.DTRBitmask; +import net.frozenorb.foxtrot.util.CC; +import org.bukkit.*; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.metadata.FixedMetadataValue; + +import java.util.*; + +public class PiercingShot extends Ability { + + @Getter + public static Map cache = new HashMap<>(); + + @Override + public String getName() { + return this.getClass().getSimpleName(); + } + + @Override + public Material getMaterial() { + return Material.ARROW; + } + + @Override + public String getDisplayName() { + return ChatColor.DARK_AQUA.toString() + ChatColor.BOLD + "Piercing Shot"; + } + + @Override + public List getLore() { + final List toReturn = new ArrayList<>(); + + toReturn.add(""); + toReturn.add(ChatColor.translate("&6❙ &fWhen you hit a player with this 3 times")); + toReturn.add(ChatColor.translate("&6❙ &fyou will now deal 20% more damage towards them.")); + toReturn.add(""); + toReturn.add(ChatColor.translate("&fCan be found in the &d&lPartner Package &f!")); + + return toReturn; + } + + @Override + public Boolean isAllowedAtLocation(Location location) { + if (Foxtrot.getInstance().getMapHandler().isKitMap()) { + return !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + return !Foxtrot.getInstance().getServerHandler().isWarzone(location) && location.getWorld().getEnvironment() == World.Environment.NORMAL && !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + @Override + public long getCooldown() { + return 150_000L; + } + + @Override + public Category getCategory() { + return Category.KIT_MAP; + } + + @Override + public String getDescription() { + return ""; + } + + @EventHandler(priority = EventPriority.MONITOR) + private void onDamage(EntityDamageByEntityEvent event) { + if (event.isCancelled() || !(event.getDamager() instanceof Player) || !(event.getEntity() instanceof Player)) { + return; + } + + final Player target = (Player) event.getEntity(); + final Player damager = (Player) event.getDamager(); + + if (damager.getItemInHand() == null || !this.isSimilar(damager.getItemInHand())) { + return; + } + + final AbilityUseEvent abilityUseEvent = new AbilityUseEvent(damager, target, damager.getLocation(), this, false); + Foxtrot.getInstance().getServer().getPluginManager().callEvent(abilityUseEvent); + + if (abilityUseEvent.isCancelled()) { + return; + } + + if (target.hasMetadata("UNDEAD_WARRIOR")) { + damager.sendMessage(ChatColor.RED + "You may not use this on an Undead Warrior!"); + return; + } + + int value = target.hasMetadata("PIERCING_SHOT") ? (target.getMetadata("PIERCING_SHOT").get(0).asInt() + 1) : 1; + + target.setMetadata("PIERCING_SHOT", new FixedMetadataValue(Foxtrot.getInstance(), value)); + + if (value != 3) { + damager.sendMessage(CC.translate("&cYou have to hit &f" + target.getName() + " &c" + (3 - value) + " more time" + (3 - value == 1 ? "" : "s") + "!")); + return; + } + + target.removeMetadata("PIERCING_SHOT", Foxtrot.getInstance()); + + cache.put(target.getUniqueId(), damager.getUniqueId()); + + if (damager.getItemInHand().getAmount() == 1) { + damager.setItemInHand(null); + } else { + damager.getItemInHand().setAmount(damager.getItemInHand().getAmount() - 1); + } + + damager.playSound(damager.getLocation(), Sound.LEVEL_UP, 1, 1); + target.playSound(target.getLocation(), Sound.ANVIL_BREAK, 1, 1); + target.sendMessage(ChatColor.RED + "You have been hit with the " + this.getDisplayName() + ChatColor.RED + "!"); + + this.fullDescription = "For the next 10 seconds you now deal 20% more damage towards them!"; + + Foxtrot.getInstance().getServer().getScheduler().runTaskLater(Foxtrot.getInstance(), () -> cache.remove(target.getUniqueId()), 20*10); + + this.applyCooldown(damager); + } + + + @EventHandler + public void onEntityDamageByEntity(EntityDamageByEntityEvent event) { + if (!(event.getEntity() instanceof Player) || !(event.getDamager() instanceof Player)) { + return; + } + + final Player player = (Player) event.getEntity(); + + if (!cache.containsKey(player.getUniqueId())) { + return; + } + + event.setDamage(event.getDamage()*1.25D); + } +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/kitmap/fall/ReapersFinalBreath.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/kitmap/fall/ReapersFinalBreath.java new file mode 100644 index 0000000..c9dcfbe --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/kitmap/fall/ReapersFinalBreath.java @@ -0,0 +1,128 @@ +package net.frozenorb.foxtrot.gameplay.ability.type.kitmap.fall; + +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.ability.Ability; +import net.frozenorb.foxtrot.gameplay.ability.Category; +import net.frozenorb.foxtrot.gameplay.ability.listener.events.AbilityUseEvent; +import net.frozenorb.foxtrot.gameplay.armorclass.type.kitmap.GrimReaperClass; +import net.frozenorb.foxtrot.team.dtr.DTRBitmask; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.meta.ItemMeta; + +import java.util.ArrayList; +import java.util.List; + +public class ReapersFinalBreath extends Ability { + public ReapersFinalBreath() { + final ItemMeta itemMeta = this.hassanStack.getItemMeta(); + itemMeta.setDisplayName(ChatColor.DARK_PURPLE.toString() + ChatColor.BOLD + "Reaper's Final Breath"); + this.hassanStack.setItemMeta(itemMeta); + } + + @Override + public Category getCategory() { + return Category.KIT_MAP; + } + + @Override + public String getDescription() { + return "You have been given effects for 5 seconds!"; + } + + @Override + public String getName() { + return this.getClass().getSimpleName(); + } + + @Override + public Material getMaterial() { + return Material.WEB; + } + + @Override + public String getDisplayName() { + return ChatColor.DARK_PURPLE.toString() + ChatColor.BOLD + "Final Breath"; + } + + @Override + public List getLore() { + final List toReturn = new ArrayList<>(); + + toReturn.add(""); + toReturn.add(ChatColor.translate("&6❙ &fRight Click and every")); + toReturn.add(ChatColor.translate("&6❙ &fenemy around gets put in webs.")); + toReturn.add(""); + toReturn.add(ChatColor.translate("&fCan be found in a &d&lPartner Package&f.")); + + return toReturn; + } + + @Override + public Boolean isAllowedAtLocation(Location location) { + if (Foxtrot.getInstance().getMapHandler().isKitMap()) { + return !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + return !Foxtrot.getInstance().getServerHandler().isWarzone(location) && location.getWorld().getEnvironment() == World.Environment.NORMAL && !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + @Override + public boolean inPartnerPackage() { + return true; + } + + @Override + public long getCooldown() { + return 90_000L; + } + + @EventHandler(priority = EventPriority.NORMAL) + public void onInteract(PlayerInteractEvent event) { + if (!event.getAction().name().contains("RIGHT")) { + return; + } + + final Player player = event.getPlayer(); + + if (!this.isSimilar(event.getItem())) { + return; + } + + final AbilityUseEvent abilityUseEvent = new AbilityUseEvent(player, null, player.getLocation(), this, false); + Foxtrot.getInstance().getServer().getPluginManager().callEvent(abilityUseEvent); + + if (abilityUseEvent.isCancelled()) { + return; + } + + event.setCancelled(true); + + if (player.getItemInHand().getAmount() == 1) { + player.setItemInHand(null); + } else { + player.getItemInHand().setAmount(player.getItemInHand().getAmount()-1); + } + + for (Player nearByEnemy : GrimReaperClass.getNearByEnemies(player, 25)) { + final Block blockAt = nearByEnemy.getLocation().getBlock(); + + if (blockAt.getType().equals(Material.AIR)) { + blockAt.setType(Material.WEB); + } + + Foxtrot.getInstance().getServer().getScheduler().runTaskLater(Foxtrot.getInstance(), () -> { + blockAt.setType(Material.AIR); + }, 20*10); + } + + this.applyCooldown(player); + } +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/kitmap/fall/ReapersRevenge.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/kitmap/fall/ReapersRevenge.java new file mode 100644 index 0000000..1f2addb --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/kitmap/fall/ReapersRevenge.java @@ -0,0 +1,114 @@ +package net.frozenorb.foxtrot.gameplay.ability.type.kitmap.fall; + +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.ability.Ability; +import net.frozenorb.foxtrot.gameplay.ability.Category; +import net.frozenorb.foxtrot.gameplay.ability.listener.events.AbilityUseEvent; +import net.frozenorb.foxtrot.gameplay.armorclass.type.kitmap.GrimReaperClass; +import net.frozenorb.foxtrot.team.dtr.DTRBitmask; +import org.bukkit.*; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +import java.util.ArrayList; +import java.util.List; + +public class ReapersRevenge extends Ability { + @Override + public Category getCategory() { + return Category.KIT_MAP; + } + + @Override + public String getDescription() { + return "You have been given effects for 5 seconds!"; + } + + @Override + public String getName() { + return this.getClass().getSimpleName(); + } + + @Override + public Material getMaterial() { + return Material.FERMENTED_SPIDER_EYE; + } + + @Override + public String getDisplayName() { + return ChatColor.LIGHT_PURPLE.toString() + ChatColor.BOLD + "Reaper's Revenge"; + } + + @Override + public List getLore() { + final List toReturn = new ArrayList<>(); + + toReturn.add(""); + toReturn.add(ChatColor.translate("&6❙ &fRight Click for 1 level of")); + toReturn.add(ChatColor.translate("&6❙ &fResistance, Regeneration and Speed")); + toReturn.add(ChatColor.translate("&6❙ &ffor every player within a 25 block range.")); + toReturn.add(""); + toReturn.add(ChatColor.translate("&fCan be found in a &d&lPartner Package&f.")); + + return toReturn; + } + + @Override + public Boolean isAllowedAtLocation(Location location) { + if (Foxtrot.getInstance().getMapHandler().isKitMap()) { + return !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + return !Foxtrot.getInstance().getServerHandler().isWarzone(location) && location.getWorld().getEnvironment() == World.Environment.NORMAL && !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + @Override + public boolean inPartnerPackage() { + return true; + } + + @Override + public long getCooldown() { + return 90_000L; + } + + @EventHandler(priority = EventPriority.NORMAL) + public void onInteract(PlayerInteractEvent event) { + if (!event.getAction().name().contains("RIGHT")) { + return; + } + + final Player player = event.getPlayer(); + + if (!this.isSimilar(event.getItem())) { + return; + } + + final AbilityUseEvent abilityUseEvent = new AbilityUseEvent(player, null, player.getLocation(), this, false); + Foxtrot.getInstance().getServer().getPluginManager().callEvent(abilityUseEvent); + + if (abilityUseEvent.isCancelled()) { + return; + } + + event.setCancelled(true); + + if (player.getItemInHand().getAmount() == 1) { + player.setItemInHand(null); + } else { + player.getItemInHand().setAmount(player.getItemInHand().getAmount()-1); + } + + int players = GrimReaperClass.getNearByEnemies(player, 30).size(); + + player.addPotionEffect(new PotionEffect(PotionEffectType.SPEED, 9*20, (Math.min(players, 4))), true); + player.addPotionEffect(new PotionEffect(PotionEffectType.REGENERATION, 9*20, (Math.min(players, 2))), true); + player.addPotionEffect(new PotionEffect(PotionEffectType.DAMAGE_RESISTANCE, 9*20, (Math.min(players, 4))), true); + + this.applyCooldown(player); + } +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/kitmap/fall/TrickOrTreat.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/kitmap/fall/TrickOrTreat.java new file mode 100644 index 0000000..9d55d94 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/kitmap/fall/TrickOrTreat.java @@ -0,0 +1,125 @@ +package net.frozenorb.foxtrot.gameplay.ability.type.kitmap.fall; + +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.ability.Ability; +import net.frozenorb.foxtrot.gameplay.ability.Category; +import net.frozenorb.foxtrot.gameplay.ability.listener.events.AbilityUseEvent; +import net.frozenorb.foxtrot.gameplay.armorclass.ArmorClass; +import net.frozenorb.foxtrot.team.dtr.DTRBitmask; +import org.bukkit.*; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; + +public class TrickOrTreat extends Ability { + @Override + public Category getCategory() { + return Category.KIT_MAP; + } + + @Override + public String getDescription() { + return "You have been given effects for 5 seconds!"; + } + + @Override + public String getName() { + return this.getClass().getSimpleName(); + } + + @Override + public Material getMaterial() { + return Material.APPLE; + } + + @Override + public String getDisplayName() { + return ChatColor.RED.toString() + ChatColor.BOLD + "Trick or Treat"; + } + + @Override + public List getLore() { + final List toReturn = new ArrayList<>(); + + toReturn.add(""); + toReturn.add(ChatColor.translate("&6❙ &fRight Click for a 50/50 chance,")); + toReturn.add(ChatColor.translate("&6❙ &fof getting Speed III and Strength II")); + toReturn.add(ChatColor.translate("&6❙ &ffor 8 seconds or Slowness II, Weakness II")); + toReturn.add(ChatColor.translate("&6❙ &fand Blindness III for 8 seconds.")); + toReturn.add(""); + toReturn.add(ChatColor.translate("&fCan be found in a &d&lPartner Package&f.")); + + return toReturn; + } + + @Override + public Boolean isAllowedAtLocation(Location location) { + if (Foxtrot.getInstance().getMapHandler().isKitMap()) { + return !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + return !Foxtrot.getInstance().getServerHandler().isWarzone(location) && location.getWorld().getEnvironment() == World.Environment.NORMAL && !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + @Override + public boolean inPartnerPackage() { + return true; + } + + @Override + public long getCooldown() { + return 90_000L; + } + + @EventHandler(priority = EventPriority.NORMAL) + public void onInteract(PlayerInteractEvent event) { + if (!event.getAction().name().contains("RIGHT")) { + return; + } + + final Player player = event.getPlayer(); + + if (!this.isSimilar(event.getItem())) { + return; + } + + final AbilityUseEvent abilityUseEvent = new AbilityUseEvent(player, null, player.getLocation(), this, false); + Foxtrot.getInstance().getServer().getPluginManager().callEvent(abilityUseEvent); + + if (abilityUseEvent.isCancelled()) { + return; + } + + event.setCancelled(true); + + if (player.getItemInHand().getAmount() == 1) { + player.setItemInHand(null); + } else { + player.getItemInHand().setAmount(player.getItemInHand().getAmount()-1); + } + + if (ThreadLocalRandom.current().nextBoolean()) { + this.fullDescription = "You got the lucky effects!"; + player.playSound(player.getLocation(), Sound.LEVEL_UP, 1, 1); + player.addPotionEffect(new PotionEffect(PotionEffectType.SPEED, 9*20, 2), true); + player.addPotionEffect(new PotionEffect(PotionEffectType.INCREASE_DAMAGE, 9*20, 1), true); + } else { + this.fullDescription = "You got the unlucky effects!"; + player.playSound(player.getLocation(), Sound.ANVIL_BREAK, 1, 1); + player.addPotionEffect(new PotionEffect(PotionEffectType.SLOW, 9*20, 1), true); + player.addPotionEffect(new PotionEffect(PotionEffectType.WEAKNESS, 9*20, 1), true); + player.addPotionEffect(new PotionEffect(PotionEffectType.BLINDNESS, 9*20, 2), true); + } + + this.applyCooldown(player); + } +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/portablebard/PortableJumpBoost.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/portablebard/PortableJumpBoost.java new file mode 100644 index 0000000..c9001e1 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/portablebard/PortableJumpBoost.java @@ -0,0 +1,122 @@ +package net.frozenorb.foxtrot.gameplay.ability.type.portablebard; + +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.ability.Ability; +import net.frozenorb.foxtrot.gameplay.ability.Category; +import net.frozenorb.foxtrot.gameplay.ability.listener.events.AbilityUseEvent; +import net.frozenorb.foxtrot.team.Team; +import net.frozenorb.foxtrot.team.claims.LandBoard; +import net.frozenorb.foxtrot.team.dtr.DTRBitmask; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.Action; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +import java.util.ArrayList; +import java.util.List; + +public class PortableJumpBoost extends Ability { + @Override + public Category getCategory() { + return Category.PORTABLE_BARD; + } + + @Override + public String getDescription() { + return "Your team has been given JumpBoost VII for 5 seconds."; + } + + public static ItemStack itemStack; + + public PortableJumpBoost() { + itemStack = this.hassanStack; + } + + @Override + public String getName() { + return this.getClass().getSimpleName(); + } + + @Override + public Material getMaterial() { + return Material.FEATHER; + } + + @Override + public String getDisplayName() { + return ChatColor.GOLD.toString() + ChatColor.BOLD + "Jump Boost"; + } + + @Override + public List getLore() { + final List toReturn = new ArrayList<>(); + + toReturn.add(""); + toReturn.add(ChatColor.translate("&6❙ &fGive you and your teammates")); + toReturn.add(ChatColor.translate("&6❙ &e&l5 seconds &fof &a&lJump Boost")); + toReturn.add(""); + toReturn.add(ChatColor.translate("&fCan be found in an &b&lAirdrop&f!")); + + return toReturn; + } + + @Override + public Boolean isAllowedAtLocation(Location location) { + if (Foxtrot.getInstance().getMapHandler().isKitMap()) { + return !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + return !Foxtrot.getInstance().getServerHandler().isWarzone(location) && location.getWorld().getEnvironment() == World.Environment.NORMAL && !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + @Override + public long getCooldown() { + return 90_000L; + } + + @EventHandler(priority = EventPriority.NORMAL) + public void onInteract(PlayerInteractEvent event) { + if (event.getAction() != Action.RIGHT_CLICK_AIR && event.getAction() != Action.RIGHT_CLICK_BLOCK && event.getAction() != Action.LEFT_CLICK_AIR && event.getAction() != Action.LEFT_CLICK_BLOCK) { + return; + } + + final Player player = event.getPlayer(); + + if (!this.isSimilar(event.getItem())) { + return; + } + + final AbilityUseEvent abilityUseEvent = new AbilityUseEvent(player, null, player.getLocation(), this, false); + Foxtrot.getInstance().getServer().getPluginManager().callEvent(abilityUseEvent); + + if (abilityUseEvent.isCancelled()) { + return; + } + + event.setCancelled(true); + + if (player.getItemInHand().getAmount() == 1) { + player.setItemInHand(null); + } else { + player.getItemInHand().setAmount(player.getItemInHand().getAmount()-1); + } + + final Team team = Foxtrot.getInstance().getTeamHandler().getTeam(player.getUniqueId()); + + if (team != null) { + player.getNearbyEntities(25,25,25).stream().filter(it -> it instanceof Player && team.getOnlineMembers().contains(it)) + .forEach(it -> ((Player) it).addPotionEffect(new PotionEffect(PotionEffectType.JUMP, 6*20, 6), true)); + } + player.addPotionEffect(new PotionEffect(PotionEffectType.JUMP, 6*20, 6), true); + + this.applyCooldown(player); + } +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/portablebard/PortableRegeneration.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/portablebard/PortableRegeneration.java new file mode 100644 index 0000000..d5547d4 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/portablebard/PortableRegeneration.java @@ -0,0 +1,122 @@ +package net.frozenorb.foxtrot.gameplay.ability.type.portablebard; + +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.ability.Ability; +import net.frozenorb.foxtrot.gameplay.ability.Category; +import net.frozenorb.foxtrot.gameplay.ability.listener.events.AbilityUseEvent; +import net.frozenorb.foxtrot.team.Team; +import net.frozenorb.foxtrot.team.claims.LandBoard; +import net.frozenorb.foxtrot.team.dtr.DTRBitmask; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.Action; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +import java.util.ArrayList; +import java.util.List; + +public class PortableRegeneration extends Ability { + @Override + public Category getCategory() { + return Category.PORTABLE_BARD; + } + + @Override + public String getDescription() { + return "Your team has been given Regeneration III for 5 seconds."; + } + + public static ItemStack itemStack; + + public PortableRegeneration() { + itemStack = this.hassanStack; + } + + @Override + public String getName() { + return this.getClass().getSimpleName(); + } + + @Override + public Material getMaterial() { + return Material.GHAST_TEAR; + } + + @Override + public String getDisplayName() { + return ChatColor.LIGHT_PURPLE.toString() + ChatColor.BOLD + "Regeneration"; + } + + @Override + public List getLore() { + final List toReturn = new ArrayList<>(); + + toReturn.add(""); + toReturn.add(ChatColor.translate("&6❙ &fGive you and your teammates")); + toReturn.add(ChatColor.translate("&6❙ &e&l5 seconds &fof &d&lRegeneration")); + toReturn.add(""); + toReturn.add(ChatColor.translate("&fCan be found in an &b&lAirdrop&f!")); + + return toReturn; + } + + @Override + public Boolean isAllowedAtLocation(Location location) { + if (Foxtrot.getInstance().getMapHandler().isKitMap()) { + return !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + return !Foxtrot.getInstance().getServerHandler().isWarzone(location) && location.getWorld().getEnvironment() == World.Environment.NORMAL && !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + @Override + public long getCooldown() { + return 90_000L; + } + + @EventHandler(priority = EventPriority.NORMAL) + public void onInteract(PlayerInteractEvent event) { + if (event.getAction() != Action.RIGHT_CLICK_AIR && event.getAction() != Action.RIGHT_CLICK_BLOCK && event.getAction() != Action.LEFT_CLICK_AIR && event.getAction() != Action.LEFT_CLICK_BLOCK) { + return; + } + + final Player player = event.getPlayer(); + + if (!this.isSimilar(event.getItem())) { + return; + } + + final AbilityUseEvent abilityUseEvent = new AbilityUseEvent(player, null, player.getLocation(), this, false); + Foxtrot.getInstance().getServer().getPluginManager().callEvent(abilityUseEvent); + + if (abilityUseEvent.isCancelled()) { + return; + } + + event.setCancelled(true); + + if (player.getItemInHand().getAmount() == 1) { + player.setItemInHand(null); + } else { + player.getItemInHand().setAmount(player.getItemInHand().getAmount()-1); + } + + final Team team = Foxtrot.getInstance().getTeamHandler().getTeam(player.getUniqueId()); + + if (team != null) { + player.getNearbyEntities(25,25,25).stream().filter(it -> it instanceof Player && team.getOnlineMembers().contains(it)) + .forEach(it -> ((Player) it).addPotionEffect(new PotionEffect(PotionEffectType.REGENERATION, 6*20, 2), true)); + } + player.addPotionEffect(new PotionEffect(PotionEffectType.REGENERATION, 6*20, 2), true); + + this.applyCooldown(player); + } +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/portablebard/PortableResistance.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/portablebard/PortableResistance.java new file mode 100644 index 0000000..2d574ec --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/portablebard/PortableResistance.java @@ -0,0 +1,132 @@ +package net.frozenorb.foxtrot.gameplay.ability.type.portablebard; + +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.ability.Ability; +import net.frozenorb.foxtrot.gameplay.ability.Category; +import net.frozenorb.foxtrot.gameplay.ability.listener.events.AbilityUseEvent; +import net.frozenorb.foxtrot.gameplay.armorclass.ArmorClass; +import net.frozenorb.foxtrot.team.Team; +import net.frozenorb.foxtrot.team.claims.LandBoard; +import net.frozenorb.foxtrot.team.dtr.DTRBitmask; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.Action; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +import java.util.ArrayList; +import java.util.List; + +public class PortableResistance extends Ability { + @Override + public Category getCategory() { + return Category.PORTABLE_BARD; + } + + @Override + public String getDescription() { + return "Your team has been given Resistance III for 5 seconds."; + } + + public static ItemStack itemStack; + + public PortableResistance() { + itemStack = this.hassanStack; + } + + @Override + public String getName() { + return this.getClass().getSimpleName(); + } + + @Override + public Material getMaterial() { + return Material.IRON_INGOT; + } + + @Override + public String getDisplayName() { + return ChatColor.GOLD.toString() + ChatColor.BOLD + "Resistance"; + } + + @Override + public List getLore() { + final List toReturn = new ArrayList<>(); + + toReturn.add(""); + toReturn.add(ChatColor.translate("&6❙ &fGive you and your teammates")); + toReturn.add(ChatColor.translate("&6❙ &e&l5 seconds &fof &7&lResistance")); + toReturn.add(""); + toReturn.add(ChatColor.translate("&fCan be found in an &b&lAirdrop&f!")); + + return toReturn; + } + + @Override + public Boolean isAllowedAtLocation(Location location) { + if (Foxtrot.getInstance().getMapHandler().isKitMap()) { + return !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + return !Foxtrot.getInstance().getServerHandler().isWarzone(location) && location.getWorld().getEnvironment() == World.Environment.NORMAL && !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + @Override + public long getCooldown() { + return 90_000L; + } + + @EventHandler(priority = EventPriority.NORMAL) + public void onInteract(PlayerInteractEvent event) { + if (event.getAction() != Action.RIGHT_CLICK_AIR && event.getAction() != Action.RIGHT_CLICK_BLOCK && event.getAction() != Action.LEFT_CLICK_AIR && event.getAction() != Action.LEFT_CLICK_BLOCK) { + return; + } + + final Player player = event.getPlayer(); + + if (!this.isSimilar(event.getItem())) { + return; + } + + final AbilityUseEvent abilityUseEvent = new AbilityUseEvent(player, null, player.getLocation(), this, false); + Foxtrot.getInstance().getServer().getPluginManager().callEvent(abilityUseEvent); + + if (abilityUseEvent.isCancelled()) { + return; + } + + event.setCancelled(true); + + if (player.getItemInHand().getAmount() == 1) { + player.setItemInHand(null); + } else { + player.getItemInHand().setAmount(player.getItemInHand().getAmount()-1); + } + + final Team team = Foxtrot.getInstance().getTeamHandler().getTeam(player.getUniqueId()); + + int seconds = 6; + + final ArmorClass armorClass = Foxtrot.getInstance().getArmorClassHandler().findWearing(player); + + if (armorClass != null && armorClass.getId().equalsIgnoreCase("Trapper")) { + seconds = 8; + } + + if (team != null) { + int finalSeconds = seconds; + player.getNearbyEntities(25,25,25).stream().filter(it -> it instanceof Player && team.getOnlineMembers().contains(it)) + .forEach(it -> ((Player) it).addPotionEffect(new PotionEffect(PotionEffectType.DAMAGE_RESISTANCE, finalSeconds *20, 2), true)); + } + player.addPotionEffect(new PotionEffect(PotionEffectType.DAMAGE_RESISTANCE, seconds*20, 2), true); + + this.applyCooldown(player); + } +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/portablebard/PortableSpeed.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/portablebard/PortableSpeed.java new file mode 100644 index 0000000..00b5981 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/portablebard/PortableSpeed.java @@ -0,0 +1,122 @@ +package net.frozenorb.foxtrot.gameplay.ability.type.portablebard; + +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.ability.Ability; +import net.frozenorb.foxtrot.gameplay.ability.Category; +import net.frozenorb.foxtrot.gameplay.ability.listener.events.AbilityUseEvent; +import net.frozenorb.foxtrot.team.Team; +import net.frozenorb.foxtrot.team.claims.LandBoard; +import net.frozenorb.foxtrot.team.dtr.DTRBitmask; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.Action; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +import java.util.ArrayList; +import java.util.List; + +public class PortableSpeed extends Ability { + @Override + public Category getCategory() { + return Category.PORTABLE_BARD; + } + + @Override + public String getDescription() { + return "Your team has been given Speed III for 5 seconds."; + } + + public static ItemStack itemStack; + + public PortableSpeed() { + itemStack = this.hassanStack; + } + + @Override + public String getName() { + return this.getClass().getSimpleName(); + } + + @Override + public Material getMaterial() { + return Material.SUGAR; + } + + @Override + public String getDisplayName() { + return ChatColor.GOLD.toString() + ChatColor.BOLD + "Speed"; + } + + @Override + public List getLore() { + final List toReturn = new ArrayList<>(); + + toReturn.add(""); + toReturn.add(ChatColor.translate("&6❙ &fGive you and your teammates")); + toReturn.add(ChatColor.translate("&6❙ &e&l5 seconds &fof &b&lSpeed")); + toReturn.add(""); + toReturn.add(ChatColor.translate("&fCan be found in an &b&lAirdrop&f!")); + + return toReturn; + } + + @Override + public Boolean isAllowedAtLocation(Location location) { + if (Foxtrot.getInstance().getMapHandler().isKitMap()) { + return !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + return !Foxtrot.getInstance().getServerHandler().isWarzone(location) && location.getWorld().getEnvironment() == World.Environment.NORMAL && !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + @Override + public long getCooldown() { + return 90_000L; + } + + @EventHandler(priority = EventPriority.NORMAL) + public void onInteract(PlayerInteractEvent event) { + if (event.getAction() != Action.RIGHT_CLICK_AIR && event.getAction() != Action.RIGHT_CLICK_BLOCK && event.getAction() != Action.LEFT_CLICK_AIR && event.getAction() != Action.LEFT_CLICK_BLOCK) { + return; + } + + final Player player = event.getPlayer(); + + if (!this.isSimilar(event.getItem())) { + return; + } + + final AbilityUseEvent abilityUseEvent = new AbilityUseEvent(player, null, player.getLocation(), this, false); + Foxtrot.getInstance().getServer().getPluginManager().callEvent(abilityUseEvent); + + if (abilityUseEvent.isCancelled()) { + return; + } + + event.setCancelled(true); + + if (player.getItemInHand().getAmount() == 1) { + player.setItemInHand(null); + } else { + player.getItemInHand().setAmount(player.getItemInHand().getAmount()-1); + } + + final Team team = Foxtrot.getInstance().getTeamHandler().getTeam(player.getUniqueId()); + + if (team != null) { + player.getNearbyEntities(25,25,25).stream().filter(it -> it instanceof Player && team.getOnlineMembers().contains(it)) + .forEach(it -> ((Player) it).addPotionEffect(new PotionEffect(PotionEffectType.SPEED, 6*20, 2), true)); + } + player.addPotionEffect(new PotionEffect(PotionEffectType.SPEED, 6*20, 2), true); + + this.applyCooldown(player); + } +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/portablebard/PortableStrength.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/portablebard/PortableStrength.java new file mode 100644 index 0000000..f002ee5 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/ability/type/portablebard/PortableStrength.java @@ -0,0 +1,122 @@ +package net.frozenorb.foxtrot.gameplay.ability.type.portablebard; + +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.ability.Ability; +import net.frozenorb.foxtrot.gameplay.ability.Category; +import net.frozenorb.foxtrot.gameplay.ability.listener.events.AbilityUseEvent; +import net.frozenorb.foxtrot.team.Team; +import net.frozenorb.foxtrot.team.claims.LandBoard; +import net.frozenorb.foxtrot.team.dtr.DTRBitmask; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.Action; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +import java.util.ArrayList; +import java.util.List; + +public class PortableStrength extends Ability { + @Override + public Category getCategory() { + return Category.PORTABLE_BARD; + } + + @Override + public String getDescription() { + return "Your team has been given Strength II for 5 seconds."; + } + + public static ItemStack itemStack; + + public PortableStrength() { + itemStack = this.hassanStack; + } + + @Override + public String getName() { + return this.getClass().getSimpleName(); + } + + @Override + public Material getMaterial() { + return Material.BLAZE_POWDER; + } + + @Override + public String getDisplayName() { + return ChatColor.GOLD.toString() + ChatColor.BOLD + "Strength"; + } + + @Override + public List getLore() { + final List toReturn = new ArrayList<>(); + + toReturn.add(""); + toReturn.add(ChatColor.translate("&6❙ &fGive you and your teammates")); + toReturn.add(ChatColor.translate("&6❙ &e&l5 seconds &fof &c&lStrength")); + toReturn.add(""); + toReturn.add(ChatColor.translate("&fCan be found in an &b&lAirdrop&f!"));; + + return toReturn; + } + + @Override + public Boolean isAllowedAtLocation(Location location) { + if (Foxtrot.getInstance().getMapHandler().isKitMap()) { + return !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + return !Foxtrot.getInstance().getServerHandler().isWarzone(location) && location.getWorld().getEnvironment() == World.Environment.NORMAL && !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + @Override + public long getCooldown() { + return 90_000L; + } + + @EventHandler(priority = EventPriority.NORMAL) + public void onInteract(PlayerInteractEvent event) { + if (event.getAction() != Action.RIGHT_CLICK_AIR && event.getAction() != Action.RIGHT_CLICK_BLOCK && event.getAction() != Action.LEFT_CLICK_AIR && event.getAction() != Action.LEFT_CLICK_BLOCK) { + return; + } + + final Player player = event.getPlayer(); + + if (!this.isSimilar(event.getItem())) { + return; + } + + final AbilityUseEvent abilityUseEvent = new AbilityUseEvent(player, null, player.getLocation(), this, false); + Foxtrot.getInstance().getServer().getPluginManager().callEvent(abilityUseEvent); + + if (abilityUseEvent.isCancelled()) { + return; + } + + event.setCancelled(true); + + if (player.getItemInHand().getAmount() == 1) { + player.setItemInHand(null); + } else { + player.getItemInHand().setAmount(player.getItemInHand().getAmount()-1); + } + + final Team team = Foxtrot.getInstance().getTeamHandler().getTeam(player.getUniqueId()); + + if (team != null) { + player.getNearbyEntities(25,25,25).stream().filter(it -> it instanceof Player && team.getOnlineMembers().contains(it)) + .forEach(it -> ((Player) it).addPotionEffect(new PotionEffect(PotionEffectType.INCREASE_DAMAGE, 6*20, 1), true)); + } + player.addPotionEffect(new PotionEffect(PotionEffectType.INCREASE_DAMAGE, 6*20, 1), true); + + this.applyCooldown(player); + } +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/armorclass/ArmorClass.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/armorclass/ArmorClass.java new file mode 100644 index 0000000..24041ca --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/armorclass/ArmorClass.java @@ -0,0 +1,136 @@ +package net.frozenorb.foxtrot.gameplay.armorclass; + +import cc.fyre.proton.util.ItemBuilder; +import lombok.Getter; +import lombok.Setter; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.team.dtr.DTRBitmask; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.event.Listener; +import org.bukkit.inventory.ItemStack; + +import java.util.Arrays; +import java.util.List; + +public abstract class ArmorClass implements Listener { + @Getter @Setter private Entity entity; + + public abstract String getId(); + public abstract String getDisplayName(); + public abstract int getSlot(); + public abstract Material getDisplayItem(); + public abstract ChatColor getChatColor(); + public abstract List getPerks(); + public abstract ItemStack createPiece(ArmorPiece armorPiece); + + public ArmorClass() { + Foxtrot.getInstance().getServer().getPluginManager().registerEvents(this, Foxtrot.getInstance()); + } + + public Category getCategory() { + return Category.ALL; + } + + public List findApplicableItems() { + return Arrays.asList(Material.DIAMOND_HELMET, Material.DIAMOND_CHESTPLATE, Material.DIAMOND_LEGGINGS, Material.DIAMOND_BOOTS); + } + + public boolean isAllowedAtLocation(Location location) { + + if (Foxtrot.getInstance().getMapHandler().isKitMap()) { + return true; + } + + return !Foxtrot.getInstance().getServerHandler().isWarzone(location) && location.getWorld().getEnvironment() == World.Environment.NORMAL && !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + public void apply(Player player) { + + } + + public void unapply(Player player) { + + } + + public ItemStack getRedeemItem() { + final ItemBuilder itemBuilder = ItemBuilder.of(Material.CHEST).name(this.getDisplayName() + " Armor Class").addToLore("", getChatColor() + "Perks:"); + + for (String perk : this.getPerks()) { + itemBuilder.addToLore(getChatColor() + "❙ &f" + perk); + } + itemBuilder.addToLore("", "&aClick to redeem this armor set"); + + return itemBuilder.build(); + } + + public boolean isWearing(Player player) { + if (!ArmorClassHandler.isAllowed(player.getLocation())) { + return false; + } + + for (ItemStack itemStack : player.getInventory().getArmorContents()) { + if(itemStack == null || !isPiece(itemStack)) { + return false; + } + } + + return true; + } + + public boolean isPiece(ItemStack itemStack){ + if (itemStack == null || itemStack.getItemMeta() == null || itemStack.getItemMeta().getLore() == null) { + return false; + } + + if (itemStack.getItemMeta().getLore() == null || itemStack.getItemMeta().getLore().isEmpty()) { + return false; + } + + final List lore = itemStack.getItemMeta().getLore(); + + return lore.stream().anyMatch(it -> ChatColor.stripColor(it).equalsIgnoreCase("Armor Class: " + ChatColor.stripColor(this.getDisplayName()))); + } + + public boolean isRedeemable(ItemStack itemStack) { + + if (itemStack == null || itemStack.getItemMeta() == null || itemStack.getType() == Material.AIR) { + return false; + } + + if (itemStack.getItemMeta().getDisplayName() == null) { + return false; + } + + if (itemStack.getItemMeta().getLore() == null || itemStack.getItemMeta().getLore().isEmpty()) { + return false; + } + + return itemStack.getType() == this.getRedeemItem().getType() && ChatColor.stripColor(itemStack.getItemMeta().getDisplayName()).startsWith(ChatColor.stripColor(this.getDisplayName())) && itemStack.getItemMeta().getLore().get(0).equals(this.getRedeemItem().getItemMeta().getLore().get(0)); + } + + public String getPieceName(ArmorPiece armorPiece) { + switch(armorPiece) { + case HELMET: + return "Helmet"; + case CHESTPLATE: + return "Chestplate"; + case LEGGINGS: + return "Leggings"; + case BOOTS: + return "Boots"; + case SWORD: + return "Sword"; + case AXE: + return "Axe"; + case BOW: + return "Bow"; + } + + return ""; + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/armorclass/ArmorClassHandler.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/armorclass/ArmorClassHandler.java new file mode 100644 index 0000000..a5826c8 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/armorclass/ArmorClassHandler.java @@ -0,0 +1,102 @@ +package net.frozenorb.foxtrot.gameplay.armorclass; + +import cc.fyre.proton.Proton; +import cc.fyre.proton.util.ItemBuilder; +import lombok.Getter; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.armorclass.listener.ArmorClassListener; +import net.frozenorb.foxtrot.gameplay.armorclass.listener.ShardListener; +import net.frozenorb.foxtrot.gameplay.armorclass.parameter.ArmorClassParameter; +import net.frozenorb.foxtrot.gameplay.armorclass.type.*; +import net.frozenorb.foxtrot.gameplay.armorclass.type.kitmap.*; +import net.frozenorb.foxtrot.team.dtr.DTRBitmask; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.entity.Player; +import org.bukkit.event.Listener; +import org.bukkit.inventory.ItemStack; + +import java.util.*; + +public class ArmorClassHandler implements Listener { + private Foxtrot instance; + + @Getter private List armorClasses = new ArrayList<>(); + @Getter private Map activeSets = new HashMap<>(); + + public ArmorClassHandler(Foxtrot instance) { + this.instance = instance; + + if (Foxtrot.getInstance().getMapHandler().isKitMap()) { + this.armorClasses.add(new CasperTheGhost()); + this.armorClasses.add(new GrimReaperClass()); + this.armorClasses.add(new UndeadWarriorClass()); + } else { + this.armorClasses.add(new RaiderClass()); + this.armorClasses.add(new PyromaniacClass()); + this.armorClasses.add(new GrinderClass()); + this.armorClasses.add(new SpidermanClass()); + this.armorClasses.add(new TrapperClass()); + } + + Proton.getInstance().getCommandHandler().registerParameterType(ArmorClass.class, new ArmorClassParameter()); + this.instance.getServer().getPluginManager().registerEvents(this, this.instance); + this.instance.getServer().getPluginManager().registerEvents(new ArmorClassListener(this), this.instance); + this.instance.getServer().getPluginManager().registerEvents(new ShardListener(), this.instance); + } + + public ArmorClass findByRedeemItem(ItemStack itemStack) { + for (ArmorClass armorClass : this.armorClasses) { + if (armorClass.isRedeemable(itemStack)) { + return armorClass; + } + } + + return null; + } + + public ArmorClass findByPiece(ItemStack itemStack) { + for (ArmorClass armorClass : this.armorClasses) { + if (armorClass.isPiece(itemStack)) { + return armorClass; + } + } + + return null; + } + + public ArmorClass findWearing(Player player) { + for (ArmorClass armorClass : this.armorClasses) { + if (armorClass.isWearing(player)) { + return armorClass; + } + } + + return null; + } + + public ItemStack createShard(Player player, ArmorClass armorClass, int amount) { + final List toReturn = new ArrayList<>(); + toReturn.add(""); + toReturn.add(ChatColor.translate(armorClass.getChatColor() + "❙ &fArmor Class: " + armorClass.getDisplayName())); + toReturn.add(ChatColor.translate(armorClass.getChatColor() + "❙ &fGenerated By: " + player.getName())); + toReturn.add(""); + toReturn.add(ChatColor.GREEN + "Double Click this shard on the armor you want to put it on!"); + + return ItemBuilder.of(Material.FLINT).name(armorClass.getDisplayName() + " Shard").setLore(toReturn).amount(amount).build(); + } + + public static boolean isAllowed(Location location) { + if (Foxtrot.getInstance().getMapHandler().isKitMap()) { + return true; + } + + return !Foxtrot.getInstance().getServerHandler().isWarzone(location) && location.getWorld().getEnvironment() == World.Environment.NORMAL && !DTRBitmask.KOTH.appliesAt(location) && !DTRBitmask.CONQUEST.appliesAt(location) && !DTRBitmask.CITADEL.appliesAt(location) && !DTRBitmask.DTC.appliesAt(location) && !DTRBitmask.SAFE_ZONE.appliesAt(location); + } + + public ArmorClass findArmorClass(String id) { + return this.armorClasses.stream().filter(it -> it.getId().equalsIgnoreCase(id)).findFirst().orElse(null); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/armorclass/ArmorPiece.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/armorclass/ArmorPiece.java new file mode 100644 index 0000000..d1cfe04 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/armorclass/ArmorPiece.java @@ -0,0 +1,103 @@ +package net.frozenorb.foxtrot.gameplay.armorclass; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import net.frozenorb.foxtrot.util.RandomUtil; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +@Getter +@RequiredArgsConstructor +public enum ArmorPiece { + + HELMET(Material.DIAMOND_HELMET, Material.LEATHER_HELMET), + CHESTPLATE(Material.DIAMOND_CHESTPLATE, Material.LEATHER_CHESTPLATE), + LEGGINGS(Material.DIAMOND_LEGGINGS, Material.LEATHER_LEGGINGS), + BOOTS(Material.DIAMOND_BOOTS, Material.LEATHER_BOOTS), + SWORD(Material.DIAMOND_SWORD, Material.DIAMOND_SWORD), + AXE(Material.DIAMOND_AXE, Material.DIAMOND_AXE), + BOW(Material.BOW, Material.BOW); + + private final Material defaultMaterial; + private final Material archerMaterial; + + public boolean isArmor() { + switch(this) { + case HELMET: + case CHESTPLATE: + case LEGGINGS: + case BOOTS: + return true; + default: + return false; + } + } + + public boolean isWeapon() { + switch(this) { + case SWORD: + case AXE: + case BOW: + return true; + default: + return false; + } + } + + public static ArmorPiece fromMaterial(Material material) { + switch(material) { + case PUMPKIN: + case SKULL_ITEM: + case GOLD_HELMET: + case LEATHER_HELMET: + case CHAINMAIL_HELMET: + case IRON_HELMET: + case DIAMOND_HELMET: + return HELMET; + case GOLD_CHESTPLATE: + case LEATHER_CHESTPLATE: + case CHAINMAIL_CHESTPLATE: + case IRON_CHESTPLATE: + case DIAMOND_CHESTPLATE: + return CHESTPLATE; + case GOLD_BOOTS: + case LEATHER_BOOTS: + case CHAINMAIL_BOOTS: + case IRON_BOOTS: + case DIAMOND_BOOTS: + return BOOTS; + case GOLD_LEGGINGS: + case LEATHER_LEGGINGS: + case CHAINMAIL_LEGGINGS: + case IRON_LEGGINGS: + case DIAMOND_LEGGINGS: + return LEGGINGS; + case WOOD_SWORD: + case STONE_SWORD: + case GOLD_SWORD: + case IRON_SWORD: + case DIAMOND_SWORD: + return SWORD; + case WOOD_AXE: + case STONE_AXE: + case GOLD_AXE: + case IRON_AXE: + case DIAMOND_AXE: + return AXE; + case BOW: + return BOW; + } + + return null; + } + + public static ArmorPiece random() { + List armorPieces = new ArrayList<>(Arrays.asList(values())); + armorPieces.remove(BOW); + + return armorPieces.get(RandomUtil.RANDOM.nextInt(armorPieces.size())); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/armorclass/Category.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/armorclass/Category.java new file mode 100644 index 0000000..91283dc --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/armorclass/Category.java @@ -0,0 +1,8 @@ +package net.frozenorb.foxtrot.gameplay.armorclass; + +public enum Category { + DIAMOND, + ARCHER, + ALL + +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/armorclass/command/ArmorClassCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/armorclass/command/ArmorClassCommand.java new file mode 100644 index 0000000..3ca59dd --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/armorclass/command/ArmorClassCommand.java @@ -0,0 +1,28 @@ +package net.frozenorb.foxtrot.gameplay.armorclass.command; + +import cc.fyre.proton.command.Command; +import cc.fyre.proton.command.param.Parameter; +import cc.fyre.proton.util.ItemBuilder; +import net.frozenorb.foxtrot.gameplay.armorclass.ArmorClass; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +public class ArmorClassCommand { + @Command( + names = {"armorclass give", "armorclass give"}, + permission = "foxtrot.command.itemboxes" + ) + public static void execute(CommandSender sender, + @Parameter(name = "armorclass") ArmorClass armorClass, + @Parameter(name = "amount", defaultValue = "1") int amount, + @Parameter(name = "player", defaultValue = "self") Player target) { + final ItemStack itemStack = armorClass.getRedeemItem().clone(); + + itemStack.setAmount(amount); + target.getInventory().addItem(itemStack); + + sender.sendMessage(ChatColor.GREEN + "Gave " + armorClass.getDisplayName() + ChatColor.GREEN + " to " + ChatColor.WHITE + target.getName()); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/armorclass/command/GiveShardCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/armorclass/command/GiveShardCommand.java new file mode 100644 index 0000000..43ec438 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/armorclass/command/GiveShardCommand.java @@ -0,0 +1,20 @@ +package net.frozenorb.foxtrot.gameplay.armorclass.command; + +import cc.fyre.proton.command.Command; +import cc.fyre.proton.command.param.Parameter; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.armorclass.ArmorClass; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +public class GiveShardCommand { + + @Command(names = {"armorclass giveshard"}, permission = "op") + public static void execute(CommandSender sender, @Parameter(name = "target")Player target, @Parameter(name = "class")ArmorClass armorClass, @Parameter(name = "amount")int amount) { + target.getInventory().addItem(Foxtrot.getInstance().getArmorClassHandler().createShard(target, armorClass, amount)); + target.sendMessage(ChatColor.translate("&aYou have been given " + amount + "x " + armorClass.getDisplayName() + " &ashards!")); + sender.sendMessage(ChatColor.translate("&aYou have given " + target.getName() + " " + amount + "x " + armorClass.getDisplayName() + " &ashards!")); + } + +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/armorclass/event/ArmorSetEquipEvent.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/armorclass/event/ArmorSetEquipEvent.java new file mode 100644 index 0000000..5c772c8 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/armorclass/event/ArmorSetEquipEvent.java @@ -0,0 +1,20 @@ +package net.frozenorb.foxtrot.gameplay.armorclass.event; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.Setter; +import net.frozenorb.foxtrot.gameplay.armorclass.ArmorClass; +import net.frozenorb.foxtrot.util.event.FoxtrotEvent; +import org.bukkit.entity.Player; +import org.bukkit.event.Cancellable; + +@Getter +@Setter +@RequiredArgsConstructor +public class ArmorSetEquipEvent extends FoxtrotEvent implements Cancellable { + + private final Player player; + private final ArmorClass armorClass; + + private boolean cancelled; +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/armorclass/listener/ArmorClassListener.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/armorclass/listener/ArmorClassListener.java new file mode 100644 index 0000000..a764f2a --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/armorclass/listener/ArmorClassListener.java @@ -0,0 +1,158 @@ +package net.frozenorb.foxtrot.gameplay.armorclass.listener; + +import lombok.RequiredArgsConstructor; +import net.frozenorb.foxtrot.gameplay.armorclass.ArmorClass; +import net.frozenorb.foxtrot.gameplay.armorclass.ArmorClassHandler; +import net.frozenorb.foxtrot.gameplay.armorclass.ArmorPiece; +import net.frozenorb.foxtrot.gameplay.armorclass.event.ArmorSetEquipEvent; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.block.Action; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.inventory.EquipmentSetEvent; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryType; +import org.bukkit.event.player.*; +import org.bukkit.inventory.ItemStack; + +@RequiredArgsConstructor +public class ArmorClassListener implements Listener { + + public final ArmorClassHandler armorClassHandler; + + @EventHandler(priority = EventPriority.MONITOR) + public void onEquipmentSet(EquipmentSetEvent event) { + final ItemStack itemStack = event.getNewItem(); + + if (itemStack == null || itemStack.getType() == Material.AIR) + return; + + Player player = (Player) event.getHumanEntity(); + ArmorClass armorClass = armorClassHandler.findWearing(player); + + if (armorClass == null) { + return; + } + + if (armorClassHandler.getActiveSets().put(player.getUniqueId(), armorClass) == null) { + ArmorSetEquipEvent equipEvent = new ArmorSetEquipEvent(player, armorClass); + equipEvent.call(); + + if(equipEvent.isCancelled()) { + armorClassHandler.getActiveSets().remove(player.getUniqueId()); + return; + } + + armorClass.apply(player); + + player.sendMessage(ChatColor.translate("&4&lArmor Classes &7┃ &fYou have equipped the " + armorClass.getDisplayName() + "&f armor set!")); + } + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onJoin(PlayerJoinEvent event) { + Player player = event.getPlayer(); + ArmorClass armorClass = armorClassHandler.findWearing(player); + + if (armorClass == null) { + return; + } + + if (armorClassHandler.getActiveSets().put(player.getUniqueId(), armorClass) == null) { + armorClass.apply(player); + + player.sendMessage(ChatColor.translate("&4&lArmor Classes &7┃ &fYou have equipped the " + armorClass.getDisplayName() + "&f armor set!")); + } + } + + @EventHandler(priority = EventPriority.HIGH) + public void onEquipmentUnset(EquipmentSetEvent event) { + final Player player = (Player) event.getHumanEntity(); + final ArmorClass armorClass = armorClassHandler.getActiveSets().remove(player.getUniqueId()); + + if (armorClass == null) { + return; + } + + armorClass.unapply(player); +// player.sendMessage(ChatColor.translate("&4&lArmor Classes &7┃ &fYou have un-equipped the " + armorClass.getDisplayName() + "&f armor set!")); + } + + @EventHandler(priority = EventPriority.LOWEST) + public void onQuit(PlayerQuitEvent event) { + final Player player = event.getPlayer(); + handleRemoval(player); + } + + @EventHandler(priority = EventPriority.LOWEST) + public void onKick(PlayerKickEvent event) { + final Player player = event.getPlayer(); + handleRemoval(player); + } + + @EventHandler(priority = EventPriority.LOWEST) + public void onDeath(PlayerDeathEvent event) { + final Player player = event.getEntity(); + handleRemoval(player); + } + + private void handleRemoval(Player player) { + final ArmorClass armorClass = armorClassHandler.getActiveSets().remove(player.getUniqueId()); + + if (armorClass != null) { + armorClass.unapply(player); + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) + public void onInventoryClick(InventoryClickEvent event) { + if(event.getView().getType() == InventoryType.ANVIL) { + if(event.getRawSlot() >= 0 && event.getRawSlot() <= 2) { + ItemStack itemZero = event.getView().getItem(0), itemOne = event.getView().getItem(1); + if((itemZero != null && itemZero.getType() != Material.AIR && armorClassHandler.findByPiece(itemZero) != null) || + (itemOne != null && itemOne.getType() != Material.AIR && armorClassHandler.findByPiece(itemOne) != null)) { +// if(armorSetSystem.getByPiece(event.getView().getItem(0)) != null || armorSetSystem.getByPiece(event.getView().getItem(1)) != null) { + ((Player)event.getWhoClicked()).sendMessage(ChatColor.translate("&cYou can't rename armor sets in anvils.")); + event.setCancelled(true); + } + } + } + } + + @EventHandler(priority = EventPriority.LOW) + public void onInteract(PlayerInteractEvent event) { + final Action action = event.getAction(); + + if (action == Action.PHYSICAL) return; + + final Player player = event.getPlayer(); + final ItemStack itemStack = event.getItem(); + + if (itemStack == null || !itemStack.getType().equals(Material.CHEST)) { + return; + } + + final ArmorClass armorClass = armorClassHandler.findByRedeemItem(itemStack); + + if (armorClass == null) { + return; + } + + event.setCancelled(true); + + if (itemStack.getAmount() == 1) { + player.setItemInHand(null); + } else { + itemStack.setAmount(itemStack.getAmount()-1); + } + + player.getInventory().addItem(armorClass.createPiece(ArmorPiece.HELMET)); + player.getInventory().addItem(armorClass.createPiece(ArmorPiece.CHESTPLATE)); + player.getInventory().addItem(armorClass.createPiece(ArmorPiece.LEGGINGS)); + player.getInventory().addItem(armorClass.createPiece(ArmorPiece.BOOTS)); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/armorclass/listener/ShardListener.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/armorclass/listener/ShardListener.java new file mode 100644 index 0000000..3334c5a --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/armorclass/listener/ShardListener.java @@ -0,0 +1,103 @@ +package net.frozenorb.foxtrot.gameplay.armorclass.listener; + +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.armorclass.ArmorClass; +import net.frozenorb.foxtrot.util.CC; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.cavepvp.suge.enchant.data.CustomEnchant; + +import java.util.ArrayList; +import java.util.List; + +public class ShardListener implements Listener { + + @EventHandler(priority = EventPriority.LOW) + private void onClick(InventoryClickEvent event) { + final Player player = (Player) event.getWhoClicked(); + final ItemStack bookItem = event.getCursor(); + final ItemStack applyToItem = event.getCurrentItem(); + + if (applyToItem == null || bookItem == null) { + return; + } + + if (!this.isSimilar(bookItem)) { + return; + } + + final Material material = applyToItem.getType(); + final List bookLore = bookItem.getItemMeta().getLore(); + + final ItemMeta applyToMeta = applyToItem.getItemMeta(); + + if (applyToMeta == null || material == null) { + player.sendMessage(ChatColor.RED + "Can't use a book on that item!"); + return; + } + + final String fullEnchantLore = ChatColor.stripColor(bookLore.get(1)).replace("❙ Armor Class: ", ""); + final ArmorClass armorClass = Foxtrot.getInstance().getArmorClassHandler().findArmorClass(fullEnchantLore.replace(" ", "")); + + if (armorClass == null) { + player.sendMessage(ChatColor.RED + "That enchant could not be found! Contact an admin! The lore is " + fullEnchantLore); + return; + } + + if (Foxtrot.getInstance().getArmorClassHandler().findByPiece(applyToItem) != null) { + player.sendMessage(ChatColor.RED + "There is already an Armor Class on this piece!"); + return; + } + + if (!armorClass.findApplicableItems().contains(material)) { + player.sendMessage(ChatColor.RED + "This armor class can't be applied to this item!"); + return; + } + + final List applyToLore = applyToMeta.hasLore() ? applyToMeta.getLore() : new ArrayList<>(); + + applyToLore.add(""); + applyToLore.add(armorClass.getChatColor() + "Armor Class: " + ChatColor.WHITE + ChatColor.stripColor(armorClass.getDisplayName())); + applyToLore.add(armorClass.getChatColor() + "Perks:"); + for (String perk : armorClass.getPerks()) { + applyToLore.add(ChatColor.translate(armorClass.getChatColor() + "❙ &f" + perk)); + } + applyToLore.add(""); + + applyToMeta.setLore(applyToLore); + applyToItem.setItemMeta(applyToMeta); + event.setCurrentItem(applyToItem.clone()); + event.setCancelled(true); + + player.setItemOnCursor(null); + + player.playSound(player.getLocation(), Sound.LEVEL_UP, 1, 1); + player.sendMessage(ChatColor.GREEN + "Applied custom enchant!"); + } + + public boolean isSimilar(ItemStack itemStack) { + if (itemStack == null || itemStack.getItemMeta() == null || itemStack.getItemMeta().getLore() == null || itemStack.getItemMeta().getDisplayName() == null) { + return false; + } + + if (itemStack.getType() != Material.FLINT) { + return false; + } + + if (!itemStack.getItemMeta().getDisplayName().endsWith(" Shard")) { + return false; + } + + final List lore = itemStack.getItemMeta().getLore(); + + return lore.contains(CC.translate("&aDouble Click this shard on the armor you want to put it on!")); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/armorclass/menu/ArmorClassesMenu.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/armorclass/menu/ArmorClassesMenu.java new file mode 100644 index 0000000..d38fc59 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/armorclass/menu/ArmorClassesMenu.java @@ -0,0 +1,108 @@ +package net.frozenorb.foxtrot.gameplay.armorclass.menu; + +import cc.fyre.proton.menu.Button; +import cc.fyre.proton.menu.Menu; +import lombok.AllArgsConstructor; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.armorclass.ArmorClass; +import net.frozenorb.foxtrot.gameplay.armorclass.Category; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@AllArgsConstructor +public class ArmorClassesMenu extends Menu { + private Category category; + + @Override + public String getTitle(Player player) { + return "Armor Classes"; + } + + @Override + public int size(Player player) { + return 27; + } + + @Override + public boolean isPlaceholder() { + return true; + } + + @Override + public Map getButtons(Player player) { + final Map toReturn = new HashMap<>(); + + toReturn.put(4, new Button() { + @Override + public String getName(Player player) { + return ChatColor.translate("&9&lArmor Classes"); + } + + @Override + public List getDescription(Player player) { + final List toReturn = new ArrayList<>(); + + toReturn.add(""); + toReturn.add(ChatColor.translate("&bWhat are Armor Classes?")); + toReturn.add(ChatColor.translate("&9❙ &fEach armor classes provides unique traits.")); + toReturn.add(ChatColor.translate("&9❙ &fSuit up to enhance your play-style.")); + toReturn.add(""); + toReturn.add(ChatColor.translate("&7Hover over each armor classes to view its use")); + + return toReturn; + } + + @Override + public Material getMaterial(Player player) { + return Material.BOOK; + } + }); + + for (ArmorClass armorClass : Foxtrot.getInstance().getArmorClassHandler().getArmorClasses()) { + if (!armorClass.getCategory().equals(category)) { + continue; + } + + toReturn.put(armorClass.getSlot(), new Button() { + @Override + public String getName(Player player) { + return ChatColor.translate(armorClass.getDisplayName()); + } + + @Override + public List getDescription(Player player) { + final List toReturn = new ArrayList<>(); + + toReturn.add(""); + toReturn.add(ChatColor.translate(armorClass.getChatColor() + ChatColor.BOLD.toString() + "Perks")); + for (String perk : armorClass.getPerks()) { + toReturn.add(ChatColor.translate(armorClass.getChatColor() + "❙ &f" + perk)); + } + toReturn.add(""); + toReturn.add(ChatColor.translate("&aClick to preview this armor class")); + + return toReturn; + } + + @Override + public Material getMaterial(Player player) { + return armorClass.getDisplayItem(); + } + + @Override + public void clicked(Player player, int slot, ClickType clickType) { + new PreviewMenu(armorClass).openMenu(player); + } + }); + } + + return toReturn; + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/armorclass/menu/ArmorMainMenu.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/armorclass/menu/ArmorMainMenu.java new file mode 100644 index 0000000..170a29b --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/armorclass/menu/ArmorMainMenu.java @@ -0,0 +1,138 @@ +package net.frozenorb.foxtrot.gameplay.armorclass.menu; + +import cc.fyre.proton.menu.Button; +import cc.fyre.proton.menu.Menu; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.armorclass.ArmorClass; +import net.frozenorb.foxtrot.gameplay.armorclass.Category; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class ArmorMainMenu extends Menu { + @Override + public String getTitle(Player player) { + return "Armor Classes"; + } + + @Override + public int size(Player player) { + return 27; + } + + @Override + public boolean isPlaceholder() { + return true; + } + + @Override + public Map getButtons(Player player) { + final Map toReturn = new HashMap<>(); + + toReturn.put(4, new Button() { + @Override + public String getName(Player player) { + return ChatColor.translate("&9&lArmor Classes"); + } + + @Override + public List getDescription(Player player) { + final List toReturn = new ArrayList<>(); + + toReturn.add(""); + toReturn.add(ChatColor.translate("&bWhat are Armor Classes?")); + toReturn.add(ChatColor.translate("&9❙ &fEach armor classes provides unique traits.")); + toReturn.add(ChatColor.translate("&9❙ &fSuit up to enhance your play-style.")); + toReturn.add(""); + toReturn.add(ChatColor.translate("&7Hover over each armor classes to view its use")); + + return toReturn; + } + + @Override + public Material getMaterial(Player player) { + return Material.BOOK; + } + }); + + toReturn.put(11, new Button() { + @Override + public String getName(Player player) { + return ChatColor.translate("&b&lDiamond Armor Classes"); + } + + @Override + public List getDescription(Player player) { + final List toReturn = new ArrayList<>(); + + toReturn.add(""); + for (ArmorClass armorClass : Foxtrot.getInstance().getArmorClassHandler().getArmorClasses()) { + + if (!armorClass.getCategory().equals(Category.DIAMOND)) { + continue; + } + + toReturn.add(ChatColor.translate("&b❙ &f" + armorClass.getDisplayName())); + } + toReturn.add(""); + toReturn.add(ChatColor.GREEN + "Click to view all diamond armor classes."); + + return toReturn; + } + + @Override + public Material getMaterial(Player player) { + return Material.DIAMOND_HELMET; + } + + @Override + public void clicked(Player player, int slot, ClickType clickType) { + new ArmorClassesMenu(Category.DIAMOND).openMenu(player); + } + }); + + toReturn.put(15, new Button() { + @Override + public String getName(Player player) { + return ChatColor.translate("&d&lArcher Armor Classes"); + } + + @Override + public List getDescription(Player player) { + final List toReturn = new ArrayList<>(); + + toReturn.add(""); + for (ArmorClass armorClass : Foxtrot.getInstance().getArmorClassHandler().getArmorClasses()) { + + if (!armorClass.getCategory().equals(Category.ARCHER)) { + continue; + } + + toReturn.add(ChatColor.translate("&d❙ &f" + armorClass.getDisplayName())); + } + toReturn.add(""); + toReturn.add(ChatColor.GREEN + "Click to view all archer armor classes."); + + return toReturn; + } + + @Override + public Material getMaterial(Player player) { + return Material.LEATHER_HELMET; + } + + @Override + public void clicked(Player player, int slot, ClickType clickType) { + new ArmorClassesMenu(Category.ARCHER).openMenu(player); + } + }); + + return toReturn; + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/armorclass/menu/PreviewMenu.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/armorclass/menu/PreviewMenu.java new file mode 100644 index 0000000..3aab02e --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/armorclass/menu/PreviewMenu.java @@ -0,0 +1,63 @@ +package net.frozenorb.foxtrot.gameplay.armorclass.menu; + +import cc.fyre.proton.menu.Button; +import cc.fyre.proton.menu.Menu; +import cc.fyre.proton.util.ItemBuilder; +import lombok.AllArgsConstructor; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.armorclass.ArmorClass; +import net.frozenorb.foxtrot.gameplay.armorclass.ArmorPiece; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Player; + +import java.util.HashMap; +import java.util.Map; + +@AllArgsConstructor +public class PreviewMenu extends Menu { + private ArmorClass armorClass; + + @Override + public String getTitle(Player player) { + return "Kit Preview"; + } + + @Override + public Map getButtons(Player player) { + final Map toReturn = new HashMap<>(); + + final ItemBuilder itemBuilder = ItemBuilder.of(Material.DIAMOND_SWORD) + .enchant(Enchantment.PROTECTION_ENVIRONMENTAL, 2) + .enchant(Enchantment.DURABILITY, 3) + .name(armorClass.getDisplayName() + " Sword") + .addToLore("", armorClass.getChatColor() + "Armor Class: &f" + ChatColor.stripColor(armorClass.getDisplayName()), armorClass.getChatColor() + "Perks:"); + for (String perk : armorClass.getPerks()) { + itemBuilder.addToLore(armorClass.getChatColor() + "❙ &f" + perk); + } + + toReturn.put(11, Button.fromItem(itemBuilder.build())); + toReturn.put(12, Button.fromItem(armorClass.createPiece(ArmorPiece.HELMET))); + toReturn.put(13, Button.fromItem(armorClass.createPiece(ArmorPiece.CHESTPLATE))); + toReturn.put(14, Button.fromItem(armorClass.createPiece(ArmorPiece.LEGGINGS))); + toReturn.put(15, Button.fromItem(armorClass.createPiece(ArmorPiece.BOOTS))); + + return toReturn; + } + + @Override + public int size(Player player) { + return 27; + } + + @Override + public void onClose(Player player) { + Foxtrot.getInstance().getServer().getScheduler().runTaskLater(Foxtrot.getInstance(), () -> new ArmorClassesMenu(armorClass.getCategory()).openMenu(player), 1); + } + + @Override + public boolean isPlaceholder() { + return true; + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/armorclass/parameter/ArmorClassParameter.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/armorclass/parameter/ArmorClassParameter.java new file mode 100644 index 0000000..29cf9fa --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/armorclass/parameter/ArmorClassParameter.java @@ -0,0 +1,22 @@ +package net.frozenorb.foxtrot.gameplay.armorclass.parameter; + +import cc.fyre.proton.command.param.ParameterType; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.armorclass.ArmorClass; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; + +public class ArmorClassParameter implements ParameterType { + + @Override + public ArmorClass transform(CommandSender commandSender, String s) { + final ArmorClass toReturn = Foxtrot.getInstance().getArmorClassHandler().findArmorClass(s); + + if (toReturn == null) { + commandSender.sendMessage(ChatColor.RED + "Armor class " + ChatColor.YELLOW + s + ChatColor.RED + " not found."); + return null; + } + + return toReturn; + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/armorclass/type/GrinderClass.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/armorclass/type/GrinderClass.java new file mode 100644 index 0000000..e16e418 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/armorclass/type/GrinderClass.java @@ -0,0 +1,110 @@ +package net.frozenorb.foxtrot.gameplay.armorclass.type; + +import cc.fyre.proton.util.ItemBuilder; +import cc.fyre.proton.util.TimeUtils; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.armorclass.ArmorClass; +import net.frozenorb.foxtrot.gameplay.armorclass.ArmorClassHandler; +import net.frozenorb.foxtrot.gameplay.armorclass.ArmorPiece; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Fireball; +import org.bukkit.entity.Player; +import org.bukkit.entity.Projectile; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.ProjectileHitEvent; +import org.bukkit.event.player.PlayerExpChangeEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.metadata.FixedMetadataValue; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +import java.util.*; +import java.util.concurrent.ThreadLocalRandom; +import java.util.concurrent.TimeUnit; + +public class GrinderClass extends ArmorClass { + + @Override + public String getId() { + return "grinder"; + } + + @Override + public String getDisplayName() { + return ChatColor.GREEN + ChatColor.BOLD.toString() + "Grinder"; + } + + @Override + public int getSlot() { + return 11; + } + + @Override + public Material getDisplayItem() { + return Material.EXP_BOTTLE; + } + + @Override + public ChatColor getChatColor() { + return ChatColor.GREEN; + } + + @Override + public List getPerks() { + final List toReturn = new ArrayList<>(); + + toReturn.add("2x permanent XP multiplier"); + + return toReturn; + } + + @EventHandler(priority = EventPriority.MONITOR) + private void onDamage(PlayerExpChangeEvent event) { + final Player player = event.getPlayer(); + + if (!isWearing(player)) { + return; + } + + if (!ArmorClassHandler.isAllowed(player.getLocation())) { + return; + } + + event.setAmount(event.getAmount()*3); + } + + @Override + public ItemStack createPiece(ArmorPiece armorPiece) { + final ItemBuilder itemBuilder = ItemBuilder.of(armorPiece.getDefaultMaterial()) + .enchant(Enchantment.PROTECTION_ENVIRONMENTAL, 2) + .enchant(Enchantment.DURABILITY, 3) + .name(getDisplayName() + " " + getPieceName(armorPiece)) + .addToLore("", getChatColor() + "Armor Class: &f" + ChatColor.stripColor(getDisplayName()), getChatColor() + "Perks:"); + for (String perk : this.getPerks()) { + itemBuilder.addToLore(getChatColor() + "❙ &f" + perk); + } + itemBuilder.addToLore(""); + + if (armorPiece.getDefaultMaterial().equals(Material.DIAMOND_CHESTPLATE)) { + itemBuilder.addToLore("&cFireResistance I"); + } + + if (armorPiece.getDefaultMaterial().equals(Material.DIAMOND_LEGGINGS)) { + itemBuilder.addToLore("&cImplants IV"); + } + + if (armorPiece.getDefaultMaterial().equals(Material.DIAMOND_BOOTS)) { + itemBuilder.enchant(Enchantment.PROTECTION_FALL, 4); + itemBuilder.addToLore("&cSpeed II"); + } + + return itemBuilder.build(); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/armorclass/type/PyromaniacClass.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/armorclass/type/PyromaniacClass.java new file mode 100644 index 0000000..aff500c --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/armorclass/type/PyromaniacClass.java @@ -0,0 +1,199 @@ +package net.frozenorb.foxtrot.gameplay.armorclass.type; + +import cc.fyre.proton.util.ItemBuilder; +import cc.fyre.proton.util.TimeUtils; +import com.sun.org.apache.bcel.internal.generic.LOR; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.armorclass.ArmorClass; +import net.frozenorb.foxtrot.gameplay.armorclass.ArmorClassHandler; +import net.frozenorb.foxtrot.gameplay.armorclass.ArmorPiece; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Fireball; +import org.bukkit.entity.Player; +import org.bukkit.entity.Projectile; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.ProjectileHitEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.metadata.FixedMetadataValue; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +import java.util.*; +import java.util.concurrent.ThreadLocalRandom; +import java.util.concurrent.TimeUnit; + +public class PyromaniacClass extends ArmorClass { + private Map cooldown = new HashMap<>(); + + @Override + public String getId() { + return "pyromaniac"; + } + + @Override + public String getDisplayName() { + return ChatColor.RED + ChatColor.BOLD.toString() + "Pyromaniac"; + } + + @Override + public int getSlot() { + return 12; + } + + @Override + public Material getDisplayItem() { + return Material.FIREBALL; + } + + @Override + public ChatColor getChatColor() { + return ChatColor.RED; + } + + @Override + public List getPerks() { + final List toReturn = new ArrayList<>(); + + toReturn.add("SHIFT + Click to throw shockwaves"); + toReturn.add("1% chance of putting them on Fire and giving them Wither I for 8 seconds."); + + return toReturn; + } + + @EventHandler(priority = EventPriority.LOW) + private void onDamage(EntityDamageEvent event) { + if (!(event.getEntity() instanceof Player)) { + return; + } + + final Player player = (Player) event.getEntity(); + + if (!this.isWearing(player)) { + return; + } + + if (!ArmorClassHandler.isAllowed(player.getLocation())) { + return; + } + + if (event.getCause().equals(EntityDamageEvent.DamageCause.ENTITY_ATTACK)) { + event.setDamage(event.getDamage() * 1.1); + } + } + + @EventHandler(priority = EventPriority.LOW) + private void onInteract(PlayerInteractEvent event) { + if (!event.getAction().name().contains("RIGHT")) { + return; + } + + final Player player = event.getPlayer(); + + if (!this.isWearing(player)) { + return; + } + + if (!player.isSneaking()) { + return; + } + + if (!ArmorClassHandler.isAllowed(player.getLocation())) { + return; + } + + if (cooldown.containsKey(player.getUniqueId()) && cooldown.get(player.getUniqueId()) > System.currentTimeMillis()) { + long millisLeft = ((cooldown.get(player.getUniqueId()) - System.currentTimeMillis()) / 1000L) * 1000L; + String msg = TimeUtils.formatIntoDetailedString((int) (millisLeft / 1000)); + + player.sendMessage(ChatColor.RED + "You cannot use this for another §c§l" + msg + "§c."); + return; + } + + final Fireball fireball = player.launchProjectile(Fireball.class); + + fireball.setMetadata("SHOCK_WAVE", new FixedMetadataValue(Foxtrot.getInstance(), player.getUniqueId().toString())); + fireball.setIsIncendiary(false); + fireball.setYield(0.0f); + fireball.setShooter(player); + + cooldown.put(player.getUniqueId(), System.currentTimeMillis()+TimeUnit.MINUTES.toMillis(5)); + } + + @EventHandler(priority = EventPriority.MONITOR) + private void onDamage(EntityDamageByEntityEvent event) { + if (!(event.getDamager() instanceof Player) || !(event.getEntity() instanceof Player)) { + return; + } + + final Player damager = (Player) event.getDamager(); + + if (!isWearing(damager)) { + return; + } + + if (!ArmorClassHandler.isAllowed(damager.getLocation())) { + return; + } + + final Player target = (Player) event.getEntity(); + + if (ThreadLocalRandom.current().nextInt(1, 200) == 38) { + target.sendMessage(ChatColor.translate(damager.getName() + " &chas used the Butcher Armor Class ability on you!")); + + target.addPotionEffect(new PotionEffect(PotionEffectType.WITHER, 20*6, 0)); + } + } + + @Override + public ItemStack createPiece(ArmorPiece armorPiece) { + final ItemBuilder itemBuilder = ItemBuilder.of(armorPiece.getDefaultMaterial()) + .enchant(Enchantment.PROTECTION_ENVIRONMENTAL, 2) + .enchant(Enchantment.DURABILITY, 3) + .name(getDisplayName() + " " + getPieceName(armorPiece)) + .addToLore("", getChatColor() + "Armor Class: &f" + ChatColor.stripColor(getDisplayName()), getChatColor() + "Perks:"); + for (String perk : this.getPerks()) { + itemBuilder.addToLore(getChatColor() + "❙ &f" + perk); + } + itemBuilder.addToLore(""); + + if (armorPiece.getDefaultMaterial().equals(Material.DIAMOND_CHESTPLATE)) { + itemBuilder.addToLore("&cFireResistance I"); + } + + if (armorPiece.getDefaultMaterial().equals(Material.DIAMOND_BOOTS)) { + itemBuilder.enchant(Enchantment.PROTECTION_FALL, 4); + itemBuilder.addToLore("&cSpeed II"); + } + + return itemBuilder.build(); + } + + @EventHandler + private void onLand(ProjectileHitEvent event) { + if (!(event.getEntity() instanceof Fireball) || !(event.getEntity().getShooter() instanceof Player) || !event.getEntity().hasMetadata("SHOCK_WAVE")) { + return; + } + + final Projectile fireBall = event.getEntity(); + final Player player = (Player) fireBall.getShooter(); + + fireBall.getNearbyEntities(10, 10, 10).stream().filter(it -> it instanceof Player && this.isAllowedAtLocation(it.getLocation())).forEach(it -> { + it.setVelocity(it.getLocation().getDirection().multiply(-2.5)); + + ((Player) it).setHealth(((Player) it).getHealth() - 1); + + ((Player) it).sendMessage(""); + ((Player) it).sendMessage(ChatColor.DARK_RED + ChatColor.BOLD.toString() + "Ability Items"); + ((Player) it).sendMessage(ChatColor.GRAY + "You have been hit with the " + this.getDisplayName() + ChatColor.GRAY + "!"); + ((Player) it).sendMessage(ChatColor.RED + "You have been sent flying in the air!"); + ((Player) it).sendMessage(""); + }); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/armorclass/type/RaiderClass.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/armorclass/type/RaiderClass.java new file mode 100644 index 0000000..f11eea9 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/armorclass/type/RaiderClass.java @@ -0,0 +1,147 @@ +package net.frozenorb.foxtrot.gameplay.armorclass.type; + +import cc.fyre.proton.util.ItemBuilder; +import cc.fyre.proton.util.TimeUtils; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.ability.AbilityHandler; +import net.frozenorb.foxtrot.gameplay.ability.type.NinjaStar; +import net.frozenorb.foxtrot.gameplay.armorclass.ArmorClass; +import net.frozenorb.foxtrot.gameplay.armorclass.ArmorClassHandler; +import net.frozenorb.foxtrot.gameplay.armorclass.ArmorPiece; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.metadata.FixedMetadataValue; + +import java.util.*; +import java.util.concurrent.TimeUnit; + +public class RaiderClass extends ArmorClass { + private Map cooldown = new HashMap<>(); + + @Override + public String getId() { + return "raider"; + } + + @Override + public String getDisplayName() { + return ChatColor.DARK_RED + ChatColor.BOLD.toString() + "Raider"; + } + + @Override + public int getSlot() { + return 13; + } + + @Override + public Material getDisplayItem() { + return Material.DIAMOND_SWORD; + } + + @Override + public ChatColor getChatColor() { + return ChatColor.DARK_RED; + } + + @Override + public List getPerks() { + final List toReturn = new ArrayList<>(); + + toReturn.add("Deal 5% more damage"); + toReturn.add("10% Reduced Partner Item cooldown"); + toReturn.add("SHIFT + Click to activate Midas Touch for 10 seconds"); + + return toReturn; + } + + @EventHandler(priority = EventPriority.MONITOR) + private void onDamage(EntityDamageByEntityEvent event) { + if (!(event.getDamager() instanceof Player)) { + return; + } + + final Player damager = (Player) event.getDamager(); + + if (!this.isWearing(damager)) { + return; + } + + if (!ArmorClassHandler.isAllowed(damager.getLocation())) { + return; + } + + event.setDamage(event.getDamage()*1.1); + } + + @EventHandler(priority = EventPriority.LOW) + private void onInteract(PlayerInteractEvent event) { + if (!event.getAction().name().contains("RIGHT")) { + return; + } + + final Player player = event.getPlayer(); + + if (!this.isWearing(player)) { + return; + } + + if (!player.isSneaking()) { + return; + } + + if (!ArmorClassHandler.isAllowed(player.getLocation())) { + return; + } + + if (cooldown.containsKey(player.getUniqueId()) && cooldown.get(player.getUniqueId()) > System.currentTimeMillis()) { + long millisLeft = ((cooldown.get(player.getUniqueId()) - System.currentTimeMillis()) / 1000L) * 1000L; + String msg = TimeUtils.formatIntoDetailedString((int) (millisLeft / 1000)); + + player.sendMessage(ChatColor.RED + "You cannot use this for another §c§l" + msg + "§c."); + return; + } + + player.setMetadata("ANTI_TRAP", new FixedMetadataValue(Foxtrot.getInstance(), true)); + + Foxtrot.getInstance().getServer().getScheduler().runTaskLater(Foxtrot.getInstance(), () -> { + if (player.isOnline()) { + player.removeMetadata("ANTI_TRAP", Foxtrot.getInstance()); + } + }, 20 * 15); + + cooldown.put(player.getUniqueId(), System.currentTimeMillis()+TimeUnit.MINUTES.toMillis(5)); + } + + @Override + public ItemStack createPiece(ArmorPiece armorPiece) { + final ItemBuilder itemBuilder = ItemBuilder.of(armorPiece.getDefaultMaterial()) + .enchant(Enchantment.PROTECTION_ENVIRONMENTAL, 2) + .enchant(Enchantment.DURABILITY, 3) + .name(getDisplayName() + " " + getPieceName(armorPiece)) + .addToLore("", getChatColor() + "Armor Class: &f" + ChatColor.stripColor(getDisplayName()), getChatColor() + "Perks:"); + for (String perk : this.getPerks()) { + itemBuilder.addToLore(getChatColor() + "❙ &f" + perk); + } + itemBuilder.addToLore(""); + + if (armorPiece.getDefaultMaterial().equals(Material.DIAMOND_CHESTPLATE)) { + itemBuilder.addToLore("&cFireResistance I"); + } + + if (armorPiece.getDefaultMaterial().equals(Material.DIAMOND_BOOTS)) { + itemBuilder.enchant(Enchantment.PROTECTION_FALL, 4); + itemBuilder.addToLore("&cSpeed II"); + } + + return itemBuilder.build(); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/armorclass/type/SpidermanClass.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/armorclass/type/SpidermanClass.java new file mode 100644 index 0000000..5b27d68 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/armorclass/type/SpidermanClass.java @@ -0,0 +1,175 @@ +package net.frozenorb.foxtrot.gameplay.armorclass.type; + +import cc.fyre.proton.util.ItemBuilder; +import cc.fyre.proton.util.TimeUtils; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.armorclass.ArmorClass; +import net.frozenorb.foxtrot.gameplay.armorclass.ArmorClassHandler; +import net.frozenorb.foxtrot.gameplay.armorclass.ArmorPiece; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +import java.util.*; +import java.util.concurrent.TimeUnit; + +public class SpidermanClass extends ArmorClass { + private Map cooldown = new HashMap<>(); + + @Override + public String getId() { + return "spiderman"; + } + + @Override + public String getDisplayName() { + return ChatColor.RED + ChatColor.BOLD.toString() + "Spider Man"; + } + + @Override + public int getSlot() { + return 14; + } + + @Override + public Material getDisplayItem() { + return Material.WEB; + } + + @Override + public ChatColor getChatColor() { + return ChatColor.RED; + } + + @Override + public List getPerks() { + final List toReturn = new ArrayList<>(); + + toReturn.add("25% Fall Damage Reduction"); + toReturn.add("Permanent Jump Boost II, Speed II, Fire Resistance I"); + toReturn.add("SHIFT + Click to put the last player you hit in cobwebs!"); + + return toReturn; + } + + @EventHandler(priority = EventPriority.MONITOR) + private void onDamage(EntityDamageEvent event) { + if (!event.getCause().equals(EntityDamageEvent.DamageCause.FALL)) { + return; + } + + if (!(event.getEntity() instanceof Player)) { + return; + } + + final Player damager = (Player) event.getEntity(); + + if (!this.isWearing(damager)) { + return; + } + + if (!ArmorClassHandler.isAllowed(damager.getLocation())) { + return; + } + + event.setDamage(event.getDamage()*0.75); + } + + @EventHandler(priority = EventPriority.LOW) + private void onInteract(PlayerInteractEvent event) { + if (!event.getAction().name().contains("RIGHT")) { + return; + } + + final Player player = event.getPlayer(); + + if (!this.isWearing(player)) { + return; + } + + if (!ArmorClassHandler.isAllowed(player.getLocation())) { + return; + } + + if (!player.isSneaking()) { + return; + } + + if (cooldown.containsKey(player.getUniqueId()) && cooldown.get(player.getUniqueId()) > System.currentTimeMillis()) { + long millisLeft = ((cooldown.get(player.getUniqueId()) - System.currentTimeMillis()) / 1000L) * 1000L; + String msg = TimeUtils.formatIntoDetailedString((int) (millisLeft / 1000)); + + player.sendMessage(ChatColor.RED + "You cannot use this for another §c§l" + msg + "§c."); + return; + } + + player.playSound(player.getLocation(), Sound.ZOMBIE_WOODBREAK, 1, 1); + + final Block blockAt = player.getLocation().getBlock(); + + setCobweb(blockAt); + setCobweb(blockAt.getRelative(BlockFace.UP)); + setCobweb(blockAt.getRelative(BlockFace.EAST)); + setCobweb(blockAt.getRelative(BlockFace.EAST).getRelative(BlockFace.UP)); + setCobweb(blockAt.getRelative(BlockFace.NORTH)); + setCobweb(blockAt.getRelative(BlockFace.NORTH).getRelative(BlockFace.UP)); + + cooldown.put(player.getUniqueId(), System.currentTimeMillis()+TimeUnit.MINUTES.toMillis(5)); + } + + public void setCobweb(Block block) { + if (!block.getType().equals(Material.AIR)) { + return; + } + + block.setType(Material.WEB); + + Foxtrot.getInstance().getServer().getScheduler().runTaskLater(Foxtrot.getInstance(), () -> block.setType(Material.AIR), 20*10); + } + + @Override + public void apply(Player player) { + player.addPotionEffect(new PotionEffect(PotionEffectType.JUMP, Integer.MAX_VALUE, 1)); + } + + @Override + public void unapply(Player player) { + player.removePotionEffect(PotionEffectType.JUMP); + } + + @Override + public ItemStack createPiece(ArmorPiece armorPiece) { + final ItemBuilder itemBuilder = ItemBuilder.of(armorPiece.getDefaultMaterial()) + .enchant(Enchantment.PROTECTION_ENVIRONMENTAL, 2) + .enchant(Enchantment.DURABILITY, 3) + .name(getDisplayName() + " " + getPieceName(armorPiece)) + .addToLore("", getChatColor() + "Armor Class: &f" + ChatColor.stripColor(getDisplayName()), getChatColor() + "Perks:"); + for (String perk : this.getPerks()) { + itemBuilder.addToLore(getChatColor() + "❙ &f" + perk); + } + itemBuilder.addToLore(""); + + if (armorPiece.getDefaultMaterial().equals(Material.DIAMOND_CHESTPLATE)) { + itemBuilder.addToLore("&cFireResistance I"); + } + + if (armorPiece.getDefaultMaterial().equals(Material.DIAMOND_BOOTS)) { + itemBuilder.enchant(Enchantment.PROTECTION_FALL, 4); + itemBuilder.addToLore("&cSpeed II"); + } + + return itemBuilder.build(); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/armorclass/type/TrapperClass.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/armorclass/type/TrapperClass.java new file mode 100644 index 0000000..98c7013 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/armorclass/type/TrapperClass.java @@ -0,0 +1,161 @@ +package net.frozenorb.foxtrot.gameplay.armorclass.type; + +import cc.fyre.proton.util.ItemBuilder; +import cc.fyre.proton.util.TimeUtils; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.ability.AbilityHandler; +import net.frozenorb.foxtrot.gameplay.ability.type.NinjaStar; +import net.frozenorb.foxtrot.gameplay.armorclass.ArmorClass; +import net.frozenorb.foxtrot.gameplay.armorclass.ArmorClassHandler; +import net.frozenorb.foxtrot.gameplay.armorclass.ArmorPiece; +import net.frozenorb.foxtrot.team.dtr.DTRBitmask; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Fireball; +import org.bukkit.entity.Player; +import org.bukkit.entity.Projectile; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.ProjectileHitEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.metadata.FixedMetadataValue; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +import java.util.*; +import java.util.concurrent.ThreadLocalRandom; +import java.util.concurrent.TimeUnit; + +public class TrapperClass extends ArmorClass { + private Map cooldown = new HashMap<>(); + + @Override + public String getId() { + return "trapper"; + } + + @Override + public String getDisplayName() { + return ChatColor.DARK_PURPLE + ChatColor.BOLD.toString() + "Trapper"; + } + + @Override + public int getSlot() { + return 15; + } + + @Override + public Material getDisplayItem() { + return Material.COBBLESTONE; + } + + @Override + public ChatColor getChatColor() { + return ChatColor.DARK_PURPLE; + } + + @Override + public List getPerks() { + final List toReturn = new ArrayList<>(); + + toReturn.add("Take 10% less damage"); + toReturn.add("Med Kits and Portable Resistance last 25% longer"); + toReturn.add("SHIFT + Click to put the last player you hit on Ability Item cooldown"); + + return toReturn; + } + + @EventHandler(priority = EventPriority.LOW) + private void onDamage(EntityDamageEvent event) { + if (!(event.getEntity() instanceof Player)) { + return; + } + + final Player player = (Player) event.getEntity(); + + if (!this.isWearing(player)) { + return; + } + + if (!ArmorClassHandler.isAllowed(player.getLocation())) { + return; + } + + if (event.getCause().equals(EntityDamageEvent.DamageCause.ENTITY_ATTACK)) { + event.setDamage(event.getDamage() * 0.9); + } + } + + @EventHandler(priority = EventPriority.LOW) + private void onInteract(PlayerInteractEvent event) { + if (!event.getAction().name().contains("RIGHT")) { + return; + } + + final Player player = event.getPlayer(); + + if (!this.isWearing(player)) { + return; + } + + if (!player.isSneaking()) { + return; + } + + if (!ArmorClassHandler.isAllowed(player.getLocation())) { + return; + } + + if (cooldown.containsKey(player.getUniqueId()) && cooldown.get(player.getUniqueId()) > System.currentTimeMillis()) { + long millisLeft = ((cooldown.get(player.getUniqueId()) - System.currentTimeMillis()) / 1000L) * 1000L; + String msg = TimeUtils.formatIntoDetailedString((int) (millisLeft / 1000)); + + player.sendMessage(ChatColor.RED + "You cannot use this for another §c§l" + msg + "§c."); + return; + } + + final long difference = TimeUnit.SECONDS.toMillis(30L); + + if (!NinjaStar.cache.containsKey(player.getUniqueId()) || (System.currentTimeMillis() - NinjaStar.cache.get(player.getUniqueId()).getTime()) > difference) { + player.sendMessage(ChatColor.RED + "No player has hit you within the last 30 seconds."); + return; + } + + final NinjaStar.LastDamageEntry lastDamageEntry = NinjaStar.cache.get(player.getUniqueId()); + final Player target = Foxtrot.getInstance().getServer().getPlayer(lastDamageEntry.getUuid()); + + final AbilityHandler abilityHandler = Foxtrot.getInstance().getMapHandler().getAbilityHandler(); + abilityHandler.getGlobalCooldowns().put(target.getUniqueId(), System.currentTimeMillis()+TimeUnit.SECONDS.toMillis(15)); + + cooldown.put(player.getUniqueId(), System.currentTimeMillis()+TimeUnit.MINUTES.toMillis(5)); + } + + @Override + public ItemStack createPiece(ArmorPiece armorPiece) { + final ItemBuilder itemBuilder = ItemBuilder.of(armorPiece.getDefaultMaterial()) + .enchant(Enchantment.PROTECTION_ENVIRONMENTAL, 2) + .enchant(Enchantment.DURABILITY, 3) + .name(getDisplayName() + " " + getPieceName(armorPiece)) + .addToLore("", getChatColor() + "Armor Class: &f" + ChatColor.stripColor(getDisplayName()), getChatColor() + "Perks:"); + for (String perk : this.getPerks()) { + itemBuilder.addToLore(getChatColor() + "❙ &f" + perk); + } + itemBuilder.addToLore(""); + + if (armorPiece.getDefaultMaterial().equals(Material.DIAMOND_CHESTPLATE)) { + itemBuilder.addToLore("&cFireResistance I"); + } + + if (armorPiece.getDefaultMaterial().equals(Material.DIAMOND_BOOTS)) { + itemBuilder.enchant(Enchantment.PROTECTION_FALL, 4); + itemBuilder.addToLore("&cSpeed II"); + } + + return itemBuilder.build(); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/armorclass/type/kitmap/CasperTheGhost.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/armorclass/type/kitmap/CasperTheGhost.java new file mode 100644 index 0000000..0b40de2 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/armorclass/type/kitmap/CasperTheGhost.java @@ -0,0 +1,192 @@ +package net.frozenorb.foxtrot.gameplay.armorclass.type.kitmap; + +import cc.fyre.proton.util.ItemBuilder; +import cc.fyre.proton.util.TimeUtils; +import com.comphenix.protocol.PacketType; +import com.comphenix.protocol.ProtocolLibrary; +import com.comphenix.protocol.events.PacketContainer; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.ability.type.Invisibility; +import net.frozenorb.foxtrot.gameplay.ability.type.kitmap.fall.PiercingShot; +import net.frozenorb.foxtrot.gameplay.armorclass.ArmorClass; +import net.frozenorb.foxtrot.gameplay.armorclass.ArmorPiece; +import net.frozenorb.foxtrot.gameplay.armorclass.Category; +import net.frozenorb.foxtrot.gameplay.pvpclasses.PvPClassHandler; +import net.frozenorb.foxtrot.util.CC; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.craftbukkit.v1_7_R4.entity.CraftPlayer; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +import java.util.*; +import java.util.concurrent.TimeUnit; + +public class CasperTheGhost extends ArmorClass { + private Map cooldown = new HashMap<>(); + + @Override + public String getId() { + return "caspertheghost"; + } + + @Override + public String getDisplayName() { + return ChatColor.WHITE + ChatColor.BOLD.toString() + "Casper The Ghost"; + } + + @Override + public int getSlot() { + return 10; + } + + @Override + public Material getDisplayItem() { + return Material.IRON_INGOT; + } + + @Override + public ChatColor getChatColor() { + return ChatColor.WHITE; + } + + @Override + public List getPerks() { + final List toReturn = new ArrayList<>(); + + toReturn.add("Ability to see nametags of invisible players."); + toReturn.add("30% more damage to players with over 6 partner items."); + toReturn.add("Shift Right Click to go fully invisible for 15 seconds."); + + return toReturn; + } + + @Override + public Category getCategory() { + return Category.DIAMOND; + } + + @EventHandler(priority = EventPriority.LOW) + private void onInteract(PlayerInteractEvent event) { + if (!event.getAction().name().contains("RIGHT")) { + return; + } + + final Player player = event.getPlayer(); + + if (!this.isWearing(player)) { + return; + } + + if (!player.isSneaking()) { + return; + } + + if (cooldown.containsKey(player.getUniqueId()) && cooldown.get(player.getUniqueId()) > System.currentTimeMillis()) { + long millisLeft = ((cooldown.get(player.getUniqueId()) - System.currentTimeMillis()) / 1000L) * 1000L; + String msg = TimeUtils.formatIntoDetailedString((int) (millisLeft / 1000)); + + player.sendMessage(ChatColor.RED + "You cannot use this for another §c§l" + msg + "§c."); + return; + } + + event.getPlayer().addPotionEffect(Invisibility.EFFECT, true); + event.getPlayer().setFireTicks(0); + + ((CraftPlayer)event.getPlayer()).getHandle().getDataWatcher().watch(9, (byte) 0); + + this.sendRestorePacket(event.getPlayer(),Foxtrot.getInstance().getServer().getOnlinePlayers(),true); + } + + @EventHandler + private void onDamage(EntityDamageByEntityEvent event) { + if (!(event.getDamager() instanceof Player) || !(event.getEntity() instanceof Player)) { + return; + } + + final Player damager = (Player) event.getDamager(); + final Player target = (Player) event.getEntity(); + + if (!isWearing(damager)) { + return; + } + + int number = 0; + + for (ItemStack content : target.getInventory().getContents()) { + if (content == null) { + continue; + } + + if (Foxtrot.getInstance().getMapHandler().getAbilityHandler().getAbilities().values().stream().noneMatch(it -> it.isSimilar(content))) { + continue; + } + + number++; + } + + if (number >= 6) { + damager.sendMessage(CC.translate(target.getName() + " &6has over 6 partner items in their inventory therefor you delt 30% more damage!")); + target.sendMessage(CC.translate(damager.getName() + " &cis in a " + this.getDisplayName() + " &cset and you have over 6 partner items so they delt 30% more damage to you!")); + event.setDamage(event.getDamage()*1.3); + } + } + + @Override + public ItemStack createPiece(ArmorPiece armorPiece) { + final ItemBuilder itemBuilder = ItemBuilder.of(armorPiece.getDefaultMaterial()) + .enchant(Enchantment.PROTECTION_ENVIRONMENTAL, 2) + .enchant(Enchantment.DURABILITY, 3) + .name(getDisplayName() + " " + getPieceName(armorPiece)) + .addToLore("", getChatColor() + "Armor Class: &f" + ChatColor.stripColor(getDisplayName()), getChatColor() + "Perks:"); + for (String perk : this.getPerks()) { + itemBuilder.addToLore(getChatColor() + "❙ &f" + perk); + } + itemBuilder.addToLore(""); + + return itemBuilder.build(); + } + + @Override + public void apply(Player player) { + } + + @Override + public void unapply(Player player) { + } + + private void sendRestorePacket(Player player, Collection players, boolean clear) { + + final List packets = new ArrayList<>(); + + for (int i = 0; i < 4; i++) { + + final PacketContainer packet = new PacketContainer(PacketType.Play.Server.ENTITY_EQUIPMENT); + + packet.getIntegers().write(0,player.getEntityId()); + packet.getIntegers().write(1,i+1); + + packet.getItemModifier().write(0,clear ? new ItemStack(Material.AIR):player.getInventory().getArmorContents()[i]); + + packets.add(packet); + } + + players.stream().filter(it -> it.getUniqueId() != player.getUniqueId()).forEach(it -> packets.forEach(packet -> { + + try { + ProtocolLibrary.getProtocolManager().sendServerPacket(it,packet); + } catch (Exception ex) { + ex.printStackTrace(); + } + + })); + + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/armorclass/type/kitmap/GrimReaperClass.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/armorclass/type/kitmap/GrimReaperClass.java new file mode 100644 index 0000000..d2b90af --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/armorclass/type/kitmap/GrimReaperClass.java @@ -0,0 +1,196 @@ +package net.frozenorb.foxtrot.gameplay.armorclass.type.kitmap; + +import cc.fyre.proton.util.ItemBuilder; +import cc.fyre.proton.util.TimeUtils; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.commands.CustomTimerCreateCommand; +import net.frozenorb.foxtrot.gameplay.ability.type.kitmap.fall.PiercingShot; +import net.frozenorb.foxtrot.gameplay.armorclass.ArmorClass; +import net.frozenorb.foxtrot.gameplay.armorclass.ArmorPiece; +import net.frozenorb.foxtrot.gameplay.armorclass.Category; +import net.frozenorb.foxtrot.gameplay.pvpclasses.PvPClassHandler; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.metadata.FixedMetadataValue; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; +import org.bukkit.scheduler.BukkitRunnable; + +import java.util.*; +import java.util.concurrent.TimeUnit; + +public class GrimReaperClass extends ArmorClass { + private Map cooldown = new HashMap<>(); + + @Override + public String getId() { + return "grimreaper"; + } + + @Override + public String getDisplayName() { + return ChatColor.DARK_RED + ChatColor.BOLD.toString() + "Grim Reaper"; + } + + @Override + public int getSlot() { + return 13; + } + + @Override + public Material getDisplayItem() { + return Material.IRON_HOE; + } + + @Override + public ChatColor getChatColor() { + return ChatColor.DARK_RED; + } + + @Override + public List getPerks() { + final List toReturn = new ArrayList<>(); + + toReturn.add("10% more damage towards kits."); + toReturn.add("Shift Right CLick to give every enemy Blindness III,"); + toReturn.add("Slowness III and they take 10% more damage for 7 seconds."); + toReturn.add("Reapers Revenge & Final Breath cannot be used within 10 blocks."); + + return toReturn; + } + + @Override + public Category getCategory() { + return Category.DIAMOND; + } + + @EventHandler(priority = EventPriority.LOW) + private void onInteract(PlayerInteractEvent event) { + if (!event.getAction().name().contains("RIGHT")) { + return; + } + + final Player player = event.getPlayer(); + + if (!this.isWearing(player)) { + return; + } + + if (!player.isSneaking()) { + return; + } + + if (cooldown.containsKey(player.getUniqueId()) && cooldown.get(player.getUniqueId()) > System.currentTimeMillis()) { + long millisLeft = ((cooldown.get(player.getUniqueId()) - System.currentTimeMillis()) / 1000L) * 1000L; + String msg = TimeUtils.formatIntoDetailedString((int) (millisLeft / 1000)); + + player.sendMessage(ChatColor.RED + "You cannot use this for another §c§l" + msg + "§c."); + return; + } + + int count = 0; + + for (Player nearByEnemy : getNearByEnemies(player, 20)) { + nearByEnemy.addPotionEffect(new PotionEffect(PotionEffectType.BLINDNESS, 20*8, 2)); + nearByEnemy.addPotionEffect(new PotionEffect(PotionEffectType.SLOW, 20*8, 2)); + + PiercingShot.cache.put(nearByEnemy.getUniqueId(), player.getUniqueId()); + + Foxtrot.getInstance().getServer().getScheduler().runTaskLater(Foxtrot.getInstance(), () -> { + PiercingShot.cache.remove(nearByEnemy.getUniqueId()); + }, 20*7); + } + + player.sendMessage(ChatColor.translate("&aSuccessfully effected &f" + count + " &aplayers!")); + cooldown.put(player.getUniqueId(), System.currentTimeMillis()+TimeUnit.MINUTES.toMillis(3)); + } + + @EventHandler + private void onDamage(EntityDamageByEntityEvent event) { + if (!(event.getDamager() instanceof Player) || !(event.getEntity() instanceof Player)) { + return; + } + + final Player damager = (Player) event.getDamager(); + final Player target = (Player) event.getEntity(); + + if (!isWearing(damager)) { + return; + } + + if (PvPClassHandler.getPvPClass(target) != null) { + event.setDamage(event.getDamage()*1.1D); + } + } + + @Override + public ItemStack createPiece(ArmorPiece armorPiece) { + final ItemBuilder itemBuilder = ItemBuilder.of(armorPiece.getDefaultMaterial()) + .enchant(Enchantment.PROTECTION_ENVIRONMENTAL, 2) + .enchant(Enchantment.DURABILITY, 3) + .name(getDisplayName() + " " + getPieceName(armorPiece)) + .addToLore("", getChatColor() + "Armor Class: &f" + ChatColor.stripColor(getDisplayName()), getChatColor() + "Perks:"); + for (String perk : this.getPerks()) { + itemBuilder.addToLore(getChatColor() + "❙ &f" + perk); + } + itemBuilder.addToLore(""); + + return itemBuilder.build(); + } + + @Override + public void apply(Player player) { + } + + @Override + public void unapply(Player player) { + } + + public static List getNearByEnemies(Player player, int radius) { + + final List toReturn = new ArrayList<>(); + + for (Entity entity : player.getNearbyEntities(radius, radius, radius)) { + + if (!(entity instanceof Player)) { + continue; + } + + final Player target = (Player)entity; + + if (player.getUniqueId().equals(target.getUniqueId())) { + continue; + } + + if (target.isDead()) { + continue; + } + + if (Foxtrot.getInstance().getTeamHandler().getTeam(player) != null && Foxtrot.getInstance().getTeamHandler().getTeam(player).getMembers().contains(target.getUniqueId())) { + continue; + } + + if (Foxtrot.getInstance().getPvPTimerMap().hasTimer(target.getUniqueId())) { + continue; + } + + if (CustomTimerCreateCommand.isSOTWTimer() && !CustomTimerCreateCommand.hasSOTWEnabled(target.getUniqueId())) { + continue; + } + + toReturn.add(target); + } + + return toReturn; + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/armorclass/type/kitmap/UndeadWarriorClass.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/armorclass/type/kitmap/UndeadWarriorClass.java new file mode 100644 index 0000000..3b6f5f0 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/armorclass/type/kitmap/UndeadWarriorClass.java @@ -0,0 +1,138 @@ +package net.frozenorb.foxtrot.gameplay.armorclass.type.kitmap; + +import cc.fyre.proton.util.ItemBuilder; +import cc.fyre.proton.util.TimeUtils; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.ability.type.kitmap.fall.PiercingShot; +import net.frozenorb.foxtrot.gameplay.armorclass.ArmorClass; +import net.frozenorb.foxtrot.gameplay.armorclass.ArmorPiece; +import net.frozenorb.foxtrot.gameplay.armorclass.Category; +import net.frozenorb.foxtrot.gameplay.pvpclasses.PvPClassHandler; +import net.frozenorb.foxtrot.team.Team; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.metadata.FixedMetadataValue; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +import java.util.*; +import java.util.concurrent.TimeUnit; + +public class UndeadWarriorClass extends ArmorClass { + private Map cooldown = new HashMap<>(); + + @Override + public String getId() { + return "undeadwarrior"; + } + + @Override + public String getDisplayName() { + return ChatColor.DARK_PURPLE + ChatColor.BOLD.toString() + "Undead Warrior"; + } + + @Override + public int getSlot() { + return 16; + } + + @Override + public Material getDisplayItem() { + return Material.BONE; + } + + @Override + public ChatColor getChatColor() { + return ChatColor.DARK_PURPLE; + } + + @Override + public List getPerks() { + final List toReturn = new ArrayList<>(); + + toReturn.add("Piercing Shot doesn't work on this class."); + toReturn.add("Allies within a 20-block radius of you take 25%"); + toReturn.add("less fall damage and take 0.5 fewer hearts from an archer tag."); + + return toReturn; + } + + @EventHandler + private void onDamage(EntityDamageEvent event) { + if (!event.getCause().equals(EntityDamageEvent.DamageCause.FALL)) { + return; + } + + if (!(event.getEntity() instanceof Player)) { + return; + } + + final Player player = (Player) event.getEntity(); + + final Team team = Foxtrot.getInstance().getTeamHandler().getTeam(player); + + boolean reduce = false; + + if (team == null) { + return; + } + + for (Player onlineMember : team.getOnlineMembers()) { + + if (!onlineMember.hasMetadata("UNDEAD_WARRIOR")) { + continue; + } + + if (!onlineMember.getLocation().getWorld().equals(player.getWorld())) { + continue; + } + + if (onlineMember.getLocation().distance(player.getLocation()) <= 20) { + reduce = true; + } + + } + + if (reduce) { + event.setDamage(event.getDamage()*0.75); + } + } + + @Override + public Category getCategory() { + return Category.DIAMOND; + } + + @Override + public ItemStack createPiece(ArmorPiece armorPiece) { + final ItemBuilder itemBuilder = ItemBuilder.of(armorPiece.getDefaultMaterial()) + .enchant(Enchantment.PROTECTION_ENVIRONMENTAL, 2) + .enchant(Enchantment.DURABILITY, 3) + .name(getDisplayName() + " " + getPieceName(armorPiece)) + .addToLore("", getChatColor() + "Armor Class: &f" + ChatColor.stripColor(getDisplayName()), getChatColor() + "Perks:"); + for (String perk : this.getPerks()) { + itemBuilder.addToLore(getChatColor() + "❙ &f" + perk); + } + itemBuilder.addToLore(""); + + return itemBuilder.build(); + } + + @Override + public void apply(Player player) { + player.setMetadata("UNDEAD_WARRIOR", new FixedMetadataValue(Foxtrot.getInstance(), true)); + } + + @Override + public void unapply(Player player) { + player.removeMetadata("UNDEAD_WARRIOR", Foxtrot.getInstance()); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/blockshop/BlockShopCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/blockshop/BlockShopCommand.java new file mode 100644 index 0000000..612104e --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/blockshop/BlockShopCommand.java @@ -0,0 +1,37 @@ +package net.frozenorb.foxtrot.gameplay.blockshop; + +import cc.fyre.proton.command.Command; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.commands.CustomTimerCreateCommand; +import net.frozenorb.foxtrot.gameplay.blockshop.menu.BlockShopMenu; +import net.frozenorb.foxtrot.server.SpawnTagHandler; +import net.frozenorb.foxtrot.team.Team; +import net.frozenorb.foxtrot.team.claims.LandBoard; +import net.frozenorb.foxtrot.team.dtr.DTRBitmask; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; + +/** + * Not created by vape on 10/30/2020 at 3:40 PM. + */ +public class BlockShopCommand { + + @Command(names = {"blockshop", "bs"}, permission = "") + public static void blockShop(Player player) { + if (Foxtrot.getInstance().getServerHandler().isTeams()) { + player.sendMessage(ChatColor.RED + "This feature is disabled on " + Foxtrot.getInstance().getServerHandler().getServerName() + "."); + return; + } + + boolean inSpawn = DTRBitmask.SAFE_ZONE.appliesAt(player.getLocation()); + boolean inCombat = SpawnTagHandler.isTagged(player); + boolean SOTW = CustomTimerCreateCommand.isSOTWTimer(); + + if (!Foxtrot.getInstance().getMapHandler().isKitMap() && !SOTW && !inSpawn && inCombat) { + player.sendMessage(ChatColor.RED + "You can't open the Block Shop while combat tagged."); + return; + } + + new BlockShopMenu().openMenu(player); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/blockshop/ShopItem.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/blockshop/ShopItem.java new file mode 100644 index 0000000..21782d0 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/blockshop/ShopItem.java @@ -0,0 +1,13 @@ +package net.frozenorb.foxtrot.gameplay.blockshop; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.bukkit.inventory.ItemStack; + +@AllArgsConstructor +@Getter +public class ShopItem { + private final ItemStack itemStack; + private final int price; + private final int index; +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/blockshop/menu/BackButton.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/blockshop/menu/BackButton.java new file mode 100644 index 0000000..4761336 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/blockshop/menu/BackButton.java @@ -0,0 +1,43 @@ +package net.frozenorb.foxtrot.gameplay.blockshop.menu; + +import cc.fyre.proton.menu.Button; +import cc.fyre.proton.util.ItemBuilder; +import lombok.AllArgsConstructor; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; +import org.bukkit.inventory.ItemStack; + +import java.util.List; + +@AllArgsConstructor +public class BackButton extends Button { + + private final ClickHandler clickHandler; + + public void clicked(Player player, int i, ClickType clickType) { + clickHandler.onClick(player, i, clickType); + } + + @Override + public ItemStack getButtonItem(Player player) { + return ItemBuilder.of(Material.ARROW) + .name("§aBack") + .build(); + } + + @Override + public String getName(Player player) { + return null; + } + + @Override + public List getDescription(Player player) { + return null; + } + + @Override + public Material getMaterial(Player player) { + return null; + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/blockshop/menu/BlockShopMenu.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/blockshop/menu/BlockShopMenu.java new file mode 100644 index 0000000..252c560 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/blockshop/menu/BlockShopMenu.java @@ -0,0 +1,172 @@ +package net.frozenorb.foxtrot.gameplay.blockshop.menu; + +import cc.fyre.proton.menu.Button; +import cc.fyre.proton.menu.Menu; +import cc.fyre.proton.util.ItemBuilder; +import lombok.RequiredArgsConstructor; +import net.frozenorb.foxtrot.gameplay.blockshop.ShopItem; +import net.frozenorb.foxtrot.util.CC; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Supplier; +import java.util.stream.Collectors; +import java.util.stream.IntStream; +import java.util.stream.Stream; + +/** + * Not created by vape on 10/30/2020 at 3:44 PM. + */ +@RequiredArgsConstructor +public class BlockShopMenu extends Menu { + + private static final Button GLASS = new GlassButton(7); + + @Override + public String getTitle(Player player) { + return "Block Shop"; + } + + @Override + public Map getButtons(Player player) { + Map buttons = new HashMap<>(); + + for (int i = 0; i < 9 * 5; i++) { + buttons.put(i, GLASS); + } + + buttons.put(12, new CategoryButton( + ItemBuilder.of(Material.WOOL) + .name(CC.GREEN + CC.BOLD + "Wool") + .build(), + IntStream.range(0, 16) + .mapToObj(index -> new ShopItem( + ItemBuilder.of(Material.WOOL, 64).data((short) index).build(), + 500, index)) + .collect(Collectors.toList()) + )); + + buttons.put(14, new CategoryButton( + ItemBuilder.of(Material.STAINED_GLASS) + .name(CC.GREEN + CC.BOLD + "Glass") + .build(), + + Stream.concat( + Stream.of(new ShopItem( + ItemBuilder.of(Material.GLASS, 64).build(), + 500, 0)), + IntStream.range(0, 16) + .mapToObj(index -> new ShopItem( + ItemBuilder.of(Material.STAINED_GLASS, 64).data((short) index).build(), + 500, index + 1)) + ).collect(Collectors.toList()) + )); + + buttons.put(21, new CategoryButton( + ItemBuilder.of(Material.SAPLING) + .name(CC.GREEN + CC.BOLD + "Saplings") + .build(), + + IntStream.range(0, 6) + .mapToObj(index -> new ShopItem( + ItemBuilder.of(Material.SAPLING, 64).data((short) index).build(), + 500, index) + ).collect(Collectors.toList()) + )); + + buttons.put(22, new CategoryButton( + ItemBuilder.of(Material.LOG) + .name(CC.GREEN + CC.BOLD + "Wood") + .build(), + + Stream.concat( + IntStream.range(0, 4) + .mapToObj(index -> new ShopItem( + ItemBuilder.of(Material.LOG, 64).data((short) index).build(), + 500, index)), + IntStream.range(0, 2) + .mapToObj(index -> new ShopItem( + ItemBuilder.of(Material.LOG_2, 64).data((short) index).build(), + 500, index + 4)) + ).collect(Collectors.toList()) + )); + + buttons.put(23, new CategoryButton( + ItemBuilder.of(Material.GRASS) + .name(CC.GREEN + CC.BOLD + "Other Blocks") + .build(), + ((Supplier>) () -> { + List items = new ArrayList<>(); + int index = 0; + items.add(new ShopItem(new ItemStack(Material.COBBLESTONE, 64), 500, index++)); + items.add(new ShopItem(new ItemStack(Material.STONE, 64), 500, index++)); + items.add(new ShopItem(new ItemStack(Material.SMOOTH_BRICK, 64), 500, index++)); + items.add(new ShopItem(new ItemStack(Material.BRICK, 64), 500, index++)); + items.add(new ShopItem(new ItemStack(Material.SANDSTONE, 64), 500, index++)); + items.add(new ShopItem(new ItemStack(Material.SAND, 64), 500, index++)); + items.add(new ShopItem(new ItemStack(Material.SAND, 64, (short) 1), 500, index++)); + items.add(new ShopItem(new ItemStack(Material.GRASS, 64), 500, index++)); + items.add(new ShopItem(new ItemStack(Material.DIRT, 64), 500, index++)); + items.add(new ShopItem(new ItemStack(Material.GRAVEL, 64), 500, index++)); + items.add(new ShopItem(new ItemStack(Material.QUARTZ_BLOCK, 64), 500, index++)); + items.add(new ShopItem(new ItemStack(Material.BOOKSHELF, 64), 500, index++)); + items.add(new ShopItem(new ItemStack(Material.ITEM_FRAME, 1), 750, index++)); + items.add(new ShopItem(new ItemStack(Material.FLOWER_POT, 1), 750, index++)); + items.add(new ShopItem(new ItemStack(Material.MYCEL, 64), 750, index++)); + items.add(new ShopItem(new ItemStack(Material.LEAVES, 64), 500, index++)); + items.add(new ShopItem(new ItemStack(Material.LEAVES, 64, (byte)1), 500, index++)); + items.add(new ShopItem(new ItemStack(Material.LEAVES, 64, (byte)2), 500, index++)); + items.add(new ShopItem(new ItemStack(Material.LEAVES, 64, (byte)3), 500, index++)); + items.add(new ShopItem(new ItemStack(Material.LEAVES_2, 64), 500, index++)); + items.add(new ShopItem(new ItemStack(Material.LEAVES_2, 64, (byte)1), 500, index++)); + return items; + }).get() + )); + + buttons.put(30, new CategoryButton( + ItemBuilder.of(Material.STAINED_CLAY) + .name(CC.GREEN + CC.BOLD + "Stained Clay") + .build(), + IntStream.range(0, 16) + .mapToObj(index -> new ShopItem( + ItemBuilder.of(Material.STAINED_CLAY, 64).data((short) index).build(), + 500, index)) + .collect(Collectors.toList()) + )); + + buttons.put(31, new CategoryButton( + ItemBuilder.of(Material.INK_SACK) + .name(CC.GREEN + CC.BOLD + "Dye") + .data((short) 1) + .build(), + + IntStream.range(0, 16) + .mapToObj(index -> new ShopItem( + ItemBuilder.of(Material.INK_SACK, 64).data((short) index).build(), + 500, index) + ).collect(Collectors.toList()) + )); + + buttons.put(32, new CategoryButton( + ItemBuilder.of(Material.SNOW_BLOCK) + .name(ChatColor.translate("&c&lChristmas &2&lBlocks")) + .build(), + ((Supplier>) () -> { + List items = new ArrayList<>(); + int index = 0; + items.add(new ShopItem(new ItemStack(Material.SNOW_BLOCK, 64), 500, index++)); + items.add(new ShopItem(new ItemStack(Material.PUMPKIN, 64), 500, index++)); + items.add(new ShopItem(new ItemStack(Material.SNOW, 64), 500, index++)); + return items; + }).get() + )); + + return buttons; + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/blockshop/menu/CategoryButton.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/blockshop/menu/CategoryButton.java new file mode 100644 index 0000000..6887b02 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/blockshop/menu/CategoryButton.java @@ -0,0 +1,43 @@ +package net.frozenorb.foxtrot.gameplay.blockshop.menu; + +import cc.fyre.proton.menu.Button; +import lombok.AllArgsConstructor; +import net.frozenorb.foxtrot.gameplay.blockshop.ShopItem; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; +import org.bukkit.inventory.ItemStack; + +import java.util.List; + +@AllArgsConstructor +public class CategoryButton extends Button { + + private final ItemStack itemStack; + private final List items; + + @Override + public void clicked(Player player, int i, ClickType clickType) { + new CategoryMenu(items).openMenu(player); + } + + @Override + public ItemStack getButtonItem(Player player) { + return itemStack; + } + + @Override + public String getName(Player player) { + return null; + } + + @Override + public List getDescription(Player player) { + return null; + } + + @Override + public Material getMaterial(Player player) { + return null; + } +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/blockshop/menu/CategoryMenu.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/blockshop/menu/CategoryMenu.java new file mode 100644 index 0000000..be7f9d7 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/blockshop/menu/CategoryMenu.java @@ -0,0 +1,35 @@ +package net.frozenorb.foxtrot.gameplay.blockshop.menu; + +import cc.fyre.proton.menu.Button; +import cc.fyre.proton.menu.Menu; +import lombok.AllArgsConstructor; +import net.frozenorb.foxtrot.gameplay.blockshop.ShopItem; +import org.bukkit.entity.Player; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@AllArgsConstructor +public class CategoryMenu extends Menu { + + private final List items; + + @Override + public String getTitle(Player player) { + return "Block Shop"; + } + + @Override + public Map getButtons(Player player) { + Map buttons = new HashMap<>(); + + buttons.put(40, new BackButton((player1, i, clickType) -> new BlockShopMenu().openMenu(player))); + + for (ShopItem item : items) { + buttons.put(item.getIndex(), new ItemButton(item)); + } + + return buttons; + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/blockshop/menu/ClickHandler.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/blockshop/menu/ClickHandler.java new file mode 100644 index 0000000..4d4de04 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/blockshop/menu/ClickHandler.java @@ -0,0 +1,9 @@ +package net.frozenorb.foxtrot.gameplay.blockshop.menu; + +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; + +@FunctionalInterface +public interface ClickHandler { + void onClick(Player player, int i, ClickType clickType); +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/blockshop/menu/GlassButton.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/blockshop/menu/GlassButton.java new file mode 100644 index 0000000..a55710f --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/blockshop/menu/GlassButton.java @@ -0,0 +1,39 @@ +package net.frozenorb.foxtrot.gameplay.blockshop.menu; + +import cc.fyre.proton.menu.Button; +import cc.fyre.proton.util.ItemBuilder; +import lombok.RequiredArgsConstructor; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import java.util.List; + +@RequiredArgsConstructor +public class GlassButton extends Button { + + private final int glassData; + + @Override + public ItemStack getButtonItem(Player player) { + return ItemBuilder.of(Material.STAINED_GLASS_PANE) + .name(" ") + .data((short) glassData) + .build(); + } + + @Override + public String getName(Player player) { + return null; + } + + @Override + public List getDescription(Player player) { + return null; + } + + @Override + public Material getMaterial(Player player) { + return null; + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/blockshop/menu/ItemButton.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/blockshop/menu/ItemButton.java new file mode 100644 index 0000000..9e406c3 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/blockshop/menu/ItemButton.java @@ -0,0 +1,67 @@ +package net.frozenorb.foxtrot.gameplay.blockshop.menu; + +import cc.fyre.proton.menu.Button; +import cc.fyre.proton.util.ItemBuilder; +import cc.fyre.proton.util.ItemUtils; +import lombok.AllArgsConstructor; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.blockshop.ShopItem; +import net.frozenorb.foxtrot.util.CC; +import net.frozenorb.foxtrot.util.InventoryUtils; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; +import org.bukkit.inventory.ItemStack; + +import java.util.List; + +@AllArgsConstructor +public class ItemButton extends Button { + + private final ShopItem item; + + @Override + public void clicked(Player player, int slot, ClickType clickType) { + if (clickType != ClickType.LEFT) return; + + double balance = Foxtrot.getInstance().getEconomyHandler().getBalance(player.getUniqueId()); + int price = item.getPrice(); + + if (balance < price) { + player.sendMessage(ChatColor.RED + "You do not have enough money to purchase this."); + return; + } + + if (!InventoryUtils.addAmountToInventory(player.getInventory(), item.getItemStack().clone(), item.getItemStack().getAmount())) { + player.sendMessage(ChatColor.RED + "Your inventory is full."); + return; + } + + Foxtrot.getInstance().getEconomyHandler().setBalance(player.getUniqueId(), balance - price); + player.sendMessage(ChatColor.GREEN + "You have purchased " + ItemUtils.getName(item.getItemStack()) + ChatColor.GREEN + " for $" + price + "."); + } + + @Override + public ItemStack getButtonItem(Player player) { + return ItemBuilder.copyOf(item.getItemStack().clone()) + .name(CC.GREEN + CC.BOLD + ItemUtils.getName(item.getItemStack())) + .addToLore(CC.GRAY + "Price: $" + item.getPrice()) + .build(); + } + + @Override + public String getName(Player player) { + return null; + } + + @Override + public List getDescription(Player player) { + return null; + } + + @Override + public Material getMaterial(Player player) { + return null; + } +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/boosters/Booster.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/boosters/Booster.java new file mode 100644 index 0000000..8a3b2e1 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/boosters/Booster.java @@ -0,0 +1,101 @@ +package net.frozenorb.foxtrot.gameplay.boosters; + +import cc.fyre.proton.util.UUIDUtils; +import lombok.Getter; +import lombok.Setter; +import mkremins.fanciful.FancyMessage; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.ability.type.kitmap.FiftyFifty; +import org.bukkit.ChatColor; +import org.bukkit.Sound; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; +import org.bukkit.event.HandlerList; +import org.bukkit.event.Listener; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; +import java.util.concurrent.TimeUnit; + +public abstract class Booster implements Listener { + @Getter @Setter private long activatedAt = 0; + @Getter @Setter private UUID activatedBy = null; + @Getter @Setter private long lastDeactivateAt = 0; + @Getter @Setter private boolean active; + + public abstract String getId(); + public abstract String getDisplayName(); + public abstract int getSlot(); + public abstract List getDescription(); + public abstract ItemStack getItemDisplay(); + + public boolean isOnCooldown() { + + if (this.isActive() && activatedBy != null) { + return false; + } + + return this.lastDeactivateAt + TimeUnit.HOURS.toHours(1) >= System.currentTimeMillis(); + } + + public int inQueue() { + return (int) Foxtrot.getInstance().getNetworkBoosterHandler().getBoostersQueued().values().stream().filter(it -> it.contains(this)).count(); + } + + public void activate(UUID target) { + final Foxtrot instance = Foxtrot.getInstance(); + + activatedAt = System.currentTimeMillis(); + activatedBy = target; + active = true; + + final List queued = instance.getNetworkBoosterHandler().getBoostersQueued().getOrDefault(target, new ArrayList<>()); + queued.remove(this); + instance.getNetworkBoosterHandler().getBoostersQueued().put(target, queued); + + for (Player onlinePlayer : instance.getServer().getOnlinePlayers()) { + onlinePlayer.sendMessage(""); + onlinePlayer.sendMessage(ChatColor.translate("&7███████")); + onlinePlayer.sendMessage(ChatColor.translate("&7█" + "&4████" + "&7██ &4&l" + ChatColor.stripColor(this.getDisplayName()) + " Booster")); + onlinePlayer.sendMessage(ChatColor.translate("&7█" + "&4█" + "&7███&4█&7█ &7" + this.getDescription().get(0))); + onlinePlayer.sendMessage(ChatColor.translate("&7█" + "&4████" + "&7██ &7" + this.getDescription().get(1))); + onlinePlayer.sendMessage(ChatColor.translate("&7█" + "&4█" + "&7███&4█&7█")); + onlinePlayer.sendMessage(ChatColor.translate("&7█" + "&4████" + "&7██ &cActivated By: " + ChatColor.WHITE + UUIDUtils.name(target))); + onlinePlayer.sendMessage(ChatColor.translate("&7███████")); + onlinePlayer.sendMessage(""); + onlinePlayer.sendMessage(ChatColor.GREEN + "You can purchase a booster at " + ChatColor.WHITE + "https://store.cavepvp.org/boosters" + ChatColor.GREEN + "!"); + } + } + + public void deactivate() { + final Foxtrot instance = Foxtrot.getInstance(); + final NetworkBoosterHandler networkBoosterHandler = instance.getNetworkBoosterHandler(); + + lastDeactivateAt = System.currentTimeMillis(); + active = false; + activatedBy = null; + + final UUID uuid = networkBoosterHandler.getActiveBoosters().remove(this); + HandlerList.unregisterAll(this); + + String name = UUIDUtils.name(uuid); + + for (Player onlinePlayer : instance.getServer().getOnlinePlayers()) { + onlinePlayer.sendMessage(""); + onlinePlayer.sendMessage(ChatColor.DARK_RED + ChatColor.BOLD.toString() + "Network Boosters"); + onlinePlayer.sendMessage(ChatColor.RED + "The " + this.getDisplayName() + " Booster " + ChatColor.RED + " has expired!"); + onlinePlayer.sendMessage(ChatColor.GRAY + "Thanks to " + ChatColor.WHITE + name + ChatColor.GRAY + " for activating this booster!"); + onlinePlayer.sendMessage(""); + } + + final Player player = Foxtrot.getInstance().getServer().getPlayer(uuid); + + if (player != null) { + player.playSound(player.getLocation(), Sound.LEVEL_UP, 1, 1); + player.sendMessage(ChatColor.GREEN + "Your booster has been deactivated! Thank you for activating this booster!"); + } + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/boosters/NetworkBoosterHandler.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/boosters/NetworkBoosterHandler.java new file mode 100644 index 0000000..213bcd6 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/boosters/NetworkBoosterHandler.java @@ -0,0 +1,184 @@ +package net.frozenorb.foxtrot.gameplay.boosters; + +import cc.fyre.proton.Proton; +import cc.fyre.proton.util.ClassUtils; +import lombok.Getter; +import lombok.Setter; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.boosters.parameter.BoosterParameter; +import net.frozenorb.foxtrot.gameplay.boosters.service.BoosterService; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.event.Listener; + +import java.io.File; +import java.io.IOException; +import java.util.*; + +public class NetworkBoosterHandler implements Listener { + private Foxtrot instance; + + @Getter private List boostersTypes = new ArrayList<>(); + + @Getter @Setter private Map> boostersQueued = new HashMap<>(); + @Getter @Setter private Map> boosterBalances = new HashMap<>(); + + @Getter private File file; + @Getter private FileConfiguration data; + + public NetworkBoosterHandler(Foxtrot instance) { + this.instance = instance; + + for (Class clazz : ClassUtils.getClassesInPackage(Foxtrot.getInstance(),"net.frozenorb.foxtrot.gameplay.boosters.type")) { + + if (!Booster.class.isAssignableFrom(clazz)) { + continue; + } + + try { + this.boostersTypes.add((Booster)clazz.newInstance()); + } catch (InstantiationException | IllegalAccessException ex) { + ex.printStackTrace(); + } + } + + Proton.getInstance().getCommandHandler().registerParameterType(Booster.class, new BoosterParameter()); + + this.instance.getServer().getPluginManager().registerEvents(this, this.instance); + + new BoosterService(this.instance, this).runTaskTimer(this.instance, 20, 20); + + this.loadBoosters(); + } + + public void loadBoosters() { + this.file = new File(Foxtrot.getInstance().getDataFolder(), "data/boosters.yml"); + this.data = YamlConfiguration.loadConfiguration(this.file); + + if (!this.file.exists()) { + try { + this.file.createNewFile(); + } catch (IOException e) { + e.printStackTrace(); + } + return; + } + + if (this.data.get("activeBoosters") != null) { + this.instance.getServer().getScheduler().runTaskLater(this.instance, () -> { + for (String boosterName : this.data.getConfigurationSection("activeBoosters").getKeys(false)) { + final Booster booster = this.findBooster(boosterName); + + final UUID activatedBy = UUID.fromString(this.data.getString("activeBoosters." + boosterName + ".activatedBy")); + final long activatedAt = this.data.getLong("activeBoosters." + boosterName + ".activatedAt"); + + booster.activate(activatedBy); + booster.setActivatedAt(activatedAt); + } + }, 5); + } + + if (this.data.get("boostersQueued") != null) { + this.instance.getServer().getScheduler().runTaskLater(this.instance, () -> { + for (String playerID : this.data.getConfigurationSection("boostersQueued").getKeys(false)) { + final UUID uuid = UUID.fromString(playerID); + + final List boosters = new ArrayList<>(); + + for (String boosterName : this.data.getConfigurationSection("boostersQueued." + playerID).getKeys(false)) { + final Booster booster = this.findBooster(boosterName); + + if (booster == null) { + System.out.println("***WARNING*** " + uuid + " has an invalid booster. What is " + boosterName + "?"); + continue; + } + + boosters.add(booster); + } + + boostersQueued.put(uuid, boosters); + } + }, 5); + } + + if (this.data.get("boosterBalance") == null) { + return; + } + + this.instance.getServer().getScheduler().runTaskLater(this.instance, () -> { + for (String playerID : this.data.getConfigurationSection("boosterBalance").getKeys(false)) { + final UUID uuid = UUID.fromString(playerID); + + final Map boosterMap = new HashMap<>(); + + for (String boosterName : this.data.getConfigurationSection("boosterBalance." + playerID).getKeys(false)) { + final Booster booster = this.findBooster(boosterName); + + if (booster == null) { + System.out.println("***WARNING*** " + uuid + " has an invalid booster. What is " + boosterName + "?"); + continue; + } + + boosterMap.put(booster, this.data.getInt("boosterBalance." + playerID + "." + boosterName)); + } + + boosterBalances.put(uuid, boosterMap); + } + }, 5); + } + + public void saveBoosters() { + this.data.getValues(false).forEach((key, value) -> this.data.set(key, null)); + + for (Map.Entry> mainEntry : this.boosterBalances.entrySet()) { + for (Map.Entry entry : mainEntry.getValue().entrySet()) { + this.data.set("boosterBalance." + mainEntry.getKey().toString() + "." + entry.getKey().getId(), entry.getValue()); + } + } + + for (Booster booster : this.getActiveBoosters().keySet()) { + this.data.set("activeBoosters." + booster.getId() + ".activatedBy", booster.getActivatedBy().toString()); + this.data.set("activeBoosters." + booster.getId() + ".activatedAt", booster.getActivatedAt()); + } + + for (Map.Entry> entry : this.boostersQueued.entrySet()) { + for (Booster booster : entry.getValue()) { + this.data.set("boostersQueued." + entry.getKey() + "." + booster.getId(), 1); + } + } + + try { + this.data.save(this.file); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public Map getActiveBoosters() { + final Map toReturn = new HashMap<>(); + + for (Booster boostersType : boostersTypes) { + if (boostersType.isActive() && boostersType.getActivatedBy() != null) { + toReturn.put(boostersType, boostersType.getActivatedBy()); + } + } + + return toReturn; + } + + public boolean isFrenzy() { + return this.getActiveBoosters().containsKey(this.findBooster("Frenzy")); + } + + public boolean isDoublePoints() { + return this.getActiveBoosters().containsKey(this.findBooster("2xPoints")); + } + + public boolean isReducedEnderpearl() { + return this.getActiveBoosters().containsKey(this.findBooster("ReducedEnderpearl")); + } + + public Booster findBooster(String id) { + return this.boostersTypes.stream().filter(it -> it.getId().equalsIgnoreCase(id)).findFirst().orElse(null); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/boosters/command/BoosterCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/boosters/command/BoosterCommand.java new file mode 100644 index 0000000..838b297 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/boosters/command/BoosterCommand.java @@ -0,0 +1,47 @@ +package net.frozenorb.foxtrot.gameplay.boosters.command; + +import cc.fyre.proton.command.Command; +import cc.fyre.proton.command.param.Parameter; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.boosters.Booster; +import net.frozenorb.foxtrot.gameplay.boosters.NetworkBoosterHandler; +import net.frozenorb.foxtrot.gameplay.boosters.menu.BoosterMenu; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import java.util.HashMap; +import java.util.Map; + +public class BoosterCommand { + + @Command(names = {"boosters", "booster", "networkbooster"}, permission = "") + public static void execute(Player player) { + new BoosterMenu().openMenu(player); + } + + @Command( + names = {"booster give", "boosters give"}, + permission = "foxtrot.command.itemboxes" + ) + public static void execute(CommandSender sender, + @Parameter(name = "booster") Booster booster, + @Parameter(name = "amount", defaultValue = "1") int amount, + @Parameter(name = "player", defaultValue = "self") Player target) { + + final NetworkBoosterHandler networkBoosterHandler = Foxtrot.getInstance().getNetworkBoosterHandler(); + + final Map boosterMap = networkBoosterHandler.getBoosterBalances().getOrDefault(target.getUniqueId(), new HashMap<>()); + boosterMap.put(booster, boosterMap.getOrDefault(booster, 0)+amount); + + networkBoosterHandler.getBoosterBalances().put(target.getUniqueId(), boosterMap); + + target.sendMessage(""); + target.sendMessage(ChatColor.DARK_RED + ChatColor.BOLD.toString() + "Network Boosters"); + target.sendMessage(ChatColor.translate("&cYou have been given &f1 " + booster.getDisplayName() + "&c booster!")); + target.sendMessage(ChatColor.GRAY + "Add it to the queue by typing /networkbooster!"); + target.sendMessage(""); + + sender.sendMessage(ChatColor.GREEN + "Gave " + booster.getDisplayName() + ChatColor.GREEN + " to " + ChatColor.WHITE + target.getName()); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/boosters/menu/BoosterMenu.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/boosters/menu/BoosterMenu.java new file mode 100644 index 0000000..4b42107 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/boosters/menu/BoosterMenu.java @@ -0,0 +1,128 @@ +package net.frozenorb.foxtrot.gameplay.boosters.menu; + +import cc.fyre.proton.menu.Button; +import cc.fyre.proton.menu.Menu; +import cc.fyre.proton.scoreboard.construct.ScoreFunction; +import cc.fyre.proton.util.UUIDUtils; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.boosters.Booster; +import net.frozenorb.foxtrot.gameplay.boosters.NetworkBoosterHandler; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +public class BoosterMenu extends Menu { + @Override + public String getTitle(Player player) { + return "Network Boosters"; + } + + @Override + public Map getButtons(Player player) { + final Map toReturn = new HashMap<>(); + + for (int i = 0; i < 27; i++) { + toReturn.put(i, Button.placeholder(Material.STAINED_GLASS_PANE, (byte) 14, "")); + } + + final NetworkBoosterHandler networkBoosterHandler = Foxtrot.getInstance().getNetworkBoosterHandler(); + + final Map boosterMap = new HashMap<>(networkBoosterHandler.getBoosterBalances().getOrDefault(player.getUniqueId(), new HashMap<>())); + + for (Booster boostersType : networkBoosterHandler.getBoostersTypes()) { + if (!boostersType.getId().equalsIgnoreCase("Frenzy")) { + continue; + } + + int boosters = boosterMap.getOrDefault(boostersType, 0); + + toReturn.put(boostersType.getSlot(), new Button() { + @Override + public String getName(Player player) { + return boostersType.getItemDisplay().getItemMeta().getDisplayName(); + } + + @Override + public List getDescription(Player player) { + final List toReturn = new ArrayList<>(boostersType.getItemDisplay().getItemMeta().getLore()); + toReturn.add(""); + + if (boostersType.isActive() && boostersType.getActivatedBy() != null) { + final String activatedBy = UUIDUtils.name(networkBoosterHandler.getActiveBoosters().get(boostersType)); + toReturn.add(ChatColor.translate("&4&l┃ &fStatus: &aActive")); + toReturn.add(ChatColor.translate("&4&l┃ &fActivated By: &c" + activatedBy)); + toReturn.add(ChatColor.translate("&4&l┃ &fExpires In: &c" + ScoreFunction.TIME_FANCY.apply((boostersType.getActivatedAt()+TimeUnit.HOURS.toMillis(1) - System.currentTimeMillis()) / 1000F))); + } else if (boostersType.isOnCooldown()) { + toReturn.add(ChatColor.translate("&4&l┃ &fStatus: &eOn Cooldown")); + toReturn.add(ChatColor.translate("&4&l┃ &fRemaining: &a" + ScoreFunction.TIME_FANCY.apply(((boostersType.getLastDeactivateAt()+TimeUnit.HOURS.toMillis(1))-System.currentTimeMillis()) / 1000F))); + } else { + toReturn.add(ChatColor.translate("&4&l┃ &fStatus: &cInactive")); + } + + toReturn.add(ChatColor.translate("&4&l┃ &fBalance: &c" + boosters)); + toReturn.add(""); + toReturn.add(ChatColor.GREEN + "Click to place a booster in the queue"); + + int queued = boostersType.inQueue(); + + toReturn.add(ChatColor.WHITE.toString() + queued + " Boosters currently are in queue"); + + return toReturn; + } + + @Override + public byte getDamageValue(Player player) { + return boostersType.getItemDisplay().getData().getData(); + } + + @Override + public Material getMaterial(Player player) { + return boostersType.getItemDisplay().getType(); + } + + @Override + public void clicked(Player player, int slot, ClickType clickType) { + if (boosters <= 0) { + player.sendMessage(ChatColor.RED + "You do not have this booster! You can purchase boosters at https://store.cavepvp.org/boosters"); + return; + } + + final List queuedBoosters = networkBoosterHandler.getBoostersQueued().getOrDefault(player.getUniqueId(), new ArrayList<>()); + + if (queuedBoosters.contains(boostersType)) { + player.sendMessage(ChatColor.RED + "You already have that booster in the queue!"); + return; + } + + queuedBoosters.add(boostersType); + + if (boosterMap.get(boostersType) == 1) { + boosterMap.remove(boostersType); + } else { + boosterMap.replace(boostersType, boosters-1); + } + + networkBoosterHandler.getBoosterBalances().replace(player.getUniqueId(), boosterMap); + networkBoosterHandler.getBoostersQueued().put(player.getUniqueId(), queuedBoosters); + + player.sendMessage(ChatColor.GREEN + "Placed your booster in the queue!"); + player.closeInventory(); + } + }); + } + + return toReturn; + } + + @Override + public boolean isAutoUpdate() { + return true; + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/boosters/parameter/BoosterParameter.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/boosters/parameter/BoosterParameter.java new file mode 100644 index 0000000..7af6eaf --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/boosters/parameter/BoosterParameter.java @@ -0,0 +1,30 @@ +package net.frozenorb.foxtrot.gameplay.boosters.parameter; + +import cc.fyre.proton.command.param.ParameterType; +import com.mysql.jdbc.StringUtils; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.ability.Ability; +import net.frozenorb.foxtrot.gameplay.boosters.Booster; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +public class BoosterParameter implements ParameterType { + + @Override + public Booster transform(CommandSender commandSender, String s) { + + final Booster toReturn = Foxtrot.getInstance().getNetworkBoosterHandler().findBooster(s); + + if (toReturn == null) { + commandSender.sendMessage(ChatColor.RED + "Booster " + ChatColor.YELLOW + s + ChatColor.RED + " not found."); + return null; + } + + return toReturn; + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/boosters/service/BoosterService.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/boosters/service/BoosterService.java new file mode 100644 index 0000000..b2a7cf4 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/boosters/service/BoosterService.java @@ -0,0 +1,52 @@ +package net.frozenorb.foxtrot.gameplay.boosters.service; + +import lombok.AllArgsConstructor; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.boosters.Booster; +import net.frozenorb.foxtrot.gameplay.boosters.NetworkBoosterHandler; +import org.bukkit.scheduler.BukkitRunnable; + +import java.util.*; +import java.util.concurrent.TimeUnit; + +@AllArgsConstructor +public class BoosterService extends BukkitRunnable { + private Foxtrot instance; + private NetworkBoosterHandler networkBoosterHandler; + + @Override + public void run() { + for (Map.Entry entry : networkBoosterHandler.getActiveBoosters().entrySet()) { + if (entry.getKey().getActivatedAt()+ TimeUnit.HOURS.toMillis(1L) <= System.currentTimeMillis()) { + entry.getKey().deactivate(); + } + } + + final Map> queuedBoosters = new HashMap<>(networkBoosterHandler.getBoostersQueued()); + + for (Map.Entry> entry : queuedBoosters.entrySet()) { + final List boosters = new ArrayList<>(entry.getValue()); + + for (Booster booster : boosters) { + if (booster.isActive()) { + continue; + } + + if (booster.getLastDeactivateAt()+TimeUnit.HOURS.toMillis(1) >= System.currentTimeMillis()) { + continue; + } + + booster.activate(entry.getKey()); + + final List secondBoosters = new ArrayList<>(entry.getValue()); + secondBoosters.remove(booster); + + if (secondBoosters.isEmpty()) { + networkBoosterHandler.getBoostersQueued().remove(entry.getKey()); + } else { + networkBoosterHandler.getBoostersQueued().put(entry.getKey(), secondBoosters); + } + } + } + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/boosters/type/DoublePoints.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/boosters/type/DoublePoints.java new file mode 100644 index 0000000..c2a02ca --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/boosters/type/DoublePoints.java @@ -0,0 +1,39 @@ +package net.frozenorb.foxtrot.gameplay.boosters.type; + +import cc.fyre.proton.util.ItemBuilder; +import net.frozenorb.foxtrot.gameplay.boosters.Booster; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; + +import java.util.Arrays; +import java.util.List; + +public class DoublePoints extends Booster { + @Override + public String getId() { + return "2xPoints"; + } + + @Override + public String getDisplayName() { + return ChatColor.LIGHT_PURPLE + ChatColor.BOLD.toString() + "2x Points"; + } + + @Override + public int getSlot() { + return 15; + } + + @Override + public List getDescription() { + return Arrays.asList("All points gained (excl Citadel)", "are doubled for the next hour!"); + } + + @Override + public ItemStack getItemDisplay() { + return ItemBuilder.of(Material.EMERALD).name(this.getDisplayName() + ChatColor.GRAY + " [1 hour]") + .addToLore(ChatColor.translate("&7Doubles all points gained"), ChatColor.translate("&7for the next hour!")) + .build(); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/boosters/type/FrenzyBooster.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/boosters/type/FrenzyBooster.java new file mode 100644 index 0000000..b453291 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/boosters/type/FrenzyBooster.java @@ -0,0 +1,39 @@ +package net.frozenorb.foxtrot.gameplay.boosters.type; + +import cc.fyre.proton.util.ItemBuilder; +import net.frozenorb.foxtrot.gameplay.boosters.Booster; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; + +import java.util.Arrays; +import java.util.List; + +public class FrenzyBooster extends Booster { + @Override + public String getId() { + return "Frenzy"; + } + + @Override + public String getDisplayName() { + return ChatColor.AQUA + ChatColor.BOLD.toString() + "Frenzy Event"; + } + + @Override + public int getSlot() { + return 13; + } + + @Override + public List getDescription() { + return Arrays.asList("Partner item cooldowns have been reduced", "by 15% and last 20% longer plus no ability limit!"); + } + + @Override + public ItemStack getItemDisplay() { + return ItemBuilder.of(Material.RAW_FISH).data((byte)2).name(this.getDisplayName() + " Event " + ChatColor.GRAY + "[1 hour]") + .addToLore(ChatColor.translate("&7Reduces all partner item"), ChatColor.translate("&7cooldowns by 15%!")) + .build(); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/boosters/type/ReducedEnderpearlBooster.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/boosters/type/ReducedEnderpearlBooster.java new file mode 100644 index 0000000..aa4734a --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/boosters/type/ReducedEnderpearlBooster.java @@ -0,0 +1,39 @@ +package net.frozenorb.foxtrot.gameplay.boosters.type; + +import cc.fyre.proton.util.ItemBuilder; +import net.frozenorb.foxtrot.gameplay.boosters.Booster; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; + +import java.util.Arrays; +import java.util.List; + +public class ReducedEnderpearlBooster extends Booster { + @Override + public String getId() { + return "ReducedEnderpearl"; + } + + @Override + public String getDisplayName() { + return ChatColor.YELLOW + ChatColor.BOLD.toString() + "Reduced Pearl Cooldowns"; + } + + @Override + public int getSlot() { + return 11; + } + + @Override + public List getDescription() { + return Arrays.asList("Enderpearl cooldown is now", "10 seconds for the next hour!"); + } + + @Override + public ItemStack getItemDisplay() { + return ItemBuilder.of(Material.ENDER_PEARL).name(this.getDisplayName() + ChatColor.GRAY + " [1 hour]") + .addToLore(ChatColor.translate("&7Reduces all partner item"), ChatColor.translate("&7cooldowns by an hour!")) + .build(); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/bosses/Boss.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/bosses/Boss.java new file mode 100644 index 0000000..1fd1750 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/bosses/Boss.java @@ -0,0 +1,154 @@ +package net.frozenorb.foxtrot.gameplay.bosses; + +import lombok.Getter; +import lombok.Setter; +import net.frozenorb.foxtrot.Foxtrot; +import org.apache.commons.lang.WordUtils; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.Sound; +import org.bukkit.World; +import org.bukkit.entity.*; +import org.bukkit.event.EventHandler; +import org.bukkit.event.HandlerList; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.metadata.FixedMetadataValue; +import org.bukkit.util.Vector; + +import java.util.concurrent.ThreadLocalRandom; +import java.util.stream.IntStream; + +public abstract class Boss implements Listener { + @Getter @Setter private Entity entity; + + public abstract String getBossID(); + public abstract String getBossDisplayName(); + public abstract int getMaxHealth(); + public abstract double getDamageMultiplier(); + public abstract EntityType getEntityType(); + public abstract String getWorldName(); + + public void activate() { + final int x = ThreadLocalRandom.current().nextInt(75, 300); + final int z = ThreadLocalRandom.current().nextInt(75, 300); + final Location location = this.findWorld().getHighestBlockAt(x, z).getLocation().add(new Vector(0, 1, 0)).clone(); + + this.activate(location); + + for (Player onlinePlayer : Foxtrot.getInstance().getServer().getOnlinePlayers()) { + onlinePlayer.sendMessage(""); + onlinePlayer.sendMessage(ChatColor.translate("&7███████")); + onlinePlayer.sendMessage(ChatColor.translate("&7█" + "&4████" + "&7██ " + this.getBossDisplayName())); + onlinePlayer.sendMessage(ChatColor.translate("&7█" + "&4█" + "&7███" + "&4█" + "&7█ has spawned!")); + onlinePlayer.sendMessage(ChatColor.translate("&7█" + "&4████" + "&7██")); + onlinePlayer.sendMessage(ChatColor.translate("&7█" + "&4█" + "&7███" + "&4█" + "&7█ &cLocation:")); + onlinePlayer.sendMessage(ChatColor.translate("&7█" + "&4████" + "&7██ &f" + location.getBlockX() + ", " + location.getBlockZ() + " [" + WordUtils.capitalize(this.findWorld().getEnvironment().name()) + "]")); + onlinePlayer.sendMessage(ChatColor.translate("&7███████")); + onlinePlayer.sendMessage(""); + + onlinePlayer.playSound(onlinePlayer.getLocation(), Sound.WITHER_SPAWN, 1, 1); + } + } + + public void activate(Location location) { + System.out.println("============================"); + System.out.println(); + System.out.println("Spawning " + this.getBossID() + " boss at " + location.getBlockX() + ", " + location.getBlockZ()); + System.out.println(); + System.out.println("============================"); + + System.out.println("[Foxtrot] Loaded Chunk at " + location.getBlockX() + ", " + location.getBlockZ()); + location.getChunk().load(true); + + IntStream.of(1,4).forEach(it -> location.getWorld().strikeLightningEffect(location)); + + final Monster monster = (Monster) location.getWorld().spawnEntity(location, this.getEntityType()); + monster.setMetadata("BOSS", new FixedMetadataValue(Foxtrot.getInstance(), true)); + monster.setMaxHealth(this.getMaxHealth()); + monster.setHealth(monster.getMaxHealth()); + monster.setCustomNameVisible(true); + monster.setCustomName(this.getBossDisplayName()); + + this.entity = monster; + + Foxtrot.getInstance().getServer().getPluginManager().registerEvents(this, Foxtrot.getInstance()); + } + + public void deactivate(Player winner) { + final Foxtrot instance = Foxtrot.getInstance(); + final BossHandler bossHandler = instance.getBossHandler(); + + bossHandler.setActiveBoss(null); + HandlerList.unregisterAll(this); + + if (winner == null) { + instance.getServer().broadcastMessage(""); + instance.getServer().broadcastMessage(ChatColor.translate("&4&lBoss")); + instance.getServer().broadcastMessage(ChatColor.translate(this.getBossDisplayName() + " &7has been forcefully killed.")); + instance.getServer().broadcastMessage(""); + return; + } + + winner.playSound(winner.getLocation(), Sound.LEVEL_UP, 1, 1); + + if (Foxtrot.getInstance().getMapHandler().isKitMap()) { + if (ThreadLocalRandom.current().nextInt(0, 100) <= 25) { + instance.getServer().dispatchCommand(instance.getServer().getConsoleSender(), "chest give Treasure " + winner.getName() + " 1"); + } else { + instance.getServer().dispatchCommand(instance.getServer().getConsoleSender(), "cr givekey " + winner.getName() + " Mario 3"); + } + } else { + if (ThreadLocalRandom.current().nextInt(0, 100) <= 25) { + instance.getServer().dispatchCommand(instance.getServer().getConsoleSender(), "chest give Omega " + winner.getName() + " 1"); + } else { + instance.getServer().dispatchCommand(instance.getServer().getConsoleSender(), "mcrate give " + winner.getName() + " Seasonal 2"); + } + } + + instance.getServer().broadcastMessage(""); + instance.getServer().broadcastMessage(ChatColor.translate("&4&lBoss")); + instance.getServer().broadcastMessage(ChatColor.translate(winner.getDisplayName() + " &7has killed the boss!")); + instance.getServer().broadcastMessage(""); + } + + public World findWorld() { + return Foxtrot.getInstance().getServer().getWorld(this.getWorldName()); + } + + @EventHandler + private void onDamage(EntityDamageByEntityEvent event) { + if (!event.getEntity().getType().equals(this.getEntityType())) { + return; + } + + if (!event.getEntity().equals(event.getEntity())) { + return; + } + + Player damager = null; + + if (event.getDamager() instanceof Player) { + damager = (Player) event.getDamager(); + } + + if (event.getDamager() instanceof Projectile) { + final Projectile projectile = (Projectile) event.getDamager(); + + if (!(projectile.getShooter() instanceof Player)) { + return; + } + + damager = (Player) projectile.getShooter(); + } + + if (damager == null) { + return; + } + + if (Foxtrot.getInstance().getPvPTimerMap().hasTimer(damager.getUniqueId())) { + damager.sendMessage(ChatColor.RED + "Use /pvp enable to toggle your PvP Timer off!"); + event.setCancelled(true); + } + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/bosses/BossHandler.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/bosses/BossHandler.java new file mode 100644 index 0000000..37217eb --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/bosses/BossHandler.java @@ -0,0 +1,60 @@ +package net.frozenorb.foxtrot.gameplay.bosses; + +import cc.fyre.proton.event.HalfHourEvent; +import cc.fyre.proton.event.HourEvent; +import cc.fyre.proton.util.ClassUtils; +import lombok.Getter; +import lombok.Setter; +import net.frozenorb.foxtrot.Foxtrot; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; + +public class BossHandler implements Listener { + private Foxtrot instance; + @Getter private List bosses = new ArrayList<>(); + @Getter @Setter private Boss activeBoss; + + public BossHandler(Foxtrot instance) { + this.instance = instance; + + for (Class clazz : ClassUtils.getClassesInPackage(Foxtrot.getInstance(),"net.frozenorb.foxtrot.gameplay.bosses.type")) { + + if (!Boss.class.isAssignableFrom(clazz)) { + continue; + } + + try { + this.bosses.add((Boss)clazz.newInstance()); + } catch (InstantiationException | IllegalAccessException ex) { + ex.printStackTrace(); + } + } + + this.instance.getServer().getPluginManager().registerEvents(this, this.instance); + } + + @EventHandler(priority = EventPriority.LOW) + private void onHour(HalfHourEvent event) { + if (event.getHour() % 5 != 0) { + return; + } + + if (event.getMinute() > 20) { + this.activateRandom(); + } + } + + public Boss findBoss(String id) { + return this.bosses.stream().filter(it -> it.getBossID().equalsIgnoreCase(id)).findFirst().orElse(null); + } + + public void activateRandom() { + this.activeBoss = bosses.get(ThreadLocalRandom.current().nextInt(bosses.size())); + this.activeBoss.activate(); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/bosses/command/BossesCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/bosses/command/BossesCommand.java new file mode 100644 index 0000000..1fd48db --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/bosses/command/BossesCommand.java @@ -0,0 +1,32 @@ +package net.frozenorb.foxtrot.gameplay.bosses.command; + +import cc.fyre.proton.command.Command; +import cc.fyre.proton.command.param.Parameter; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.bosses.Boss; +import net.frozenorb.foxtrot.gameplay.bosses.BossHandler; +import org.bukkit.entity.Player; + +public class BossesCommand { + @Command(names = {"boss spawn", "boss summon"}, permission = "op") + public static void execute(Player player, @Parameter(name = "taskName", defaultValue = "R_A_N_D_O_M")String taskName) { + final BossHandler bossHandler = Foxtrot.getInstance().getBossHandler(); + + if (taskName.equalsIgnoreCase("R_A_N_D_O_M")) { + bossHandler.activateRandom(); + return; + } + + final Boss boss = bossHandler.findBoss(taskName); + + bossHandler.setActiveBoss(boss); + boss.activate(); + } + + @Command(names = {"boss stop", "boss deactivate"}, permission = "op") + public static void execute(Player player) { + final BossHandler bossHandler = Foxtrot.getInstance().getBossHandler(); + + bossHandler.getActiveBoss().deactivate(null); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/bosses/type/Giant.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/bosses/type/Giant.java new file mode 100644 index 0000000..4a145c1 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/bosses/type/Giant.java @@ -0,0 +1,189 @@ +package net.frozenorb.foxtrot.gameplay.bosses.type; + +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.bosses.Boss; +import net.frozenorb.foxtrot.util.RandomUtil; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.Sound; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Monster; +import org.bukkit.entity.Player; +import org.bukkit.entity.Projectile; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.EntityDeathEvent; +import org.bukkit.metadata.FixedMetadataValue; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; + +import java.util.List; +import java.util.stream.Collectors; + +public class Giant extends Boss { + + @Override + public String getBossID() { + return "Giant"; + } + + @Override + public String getBossDisplayName() { + return ChatColor.translate("&2&lGiant"); + } + + @Override + public int getMaxHealth() { + return 1400; + } + + @Override + public double getDamageMultiplier() { + return 10; + } + + @Override + public EntityType getEntityType() { + return EntityType.GIANT; + } + + @Override + public String getWorldName() { + return "world"; + } + + private int seconds; + + @Override + public void activate(Location location) { + super.activate(location); + + new BukkitRunnable() { + @Override + public void run() { + if (getEntity().isDead()) { + this.cancel(); + return; + } + + if (seconds % 15 == 0) { + getEntity().getNearbyEntities(10, 10, 10).stream().filter(it -> it instanceof Player).forEach(it -> { + it.setVelocity(it.getLocation().getDirection().multiply(-2.5)); + ((Player) it).playSound(it.getLocation(), Sound.ZOMBIE_WOODBREAK, 1, 1); + }); + } + + seconds++; + + if (seconds % 25 != 0) { + return; + } + + if (getEntity().getNearbyEntities(30, 30, 30).isEmpty()) { + return; + } + + for (int i = 0; i < 5; i++) { + spawnMinion(BlockFace.UP); + } + + for (int i = 0; i < 5; i++) { + spawnMinion(BlockFace.WEST); + } + + for (int i = 0; i < 5; i++) { + spawnMinion(BlockFace.EAST); + } + + for (int i = 0; i < 5; i++) { + spawnMinion(BlockFace.SOUTH); + } + + for (int i = 0; i < 5; i++) { + spawnMinion(BlockFace.NORTH); + } + } + }.runTaskTimer(Foxtrot.getInstance(), 20, 20); + } + + public void stomp() { + if (this.getEntity().isOnGround()) { + this.getEntity().setVelocity(new Vector(0, RandomUtil.getRandDouble(1.5, 2.25), 0)); + this.getEntity().setMetadata("stomp", new FixedMetadataValue(Foxtrot.getInstance(), true)); + + new BukkitRunnable() { + @Override + public void run() { + if(getEntity().isDead() || !getEntity().isValid()) { + cancel(); + return; + } + + if(getEntity().isOnGround()) { + List nearbyPlayers = getEntity().getNearbyEntities(10, 10, 10).stream() + .filter(Player.class::isInstance) + .map(Player.class::cast) + .collect(Collectors.toList()); + for(Player player : nearbyPlayers) + player.damage(20.0D, getEntity()); +// player.setHealth(Math.max(player.getHealth() - RandomUtil.getRandInt(10, 20), 8)); + + getEntity().removeMetadata("stomp", Foxtrot.getInstance()); + cancel(); + } + } + }.runTaskTimer(Foxtrot.getInstance(), 20L, 4L); + } + } + + @EventHandler(priority = EventPriority.LOW) + private void onDeath(EntityDeathEvent event) { + if (!(event.getEntity() instanceof Monster)) { + return; + } + + if (event.getEntity().hasMetadata("BOSS")) { + this.deactivate(event.getEntity().getKiller()); + } + } + + @EventHandler(priority = EventPriority.LOW) + private void onDamage(EntityDamageByEntityEvent event) { + if (!(event.getDamager() instanceof Player)) { + return; + } + + Monster monster = null; + + if (event.getDamager() instanceof Monster) { + monster = (Monster) event.getDamager(); + } + + if (event.getDamager() instanceof Projectile) { + final Projectile projectile = (Projectile) event.getDamager(); + + if (projectile.getShooter() instanceof Monster) { + monster = (Monster) projectile.getShooter(); + } + } + + if (monster == null) { + return; + } + + if (monster.hasMetadata("BOSS")) { + event.setDamage(event.getDamage()*this.getDamageMultiplier()); + } + } + + public void spawnMinion(BlockFace blockFace) { + final Location entityLocation = getEntity().getLocation().clone(); + final Block block = entityLocation.getBlock().getRelative(blockFace, 2); + + this.getEntity().getWorld().spawnEntity(block.getLocation().clone(), EntityType.ZOMBIE); + this.getEntity().getWorld().playSound(block.getLocation(), Sound.ZOMBIE_INFECT, 1, 1); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/bosses/type/Magnum.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/bosses/type/Magnum.java new file mode 100644 index 0000000..b28e54b --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/bosses/type/Magnum.java @@ -0,0 +1,149 @@ +package net.frozenorb.foxtrot.gameplay.bosses.type; + +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.bosses.Boss; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.Sound; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.entity.*; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.EntityDeathEvent; +import org.bukkit.event.entity.ProjectileLaunchEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.scheduler.BukkitRunnable; + +public class Magnum extends Boss { + + @Override + public String getBossID() { + return "Magnum"; + } + + @Override + public String getBossDisplayName() { + return ChatColor.translate("&5&lMagnum"); + } + + @Override + public int getMaxHealth() { + return 1500; + } + + @Override + public double getDamageMultiplier() { + return 12.5; + } + + @Override + public EntityType getEntityType() { + return EntityType.WITHER; + } + + @Override + public String getWorldName() { + return "world"; + } + + private int seconds; + + @Override + public void activate(Location location) { + super.activate(location); + + new BukkitRunnable() { + @Override + public void run() { + if (getEntity().isDead()) { + this.cancel(); + return; + } + + if (seconds % 15 == 0) { + getEntity().getNearbyEntities(10, 10, 10).stream().filter(it -> it instanceof Player).forEach(it -> { + it.setVelocity(it.getLocation().getDirection().multiply(-2.5)); + ((Player) it).playSound(it.getLocation(), Sound.WITHER_SHOOT, 1, 1); + }); + } + + seconds++; + + if (seconds % 25 != 0) { + return; + } + + if (getEntity().getNearbyEntities(30, 30, 30).isEmpty()) { + return; + } + + for (int i = 0; i < 5; i++) { + spawnMinion(BlockFace.WEST); + } + + for (int i = 0; i < 5; i++) { + spawnMinion(BlockFace.EAST); + } + + for (int i = 0; i < 5; i++) { + spawnMinion(BlockFace.SOUTH); + } + + for (int i = 0; i < 5; i++) { + spawnMinion(BlockFace.NORTH); + } + } + }.runTaskTimer(Foxtrot.getInstance(), 20, 20); + } + + @EventHandler(priority = EventPriority.LOW) + private void onDeath(EntityDeathEvent event) { + if (!(event.getEntity() instanceof Monster)) { + return; + } + + if (event.getEntity().hasMetadata("BOSS")) { + this.deactivate(event.getEntity().getKiller()); + } + } + + @EventHandler(priority = EventPriority.LOW) + private void onDamage(EntityDamageByEntityEvent event) { + if (!(event.getDamager() instanceof Player)) { + return; + } + + Monster monster = null; + + if (event.getDamager() instanceof Monster) { + monster = (Monster) event.getDamager(); + } + + if (event.getDamager() instanceof Projectile) { + final Projectile projectile = (Projectile) event.getDamager(); + + if (projectile.getShooter() instanceof Monster) { + monster = (Monster) projectile.getShooter(); + } + } + + if (monster == null) { + return; + } + + if (monster.hasMetadata("BOSS")) { + event.setDamage(event.getDamage()*this.getDamageMultiplier()); + } + } + + public void spawnMinion(BlockFace blockFace) { + final Location entityLocation = getEntity().getLocation().clone(); + final Block block = entityLocation.getBlock().getRelative(blockFace, 4); + + final Skeleton skeleton = (Skeleton) getEntity().getWorld().spawnEntity(block.getWorld().getHighestBlockAt(block.getLocation()).getLocation().clone(), EntityType.SKELETON); + skeleton.setSkeletonType(Skeleton.SkeletonType.WITHER); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/bosses/type/Surtur.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/bosses/type/Surtur.java new file mode 100644 index 0000000..84d2965 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/bosses/type/Surtur.java @@ -0,0 +1,157 @@ +package net.frozenorb.foxtrot.gameplay.bosses.type; + +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.bosses.Boss; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Monster; +import org.bukkit.entity.Player; +import org.bukkit.entity.Projectile; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.Action; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.EntityDeathEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.scheduler.BukkitRunnable; + +public class Surtur extends Boss { + + @Override + public String getBossID() { + return "Blaze"; + } + + @Override + public String getBossDisplayName() { + return ChatColor.translate("&6&lSurtur"); + } + + @Override + public int getMaxHealth() { + return 1500; + } + + @Override + public double getDamageMultiplier() { + return 12.5; + } + + @Override + public EntityType getEntityType() { + return EntityType.BLAZE; + } + + @Override + public String getWorldName() { + return "world"; + } + + private int seconds; + + @Override + public void activate(Location location) { + super.activate(location); + + new BukkitRunnable() { + @Override + public void run() { + if (getEntity().isDead()) { + this.cancel(); + return; + } + + if (seconds % 15 == 0) { + getEntity().getNearbyEntities(10, 10, 10).stream().filter(it -> it instanceof Player).forEach(it -> { + it.setVelocity(it.getLocation().getDirection().multiply(-2.5)); + ((Player) it).playSound(it.getLocation(), Sound.WITHER_SHOOT, 1, 1); + }); + } + + seconds++; + + if (seconds % 25 != 0) { + return; + } + + if (getEntity().getNearbyEntities(30, 30, 30).isEmpty()) { + return; + } + + for (int i = 0; i < 5; i++) { + spawnMinion(BlockFace.UP); + } + + for (int i = 0; i < 5; i++) { + spawnMinion(BlockFace.WEST); + } + + for (int i = 0; i < 5; i++) { + spawnMinion(BlockFace.EAST); + } + + for (int i = 0; i < 5; i++) { + spawnMinion(BlockFace.SOUTH); + } + + for (int i = 0; i < 5; i++) { + spawnMinion(BlockFace.NORTH); + } + } + }.runTaskTimer(Foxtrot.getInstance(), 20, 20); + } + + @EventHandler(priority = EventPriority.LOW) + private void onDeath(EntityDeathEvent event) { + if (!(event.getEntity() instanceof Monster)) { + return; + } + + if (event.getEntity().hasMetadata("BOSS")) { + this.deactivate(event.getEntity().getKiller()); + } + } + + @EventHandler(priority = EventPriority.LOW) + private void onDamage(EntityDamageByEntityEvent event) { + if (!(event.getDamager() instanceof Player)) { + return; + } + + Monster monster = null; + + if (event.getDamager() instanceof Monster) { + monster = (Monster) event.getDamager(); + } + + if (event.getDamager() instanceof Projectile) { + final Projectile projectile = (Projectile) event.getDamager(); + + if (projectile.getShooter() instanceof Monster) { + monster = (Monster) projectile.getShooter(); + } + } + + if (monster == null) { + return; + } + + if (monster.hasMetadata("BOSS")) { + event.setDamage(event.getDamage()*this.getDamageMultiplier()); + } + } + + public void spawnMinion(BlockFace blockFace) { + final Location entityLocation = getEntity().getLocation().clone(); + final Block block = entityLocation.getBlock().getRelative(blockFace, 2); + + getEntity().getWorld().spawnEntity(block.getLocation().clone(), EntityType.BLAZE); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/CaveSaysHandler.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/CaveSaysHandler.java new file mode 100644 index 0000000..5aa978d --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/CaveSaysHandler.java @@ -0,0 +1,58 @@ +package net.frozenorb.foxtrot.gameplay.cavesays; + +import cc.fyre.proton.event.HourEvent; +import cc.fyre.proton.util.ClassUtils; +import lombok.Getter; +import lombok.Setter; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.ability.Ability; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; + +public class CaveSaysHandler implements Listener { + private Foxtrot instance; + + @Getter private List tasks = new ArrayList<>(); + + @Getter @Setter private Task activeTask; + + public CaveSaysHandler(Foxtrot instance) { + this.instance = instance; + + for (Class clazz : ClassUtils.getClassesInPackage(Foxtrot.getInstance(),"net.frozenorb.foxtrot.gameplay.cavesays.type")) { + + if (!Task.class.isAssignableFrom(clazz)) { + continue; + } + + try { + this.tasks.add((Task)clazz.newInstance()); + } catch (InstantiationException | IllegalAccessException ex) { + ex.printStackTrace(); + } + } + + this.instance.getServer().getPluginManager().registerEvents(this, this.instance); + } + + public Task findTask(String id) { + return this.tasks.stream().filter(it -> it.getTaskID().equalsIgnoreCase(id)).findFirst().orElse(null); + } + + @EventHandler(priority = EventPriority.LOW) + private void onHour(HourEvent event) { + if (event.getHour() % 2 == 0) { + this.instance.getServer().getScheduler().runTaskLater(this.instance, this::activateRandom, 20*40); + } + } + + public void activateRandom() { + this.activeTask = tasks.get(ThreadLocalRandom.current().nextInt(tasks.size())); + this.activeTask.activate(); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/Task.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/Task.java new file mode 100644 index 0000000..b426c73 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/Task.java @@ -0,0 +1,99 @@ +package net.frozenorb.foxtrot.gameplay.cavesays; + +import lombok.Getter; +import lombok.Setter; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.extra.stats.StatsEntry; +import org.bukkit.ChatColor; +import org.bukkit.GameMode; +import org.bukkit.Sound; +import org.bukkit.entity.Player; +import org.bukkit.event.HandlerList; +import org.bukkit.event.Listener; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.ThreadLocalRandom; + +public abstract class Task implements Listener { + + @Getter private final Map points = new HashMap<>(); + + public abstract String getTaskID(); + public abstract String getTaskDisplayName(); + public abstract int getPointsToWin(); + + @Getter @Setter private int airdrops; + + public void addProgress(Player player) { + if (player.getGameMode() == GameMode.CREATIVE) { + return; + } + + this.points.put(player.getUniqueId(), points.getOrDefault(player.getUniqueId(), 0)+1); + + if (this.points.get(player.getUniqueId()) >= this.getPointsToWin()) { + deactivate(player); + return; + } + + player.playSound(player.getLocation(), Sound.ORB_PICKUP, 1, 1); + player.sendMessage(ChatColor.translate("&6You have obtained a point towards this task! (&f" + this.points.get(player.getUniqueId()) + "/" + getPointsToWin() + "&6)")); + } + + public void activate() { + final Foxtrot instance = Foxtrot.getInstance(); + + this.airdrops = ThreadLocalRandom.current().nextInt(0, 100) <= 50 ? 2 : 3; + + instance.getServer().getPluginManager().registerEvents(this, instance); + + for (Player onlinePlayer : Foxtrot.getInstance().getServer().getOnlinePlayers()) { + onlinePlayer.sendMessage(""); + onlinePlayer.sendMessage(ChatColor.translate("&7███████")); + onlinePlayer.sendMessage(ChatColor.translate("&7█" + "&4█████" + "&7█ &4&lCave Says")); + onlinePlayer.sendMessage(ChatColor.translate("&7█" + "&4█" + "&7█████ &7First person to")); + onlinePlayer.sendMessage(ChatColor.translate("&7█" + "&4█" + "&7█████ &f" + this.getTaskDisplayName())); + onlinePlayer.sendMessage(ChatColor.translate("&7█" + "&4█" + "&7█████ &cwill receive")); + onlinePlayer.sendMessage(ChatColor.translate("&7█" + "&4█████" + "&7█ &b&l" + airdrops + " Airdrops")); + onlinePlayer.sendMessage(ChatColor.translate("&7███████")); + onlinePlayer.sendMessage(""); + } + } + + public void deactivate(Player winner) { + final Foxtrot instance = Foxtrot.getInstance(); + final CaveSaysHandler caveSaysHandler = instance.getCaveSaysHandler(); + + this.points.clear(); + caveSaysHandler.setActiveTask(null); + HandlerList.unregisterAll(this); + + if (winner == null) { + instance.getServer().broadcastMessage(""); + instance.getServer().broadcastMessage(ChatColor.translate("&4&lCave Says")); + instance.getServer().broadcastMessage(ChatColor.translate(getTaskDisplayName() + " &7has been forcefully cancelled.")); + instance.getServer().broadcastMessage(""); + return; + } + + winner.playSound(winner.getLocation(), Sound.LEVEL_UP, 1, 1); + + instance.getServer().dispatchCommand(instance.getServer().getConsoleSender(), "airdrops give " + winner.getName() + " " + this.airdrops); + + instance.getServer().broadcastMessage(""); + instance.getServer().broadcastMessage(ChatColor.translate("&4&lCave Says")); + instance.getServer().broadcastMessage(""); + instance.getServer().broadcastMessage(ChatColor.translate(winner.getDisplayName() + " &7has completed the task first and received &b&l" + this.airdrops + "x Airdrops&7.")); + instance.getServer().broadcastMessage(""); + + final StatsEntry statsEntry = Foxtrot.getInstance().getMapHandler().getStatsHandler().getStats(winner.getUniqueId()); + + if (statsEntry == null) { + return; + } + + statsEntry.addCaveSaysCompleted(); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/command/CaveSaysCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/command/CaveSaysCommand.java new file mode 100644 index 0000000..efa2fdc --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/command/CaveSaysCommand.java @@ -0,0 +1,32 @@ +package net.frozenorb.foxtrot.gameplay.cavesays.command; + +import cc.fyre.proton.command.Command; +import cc.fyre.proton.command.param.Parameter; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.cavesays.CaveSaysHandler; +import net.frozenorb.foxtrot.gameplay.cavesays.Task; +import org.bukkit.entity.Player; + +public class CaveSaysCommand { + @Command(names = {"cavesays start", "cavesays activate"}, permission = "op") + public static void execute(Player player, @Parameter(name = "taskName", defaultValue = "R_A_N_D_O_M")String taskName) { + final CaveSaysHandler caveSaysHandler = Foxtrot.getInstance().getCaveSaysHandler(); + + if (taskName.equalsIgnoreCase("R_A_N_D_O_M")) { + caveSaysHandler.activateRandom(); + return; + } + + final Task task = caveSaysHandler.findTask(taskName); + + caveSaysHandler.setActiveTask(task); + task.activate(); + } + + @Command(names = {"cavesays stop", "cavesays deactivate"}, permission = "op") + public static void execute(Player player) { + final CaveSaysHandler caveSaysHandler = Foxtrot.getInstance().getCaveSaysHandler(); + + caveSaysHandler.getActiveTask().deactivate(null); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/Chat.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/Chat.java new file mode 100644 index 0000000..85af7fe --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/Chat.java @@ -0,0 +1,47 @@ +package net.frozenorb.foxtrot.gameplay.cavesays.type; + +import cc.fyre.piston.Piston; +import net.frozenorb.foxtrot.gameplay.cavesays.Task; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.enchantment.EnchantItemEvent; +import org.bukkit.event.player.AsyncPlayerChatEvent; + +public class Chat extends Task { + private boolean wasMuted; + private int slowChat; + + @Override + public String getTaskDisplayName() { + return "Type anything in Chat"; + } + + @Override + public String getTaskID() { + return "Chat"; + } + + @Override + public int getPointsToWin() { + return 1; + } + + @Override + public void activate() { + super.activate(); + + this.wasMuted = Piston.getInstance().getChatHandler().isMuted(); + this.slowChat = Piston.getInstance().getChatHandler().getSlowTime(); + + Piston.getInstance().getChatHandler().setMuted(false); + Piston.getInstance().getChatHandler().setSlowTime(0); + } + + @EventHandler(priority = EventPriority.LOW) + private void onEnchant(AsyncPlayerChatEvent event) { + Piston.getInstance().getChatHandler().setMuted(this.wasMuted); + Piston.getInstance().getChatHandler().setSlowTime(this.slowChat); + + this.addProgress(event.getPlayer()); + } +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/EnchantItem.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/EnchantItem.java new file mode 100644 index 0000000..9bba674 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/EnchantItem.java @@ -0,0 +1,34 @@ +package net.frozenorb.foxtrot.gameplay.cavesays.type; + +import net.frozenorb.foxtrot.gameplay.cavesays.Task; +import org.bukkit.Material; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.enchantment.EnchantItemEvent; + +public class EnchantItem extends Task { + @Override + public String getTaskDisplayName() { + return "Enchant an Item"; + } + + @Override + public String getTaskID() { + return "EnchantItem"; + } + + @Override + public int getPointsToWin() { + return 1; + } + + @EventHandler(priority = EventPriority.LOW) + private void onEnchant(EnchantItemEvent event) { + if (event.isCancelled()) { + return; + } + + this.addProgress(event.getEnchanter()); + } +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/GoEnd.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/GoEnd.java new file mode 100644 index 0000000..d2399ce --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/GoEnd.java @@ -0,0 +1,34 @@ +package net.frozenorb.foxtrot.gameplay.cavesays.type; + +import net.frozenorb.foxtrot.gameplay.cavesays.Task; +import org.bukkit.World; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerChangedWorldEvent; +import org.bukkit.event.player.PlayerTeleportEvent; + +public class GoEnd extends Task { + @Override + public String getTaskDisplayName() { + return "Go through an End Portal"; + } + + @Override + public String getTaskID() { + return "GoEnd"; + } + + @Override + public int getPointsToWin() { + return 1; + } + + @EventHandler + private void onWorldChange(PlayerChangedWorldEvent event) { + final Player player = event.getPlayer(); + + if (player.getWorld().getEnvironment() == World.Environment.THE_END) { + this.addProgress(player); + } + } +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/GoKoth.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/GoKoth.java new file mode 100644 index 0000000..fac2176 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/GoKoth.java @@ -0,0 +1,60 @@ +package net.frozenorb.foxtrot.gameplay.cavesays.type; + +import lombok.Getter; +import net.frozenorb.foxtrot.gameplay.cavesays.Task; +import net.frozenorb.foxtrot.team.Team; +import net.frozenorb.foxtrot.team.dtr.DTRBitmask; +import net.frozenorb.foxtrot.team.event.TeamEnterClaimEvent; +import org.bukkit.ChatColor; +import org.bukkit.World; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerTeleportEvent; + +import java.util.*; + +public class GoKoth extends Task { + @Override + public String getTaskDisplayName() { + return "Visit all Overworld KOTHs"; + } + + @Override + public String getTaskID() { + return "GoKOTH"; + } + + @Override + public int getPointsToWin() { + return 3; + } + + @Getter private Map> enteredClaims = new HashMap<>(); + + @EventHandler + private void onClaimEnter(TeamEnterClaimEvent event) { + final Player player = event.getPlayer(); + final Team toTeam = event.getToTeam(); + + if (!DTRBitmask.KOTH.appliesAt(event.getTo())) { + return; + } + + if (player.getWorld().getEnvironment() != World.Environment.NORMAL) { + player.sendMessage(ChatColor.RED + "You can only visit a Overworld KOTH for this task!"); + return; + } + + final List teamsVisited = this.enteredClaims.getOrDefault(player.getUniqueId(), Collections.emptyList()); + + if (teamsVisited.contains(toTeam)) { + player.sendMessage(ChatColor.RED + "You've already visited this KOTH!"); + return; + } + teamsVisited.add(toTeam); + + this.enteredClaims.put(player.getUniqueId(), teamsVisited); + + this.addProgress(player); + } +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/GoNether.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/GoNether.java new file mode 100644 index 0000000..7f77f89 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/GoNether.java @@ -0,0 +1,36 @@ +package net.frozenorb.foxtrot.gameplay.cavesays.type; + +import net.frozenorb.foxtrot.gameplay.cavesays.Task; +import org.bukkit.World; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.PlayerChangedWorldEvent; +import org.bukkit.event.player.PlayerTeleportEvent; + +public class GoNether extends Task { + @Override + public String getTaskDisplayName() { + return "Go through a Nether Portal"; + } + + @Override + public String getTaskID() { + return "GoNether"; + } + + @Override + public int getPointsToWin() { + return 1; + } + + @EventHandler + private void onWorldChange(PlayerChangedWorldEvent event) { + final Player player = event.getPlayer(); + + if (player.getWorld().getEnvironment() == World.Environment.NETHER) { + this.addProgress(player); + } + } +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/KillCows.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/KillCows.java new file mode 100644 index 0000000..8e88a05 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/KillCows.java @@ -0,0 +1,41 @@ +package net.frozenorb.foxtrot.gameplay.cavesays.type; + +import net.frozenorb.foxtrot.gameplay.cavesays.Task; +import org.bukkit.ChatColor; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.EntityDeathEvent; + +public class KillCows extends Task { + @Override + public String getTaskDisplayName() { + return "Kill 25x Cows"; + } + + @Override + public String getTaskID() { + return "KillCows"; + } + + @Override + public int getPointsToWin() { + return 25; + } + + @EventHandler(priority = EventPriority.LOW) + private void onDeath(EntityDeathEvent event) { + if (event.getEntityType() != EntityType.COW) { + return; + } + + final Player killer = event.getEntity().getKiller(); + + if (killer == null) { + return; + } + + this.addProgress(killer); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/KillCreepers.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/KillCreepers.java new file mode 100644 index 0000000..acabcce --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/KillCreepers.java @@ -0,0 +1,41 @@ +package net.frozenorb.foxtrot.gameplay.cavesays.type; + +import net.frozenorb.foxtrot.gameplay.cavesays.Task; +import org.bukkit.ChatColor; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.EntityDeathEvent; + +public class KillCreepers extends Task { + @Override + public String getTaskDisplayName() { + return "Kill 25x Creepers"; + } + + @Override + public String getTaskID() { + return "KillCreepers"; + } + + @Override + public int getPointsToWin() { + return 25; + } + + @EventHandler(priority = EventPriority.LOW) + private void onDeath(EntityDeathEvent event) { + if (event.getEntityType() != EntityType.CREEPER) { + return; + } + + final Player killer = event.getEntity().getKiller(); + + if (killer == null) { + return; + } + + this.addProgress(killer); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/KillEndermen.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/KillEndermen.java new file mode 100644 index 0000000..9eb27f9 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/KillEndermen.java @@ -0,0 +1,41 @@ +package net.frozenorb.foxtrot.gameplay.cavesays.type; + +import net.frozenorb.foxtrot.gameplay.cavesays.Task; +import org.bukkit.ChatColor; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.EntityDeathEvent; + +public class KillEndermen extends Task { + @Override + public String getTaskDisplayName() { + return "Kill 25x Endermen"; + } + + @Override + public String getTaskID() { + return "KillEndermen"; + } + + @Override + public int getPointsToWin() { + return 25; + } + + @EventHandler(priority = EventPriority.LOW) + private void onDeath(EntityDeathEvent event) { + if (event.getEntityType() != EntityType.ENDERMAN) { + return; + } + + final Player killer = event.getEntity().getKiller(); + + if (killer == null) { + return; + } + + this.addProgress(killer); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/KillMagmaCube.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/KillMagmaCube.java new file mode 100644 index 0000000..2c2cf41 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/KillMagmaCube.java @@ -0,0 +1,40 @@ +package net.frozenorb.foxtrot.gameplay.cavesays.type; + +import net.frozenorb.foxtrot.gameplay.cavesays.Task; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.EntityDeathEvent; + +public class KillMagmaCube extends Task { + @Override + public String getTaskDisplayName() { + return "Kill 25x Magma Cubes"; + } + + @Override + public String getTaskID() { + return "KillMagmaCube"; + } + + @Override + public int getPointsToWin() { + return 25; + } + + @EventHandler(priority = EventPriority.LOW) + private void onDeath(EntityDeathEvent event) { + if (event.getEntityType() != EntityType.MAGMA_CUBE) { + return; + } + + final Player killer = event.getEntity().getKiller(); + + if (killer == null) { + return; + } + + this.addProgress(killer); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/KillPlayer.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/KillPlayer.java new file mode 100644 index 0000000..ddf6426 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/KillPlayer.java @@ -0,0 +1,38 @@ +package net.frozenorb.foxtrot.gameplay.cavesays.type; + +import cc.fyre.piston.Piston; +import net.frozenorb.foxtrot.gameplay.cavesays.Task; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.AsyncPlayerChatEvent; + +public class KillPlayer extends Task { + @Override + public String getTaskDisplayName() { + return "Kill a Player"; + } + + @Override + public String getTaskID() { + return "KillPlayer"; + } + + @Override + public int getPointsToWin() { + return 1; + } + + @EventHandler(priority = EventPriority.LOW) + private void onDeath(PlayerDeathEvent event) { + final Player player = event.getEntity(); + final Player killer = player.getKiller(); + + if (killer == null) { + return; + } + + this.addProgress(killer); + } +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/KillSkeletons.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/KillSkeletons.java new file mode 100644 index 0000000..124a41a --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/KillSkeletons.java @@ -0,0 +1,41 @@ +package net.frozenorb.foxtrot.gameplay.cavesays.type; + +import net.frozenorb.foxtrot.gameplay.cavesays.Task; +import org.bukkit.ChatColor; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.EntityDeathEvent; + +public class KillSkeletons extends Task { + @Override + public String getTaskDisplayName() { + return "Kill 25x Skeletons"; + } + + @Override + public String getTaskID() { + return "KillSkeletons"; + } + + @Override + public int getPointsToWin() { + return 25; + } + + @EventHandler(priority = EventPriority.LOW) + private void onDeath(EntityDeathEvent event) { + if (event.getEntityType() != EntityType.SKELETON) { + return; + } + + final Player killer = event.getEntity().getKiller(); + + if (killer == null) { + return; + } + + this.addProgress(killer); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/KillSpiders.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/KillSpiders.java new file mode 100644 index 0000000..2816469 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/KillSpiders.java @@ -0,0 +1,41 @@ +package net.frozenorb.foxtrot.gameplay.cavesays.type; + +import net.frozenorb.foxtrot.gameplay.cavesays.Task; +import org.bukkit.ChatColor; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.EntityDeathEvent; + +public class KillSpiders extends Task { + @Override + public String getTaskDisplayName() { + return "Kill 25x Spiders"; + } + + @Override + public String getTaskID() { + return "KillSpiders"; + } + + @Override + public int getPointsToWin() { + return 25; + } + + @EventHandler(priority = EventPriority.LOW) + private void onDeath(EntityDeathEvent event) { + if (event.getEntityType() != EntityType.SPIDER) { + return; + } + + final Player killer = event.getEntity().getKiller(); + + if (killer == null) { + return; + } + + this.addProgress(killer); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/KillZombies.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/KillZombies.java new file mode 100644 index 0000000..e52712f --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/KillZombies.java @@ -0,0 +1,41 @@ +package net.frozenorb.foxtrot.gameplay.cavesays.type; + +import net.frozenorb.foxtrot.gameplay.cavesays.Task; +import org.bukkit.ChatColor; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.EntityDeathEvent; + +public class KillZombies extends Task { + @Override + public String getTaskDisplayName() { + return "Kill 25x Zombies"; + } + + @Override + public String getTaskID() { + return "KillZombies"; + } + + @Override + public int getPointsToWin() { + return 25; + } + + @EventHandler(priority = EventPriority.LOW) + private void onDeath(EntityDeathEvent event) { + if (event.getEntityType() != EntityType.ENDERMAN) { + return; + } + + final Player killer = event.getEntity().getKiller(); + + if (killer == null) { + return; + } + + this.addProgress(killer); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/MakeAFactionRaidable.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/MakeAFactionRaidable.java new file mode 100644 index 0000000..a366bbe --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/MakeAFactionRaidable.java @@ -0,0 +1,33 @@ +package net.frozenorb.foxtrot.gameplay.cavesays.type; + +import net.frozenorb.foxtrot.gameplay.cavesays.Task; +import net.frozenorb.foxtrot.team.event.TeamRaidableEvent; +import org.bukkit.ChatColor; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; + +public class MakeAFactionRaidable extends Task { + @Override + public String getTaskDisplayName() { + return "Make a Faction Raidable"; + } + + @Override + public String getTaskID() { + return "Raidable"; + } + + @Override + public int getPointsToWin() { + return 1; + } + + @EventHandler(priority = EventPriority.LOW) + private void onRaidable(TeamRaidableEvent event) { + if (event.getKiller() != null) { + return; + } + + this.addProgress(event.getKiller()); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/MineCoal.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/MineCoal.java new file mode 100644 index 0000000..c6b7e20 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/MineCoal.java @@ -0,0 +1,33 @@ +package net.frozenorb.foxtrot.gameplay.cavesays.type; + +import net.frozenorb.foxtrot.gameplay.cavesays.Task; +import org.bukkit.Material; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.BlockBreakEvent; + +public class MineCoal extends Task { + @Override + public String getTaskDisplayName() { + return "Mine 16x Coal Ore"; + } + + @Override + public String getTaskID() { + return "MineCoal"; + } + + @Override + public int getPointsToWin() { + return 16; + } + + @EventHandler(priority = EventPriority.HIGH) + private void onBreak(BlockBreakEvent event) { + if (event.isCancelled() || event.getBlock().getType() != Material.COAL_ORE) { + return; + } + + this.addProgress(event.getPlayer()); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/MineDiamonds.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/MineDiamonds.java new file mode 100644 index 0000000..0f1a2ba --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/MineDiamonds.java @@ -0,0 +1,34 @@ +package net.frozenorb.foxtrot.gameplay.cavesays.type; + +import net.frozenorb.foxtrot.gameplay.cavesays.Task; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.BlockBreakEvent; + +public class MineDiamonds extends Task { + @Override + public String getTaskDisplayName() { + return "Mine 16x Diamond Ore"; + } + + @Override + public String getTaskID() { + return "MineDiamonds"; + } + + @Override + public int getPointsToWin() { + return 16; + } + + @EventHandler(priority = EventPriority.HIGH) + private void onBreak(BlockBreakEvent event) { + if (event.isCancelled() || event.getBlock().getType() != Material.DIAMOND_ORE) { + return; + } + + this.addProgress(event.getPlayer()); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/MineGlowstone.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/MineGlowstone.java new file mode 100644 index 0000000..b6cfeff --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/MineGlowstone.java @@ -0,0 +1,42 @@ +package net.frozenorb.foxtrot.gameplay.cavesays.type; + +import net.frozenorb.foxtrot.gameplay.cavesays.Task; +import net.frozenorb.foxtrot.team.claims.LandBoard; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.BlockBreakEvent; + +public class MineGlowstone extends Task { + @Override + public String getTaskDisplayName() { + return "Mine 16x Glowstone at Glowstone Mountain"; + } + + @Override + public String getTaskID() { + return "Glowstone"; + } + + @Override + public int getPointsToWin() { + return 16; + } + + @EventHandler(priority = EventPriority.HIGHEST) + private void onBreak(BlockBreakEvent event) { + if (event.isCancelled() || event.getBlock().getType() != Material.GLOWSTONE) { + return; + } + + final Player player = event.getPlayer(); + + if (!LandBoard.getInstance().getTeam(player.getLocation()).getName().equalsIgnoreCase("Glowstone")) { + return; + } + + this.addProgress(player); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/MineIron.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/MineIron.java new file mode 100644 index 0000000..2e78b84 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/MineIron.java @@ -0,0 +1,34 @@ +package net.frozenorb.foxtrot.gameplay.cavesays.type; + +import net.frozenorb.foxtrot.gameplay.cavesays.Task; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.BlockBreakEvent; + +public class MineIron extends Task { + @Override + public String getTaskDisplayName() { + return "Mine 16x Iron Ore"; + } + + @Override + public String getTaskID() { + return "MineIron"; + } + + @Override + public int getPointsToWin() { + return 16; + } + + @EventHandler(priority = EventPriority.HIGH) + private void onBreak(BlockBreakEvent event) { + if (event.isCancelled() || event.getBlock().getType() != Material.IRON_ORE) { + return; + } + + this.addProgress(event.getPlayer()); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/MineLapis.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/MineLapis.java new file mode 100644 index 0000000..7afe879 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/MineLapis.java @@ -0,0 +1,33 @@ +package net.frozenorb.foxtrot.gameplay.cavesays.type; + +import net.frozenorb.foxtrot.gameplay.cavesays.Task; +import org.bukkit.Material; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.BlockBreakEvent; + +public class MineLapis extends Task { + @Override + public String getTaskDisplayName() { + return "Mine 16x Lapis Ore"; + } + + @Override + public String getTaskID() { + return "MineLapis"; + } + + @Override + public int getPointsToWin() { + return 16; + } + + @EventHandler(priority = EventPriority.HIGH) + private void onBreak(BlockBreakEvent event) { + if (event.isCancelled() || event.getBlock().getType() != Material.LAPIS_ORE) { + return; + } + + this.addProgress(event.getPlayer()); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/MineQuartz.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/MineQuartz.java new file mode 100644 index 0000000..c558b62 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/MineQuartz.java @@ -0,0 +1,33 @@ +package net.frozenorb.foxtrot.gameplay.cavesays.type; + +import net.frozenorb.foxtrot.gameplay.cavesays.Task; +import org.bukkit.Material; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.BlockBreakEvent; + +public class MineQuartz extends Task { + @Override + public String getTaskDisplayName() { + return "Mine 8x Quartz Ore"; + } + + @Override + public String getTaskID() { + return "MineQuartz"; + } + + @Override + public int getPointsToWin() { + return 8; + } + + @EventHandler(priority = EventPriority.HIGH) + private void onBreak(BlockBreakEvent event) { + if (event.isCancelled() || event.getBlock().getType() != Material.QUARTZ_ORE) { + return; + } + + this.addProgress(event.getPlayer()); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/MineRedstone.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/MineRedstone.java new file mode 100644 index 0000000..1ecab23 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/MineRedstone.java @@ -0,0 +1,33 @@ +package net.frozenorb.foxtrot.gameplay.cavesays.type; + +import net.frozenorb.foxtrot.gameplay.cavesays.Task; +import org.bukkit.Material; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.BlockBreakEvent; + +public class MineRedstone extends Task { + @Override + public String getTaskDisplayName() { + return "Mine 16x Redstone Ore"; + } + + @Override + public String getTaskID() { + return "MineRedstone"; + } + + @Override + public int getPointsToWin() { + return 16; + } + + @EventHandler(priority = EventPriority.HIGH) + private void onBreak(BlockBreakEvent event) { + if (event.isCancelled() || event.getBlock().getType() != Material.GLOWING_REDSTONE_ORE && event.getBlock().getType() != Material.REDSTONE_ORE) { + return; + } + + this.addProgress(event.getPlayer()); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/SpawnACow.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/SpawnACow.java new file mode 100644 index 0000000..7170031 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/SpawnACow.java @@ -0,0 +1,45 @@ +package net.frozenorb.foxtrot.gameplay.cavesays.type; + +import net.frozenorb.foxtrot.gameplay.cavesays.Task; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.Action; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.ItemStack; + +public class SpawnACow extends Task { + @Override + public String getTaskDisplayName() { + return "Spawn a Cow"; + } + + @Override + public String getTaskID() { + return "Blaze"; + } + + @Override + public int getPointsToWin() { + return 1; + } + + @EventHandler(priority = EventPriority.LOW) + private void onSpawn(PlayerInteractEvent event) { + if (event.getAction() != Action.RIGHT_CLICK_BLOCK) { + return; + } + + final Player player = event.getPlayer(); + + final ItemStack itemStack = event.getItem(); + + if (itemStack == null || itemStack.getType() != Material.MONSTER_EGG) { + return; + } + + this.addProgress(player); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/TakeFallDamage.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/TakeFallDamage.java new file mode 100644 index 0000000..f0a1b61 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/TakeFallDamage.java @@ -0,0 +1,36 @@ +package net.frozenorb.foxtrot.gameplay.cavesays.type; + +import net.frozenorb.foxtrot.gameplay.cavesays.Task; +import net.frozenorb.foxtrot.team.event.TeamRaidableEvent; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.EntityDamageEvent; + +public class TakeFallDamage extends Task { + @Override + public String getTaskDisplayName() { + return "Take Fall Damage"; + } + + @Override + public String getTaskID() { + return "FallDamage"; + } + + @Override + public int getPointsToWin() { + return 1; + } + + @EventHandler(priority = EventPriority.LOW) + private void onDamage(EntityDamageEvent event) { + final Player player = (Player) event.getEntity(); + + if (event.getCause() != EntityDamageEvent.DamageCause.FALL) { + return; + } + + this.addProgress(player); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/Vote.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/Vote.java new file mode 100644 index 0000000..8f2026f --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/cavesays/type/Vote.java @@ -0,0 +1,36 @@ + +package net.frozenorb.foxtrot.gameplay.cavesays.type; + +import com.vexsoftware.votifier.model.VotifierEvent; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.cavesays.Task; +import org.bukkit.World; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerChangedWorldEvent; + +public class Vote extends Task { + @Override + public String getTaskDisplayName() { + return "Vote for the Server (/vote)"; + } + + @Override + public String getTaskID() { + return "Vote"; + } + + @Override + public int getPointsToWin() { + return 1; + } + + @EventHandler + private void onWorldChange(VotifierEvent event) { + final Player player = Foxtrot.getInstance().getServer().getPlayer(event.getVote().getUsername()); + + if (player != null) { + addProgress(player); + } + } +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/clickitem/ClickItem.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/clickitem/ClickItem.java new file mode 100644 index 0000000..9d7ae94 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/clickitem/ClickItem.java @@ -0,0 +1,67 @@ +package net.frozenorb.foxtrot.gameplay.clickitem; + +import lombok.Getter; +import lombok.Setter; +import net.frozenorb.foxtrot.Foxtrot; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.ItemStack; + +import java.util.List; + +public abstract class ClickItem implements Listener { + @Getter @Setter private Entity entity; + + public abstract String getId(); + public abstract String getDisplayName(); + public abstract List getLore(); + public abstract Material getMaterial(); + + public ClickItem() { + Foxtrot.getInstance().getServer().getPluginManager().registerEvents(this, Foxtrot.getInstance()); + } + + public boolean redeem(Player player, PlayerInteractEvent event) { + if (!event.getAction().name().contains("RIGHT")) { + return false; + } + + final ItemStack itemStack = player.getItemInHand(); + + if (!this.isSimilar(itemStack)) { + return false; + } + + if (itemStack.getAmount() == 1) { + player.setItemInHand(null); + } else { + itemStack.setAmount(itemStack.getAmount()-1); + } + + player.playSound(player.getLocation(), Sound.LEVEL_UP, 1, 1); + player.playSound(player.getLocation(), Sound.CHEST_OPEN, 1, 1); + return true; + } + + public boolean isSimilar(ItemStack itemStack) { + + if (itemStack == null || itemStack.getItemMeta() == null || itemStack.getType() == Material.AIR) { + return false; + } + + if (itemStack.getItemMeta().getDisplayName() == null) { + return false; + } + + if (itemStack.getItemMeta().getLore() == null || itemStack.getItemMeta().getLore().isEmpty()) { + return false; + } + + return itemStack.getType() == this.getMaterial() && ChatColor.stripColor(itemStack.getItemMeta().getDisplayName()).startsWith(ChatColor.stripColor(this.getDisplayName())) && itemStack.getItemMeta().getLore().get(0).equals(this.getLore().get(0)); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/clickitem/ClickItemHandler.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/clickitem/ClickItemHandler.java new file mode 100644 index 0000000..c4c954f --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/clickitem/ClickItemHandler.java @@ -0,0 +1,39 @@ +package net.frozenorb.foxtrot.gameplay.clickitem; + +import cc.fyre.proton.Proton; +import cc.fyre.proton.util.ClassUtils; +import lombok.Getter; +import lombok.Setter; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.clickitem.parameter.ClickItemParameter; +import net.frozenorb.foxtrot.gameplay.clickitem.type.BossSummoner; +import net.frozenorb.foxtrot.gameplay.clickitem.type.RandomAbilityItem; +import net.frozenorb.foxtrot.gameplay.clickitem.type.RandomArmorClass; +import net.frozenorb.foxtrot.gameplay.clickitem.type.RandomSpawner; +import net.frozenorb.foxtrot.gameplay.loot.itemboxes.parameter.ItemBoxParameter; +import org.bukkit.event.Listener; + +import java.util.ArrayList; +import java.util.List; + +public class ClickItemHandler implements Listener { + private Foxtrot instance; + + @Getter private List clickItems = new ArrayList<>(); + + public ClickItemHandler(Foxtrot instance) { + this.instance = instance; + + this.clickItems.add(new BossSummoner()); + this.clickItems.add(new RandomAbilityItem()); + this.clickItems.add(new RandomArmorClass()); + this.clickItems.add(new RandomSpawner()); + + Proton.getInstance().getCommandHandler().registerParameterType(ClickItem.class, new ClickItemParameter()); + this.instance.getServer().getPluginManager().registerEvents(this, this.instance); + } + + public ClickItem findClickItem(String id) { + return this.clickItems.stream().filter(it -> it.getId().equalsIgnoreCase(id)).findFirst().orElse(null); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/clickitem/command/ClickItemCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/clickitem/command/ClickItemCommand.java new file mode 100644 index 0000000..66de875 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/clickitem/command/ClickItemCommand.java @@ -0,0 +1,29 @@ +package net.frozenorb.foxtrot.gameplay.clickitem.command; + +import cc.fyre.proton.command.Command; +import cc.fyre.proton.command.param.Parameter; +import cc.fyre.proton.util.ItemBuilder; +import net.frozenorb.foxtrot.gameplay.clickitem.ClickItem; +import net.frozenorb.foxtrot.gameplay.loot.itemboxes.ItemBox; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +public class ClickItemCommand { + @Command( + names = {"clickitem give", "clickitems give"}, + permission = "foxtrot.command.clickitem" + ) + public static void execute(CommandSender sender, + @Parameter(name = "clickitem")ClickItem clickItem, + @Parameter(name = "amount", defaultValue = "1") int amount, + @Parameter(name = "player", defaultValue = "self") Player target) { + final ItemStack itemStack = ItemBuilder.of(clickItem.getMaterial()).name(clickItem.getDisplayName()).setLore(clickItem.getLore()).build(); + + itemStack.setAmount(amount); + target.getInventory().addItem(itemStack); + + sender.sendMessage(ChatColor.GREEN + "Gave " + clickItem.getDisplayName() + ChatColor.GREEN + " to " + ChatColor.WHITE + target.getName()); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/clickitem/parameter/ClickItemParameter.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/clickitem/parameter/ClickItemParameter.java new file mode 100644 index 0000000..bb1cfb3 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/clickitem/parameter/ClickItemParameter.java @@ -0,0 +1,23 @@ +package net.frozenorb.foxtrot.gameplay.clickitem.parameter; + +import cc.fyre.proton.command.param.ParameterType; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.clickitem.ClickItem; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; + +public class ClickItemParameter implements ParameterType { + + @Override + public ClickItem transform(CommandSender commandSender, String s) { + + final ClickItem toReturn = Foxtrot.getInstance().getClickItemHandler().findClickItem(s); + + if (toReturn == null) { + commandSender.sendMessage(ChatColor.RED + "Click Item " + ChatColor.YELLOW + s + ChatColor.RED + " not found."); + return null; + } + + return toReturn; + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/clickitem/type/BossSummoner.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/clickitem/type/BossSummoner.java new file mode 100644 index 0000000..26e13d5 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/clickitem/type/BossSummoner.java @@ -0,0 +1,85 @@ +package net.frozenorb.foxtrot.gameplay.clickitem.type; + +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.ability.Ability; +import net.frozenorb.foxtrot.gameplay.ability.AbilityHandler; +import net.frozenorb.foxtrot.gameplay.ability.Category; +import net.frozenorb.foxtrot.gameplay.bosses.BossHandler; +import net.frozenorb.foxtrot.gameplay.clickitem.ClickItem; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; +import java.util.stream.Collectors; + +public class BossSummoner extends ClickItem { + + @Override + public String getId() { + return "boss-summoner"; + } + + @Override + public String getDisplayName() { + return ChatColor.RED + ChatColor.BOLD.toString() + "Boss Summoner"; + } + + @Override + public List getLore() { + final List toReturn = new ArrayList<>(); + + toReturn.add(""); + toReturn.add(ChatColor.GREEN + "Right Click to spawn a random boss"); + + return toReturn; + } + + @Override + public Material getMaterial() { + return Material.REDSTONE_TORCH_ON; + } + + @EventHandler(priority = EventPriority.LOW) + private void onInteract(PlayerInteractEvent event) { + final Player player = event.getPlayer(); + + if (!event.getAction().name().contains("RIGHT")) { + return; + } + + final ItemStack itemStack = player.getItemInHand(); + + if (!this.isSimilar(itemStack)) { + return; + } + + event.setCancelled(true); + + final BossHandler bossHandler = Foxtrot.getInstance().getBossHandler(); + + if (bossHandler.getActiveBoss() != null && !bossHandler.getActiveBoss().getEntity().isDead()) { + player.sendMessage(ChatColor.RED + "There is already an ongoing boss!"); + return; + } + + boolean activate = this.redeem(event.getPlayer(), event); + + if (!activate) { + return; + } + + bossHandler.activateRandom(); + + Bukkit.broadcastMessage(""); + Bukkit.broadcastMessage(player.getName() + ChatColor.translate(" &ahas summoned a boss!")); + Bukkit.broadcastMessage(""); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/clickitem/type/RandomAbilityItem.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/clickitem/type/RandomAbilityItem.java new file mode 100644 index 0000000..08d094c --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/clickitem/type/RandomAbilityItem.java @@ -0,0 +1,67 @@ +package net.frozenorb.foxtrot.gameplay.clickitem.type; + +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.ability.Ability; +import net.frozenorb.foxtrot.gameplay.ability.AbilityHandler; +import net.frozenorb.foxtrot.gameplay.ability.Category; +import net.frozenorb.foxtrot.gameplay.bosses.BossHandler; +import net.frozenorb.foxtrot.gameplay.clickitem.ClickItem; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.player.PlayerInteractEvent; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; +import java.util.stream.Collectors; + +public class RandomAbilityItem extends ClickItem { + + @Override + public String getId() { + return "random-ability-item"; + } + + @Override + public String getDisplayName() { + return ChatColor.AQUA + ChatColor.BOLD.toString() + "Random Ability Item"; + } + + @Override + public List getLore() { + final List toReturn = new ArrayList<>(); + + toReturn.add(""); + toReturn.add(ChatColor.GREEN + "Right Click to receive a random ability item"); + + return toReturn; + } + + @Override + public Material getMaterial() { + return Material.NETHER_STAR; + } + + @EventHandler(priority = EventPriority.LOW) + private void onInteract(PlayerInteractEvent event) { + final Player player = event.getPlayer(); + + boolean activate = this.redeem(event.getPlayer(), event); + + if (!activate) { + return; + } + + final AbilityHandler abilityHandler = Foxtrot.getInstance().getMapHandler().getAbilityHandler(); + final List abilities = abilityHandler.getAbilities().values().stream().filter(it -> it.getCategory() != Category.KIT_MAP).collect(Collectors.toList()); + + final Ability randomAbility = abilities.get(ThreadLocalRandom.current().nextInt(abilities.size())); + + player.sendMessage(ChatColor.GREEN + "You have been given the " + randomAbility.getDisplayName() + ChatColor.GREEN + " ability!"); + player.getInventory().addItem(randomAbility.hassanStack.clone()); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/clickitem/type/RandomArmorClass.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/clickitem/type/RandomArmorClass.java new file mode 100644 index 0000000..b165076 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/clickitem/type/RandomArmorClass.java @@ -0,0 +1,66 @@ +package net.frozenorb.foxtrot.gameplay.clickitem.type; + +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.armorclass.ArmorClass; +import net.frozenorb.foxtrot.gameplay.armorclass.ArmorClassHandler; +import net.frozenorb.foxtrot.gameplay.bosses.BossHandler; +import net.frozenorb.foxtrot.gameplay.clickitem.ClickItem; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.player.PlayerInteractEvent; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; + +public class RandomArmorClass extends ClickItem { + + @Override + public String getId() { + return "random-armor-class"; + } + + @Override + public String getDisplayName() { + return ChatColor.DARK_RED + ChatColor.BOLD.toString() + "Random Armor Class"; + } + + @Override + public List getLore() { + final List toReturn = new ArrayList<>(); + + toReturn.add(""); + toReturn.add(ChatColor.GREEN + "Right Click to receive a random armor class."); + + return toReturn; + } + + @Override + public Material getMaterial() { + return Material.CHEST; + } + + @EventHandler(priority = EventPriority.LOW) + private void onInteract(PlayerInteractEvent event) { + final Player player = event.getPlayer(); + + boolean activate = this.redeem(event.getPlayer(), event); + + if (!activate) { + return; + } + + final ArmorClassHandler armorClassHandler = Foxtrot.getInstance().getArmorClassHandler(); + final List armorClasses = new ArrayList<>(armorClassHandler.getArmorClasses()); + final ArmorClass randomClass = armorClasses.get(ThreadLocalRandom.current().nextInt(armorClasses.size())); + + player.getInventory().addItem(randomClass.getRedeemItem().clone()); + player.playSound(player.getLocation(), Sound.LEVEL_UP, 1, 1); + player.sendMessage(ChatColor.GREEN + "You have received a " + randomClass.getDisplayName() + " Armor Class " + ChatColor.GREEN + "!"); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/clickitem/type/RandomSpawner.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/clickitem/type/RandomSpawner.java new file mode 100644 index 0000000..bdcd2ea --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/clickitem/type/RandomSpawner.java @@ -0,0 +1,75 @@ +package net.frozenorb.foxtrot.gameplay.clickitem.type; + +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.bosses.BossHandler; +import net.frozenorb.foxtrot.gameplay.clickitem.ClickItem; +import net.frozenorb.foxtrot.server.SpawnerType; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; +import java.util.stream.Collectors; + +public class RandomSpawner extends ClickItem { + + @Override + public String getId() { + return "random-spawner"; + } + + @Override + public String getDisplayName() { + return ChatColor.DARK_AQUA + ChatColor.BOLD.toString() + "Random Spawner"; + } + + @Override + public List getLore() { + final List toReturn = new ArrayList<>(); + + toReturn.add(""); + toReturn.add(ChatColor.GREEN + "Right Click to receive a random spawner!"); + + return toReturn; + } + + @Override + public Material getMaterial() { + return Material.MOB_SPAWNER; + } + + @EventHandler(priority = EventPriority.LOW) + private void onInteract(PlayerInteractEvent event) { + final Player player = event.getPlayer(); + + boolean activate = this.redeem(event.getPlayer(), event); + + if (!activate) { + return; + } + + final List spawners = Arrays.stream(SpawnerType.values()).collect(Collectors.toList()); + final SpawnerType spawnerType = spawners.get(ThreadLocalRandom.current().nextInt(spawners.size())); + + ItemStack drop = new ItemStack(Material.MOB_SPAWNER); + ItemMeta meta = drop.getItemMeta(); + + meta.setDisplayName(ChatColor.RESET + StringUtils.capitaliseAllWords(spawnerType.getDisplayName().toLowerCase().replaceAll("_", " ")) + " Spawner"); + drop.setItemMeta(meta); + + player.getInventory().addItem(drop.clone()); + player.sendMessage(ChatColor.translate("&aYou have received a &f" + spawnerType.getDisplayName() + " Spawner&a!")); + player.playSound(player.getLocation(), Sound.LEVEL_UP, 1, 1); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/content/ContentHandler.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/content/ContentHandler.java new file mode 100644 index 0000000..c262806 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/content/ContentHandler.java @@ -0,0 +1,27 @@ +package net.frozenorb.foxtrot.gameplay.content; + +import lombok.Getter; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.content.listener.ContentListener; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +public class ContentHandler { + private Foxtrot instance; + + @Getter private Map> cache = new HashMap<>(); + + public boolean isContentType(UUID uuid, ContentType contentType) { + return this.cache.get(uuid).stream().anyMatch(it -> it.equals(contentType)); + } + + public ContentHandler(Foxtrot instance) { + this.instance = instance; + + this.instance.getServer().getPluginManager().registerEvents(new ContentListener(this.instance, this), this.instance); + } + +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/content/ContentType.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/content/ContentType.java new file mode 100644 index 0000000..10be825 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/content/ContentType.java @@ -0,0 +1,12 @@ +package net.frozenorb.foxtrot.gameplay.content; + +public enum ContentType { + NO_PARTNER_COOLDOWN, + JUMP_DAMAGE, + RANDOM_EFFECT, + BOW, + GOD_MODE, + RESTRICT, + WATER_DAMAGE + +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/content/command/ContentCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/content/command/ContentCommand.java new file mode 100644 index 0000000..a0f1427 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/content/command/ContentCommand.java @@ -0,0 +1,35 @@ +package net.frozenorb.foxtrot.gameplay.content.command; + +import cc.fyre.proton.command.Command; +import cc.fyre.proton.command.param.Parameter; +import net.frozenorb.foxtrot.Foxtrot; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import org.bukkit.metadata.FixedMetadataValue; + +public class ContentCommand { + + @Command(names = {"content restrict"}, permission = "command.content.restrict") + public static void restrict(Player player, @Parameter(name = "target")Player target) { + if (!target.hasMetadata("RESTRICTED")) { + target.setMetadata("RESTRICTED", new FixedMetadataValue(Foxtrot.getInstance(), true)); + player.sendMessage(ChatColor.RED + target.getName() + " can no longer place, break and use blocks."); + } else { + target.removeMetadata("RESTRICTED", Foxtrot.getInstance()); + player.sendMessage(ChatColor.GREEN + target.getName() + " can now place, break and use blocks."); + } + } + + @Command(names = {"content jump"}, permission = "command.content.jump") + public static void execute(Player player) { + + if (!player.hasMetadata("JUMP")) { + player.setMetadata("JUMP", new FixedMetadataValue(Foxtrot.getInstance(), true)); + player.sendMessage(ChatColor.GREEN + player.getName() + " will now take damage whenever they jump."); + } else { + player.removeMetadata("JUMP", Foxtrot.getInstance()); + player.sendMessage(ChatColor.RED + player.getName() + " will no longer take damage whenever they jump."); + } + } + +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/content/listener/ContentListener.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/content/listener/ContentListener.java new file mode 100644 index 0000000..3936341 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/content/listener/ContentListener.java @@ -0,0 +1,146 @@ +package net.frozenorb.foxtrot.gameplay.content.listener; + +import lombok.AllArgsConstructor; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.content.ContentHandler; +import net.frozenorb.foxtrot.gameplay.content.ContentType; +import net.frozenorb.foxtrot.listener.FoxListener; +import net.frozenorb.foxtrot.listener.event.PlayerJumpEvent; +import net.frozenorb.foxtrot.util.InventoryUtils; +import net.frozenorb.foxtrot.util.PotionUtil; +import org.bukkit.ChatColor; +import org.bukkit.block.Block; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.block.Action; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.potion.Potion; + +import java.util.concurrent.ThreadLocalRandom; + +import static org.bukkit.Material.POTION; + +@AllArgsConstructor +public class ContentListener implements Listener { + private Foxtrot instance; + private ContentHandler contentHandler; + + @EventHandler + private void onJump(PlayerJumpEvent event) { + final Player player = event.getPlayer(); + + if (player.hasMetadata("JUMP")) { + player.damage(0); + + int damage = ThreadLocalRandom.current().nextInt(1, 19); + player.setHealth(player.getHealth()-damage); + + double half = damage/2; + + player.sendMessage(ChatColor.translate("&aYou took &4&l❤" + half + " &aof damage!")); + } + } + + + @EventHandler + public void onPlace(BlockPlaceEvent event) { + if (event.isCancelled()) { + return; + } + + final Player player = event.getPlayer(); + + if (!player.hasMetadata("RESTRICTED")) { + return; + } + + player.sendMessage(ChatColor.RED + "You may not place blocks as you are currently restricted from doing so!"); + event.setCancelled(true); + } + + @EventHandler + public void onBreak(BlockBreakEvent event) { + if (event.isCancelled()) { + return; + } + + final Player player = event.getPlayer(); + + if (!player.hasMetadata("RESTRICTED")) { + return; + } + + player.sendMessage(ChatColor.RED + "You may not break blocks as you are currently restricted from doing so!"); + event.setCancelled(true); + } + + @EventHandler + private void onPlate(PlayerInteractEvent event) { + if ((event.getAction() != Action.PHYSICAL || event.getClickedBlock() == null || !event.getClickedBlock().getType().name().contains("PLATE"))) { + return; + } + + final Player player = event.getPlayer(); + + if (!player.hasMetadata("RESTRICTED")) { + return; + } + + if (event.getItem() != null && event.getItem().getType() == POTION && event.getItem().getDurability() != 0) { + Potion potion = Potion.fromItemStack(event.getItem()); + + if (potion.isSplash()) { + PotionUtil.splashPotion(player, event.getItem()); + if (player.getItemInHand() != null && player.getItemInHand().isSimilar(event.getItem())) { + player.setItemInHand(null); + player.updateInventory(); + } else { + InventoryUtils.removeAmountFromInventory(player.getInventory(), event.getItem(), 1); + } + } + } + + event.setCancelled(true); + } + + @EventHandler(priority = EventPriority.LOWEST) + private void onInteract(PlayerInteractEvent event) { + if (event.getAction() != Action.RIGHT_CLICK_BLOCK || event.getClickedBlock() == null) { + return; + } + + final Block clickedBlock = event.getClickedBlock(); + + if (!FoxListener.NO_INTERACT.contains(clickedBlock.getType())) { + return; + } + + final Player player = event.getPlayer(); + + if (!player.hasMetadata("RESTRICTED")) { + return; + } + + if (event.getItem() != null && event.getItem().getType() == POTION && event.getItem().getDurability() != 0) { + Potion potion = Potion.fromItemStack(event.getItem()); + + if (potion.isSplash()) { + PotionUtil.splashPotion(player, event.getItem()); + if (player.getItemInHand() != null && player.getItemInHand().isSimilar(event.getItem())) { + player.setItemInHand(null); + player.updateInventory(); + } else { + InventoryUtils.removeAmountFromInventory(player.getInventory(), event.getItem(), 1); + } + } + } + + event.setCancelled(true); + player.sendMessage(ChatColor.RED + "You may not interact with blocks as you are currently restricted from doing so!"); + } + +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/content/service/ContentService.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/content/service/ContentService.java new file mode 100644 index 0000000..1ff7919 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/content/service/ContentService.java @@ -0,0 +1,49 @@ +package net.frozenorb.foxtrot.gameplay.content.service; + +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.content.ContentHandler; +import net.frozenorb.foxtrot.gameplay.content.ContentType; +import org.bukkit.entity.Player; +import org.bukkit.potion.Potion; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; +import org.bukkit.scheduler.BukkitRunnable; + +import java.util.*; +import java.util.concurrent.ThreadLocalRandom; + +public class ContentService extends BukkitRunnable { + private Foxtrot instance; + private ContentHandler contentHandler; + private Map seconds = new HashMap<>(); + + @Override + public void run() { + for (Player onlinePlayer : this.instance.getServer().getOnlinePlayers()) { + + seconds.putIfAbsent(onlinePlayer.getUniqueId(), 30); + int seconds = this.seconds.getOrDefault(onlinePlayer.getUniqueId(), 30); + + if (contentHandler.isContentType(onlinePlayer.getUniqueId(), ContentType.RANDOM_EFFECT)) { + seconds--; + + if (seconds == 0) { + List potionEffects = Arrays.asList(PotionEffectType.values()); + + PotionEffectType potionEffectType = potionEffects.get(ThreadLocalRandom.current().nextInt(potionEffects.size()-1)); + + onlinePlayer.addPotionEffect(new PotionEffect(potionEffectType, 20*30, 1)); + } + } + + if (contentHandler.isContentType(onlinePlayer.getUniqueId(), ContentType.WATER_DAMAGE)) { + + if (onlinePlayer.getLocation().getBlock().getType().name().contains("WATER")) { + onlinePlayer.damage(0); + onlinePlayer.setHealth(onlinePlayer.getHealth()-4); + } + + } + } + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/coupondrops/CouponDropsHandler.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/coupondrops/CouponDropsHandler.java new file mode 100644 index 0000000..123cdfd --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/coupondrops/CouponDropsHandler.java @@ -0,0 +1,83 @@ +package net.frozenorb.foxtrot.gameplay.coupondrops; + +import cc.fyre.proton.command.Command; +import lombok.Getter; +import lombok.Setter; +import net.buycraft.plugin.data.Coupon; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.coupondrops.listener.CouponDropsListener; +import net.frozenorb.foxtrot.gameplay.coupondrops.tasks.CouponDropsTask; +import org.apache.commons.lang.RandomStringUtils; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.entity.Player; + +import java.io.IOException; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.concurrent.ThreadLocalRandom; + +public class CouponDropsHandler { + private Foxtrot instance; + @Getter @Setter private long dropsIn; + @Getter @Setter private Location location; + + public CouponDropsHandler(Foxtrot instance) { + this.instance = instance; + + instance.getServer().getPluginManager().registerEvents(new CouponDropsListener(instance, this), instance); + } + + public Coupon createCoupon() { + final int[] percentages = { 10, 15, 20 }; + final int percentage = percentages[ThreadLocalRandom.current().nextInt(percentages.length)]; + + final Coupon.Discount discount = new Coupon.Discount("percentage", new BigDecimal(percentage), new BigDecimal("0.0")); + + final Calendar expiration = Calendar.getInstance(); + expiration.set(Calendar.YEAR, 2030); + + final Coupon coupon = Coupon.builder() + .note("Generated coupon drop at " + new Date(System.currentTimeMillis()).toLocaleString()) + .basketType("single") + .code("DROP-" + RandomStringUtils.random(4, true, true)) + .userLimit(1) + .redeemUnlimited(false) + .startDate(new Date(System.currentTimeMillis())) + .minimum(new BigDecimal("0.0")) + .expire(new Coupon.Expire("limit", 1, expiration.getTime())) + .discountMethod(2) + .effective(new Coupon.Effective("cart", Foxtrot.getInstance().getVoucherHandler().getEffectiveHandler().getEffectivePackages(), new ArrayList<>())) + .startDate(new Date(System.currentTimeMillis())) + .discount(discount).build(); + + Foxtrot.getInstance().getServer().getScheduler().runTaskAsynchronously(Foxtrot.getInstance(), () -> { + + try { + Foxtrot.getInstance().getBuycraftPlugin().getApiClient().createCoupon(coupon).execute(); + } catch (IOException e) { + System.out.println("FAILED TO CREATE COUPON ! ! !"); + e.printStackTrace(); + } + }); + + return coupon; + } + + @Command(names = {"coupondrops start", "discountdrops start", "discountdrop start", "coupondrop start"}, permission = "op") + public static void execute(Player player) { + player.sendMessage(ChatColor.GREEN + "Started Coupon Drop!"); + new CouponDropsTask(Foxtrot.getInstance(), Foxtrot.getInstance().getCouponDropsHandler().createCoupon()).runTask(Foxtrot.getInstance()); + } + + @Command(names = {"coupondrops fix", "discountdrops fix", "discountdrop fix", "coupondrop fix"}, permission = "op") + public static void fix(Player player) { + player.sendMessage(ChatColor.GREEN + "Fixed Coupon Drop!"); + + Foxtrot.getInstance().getCouponDropsHandler().setDropsIn(0); + Foxtrot.getInstance().getCouponDropsHandler().setLocation(null); + } + +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/coupondrops/listener/CouponDropsListener.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/coupondrops/listener/CouponDropsListener.java new file mode 100644 index 0000000..900b4a0 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/coupondrops/listener/CouponDropsListener.java @@ -0,0 +1,67 @@ +package net.frozenorb.foxtrot.gameplay.coupondrops.listener; + +import cc.fyre.proton.event.HourEvent; +import com.lunarclient.bukkitapi.LunarClientAPI; +import com.lunarclient.bukkitapi.object.LCWaypoint; +import lombok.AllArgsConstructor; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.coupondrops.CouponDropsHandler; +import net.frozenorb.foxtrot.gameplay.coupondrops.tasks.CouponDropsTask; +import org.bukkit.*; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerPickupItemEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +@AllArgsConstructor +public class CouponDropsListener implements Listener { + private Foxtrot instance; + private CouponDropsHandler couponDropsHandler; + + public static LCWaypoint couponDropWaypoint; + + @EventHandler + private void onPickupCoupon(final PlayerPickupItemEvent event) { + final ItemStack itemStack = event.getItem().getItemStack(); + if (itemStack != null && itemStack.getType() == Material.BOOK_AND_QUILL && itemStack.hasItemMeta()) { + final ItemMeta itemMeta = itemStack.getItemMeta(); + final String displayName = itemMeta.getDisplayName(); + if (displayName != null) { + final boolean contains = CouponDropsTask.ACTIVE_COUPONS.contains(displayName); + + if (contains && event.getPlayer().getGameMode() == GameMode.CREATIVE) { + event.setCancelled(true); + return; + } + + final boolean removed = CouponDropsTask.ACTIVE_COUPONS.remove(displayName); + + Foxtrot.getInstance().getCouponDropsHandler().setDropsIn(0); + Foxtrot.getInstance().getCouponDropsHandler().setLocation(null); + + if (removed) { + Bukkit.getOnlinePlayers().forEach(player -> { + player.sendMessage(" "); + player.sendMessage(ChatColor.DARK_RED + ChatColor.BOLD.toString() + "Discount Drops"); + player.sendMessage(ChatColor.translate("&7The book containing a coupon has been picked up!")); + player.sendMessage(ChatColor.translate("&cPicked up By: &f" + event.getPlayer().getDisplayName())); + player.sendMessage(" "); + + LunarClientAPI.getInstance().removeWaypoint(player, couponDropWaypoint); + }); + } + } + } + } + + @EventHandler + private void onHour(HourEvent event) { + if (event.getHour() % 3 != 0) { + return; + } + + new CouponDropsTask(this.instance, this.couponDropsHandler.createCoupon()).runTask(Foxtrot.getInstance()); + } + +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/coupondrops/tasks/CouponDropsTask.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/coupondrops/tasks/CouponDropsTask.java new file mode 100644 index 0000000..3a61acb --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/coupondrops/tasks/CouponDropsTask.java @@ -0,0 +1,96 @@ +package net.frozenorb.foxtrot.gameplay.coupondrops.tasks; + +import cc.fyre.universe.UniverseAPI; +import com.lunarclient.bukkitapi.LunarClientAPI; +import com.lunarclient.bukkitapi.object.LCWaypoint; +import net.buycraft.plugin.data.Coupon; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.coupondrops.listener.CouponDropsListener; +import org.bukkit.*; +import org.bukkit.entity.Item; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.BookMeta; +import org.bukkit.metadata.FixedMetadataValue; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; + +import java.awt.Color; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; +import java.util.concurrent.TimeUnit; + +public class CouponDropsTask extends BukkitRunnable { + private Foxtrot instance; + public static final List ACTIVE_COUPONS; + private Coupon coupon; + + public CouponDropsTask(Foxtrot instance, Coupon coupon) { + this.instance = instance; + this.coupon = coupon; + } + + @Override + public void run() { + if (UniverseAPI.getServerName().contains("Dev")) { + return; + } + + int x = ThreadLocalRandom.current().nextInt(100,1000) - 500; + int z = ThreadLocalRandom.current().nextInt(100,1000) - 500; + + final Location location = this.instance.getServer().getWorld("world").getHighestBlockAt(x, z).getLocation().add(new Vector(0, 1, 0)).clone(); + location.getChunk().load(true); + + this.instance.getServer().getOnlinePlayers().forEach(player -> { + player.sendMessage(" "); + player.sendMessage(ChatColor.DARK_RED + ChatColor.BOLD.toString() + "Discount Drops"); + player.sendMessage(ChatColor.translate("&7A book containing a Buycraft Coupon will drop in &f5 minutes&7!")); + player.sendMessage(ChatColor.translate("&cLocation: &f" + x + ", " + location.getBlockY() + ", " + z)); + player.sendMessage(" "); + + CouponDropsListener.couponDropWaypoint = new LCWaypoint(ChatColor.DARK_RED + "Coupon Drop" + ChatColor.WHITE, location, Color.RED.getRGB(), true); + + LunarClientAPI.getInstance().sendWaypoint(player, CouponDropsListener.couponDropWaypoint); + }); + + Foxtrot.getInstance().getCouponDropsHandler().setDropsIn(System.currentTimeMillis()+TimeUnit.MINUTES.toMillis(5)); + Foxtrot.getInstance().getCouponDropsHandler().setLocation(location.clone()); + + final ItemStack itemStack = this.getItem(this.coupon); + + this.instance.getServer().getScheduler().runTaskLater(Foxtrot.getInstance(), () -> { + final Item item = location.getWorld().dropItemNaturally(location, itemStack.clone()); + item.setMetadata("DONT_CLEAR", new FixedMetadataValue(Foxtrot.getInstance(), true)); + + this.instance.getServer().getOnlinePlayers().forEach(player -> { + player.sendMessage(" "); + player.sendMessage(ChatColor.DARK_RED + ChatColor.BOLD.toString() + "Discount Drops"); + player.sendMessage(ChatColor.translate("&7The book containing a Coupon has been dropped!")); + player.sendMessage(ChatColor.translate("&cLocation: &f" + x + ", " + location.getBlockY() + ", " + z)); + player.sendMessage(" "); + }); + + ACTIVE_COUPONS.add(itemStack.getItemMeta().getDisplayName()); + }, 20L * TimeUnit.MINUTES.toSeconds(5L)); + } + + private ItemStack getItem(final Coupon coupon) { + final ItemStack itemStack = new ItemStack(Material.BOOK_AND_QUILL, 1); + final BookMeta book = (BookMeta) itemStack.getItemMeta(); + + book.setDisplayName(ChatColor.translate("&4&lDiscount Drop &7&l┃ &f" + coupon.getDiscount().getPercentage() + "% off")); + book.setLore(Collections.singletonList(ChatColor.YELLOW + "Within this book contains a buycraft coupon code!")); + book.setTitle(ChatColor.RED + "§lCoupon Book"); + book.setPages("\n" + ChatColor.RED + "Apply this coupon code at checkout!\n" + ChatColor.GRAY + "https://store.cavepvp.org\n\n" + ChatColor.DARK_GREEN + "Code: " + ChatColor.GREEN + coupon.getCode()); + book.setAuthor("CavePvP"); + itemStack.setItemMeta(book); + return itemStack; + } + + static { + ACTIVE_COUPONS = new ArrayList<>(); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/Event.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/Event.java new file mode 100644 index 0000000..1926d29 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/Event.java @@ -0,0 +1,23 @@ +package net.frozenorb.foxtrot.gameplay.events; + +public interface Event { + + String getName(); + + boolean isActive(); + + void tick(); + + void setActive(boolean active); + + boolean isHidden(); + + void setHidden(boolean hidden); + + boolean activate(); + + boolean deactivate(); + + EventType getType(); + +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/EventHandler.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/EventHandler.java new file mode 100644 index 0000000..b22e727 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/EventHandler.java @@ -0,0 +1,298 @@ +package net.frozenorb.foxtrot.gameplay.events; + +import com.mongodb.BasicDBObject; +import com.mongodb.util.JSON; +import java.io.File; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Collections; +import java.util.Date; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.TreeMap; + +import lombok.Getter; +import lombok.Setter; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.commands.CustomTimerCreateCommand; +import net.frozenorb.foxtrot.gameplay.events.dtc.DTC; +import net.frozenorb.foxtrot.gameplay.events.dtc.DTCListener; +import net.frozenorb.foxtrot.gameplay.events.koth.KOTH; +import net.frozenorb.foxtrot.gameplay.events.koth.listeners.KOTHListener; +import cc.fyre.proton.Proton; +import net.frozenorb.foxtrot.gameplay.events.koth.minikoth.MiniKOTHHandler; +import net.minecraft.util.org.apache.commons.io.FileUtils; +import org.bukkit.Bukkit; +import com.google.gson.JsonParser; +import org.bukkit.scheduler.BukkitRunnable; + +public class EventHandler { + + @Getter private final Set events = new HashSet<>(); + @Getter private final Map EventSchedule = new TreeMap<>(); + + @Getter + @Setter + private boolean scheduleEnabled; + + @Getter private MiniKOTHHandler miniKOTHHandler; + + public EventHandler() { + + if (!Foxtrot.getInstance().getMapHandler().isKitMap()) { + this.miniKOTHHandler = new MiniKOTHHandler(); + } + + loadEvents(); + loadSchedules(); + + Foxtrot.getInstance().getServer().getPluginManager().registerEvents(new KOTHListener(), Foxtrot.getInstance()); + Foxtrot.getInstance().getServer().getPluginManager().registerEvents(new DTCListener(), Foxtrot.getInstance()); + Foxtrot.getInstance().getServer().getPluginManager().registerEvents(new EventListener(), Foxtrot.getInstance()); + Proton.getInstance().getCommandHandler().registerParameterType(Event.class, new EventParameterType()); + + new BukkitRunnable() { + public void run() { + for (Event event : events) { + if (event.isActive()) { + event.tick(); + } + } + } + }.runTaskTimer(Foxtrot.getInstance(), 5L, 20L); + + Foxtrot.getInstance().getServer().getScheduler().runTaskTimer(Foxtrot.getInstance(), this::activateKOTHs, 20L, 20L); + // The initial delay of 5 ticks is to 'offset' us with the scoreboard handler. + } + + public KOTH getActiveKOTH() { + return events.stream().filter(it -> it instanceof KOTH && it.isActive()).map(it -> (KOTH)it).findFirst().orElse(null); + } + + public void loadEvents() { + try { + File eventsBase = new File(Foxtrot.getInstance().getDataFolder(), "events"); + + if (!eventsBase.exists()) { + eventsBase.mkdir(); + } + + for (EventType eventType : EventType.values()) { + File subEventsBase = new File(eventsBase, eventType.name().toLowerCase()); + + if (!subEventsBase.exists()) { + subEventsBase.mkdir(); + } + + for (File eventFile : subEventsBase.listFiles()) { + if (eventFile.getName().endsWith(".json")) { + events.add(Foxtrot.GSON.fromJson(FileUtils.readFileToString(eventFile), eventType == EventType.KOTH ? KOTH.class : DTC.class)); + } + } + } + } catch (Exception e) { + e.printStackTrace(); + } + + // look for a previously active Event, if present deactivate and start it after 15 seconds + events.stream().filter(Event::isActive).findFirst().ifPresent((event) -> { + event.setActive(false); + Bukkit.getScheduler().runTaskLater(Foxtrot.getInstance(), () -> { + // if anyone had started a Event within the last 15 seconds, + // don't activate previously active one + if (events.stream().noneMatch(Event::isActive)) { + event.activate(); + } + }, 300L); + }); + } + + public void fillSchedule() { + List allevents = new ArrayList<>(); + + for (Event event : getEvents()) { + if (event.isHidden() || event.getName().equalsIgnoreCase("EOTW") || event.getName().equalsIgnoreCase("Citadel") || event.getName().equalsIgnoreCase("NetherCitadel")) { + continue; + } + + allevents.add(event.getName()); + } + + for (int minute = 0; minute < 60; minute++) { + for (int hour = 0; hour < 24; hour++) { + this.EventSchedule.put(new EventScheduledTime(Calendar.getInstance().get(Calendar.DAY_OF_YEAR), (Calendar.getInstance().get(Calendar.HOUR_OF_DAY) + hour) % 24, minute), allevents.get(0)); + } + } + } + + public void loadSchedules() { + EventSchedule.clear(); + + try { + File eventSchedule = new File(Foxtrot.getInstance().getDataFolder(), "eventSchedule.json"); + + if (!eventSchedule.exists()) { + eventSchedule.createNewFile(); + BasicDBObject schedule = new BasicDBObject(); + int currentDay = Calendar.getInstance().get(Calendar.DAY_OF_YEAR); + List allevents = new ArrayList<>(); + + for (Event event : getEvents()) { + if (event.isHidden() || event.getName().equalsIgnoreCase("EOTW") || event.getName().equalsIgnoreCase("Citadel") || event.getName().equalsIgnoreCase("NetherCitadel") || event.getName().contains("Outpost")) { + continue; + } + + if (event instanceof KOTH && ((KOTH) event).isMini()) { + continue; + } + + allevents.add(event.getName()); + } + + for (int dayOffset = 0; dayOffset < 21; dayOffset++) { + int day = (currentDay + dayOffset) % 365; + EventScheduledTime[] times = new EventScheduledTime[]{ + new EventScheduledTime(day, 0, 0), // 12:00 AM EST + new EventScheduledTime(day, 1, 30), // 1:30 AM EST + new EventScheduledTime(day, 3, 0), // 3:00 AM EST + new EventScheduledTime(day, 4, 30), // 04:30 AM EST + new EventScheduledTime(day, 6, 0), // 06:00 AM EST + new EventScheduledTime(day, 7, 30), // 07:30 AM EST + new EventScheduledTime(day, 9, 0), // 09:00 AM EST + new EventScheduledTime(day, 10, 30), // 10:30 AM EST + new EventScheduledTime(day, 12, 0), // 12:00 PM EST + new EventScheduledTime(day, 13, 30), // 01:30 PM EST + new EventScheduledTime(day, 15, 0), // 3:00 PM EST + new EventScheduledTime(day, 16, 30), // 04:30 PM EST + new EventScheduledTime(day, 18, 0), // 06:00 PM EST + new EventScheduledTime(day, 19, 30), // 07:30 PM EST + new EventScheduledTime(day, 21, 0), // 09:00 PM EST + new EventScheduledTime(day, 22, 30), // 10:30 PM EST + }; + + if (Foxtrot.getInstance().getServerHandler().isAu()) { + times = new EventScheduledTime[]{ + new EventScheduledTime(day, 0, 0), // 12:00 AM EST + new EventScheduledTime(day, 2, 0), // 02:00 AM EST + new EventScheduledTime(day, 4, 0), // 04:00 AM EST + new EventScheduledTime(day, 6, 0), // 06:00 AM EST + new EventScheduledTime(day, 8, 0), // 08:00 AM EST + new EventScheduledTime(day, 10, 0), // 10:00 AM EST + new EventScheduledTime(day, 12, 0), // 12:00 PM EST + new EventScheduledTime(day, 14, 0), // 02:00 PM EST + new EventScheduledTime(day, 16, 0), // 04:00 PM EST + new EventScheduledTime(day, 18, 0), // 06:30 PM EST + new EventScheduledTime(day, 20, 0), // 08:00 PM EST + new EventScheduledTime(day, 22, 0), // 10:00 PM EST + }; + } + + if (Foxtrot.getInstance().getServerHandler().isTeams()) { + times = new EventScheduledTime[]{ + new EventScheduledTime(day, 12, 0), // 12:00 PM EST + new EventScheduledTime(day, 15, 0), // 03:00 PM EST + new EventScheduledTime(day, 18, 0), // 06:00 PM EST + new EventScheduledTime(day, 21, 0), // 09:00 PM EST + }; + } + + Collections.shuffle(allevents); + + if (!allevents.isEmpty()) { + for (int eventTimeIndex = 0; eventTimeIndex < times.length; eventTimeIndex++) { + EventScheduledTime eventTime = times[eventTimeIndex]; + String eventName = allevents.get(eventTimeIndex % allevents.size()); + + schedule.put(eventTime.toString(), eventName); + } + } + } + + FileUtils.write(eventSchedule, Foxtrot.GSON.toJson(new JsonParser().parse(schedule.toString()))); + } + + BasicDBObject dbo = (BasicDBObject) JSON.parse(FileUtils.readFileToString(eventSchedule)); + + if (dbo != null) { + for (Map.Entry entry : dbo.entrySet()) { + EventScheduledTime scheduledTime = EventScheduledTime.parse(entry.getKey()); + this.EventSchedule.put(scheduledTime, String.valueOf(entry.getValue())); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + public void saveEvents() { + try { + File eventsBase = new File(Foxtrot.getInstance().getDataFolder(), "events"); + + if (!eventsBase.exists()) { + eventsBase.mkdir(); + } + + for (EventType eventType : EventType.values()) { + + File subEventsBase = new File(eventsBase, eventType.name().toLowerCase()); + + if (!subEventsBase.exists()) { + subEventsBase.mkdir(); + } + + for (File eventFile : subEventsBase.listFiles()) { + eventFile.delete(); + } + } + + for (Event event : events) { + File eventFile = new File(new File(eventsBase, event.getType().name().toLowerCase()), event.getName() + ".json"); + FileUtils.write(eventFile, Foxtrot.GSON.toJson(event)); + Bukkit.getLogger().info("Writing " + event.getName() + " to " + eventFile.getAbsolutePath()); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + public Event getEvent(String name) { + for (Event event : events) { + if (event.getName().equalsIgnoreCase(name)) { + return (event); + } + } + + return (null); + } + + private void activateKOTHs() { + // Don't start a KOTH during EOTW. + if (Foxtrot.getInstance().getServerHandler().isPreEOTW() || CustomTimerCreateCommand.isSOTWTimer()) { + return; + } + + // Don't start a KOTH if another one is active. + for (Event koth : Foxtrot.getInstance().getEventHandler().getEvents()) { + if (koth.isActive()) { + return; + } + } + + EventScheduledTime scheduledTime = EventScheduledTime.parse(new Date()); + + if (Foxtrot.getInstance().getEventHandler().getEventSchedule().containsKey(scheduledTime)) { + String resolvedName = Foxtrot.getInstance().getEventHandler().getEventSchedule().get(scheduledTime); + Event resolved = Foxtrot.getInstance().getEventHandler().getEvent(resolvedName); + + if (resolved == null) { + Foxtrot.getInstance().getLogger().warning("The event scheduler has a schedule for an event named " + resolvedName + ", but the event does not exist."); + return; + } + + resolved.activate(); + } + } + +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/EventListener.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/EventListener.java new file mode 100644 index 0000000..0225b08 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/EventListener.java @@ -0,0 +1,359 @@ +package net.frozenorb.foxtrot.gameplay.events; + +import cc.fyre.proton.serialization.LocationSerializer; +import com.mongodb.BasicDBObject; +import com.mongodb.DBCollection; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.commands.CustomTimerCreateCommand; +import net.frozenorb.foxtrot.gameplay.events.events.EventActivatedEvent; +import net.frozenorb.foxtrot.gameplay.events.events.EventCapturedEvent; +import net.frozenorb.foxtrot.gameplay.events.events.EventDeactivatedEvent; +import net.frozenorb.foxtrot.gameplay.events.koth.KOTH; +import net.frozenorb.foxtrot.gameplay.events.koth.events.KOTHControlLostEvent; +import net.frozenorb.foxtrot.gameplay.extra.stats.StatsEntry; +import net.frozenorb.foxtrot.team.Team; +import net.frozenorb.foxtrot.util.InventoryUtils; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.Sound; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.inventory.ItemStack; +import org.bukkit.scheduler.BukkitRunnable; +import org.cavepvp.profiles.Profiles; +import org.cavepvp.profiles.playerProfiles.PlayerProfileAPI; +import org.cavepvp.profiles.playerProfiles.impl.stats.StatisticType; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; + +public class EventListener implements Listener { + + public EventListener() { + Bukkit.getLogger().info("Creating indexes..."); + DBCollection mongoCollection = Foxtrot.getInstance().getMongoPool().getDB(Foxtrot.MONGO_DB_NAME).getCollection("KOTHCaptures"); + mongoCollection.createIndex(new BasicDBObject("Capper", 1)); + mongoCollection.createIndex(new BasicDBObject("CapperTeam", 1)); + mongoCollection.createIndex(new BasicDBObject("EventName", 1)); + Bukkit.getLogger().info("Creating indexes done."); + } + + @EventHandler + public void onKOTHActivated(EventActivatedEvent event) { + if (event.getEvent().isHidden()) { + return; + } + + String[] messages; + + switch (event.getEvent().getName()) { + case "EOTW": + messages = new String[]{ + ChatColor.RED + "███████", + ChatColor.RED + "█" + ChatColor.DARK_RED + "█████" + ChatColor.RED + "█" + " " + ChatColor.DARK_RED + "[EOTW]", + ChatColor.RED + "█" + ChatColor.DARK_RED + "█" + ChatColor.RED + "█████" + " " + ChatColor.RED + ChatColor.BOLD + "The cap point at spawn", + ChatColor.RED + "█" + ChatColor.DARK_RED + "████" + ChatColor.RED + "██" + " " + ChatColor.RED + ChatColor.BOLD + "is now active.", + ChatColor.RED + "█" + ChatColor.DARK_RED + "█" + ChatColor.RED + "█████" + " " + ChatColor.DARK_RED + "EOTW " + ChatColor.GOLD + "can be contested now.", + ChatColor.RED + "█" + ChatColor.DARK_RED + "█████" + ChatColor.RED + "█", + ChatColor.RED + "███████" + }; + + for (Player player : Foxtrot.getInstance().getServer().getOnlinePlayers()) { + player.playSound(player.getLocation(), Sound.WITHER_SPAWN, 1F, 1F); + } + + break; + case "Citadel": + messages = new String[]{ + ChatColor.GRAY + "███████", + ChatColor.GRAY + "██" + ChatColor.DARK_PURPLE + "████" + ChatColor.GRAY + "█", + ChatColor.GRAY + "█" + ChatColor.DARK_PURPLE + "█" + ChatColor.GRAY + "█████ " + ChatColor.GOLD + "[Citadel]", + ChatColor.GRAY + "█" + ChatColor.DARK_PURPLE + "█" + ChatColor.GRAY + "█████ " + ChatColor.DARK_PURPLE + event.getEvent().getName(), + ChatColor.GRAY + "█" + ChatColor.DARK_PURPLE + "█" + ChatColor.GRAY + "█████ " + ChatColor.GOLD + "can be contested now.", + ChatColor.GRAY + "█" + ChatColor.DARK_PURPLE + "█" + ChatColor.GRAY + "█████", + ChatColor.GRAY + "██" + ChatColor.DARK_PURPLE + "████" + ChatColor.GRAY + "█", + ChatColor.GRAY + "███████" + }; + + break; + + case "NetherCitadel": + messages = new String[]{ + ChatColor.GRAY + "███████", + ChatColor.GRAY + "██" + ChatColor.DARK_RED + "████" + ChatColor.GRAY + "█", + ChatColor.GRAY + "█" + ChatColor.DARK_RED + "█" + ChatColor.GRAY + "█████ " + ChatColor.GOLD + "[Nether Citadel]", + ChatColor.GRAY + "█" + ChatColor.DARK_RED + "█" + ChatColor.GRAY + "█████ " + ChatColor.DARK_RED + "Nether Citadel", + ChatColor.GRAY + "█" + ChatColor.DARK_RED + "█" + ChatColor.GRAY + "█████ " + ChatColor.GOLD + "can be contested now.", + ChatColor.GRAY + "█" + ChatColor.DARK_RED + "█" + ChatColor.GRAY + "█████", + ChatColor.GRAY + "██" + ChatColor.DARK_RED + "████" + ChatColor.GRAY + "█", + ChatColor.GRAY + "███████" + }; + + break; + + default: + messages = new String[]{ + ChatColor.GRAY + "███████", + ChatColor.GRAY + "█" + ChatColor.DARK_AQUA + "█" + ChatColor.GRAY + "███" + ChatColor.DARK_AQUA + "█" + ChatColor.GRAY + "█", + ChatColor.GRAY + "█" + ChatColor.DARK_AQUA + "█" + ChatColor.GRAY + "██" + ChatColor.DARK_AQUA + "█" + ChatColor.GRAY + "██" + " " + ChatColor.GOLD + "[KingOfTheHill]", + ChatColor.GRAY + "█" + ChatColor.DARK_AQUA + "███" + ChatColor.GRAY + "███" + " " + ChatColor.YELLOW + event.getEvent().getName() + " KOTH", + ChatColor.GRAY + "█" + ChatColor.DARK_AQUA + "█" + ChatColor.GRAY + "██" + ChatColor.DARK_AQUA + "█" + ChatColor.GRAY + "██" + " " + ChatColor.GOLD + "can be contested now.", + ChatColor.GRAY + "█" + ChatColor.DARK_AQUA + "█" + ChatColor.GRAY + "███" + ChatColor.DARK_AQUA + "█" + ChatColor.GRAY + "█", + ChatColor.GRAY + "█" + ChatColor.DARK_AQUA + "█" + ChatColor.GRAY + "███" + ChatColor.DARK_AQUA + "█" + ChatColor.GRAY + "█", + ChatColor.GRAY + "███████" + }; + + break; + } + + if (event.getEvent().getType() == EventType.DTC) { + messages = new String[]{ + ChatColor.RED + "███████", + ChatColor.RED + "█" + ChatColor.GOLD + "█████" + ChatColor.RED + "█" + " " + ChatColor.GOLD + "[Event]", + ChatColor.RED + "█" + ChatColor.GOLD + "█" + ChatColor.RED + "█████" + " " + ChatColor.YELLOW + "DTC", + ChatColor.RED + "█" + ChatColor.GOLD + "████" + ChatColor.RED + "██" + " " + ChatColor.GOLD + "can be contested now.", + ChatColor.RED + "█" + ChatColor.GOLD + "█" + ChatColor.RED + "█████", + ChatColor.RED + "█" + ChatColor.GOLD + "█████" + ChatColor.RED + "█", + ChatColor.RED + "███████" + }; + } + + final String[] messagesFinal = messages; + + for (Player player : Foxtrot.getInstance().getServer().getOnlinePlayers()) { + player.sendMessage(messagesFinal); + } + + // Can't forget console now can we + for (String message : messages) { + Foxtrot.getInstance().getLogger().info(message); + } + } + + @EventHandler + public void onKOTHCaptured(final EventCapturedEvent event) { + if (event.getEvent().isHidden()) { + return; + } + + final Team team = Foxtrot.getInstance().getTeamHandler().getTeam(event.getPlayer()); + String teamName = ChatColor.GOLD + "[" + ChatColor.YELLOW + "-" + ChatColor.GOLD + "]"; + + if (team != null) { + teamName = ChatColor.GOLD + "[" + ChatColor.YELLOW + team.getName() + ChatColor.GOLD + "]"; + } + + String[] messages; + + if (event.getEvent().getName().contains("Citadel")) { + messages = new String[]{ + ChatColor.GRAY + "███████", + ChatColor.GRAY + "██" + ChatColor.DARK_PURPLE + "████" + ChatColor.GRAY + "█", + ChatColor.GRAY + "█" + ChatColor.DARK_PURPLE + "█" + ChatColor.GRAY + "█████ " + ChatColor.GOLD + "[Citadel]", + ChatColor.GRAY + "█" + ChatColor.DARK_PURPLE + "█" + ChatColor.GRAY + "█████ " + ChatColor.YELLOW + "controlled by", + ChatColor.GRAY + "█" + ChatColor.DARK_PURPLE + "█" + ChatColor.GRAY + "█████ " + teamName + ChatColor.WHITE + event.getPlayer().getDisplayName(), + ChatColor.GRAY + "█" + ChatColor.DARK_PURPLE + "█" + ChatColor.GRAY + "█████", + ChatColor.GRAY + "██" + ChatColor.DARK_PURPLE + "████" + ChatColor.GRAY + "█", + ChatColor.GRAY + "███████" + }; + + + if (!Foxtrot.getInstance().getServerHandler().isAu()) { + PlayerProfileAPI.addStatistic(event.getPlayer().getUniqueId(), Foxtrot.getInstance().getStatisticServer(), StatisticType.CITADELS_CAPTURED, 1); + } + + Profiles.getInstance().getReputationHandler().addReputation(event.getPlayer().getUniqueId(), event.getPlayer().getName(), 25); + + ItemStack rewardKey = InventoryUtils.generateKOTHRewardKey(event.getEvent().getName() + " KOTH"); + rewardKey.setAmount(6); + + event.getPlayer().getInventory().addItem(rewardKey); + + if (!event.getPlayer().getInventory().contains(rewardKey)) { + event.getPlayer().getWorld().dropItemNaturally(event.getPlayer().getLocation(), rewardKey); + } + } else if (event.getEvent().getName().equalsIgnoreCase("EOTW")) { + messages = new String[]{ + ChatColor.RED + "███████", + ChatColor.RED + "█" + ChatColor.DARK_RED + "█████" + ChatColor.RED + "█" + " " + ChatColor.DARK_RED + "[EOTW]", + ChatColor.RED + "█" + ChatColor.DARK_RED + "█" + ChatColor.RED + "█████" + " " + ChatColor.RED + ChatColor.BOLD + "EOTW has been", + ChatColor.RED + "█" + ChatColor.DARK_RED + "████" + ChatColor.RED + "██" + " " + ChatColor.RED + ChatColor.BOLD + "controlled by", + ChatColor.RED + "█" + ChatColor.DARK_RED + "█" + ChatColor.RED + "█████" + " " + teamName + ChatColor.WHITE + event.getPlayer().getDisplayName(), + ChatColor.RED + "█" + ChatColor.DARK_RED + "█████" + ChatColor.RED + "█", + ChatColor.RED + "███████", + }; + if (team != null) + team.setEotwCapped(true); + } else if (event.getEvent().getType() == EventType.DTC) { + messages = new String[]{ + ChatColor.RED + "███████", + ChatColor.RED + "█" + ChatColor.GOLD + "█████" + ChatColor.RED + "█" + " " + ChatColor.GOLD + "[Event]", + ChatColor.RED + "█" + ChatColor.GOLD + "█" + ChatColor.RED + "█████" + " " + ChatColor.YELLOW + ChatColor.BOLD + "DTC has been", + ChatColor.RED + "█" + ChatColor.GOLD + "████" + ChatColor.RED + "██" + " " + ChatColor.YELLOW + ChatColor.BOLD + "controlled by", + ChatColor.RED + "█" + ChatColor.GOLD + "█" + ChatColor.RED + "█████" + " " + teamName + ChatColor.WHITE + event.getPlayer().getDisplayName(), + ChatColor.RED + "█" + ChatColor.GOLD + "█████" + ChatColor.RED + "█", + ChatColor.RED + "███████", + }; + + ItemStack kothSign = Foxtrot.getInstance().getServerHandler().generateKOTHSign(event.getEvent().getName(), team == null ? event.getPlayer().getName() : team.getName(), EventType.DTC); + event.getPlayer().getInventory().addItem(kothSign); + + if (!event.getPlayer().getInventory().contains(kothSign)) { + event.getPlayer().getWorld().dropItemNaturally(event.getPlayer().getLocation(), kothSign); + } + } else { + final KOTH koth = (KOTH) event.getEvent(); + + messages = new String[]{ + ChatColor.GOLD + "[KingOfTheHill] " + ChatColor.BLUE + event.getEvent().getName() + ChatColor.YELLOW + " has been controlled by " + teamName + ChatColor.WHITE + event.getPlayer().getDisplayName() + ChatColor.YELLOW + "!", + ChatColor.GOLD + "[KingOfTheHill] " + ChatColor.YELLOW + "Awarded" + ChatColor.BLUE + " KOTH Key" + ChatColor.YELLOW + " to " + teamName + ChatColor.WHITE + event.getPlayer().getDisplayName() + ChatColor.YELLOW + "." + }; + + ItemStack kothSign = Foxtrot.getInstance().getServerHandler().generateKOTHSign(event.getEvent().getName(), team == null ? event.getPlayer().getName() : team.getName(), EventType.KOTH); + + if (!Foxtrot.getInstance().getServerHandler().isAu()) { + PlayerProfileAPI.addStatistic(event.getPlayer().getUniqueId(), Foxtrot.getInstance().getStatisticServer(), StatisticType.KOTH_CAPTURES, 1); + } + + event.getPlayer().getInventory().addItem(kothSign); + + if (!event.getPlayer().getInventory().contains(kothSign)) { + event.getPlayer().getWorld().dropItemNaturally(event.getPlayer().getLocation(), kothSign); + } + +// if (Foxtrot.getInstance().getMapHandler().isKitMap()) { + ItemStack rewardKey = InventoryUtils.generateKOTHRewardKey(event.getEvent().getName() + " KOTH"); + + if (Foxtrot.getInstance().getMapHandler().isKitMap() || event.getEvent().getName().equalsIgnoreCase("End") || event.getEvent().getName().equalsIgnoreCase("Hell")) { + rewardKey.setAmount(2); + } + + event.getPlayer().getInventory().addItem(rewardKey); + + if (!event.getPlayer().getInventory().contains(rewardKey)) { + event.getPlayer().getWorld().dropItemNaturally(event.getPlayer().getLocation(), rewardKey); + } +// } else { +// Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "cr givekey " + event.getPlayer().getName() + " koth 3"); +// } + + if (Foxtrot.getInstance().getMapHandler().isKitMap()) { + Foxtrot.getInstance().getGemMap().addGems(event.getPlayer().getUniqueId(), 25, true); + } + + Team playerTeam = Foxtrot.getInstance().getTeamHandler().getTeam(event.getPlayer()); + if (playerTeam != null) { + + if (koth.isMini()) { + playerTeam.setMiniKothCaptures(playerTeam.getMiniKothCaptures()+1); + } else { + playerTeam.setKothCaptures(playerTeam.getKothCaptures() + 1); + } + + if (!Foxtrot.getInstance().getMapHandler().isKitMap() && (event.getEvent().getName().equalsIgnoreCase("Hell") || event.getEvent().getName().equalsIgnoreCase("End"))) { + playerTeam.setDoublePoints(playerTeam.getDoublePoints()+15); + } + + if (CustomTimerCreateCommand.isDoublePoints() || playerTeam.hasNetherOutpost()) { + playerTeam.setDoublePoints(playerTeam.getDoublePoints() + (koth.isMini() ? 10 : 20)); + } + } + } + + StatsEntry stats = Foxtrot.getInstance().getMapHandler().getStatsHandler().getStats(event.getPlayer()); + stats.addKothCapture(); + Profiles.getInstance().getReputationHandler().addReputation(event.getPlayer().getUniqueId(), event.getPlayer().getName(), 10); + + final String[] messagesFinal = messages; + + new BukkitRunnable() { + + public void run() { + for (Player player : Foxtrot.getInstance().getServer().getOnlinePlayers()) { + player.sendMessage(""); + player.sendMessage(messagesFinal); + player.sendMessage(""); + } + } + + }.runTaskAsynchronously(Foxtrot.getInstance()); + + // Can't forget console now can we + // but we don't want to give console the filler. + for (String message : messages) { + Foxtrot.getInstance().getLogger().info(message); + } + + final BasicDBObject dbObject = new BasicDBObject(); + + dbObject.put("EventName", event.getEvent().getName()); + dbObject.put("EventType", event.getEvent().getType().name()); + dbObject.put("CapturedAt", new Date()); + dbObject.put("Capper", event.getPlayer().getUniqueId().toString().replace("-", "")); + dbObject.put("CapperTeam", team == null ? null : team.getUniqueId().toString()); + if (event.getEvent().getType() == EventType.KOTH) { + dbObject.put("EventLocation", LocationSerializer.serialize(((KOTH) event.getEvent()).getCapLocation().toLocation(event.getPlayer().getWorld()))); + } + + new BukkitRunnable() { + + public void run() { + DBCollection kothCapturesCollection = Foxtrot.getInstance().getMongoPool().getDB(Foxtrot.MONGO_DB_NAME).getCollection("KOTHCaptures"); + kothCapturesCollection.insert(dbObject); + } + + }.runTaskAsynchronously(Foxtrot.getInstance()); + } + + @EventHandler + public void onKOTHControlLost(final KOTHControlLostEvent event) { + if (event.getKOTH().getRemainingCapTime() <= (event.getKOTH().getCapTime() - 30)) { + Foxtrot.getInstance().getServer().broadcastMessage(ChatColor.GOLD + "[KingOfTheHill] Control of " + ChatColor.YELLOW + event.getKOTH().getName() + ChatColor.GOLD + " lost."); + } + } + + @EventHandler + public void onKOTHDeactivated(EventDeactivatedEvent event) { + if (!(event.getEvent() instanceof KOTH)) { + return; + } + + // activate koths every 10m on the kitmap + if (!Foxtrot.getInstance().getMapHandler().isKitMap()) { + return; + } + + Bukkit.getScheduler().runTaskLater(Foxtrot.getInstance(), () -> { + net.frozenorb.foxtrot.gameplay.events.EventHandler eventHandler = Foxtrot.getInstance().getEventHandler(); + List localEvents = new ArrayList<>(eventHandler.getEvents()); + + if (localEvents.isEmpty()) { + return; + } + + List koths = new ArrayList<>(); + + for (Event otherKoth : Foxtrot.getInstance().getEventHandler().getEvents()) { + if (otherKoth.isActive()) { + return; + } + + if (otherKoth.getName().contains("Citadel") || otherKoth.getName().contains("Outpost")) { + continue; + } + + if (otherKoth.getType() == EventType.KOTH) { + koths.add((KOTH) otherKoth); + } + } + + KOTH selected = koths.get(ThreadLocalRandom.current().nextInt(koths.size())); + selected.activate(); + }, 10 * 60 * 20); + } + +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/EventParameterType.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/EventParameterType.java new file mode 100644 index 0000000..c2390d2 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/EventParameterType.java @@ -0,0 +1,53 @@ +package net.frozenorb.foxtrot.gameplay.events; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import com.mysql.jdbc.StringUtils; + +import net.frozenorb.foxtrot.Foxtrot; +import cc.fyre.proton.command.param.ParameterType; + +public class EventParameterType implements ParameterType { + + public Event transform(CommandSender sender, String source) { + if (source.equals("active")) { + for (Event event : Foxtrot.getInstance().getEventHandler().getEvents()) { + if (event.isActive() && !event.isHidden()) { + return event; + } + } + + sender.sendMessage(ChatColor.RED + "There is no active Event at the moment."); + + return null; + } + + Event event = Foxtrot.getInstance().getEventHandler().getEvent(source); + + if (event == null) { + sender.sendMessage(ChatColor.RED + "No Event with the name " + source + " found."); + return (null); + } + + return (event); + } + + public List tabComplete(Player sender, Set flags, String source) { + List completions = new ArrayList<>(); + + for (Event event : Foxtrot.getInstance().getEventHandler().getEvents()) { + if (StringUtils.startsWithIgnoreCase(event.getName(), source)) { + completions.add(event.getName()); + } + } + + return (completions); + } + +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/EventScheduledTime.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/EventScheduledTime.java new file mode 100644 index 0000000..e29b78f --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/EventScheduledTime.java @@ -0,0 +1,91 @@ +package net.frozenorb.foxtrot.gameplay.events; + +import java.util.Calendar; +import java.util.Date; + +import net.minecraft.util.com.google.common.primitives.Ints; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import net.minecraft.util.com.google.common.base.Objects; + +@AllArgsConstructor +public class EventScheduledTime implements Comparable { + + @Getter private int day; + @Getter private int hour; + @Getter private int minutes; + + public static EventScheduledTime parse(String input) { + String[] inputSplit = input.split(" "); + + int days = Integer.parseInt(inputSplit[0]); + + String[] timeSplit = inputSplit[1].split(":"); + int hour = Integer.parseInt(timeSplit[0]); + int minutes = timeSplit.length > 1 ? Integer.parseInt(timeSplit[1]) : 0; + + return (new EventScheduledTime(days, hour, minutes)); + } + + public static EventScheduledTime parse(Date input) { + Calendar calendar = Calendar.getInstance(); + + calendar.setTime(input); + + int days = calendar.get(Calendar.DAY_OF_YEAR); + int hour = calendar.get(Calendar.HOUR_OF_DAY); + int minutes = calendar.get(Calendar.MINUTE); + + return (new EventScheduledTime(days, hour, minutes)); + } + + public Date toDate() { + Calendar activationTime = Calendar.getInstance(); + + activationTime.set(Calendar.DAY_OF_YEAR, day); + activationTime.set(Calendar.HOUR_OF_DAY, hour); + activationTime.set(Calendar.MINUTE, minutes); + activationTime.set(Calendar.SECOND, 0); + activationTime.set(Calendar.MILLISECOND, 0); + + return (activationTime.getTime()); + } + + @Override + public boolean equals(Object object) { + if (object instanceof EventScheduledTime) { + EventScheduledTime other = (EventScheduledTime) object; + + return (other.day == this.day && other.hour == this.hour && other.minutes == this.minutes); + } + + return (false); + } + + @Override + public int hashCode() { + return Objects.hashCode(day, hour, minutes); + } + + @Override + public int compareTo(EventScheduledTime other) { + int result = Ints.compare(day, other.day); + + if (result == 0) { + result = Ints.compare(hour, other.hour); + } + + if (result == 0) { + result = Ints.compare(minutes, other.minutes); + } + + return (result); + } + + @Override + public String toString() { + return (day + " " + hour + ":" + minutes); + } + +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/EventType.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/EventType.java new file mode 100644 index 0000000..0f3173b --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/EventType.java @@ -0,0 +1,5 @@ +package net.frozenorb.foxtrot.gameplay.events; + +public enum EventType { + KOTH, DTC, CARNAGE +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/carnage/Carnage.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/carnage/Carnage.java new file mode 100644 index 0000000..de1e78c --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/carnage/Carnage.java @@ -0,0 +1,52 @@ +package net.frozenorb.foxtrot.gameplay.events.carnage; + +public class Carnage /*implements Event*/ { + + /*private final static + + + @Override + public String getKitName() { + return null; + } + + @Override + public boolean isActive() { + return false; + } + + @Override + public void tick() { + + } + + @Override + public void setActive(boolean active) { + + } + + @Override + public boolean isHidden() { + return false; + } + + @Override + public void setHidden(boolean hidden) { + + } + + @Override + public boolean activate() { + return false; + } + + @Override + public boolean deactivate() { + return false; + } + + @Override + public EventType getType() { + return null; + }*/ +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/cavenite/CaveNiteHandler.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/cavenite/CaveNiteHandler.java new file mode 100644 index 0000000..36a602e --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/cavenite/CaveNiteHandler.java @@ -0,0 +1,353 @@ +package net.frozenorb.foxtrot.gameplay.events.cavenite; + +import cc.fyre.proton.scoreboard.construct.ScoreFunction; +import cc.fyre.proton.util.ItemBuilder; +import cc.fyre.proton.util.PlayerUtils; +import cc.fyre.proton.util.TimeUtils; +import lombok.Getter; +import lombok.Setter; +import mkremins.fanciful.FancyMessage; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.events.cavenite.listener.CaveNiteListener; +import net.frozenorb.foxtrot.server.voucher.VoucherCommand; +import net.frozenorb.foxtrot.team.Team; +import net.frozenorb.foxtrot.team.claims.Claim; +import net.frozenorb.foxtrot.util.CuboidRegion; +import net.frozenorb.foxtrot.util.PersistableLocation; +import org.bukkit.*; +import org.bukkit.block.Chest; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; +import org.bukkit.scheduler.BukkitRunnable; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; +import java.util.concurrent.ThreadLocalRandom; +import java.util.stream.Collectors; + +public class CaveNiteHandler { + private Foxtrot instance; + + @Getter @Setter private long started = 0; + @Getter private final List playersRemaining = new ArrayList<>(); + @Getter private final List spectators = new ArrayList<>(); + @Getter private final List locations = new ArrayList<>(); + @Getter @Setter private int scatterIn = 0; + @Getter @Setter private int startIn = 0; + @Getter private int startedWith = 0; + @Getter @Setter private CaveNiteState gameState = CaveNiteState.INACTIVE; + @Getter private final List chestLocations = new ArrayList<>(); + @Getter private final List chestLoot = new ArrayList<>(); + + @Getter private File file; + @Getter private FileConfiguration data; + + public CaveNiteHandler(Foxtrot instance) { + this.instance = instance; + + this.instance.getServer().getPluginManager().registerEvents(new CaveNiteListener(this.instance, this), this.instance); + + new GameTask(this.instance, this).runTaskTimer(this.instance, 60, 60); + + this.loadLocations(); + } + + public void loadLocations() { + this.file = new File(Foxtrot.getInstance().getDataFolder(), "data/cavenite.yml"); + this.data = YamlConfiguration.loadConfiguration(this.file); + + if (!this.file.exists()) { + try { + this.file.createNewFile(); + } catch (IOException e) { + e.printStackTrace(); + } + return; + } + + if (this.data.get("locations") == null) { + return; + } + + this.instance.getServer().getScheduler().runTaskLater(this.instance, () -> this.data.getConfigurationSection("locations").getKeys(false).forEach(it -> + this.locations.add(((PersistableLocation) data.get("locations." + it)).getLocation())), 30L); + } + + public void saveLocations() { + this.data.getValues(false).forEach((key, value) -> this.data.set(key, null)); + + int i = 0; + + for (Location location : this.locations) { + i++; + this.data.set("locations.location_" + i, new PersistableLocation(location)); + } + + try { + this.data.save(this.file); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public void start() { + final Server server = Foxtrot.getInstance().getServer(); + + this.scatterIn = 90; + this.gameState = CaveNiteState.WAITING; + + this.respawnChests(); + + new BukkitRunnable() { + @Override + public void run() { + if (scatterIn <= 0) { + scatter(); + + server.broadcastMessage(ChatColor.GREEN + "Cave Nite has started!"); + + startIn = 30; + gameState = CaveNiteState.SCATTERING; + startedWith = getOnlinePlayers().size(); + + this.cancel(); + return; + } + + scatterIn--; + + if (scatterIn % 10 == 0 || scatterIn <= 5) { + for (Player onlinePlayer : instance.getServer().getOnlinePlayers()) { + onlinePlayer.sendMessage(""); + onlinePlayer.sendMessage(ChatColor.translate("&7███████")); + new FancyMessage(ChatColor.translate("&7█" + "&4█████" + "&7█ &4&lCave Nite")).tooltip(ChatColor.GREEN + "Click to join").command("/cavenite join").send(onlinePlayer); + new FancyMessage(ChatColor.translate("&7█" + "&4█" + "&7█████ &f")).tooltip(ChatColor.GREEN + "Click to join").command("/cavenite join").send(onlinePlayer); + new FancyMessage(ChatColor.translate("&7█" + "&4█" + "&7█████ &7Players: &f" + getOnlinePlayers().size() + "/" + getLocations().size())).tooltip(ChatColor.GREEN + "Click to join").command("/cavenite join").send(onlinePlayer); + new FancyMessage(ChatColor.translate("&7█" + "&4█" + "&7█████ &7Starts In: &f" + scatterIn + " seconds")).tooltip(ChatColor.GREEN + "Click to join").command("/cavenite join").send(onlinePlayer); + new FancyMessage(ChatColor.translate("&7█" + "&4█████" + "&7█ &aClick here to join the event")).tooltip(ChatColor.GREEN + "Click to join").command("/cavenite join").send(onlinePlayer); + onlinePlayer.sendMessage(ChatColor.translate("&7███████")); + onlinePlayer.sendMessage(""); + } + } + } + }.runTaskTimer(this.instance, 20, 20); + } + + public void scatter() { + final Server server = this.instance.getServer(); + + new BukkitRunnable() { + @Override + public void run() { + if (startIn <= 0) { + this.cancel(); + gameState = CaveNiteState.RUNNING; + started = System.currentTimeMillis(); + + server.broadcastMessage(""); + server.broadcastMessage(ChatColor.DARK_RED + ChatColor.BOLD.toString() + "Cave Nite"); + server.broadcastMessage(ChatColor.GRAY + "Cave Nite has started! Good luck have fun!"); + server.broadcastMessage(""); + + getOnlinePlayers().forEach(it -> { + it.closeInventory(); + it.playSound(it.getLocation(), Sound.WITHER_SPAWN, 1F, 1F); + it.addPotionEffect(new PotionEffect(PotionEffectType.INVISIBILITY, Integer.MAX_VALUE, 0)); + it.removePotionEffect(PotionEffectType.SLOW); + it.removePotionEffect(PotionEffectType.BLINDNESS); + }); + + getOnlinePlayers().forEach(it -> it.playSound(it.getLocation(), Sound.LEVEL_UP, 1, 1)); + return; + } + + startIn--; + + if (startIn == 20 || startIn == 10 || startIn <= 5) { + getOnlinePlayers().forEach(it -> it.playSound(it.getLocation(), Sound.NOTE_PLING, 1, 1)); + server.broadcastMessage(""); + server.broadcastMessage(ChatColor.DARK_RED + ChatColor.BOLD.toString() + "Cave Nite"); + server.broadcastMessage(ChatColor.GRAY + "Cave Nite begins in " + ChatColor.WHITE + startIn + " seconds" + ChatColor.GRAY + "."); + server.broadcastMessage(""); + } + } + }.runTaskTimer(this.instance, 20, 20); + + final List toTeleport = new ArrayList<>(this.getOnlinePlayers()); + final List toUse = new ArrayList<>(this.getLocations()); + + for (Player onlinePlayer : this.getOnlinePlayers()) { + + toTeleport.remove(onlinePlayer); + + onlinePlayer.playSound(onlinePlayer.getLocation(), Sound.PORTAL_TRAVEL, 1, 1); + onlinePlayer.sendMessage(ChatColor.GREEN + "You have been scattered across the map!"); + onlinePlayer.addPotionEffect(new PotionEffect(PotionEffectType.BLINDNESS, Integer.MAX_VALUE, 255)); + onlinePlayer.addPotionEffect(new PotionEffect(PotionEffectType.SLOW, Integer.MAX_VALUE, 255)); + onlinePlayer.teleport(toUse.get(0)); + onlinePlayer.getInventory().clear(); + + server.dispatchCommand(server.getConsoleSender(), "kit apply Diamond2 " + onlinePlayer.getName()); + } + + } + + public void addPlayer(Player player) { + PlayerUtils.resetInventory(player, GameMode.ADVENTURE); + + this.getPlayersRemaining().add(player.getUniqueId()); + + this.getOnlinePlayers().forEach(it -> { + it.playSound(it.getLocation(), Sound.NOTE_PLING, 1, 1); + it.sendMessage(ChatColor.translate(player.getDisplayName() + " &chas joined the game! &7[" + this.getOnlinePlayers().size() + "/" + this.getLocations().size() + "]")); + }); + } + + public void addSpectator(Player player) { + spectators.add(player.getUniqueId()); + + PlayerUtils.resetInventory(player, GameMode.ADVENTURE); + player.setAllowFlight(true); + player.setFlying(true); + player.getInventory().setItem(4, ItemBuilder.of(Material.WATCH).name(ChatColor.GOLD + ChatColor.BOLD.toString() + "Spectate Menu").build()); +// player.teleport(this.getOnlinePlayers().get(ThreadLocalRandom.current().nextInt(this.getOnlinePlayers().size()))); + + player.spigot().setCollidesWithEntities(false); + + this.getOnlinePlayers().forEach(it -> it.hidePlayer(player)); + } + + public void disqualify(Player player) { + this.playersRemaining.remove(player.getUniqueId()); + + if (this.getOnlinePlayers().size() <= 1) { + this.endGame(false); + } + } + + public void endGame(boolean force) { + + final Server server = this.instance.getServer(); + server.broadcastMessage(ChatColor.RED + "Game over!"); + + this.gameState = CaveNiteState.ENDING; + + server.dispatchCommand(server.getConsoleSender(), "reboot 15s"); + + if (force) { + server.broadcastMessage(""); + server.broadcastMessage(ChatColor.DARK_RED + ChatColor.BOLD.toString() + "Cave Nite"); + server.broadcastMessage(ChatColor.WHITE + "The game is now over!"); + server.broadcastMessage(ChatColor.GRAY + "The game has been forcefully cancelled"); + server.broadcastMessage(""); + return; + } + + this.getOnlinePlayers().stream().findFirst().ifPresent(it -> { + + this.getOnlineSpectators().forEach(spectator -> spectator.teleport(it.getLocation().clone())); + + VoucherCommand.spawnFireworks(it.getLocation(), 3, 2, Color.RED, FireworkEffect.Type.BALL_LARGE); + + server.broadcastMessage(""); + server.broadcastMessage(ChatColor.DARK_RED + ChatColor.BOLD.toString() + "Cave Nite"); + server.broadcastMessage(ChatColor.WHITE + "The game is now over!"); + server.broadcastMessage(ChatColor.translate(it.getName() + " &7has won the game!")); + server.broadcastMessage(""); + }); + } + + public void scanLoot() { + this.chestLocations.clear(); + + for (Team team : Foxtrot.getInstance().getTeamHandler().getTeams()) { + if (team.getOwner() != null) { + continue; + } + + if (team.getName().equalsIgnoreCase("CaveNite")) { + for (Claim claim : team.getClaims()) { + for (Location location : new CuboidRegion("CaveNite", claim.getMinimumPoint(), claim.getMaximumPoint())) { + if (location.getBlock().getType() == Material.CHEST) { + this.chestLocations.add(location); + } + } + } + } + } + } + + public void respawnChests() { + for (Location location : this.chestLocations) { + if (!(location.getBlock().getState() instanceof Chest)) { + continue; + } + + final Chest chest = (Chest) location.getBlock().getState(); + + chest.getInventory().clear(); + + for (int i = 0; i < 4; i++) { + final ItemStack randomItem = Foxtrot.getInstance().getCaveNiteHandler().getChestLoot().get(ThreadLocalRandom.current().nextInt(Foxtrot.getInstance().getCaveNiteHandler().getChestLoot().size())); + + chest.getInventory().addItem(randomItem.clone()); + } + } + } + + public List getOnlinePlayers() { + return this.playersRemaining.stream().filter(it -> this.instance.getServer().getPlayer(it) != null).map(it -> this.instance.getServer().getPlayer(it)).collect(Collectors.toList()); + } + + public List getOnlineSpectators() { + return this.spectators.stream().filter(it -> this.instance.getServer().getPlayer(it) != null).map(it -> this.instance.getServer().getPlayer(it)).collect(Collectors.toList()); + } + + public List getScoreboardLines() { + final List toReturn = new ArrayList<>(); + + toReturn.add("&4&lCave Nite"); + + if (this.gameState == CaveNiteState.ENDING) { + final Player lastPlayer = this.getOnlinePlayers().get(0); + + toReturn.add("&7Winner: &f" + (lastPlayer == null ? "N/A" : lastPlayer.getDisplayName())); + toReturn.add("&7Spectators: &f" + this.getOnlineSpectators().size()); + toReturn.add(""); + toReturn.add(ChatColor.RED + "The game is now over!"); + } + + if (this.gameState == CaveNiteState.RUNNING) { + long difference = System.currentTimeMillis()-this.started; + + toReturn.add("&7Remaining: &f" + this.getOnlinePlayers().size() + "/" + this.startedWith); + toReturn.add("&7Time Elapsed: &f" + ScoreFunction.TIME_FANCY.apply((float) (difference/1000))); + toReturn.add(""); + toReturn.add("&a/cavenite spectate"); + } + + if (this.gameState == CaveNiteState.SCATTERING) { + toReturn.add("&7Queued: &f" + this.getOnlinePlayers().size()); + toReturn.add("&7Starting In: &f" + TimeUtils.formatIntoMMSS(this.startIn)); + toReturn.add(""); + toReturn.add("&a/cavenite spectate"); + } + + if (this.gameState == CaveNiteState.WAITING) { + toReturn.add("&7Queued: &f" + this.getOnlinePlayers().size()); + toReturn.add("&7Scatter In: &f" + TimeUtils.formatIntoMMSS(this.scatterIn)); + toReturn.add(""); + toReturn.add("&a/cavenite join"); + } + + return toReturn; + } + +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/cavenite/CaveNiteState.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/cavenite/CaveNiteState.java new file mode 100644 index 0000000..5f36990 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/cavenite/CaveNiteState.java @@ -0,0 +1,10 @@ +package net.frozenorb.foxtrot.gameplay.events.cavenite; + +public enum CaveNiteState { + INACTIVE, + WAITING, + SCATTERING, + RUNNING, + ENDING + +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/cavenite/GameTask.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/cavenite/GameTask.java new file mode 100644 index 0000000..c97011e --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/cavenite/GameTask.java @@ -0,0 +1,41 @@ +package net.frozenorb.foxtrot.gameplay.events.cavenite; + +import lombok.AllArgsConstructor; +import net.frozenorb.foxtrot.Foxtrot; +import org.bukkit.Effect; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.block.Chest; +import org.bukkit.scheduler.BukkitRunnable; + +import java.util.Arrays; + +@AllArgsConstructor +public class GameTask extends BukkitRunnable { + private Foxtrot instance; + private CaveNiteHandler caveNiteHandler; + + @Override + public void run() { + if (caveNiteHandler.getGameState() != CaveNiteState.RUNNING) { + return; + } + + for (Location chestLocation : caveNiteHandler.getChestLocations()) { + + if (chestLocation.getBlock() == null || chestLocation.getBlock().getType() != Material.CHEST) { + continue; + } + + final Chest chest = (Chest) chestLocation.getBlock().getState(); + + if (Arrays.stream(chest.getInventory().getContents()).noneMatch(it -> it != null && it.getType() != Material.AIR)) { + continue; + } + + chestLocation.getWorld().playEffect(chestLocation, Effect.ENDER_SIGNAL, 1); + chestLocation.getWorld().playSound(chestLocation, Sound.PORTAL_TRAVEL, 0.03F, 1); + } + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/cavenite/SpectateMenu.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/cavenite/SpectateMenu.java new file mode 100644 index 0000000..a8c1dfa --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/cavenite/SpectateMenu.java @@ -0,0 +1,72 @@ +package net.frozenorb.foxtrot.gameplay.events.cavenite; + +import cc.fyre.proton.menu.Button; +import cc.fyre.proton.menu.pagination.PaginatedMenu; +import cc.fyre.proton.util.ItemBuilder; +import net.frozenorb.foxtrot.Foxtrot; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class SpectateMenu extends PaginatedMenu { + @Override + public String getPrePaginatedTitle(Player player) { + return "Spectate"; + } + + @Override + public Map getAllPagesButtons(Player player) { + final Map toReturn = new HashMap<>(); + + final CaveNiteHandler caveNiteHandler = Foxtrot.getInstance().getCaveNiteHandler(); + + for (Player onlinePlayer : caveNiteHandler.getOnlinePlayers()) { + toReturn.put(toReturn.size(), new Button() { + @Override + public String getName(Player player) { + return ChatColor.WHITE + onlinePlayer.getDisplayName(); + } + + @Override + public List getDescription(Player player) { + final List toReturn = new ArrayList<>(); + + toReturn.add(""); + toReturn.add(ChatColor.YELLOW + "Click to teleport to this player"); + + return toReturn; + } + + @Override + public Material getMaterial(Player player) { + return Material.SKULL_ITEM; + } + + @Override + public byte getDamageValue(Player player) { + return (byte) 3; + } + + @Override + public ItemStack getButtonItem(Player player) { + return ItemBuilder.copyOf(super.getButtonItem(player)).skull(onlinePlayer.getName()).build(); + } + + @Override + public void clicked(Player player, int slot, ClickType clickType) { + player.teleport(onlinePlayer.getLocation().clone()); + player.sendMessage(ChatColor.translate("&6Teleported to &f" + onlinePlayer.getDisplayName() + "&6!")); + } + }); + } + + return toReturn; + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/cavenite/command/CaveNiteAddItemCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/cavenite/command/CaveNiteAddItemCommand.java new file mode 100644 index 0000000..faeb055 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/cavenite/command/CaveNiteAddItemCommand.java @@ -0,0 +1,90 @@ +package net.frozenorb.foxtrot.gameplay.events.cavenite.command; + +import cc.fyre.proton.command.Command; +import cc.fyre.proton.menu.Button; +import cc.fyre.proton.menu.Menu; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.events.cavenite.CaveNiteHandler; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; +import org.bukkit.inventory.ItemStack; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class CaveNiteAddItemCommand { + + @Command(names = {"cavenite additem"}, permission = "op") + public static void execute(Player player) { + final ItemStack itemStack = player.getItemInHand().clone(); + + if (itemStack == null ||itemStack.getType() == Material.AIR) { + player.sendMessage("no"); + return; + } + + player.sendMessage(ChatColor.GREEN + "yes added"); + Foxtrot.getInstance().getCaveNiteHandler().getChestLoot().add(itemStack.clone()); + } + + @Command(names = {"cavenite viewitems"}, permission = "op") + public static void listSpawn(Player player) { + final CaveNiteHandler caveNiteHandler = Foxtrot.getInstance().getCaveNiteHandler(); + + new Menu() { + + @Override + public String getTitle(Player player) { + return null; + } + + @Override + public Map getButtons(Player player) { + final Map toReturn = new HashMap<>(); + + for (ItemStack itemStack : caveNiteHandler.getChestLoot()) { + toReturn.put(toReturn.size(), new Button() { + @Override + public String getName(Player player) { + return null; + } + + @Override + public List getDescription(Player player) { + return null; + } + + @Override + public Material getMaterial(Player player) { + return null; + } + + @Override + public ItemStack getButtonItem(Player player) { + return itemStack.clone(); + } + + @Override + public void clicked(Player player, int slot, ClickType clickType) { + + if (clickType == ClickType.SHIFT_RIGHT) { + caveNiteHandler.getChestLoot().remove(itemStack); + player.sendMessage(ChatColor.RED + "You have removed that item from the loot table!"); + player.playSound(player.getLocation(), Sound.NOTE_PLING, 1, 1); + return; + } + + player.getInventory().addItem(itemStack.clone()); + } + }); + } + + return toReturn; + } + }.openMenu(player); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/cavenite/command/CaveNiteAddSpawnCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/cavenite/command/CaveNiteAddSpawnCommand.java new file mode 100644 index 0000000..09aa5ef --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/cavenite/command/CaveNiteAddSpawnCommand.java @@ -0,0 +1,54 @@ +package net.frozenorb.foxtrot.gameplay.events.cavenite.command; + +import cc.fyre.proton.command.Command; +import cc.fyre.proton.command.param.Parameter; +import mkremins.fanciful.FancyMessage; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.events.cavenite.CaveNiteHandler; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.entity.Player; + +public class CaveNiteAddSpawnCommand { + + @Command(names = {"cavenite addspawn"}, permission = "op") + public static void execute(Player player) { + final CaveNiteHandler caveNiteHandler = Foxtrot.getInstance().getCaveNiteHandler(); + + final Location location = player.getLocation().clone(); + + if (caveNiteHandler.getLocations().contains(location)) { + player.sendMessage(ChatColor.RED + "There is already a Spawn at that location!"); + return; + } + + player.sendMessage(ChatColor.translate("&6Added a spawn at &f" + location.getBlockX() + ", " + location.getBlockY() + ", " + location.getBlockZ() + "&6! &e[" + caveNiteHandler.getLocations().size() + "]")); + + caveNiteHandler.getLocations().add(location); + } + + @Command(names = {"cavenite listspawn"}, permission = "op") + public static void listSpawn(Player player) { + final CaveNiteHandler caveNiteHandler = Foxtrot.getInstance().getCaveNiteHandler(); + + for (Location location : caveNiteHandler.getLocations()) { + new FancyMessage("&6Location #" + caveNiteHandler.getLocations().indexOf(location) + " at &f" + location.getBlockX() + ", " + location.getBlockY() + ", " + location.getBlockZ()).tooltip(ChatColor.GREEN + "Click to teleport").command("/tppos " + location.getBlockX() + " " + location.getBlockY() + " " + location.getBlockZ()).send(player); + } + } + + @Command(names = {"cavenite removeid"}, permission = "op") + public static void listSpawn(Player player, @Parameter(name = "id")int id) { + final CaveNiteHandler caveNiteHandler = Foxtrot.getInstance().getCaveNiteHandler(); + + final Location indexOf = caveNiteHandler.getLocations().get(id); + + if (indexOf == null) { + player.sendMessage(ChatColor.RED + "There is no location with that ID! Check /cavenite listspawn for all ids"); + return; + } + + caveNiteHandler.getLocations().remove(indexOf); + + player.sendMessage(ChatColor.RED + "Removed location with id " + ChatColor.WHITE + id); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/cavenite/command/CaveNiteJoinCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/cavenite/command/CaveNiteJoinCommand.java new file mode 100644 index 0000000..5eaf0b7 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/cavenite/command/CaveNiteJoinCommand.java @@ -0,0 +1,55 @@ +package net.frozenorb.foxtrot.gameplay.events.cavenite.command; + +import cc.fyre.proton.command.Command; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.events.cavenite.CaveNiteHandler; +import net.frozenorb.foxtrot.gameplay.events.cavenite.CaveNiteState; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; + +public class CaveNiteJoinCommand { + + @Command(names = {"cavenite join"}, permission = "") + public static void execute(Player player) { + final CaveNiteHandler caveNiteHandler = Foxtrot.getInstance().getCaveNiteHandler(); + + if (caveNiteHandler.getGameState() == CaveNiteState.INACTIVE) { + player.sendMessage(ChatColor.RED + "The game isn't active!"); + return; + } + + if (caveNiteHandler.getGameState() != CaveNiteState.WAITING) { + player.sendMessage(ChatColor.RED + "The game has already started!"); + return; + } + + if (caveNiteHandler.getOnlinePlayers().contains(player)) { + player.sendMessage(ChatColor.RED + "You are already in the game queue!"); + return; + } + + caveNiteHandler.addPlayer(player); + } + + @Command(names = {"cavenite spec"}, permission = "") + public static void addSpec(Player player) { + final CaveNiteHandler caveNiteHandler = Foxtrot.getInstance().getCaveNiteHandler(); + + if (caveNiteHandler.getGameState() == CaveNiteState.INACTIVE) { + player.sendMessage(ChatColor.RED + "The game isn't active!"); + return; + } + + if (caveNiteHandler.getOnlinePlayers().contains(player)) { + player.sendMessage(ChatColor.RED + "You are already a player!"); + return; + } + + if (caveNiteHandler.getOnlineSpectators().contains(player)) { + player.sendMessage(ChatColor.RED + "You are already a spectator!"); + return; + } + + caveNiteHandler.addSpectator(player); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/cavenite/command/CaveNiteRefillCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/cavenite/command/CaveNiteRefillCommand.java new file mode 100644 index 0000000..5116716 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/cavenite/command/CaveNiteRefillCommand.java @@ -0,0 +1,41 @@ +package net.frozenorb.foxtrot.gameplay.events.cavenite.command; + +import cc.fyre.proton.command.Command; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.events.cavenite.CaveNiteHandler; +import net.frozenorb.foxtrot.gameplay.events.cavenite.CaveNiteState; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import org.bukkit.potion.Potion; +import org.bukkit.potion.PotionType; + +public class CaveNiteRefillCommand { + + @Command(names = {"cavenite refillpotions"}, permission = "op") + public static void execute(Player player) { + final CaveNiteHandler caveNiteHandler = Foxtrot.getInstance().getCaveNiteHandler(); + + if (caveNiteHandler == null) { + player.sendMessage(ChatColor.RED + "Cave Nite doesn't exist on here!"); + return; + } + + if (caveNiteHandler.getGameState() == CaveNiteState.INACTIVE) { + player.sendMessage(ChatColor.RED + "Game is inactive."); + return; + } + + player.sendMessage(ChatColor.GREEN + "Refilling players..."); + for (Player onlinePlayer : Foxtrot.getInstance().getServer().getOnlinePlayers()) { + + if (!caveNiteHandler.getPlayersRemaining().contains(onlinePlayer.getUniqueId())) { + continue; + } + + while (onlinePlayer.getInventory().firstEmpty() != -1) { + onlinePlayer.getInventory().addItem(new Potion(PotionType.INSTANT_HEAL, 2, true).toItemStack(1)); + } + } + } + +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/cavenite/command/CaveNiteResetCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/cavenite/command/CaveNiteResetCommand.java new file mode 100644 index 0000000..38b68bf --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/cavenite/command/CaveNiteResetCommand.java @@ -0,0 +1,40 @@ +package net.frozenorb.foxtrot.gameplay.events.cavenite.command; + +import cc.fyre.proton.command.Command; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.events.cavenite.CaveNiteHandler; +import net.frozenorb.foxtrot.gameplay.events.cavenite.CaveNiteState; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; + +public class CaveNiteResetCommand { + + @Command(names = {"cavenite reset"}, permission = "op") + public static void reset(Player player) { + final CaveNiteHandler caveNiteHandler = Foxtrot.getInstance().getCaveNiteHandler(); + + player.sendMessage(ChatColor.translate("&cReset cavenite")); + + Foxtrot.getInstance().getCaveNiteHandler().setGameState(CaveNiteState.INACTIVE); + Foxtrot.getInstance().getCaveNiteHandler().setScatterIn(0); + Foxtrot.getInstance().getCaveNiteHandler().setStarted(0); + Foxtrot.getInstance().getCaveNiteHandler().setStartIn(0); + } + + @Command(names = {"cavenite resetall"}, permission = "op") + public static void resetAll(Player player) { + final CaveNiteHandler caveNiteHandler = Foxtrot.getInstance().getCaveNiteHandler(); + + player.sendMessage(ChatColor.translate("&cReset Cave Nite All")); + + Foxtrot.getInstance().getCaveNiteHandler().setGameState(CaveNiteState.INACTIVE); + Foxtrot.getInstance().getCaveNiteHandler().setScatterIn(0); + Foxtrot.getInstance().getCaveNiteHandler().setStarted(0); + Foxtrot.getInstance().getCaveNiteHandler().setStartIn(0); + Foxtrot.getInstance().getCaveNiteHandler().getChestLocations().clear(); + Foxtrot.getInstance().getCaveNiteHandler().getChestLoot().clear(); + Foxtrot.getInstance().getCaveNiteHandler().getLocations().clear(); + Foxtrot.getInstance().getCaveNiteHandler().getPlayersRemaining().clear(); + Foxtrot.getInstance().getCaveNiteHandler().getSpectators().clear(); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/cavenite/command/CaveNiteScanCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/cavenite/command/CaveNiteScanCommand.java new file mode 100644 index 0000000..b01df33 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/cavenite/command/CaveNiteScanCommand.java @@ -0,0 +1,54 @@ +package net.frozenorb.foxtrot.gameplay.events.cavenite.command; + +import cc.fyre.proton.command.Command; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.team.Team; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +public class CaveNiteScanCommand { + + @Command(names = {"cavenite see"}, permission = "op") + public static void see(Player player) { + for (Player onlinePlayer : Foxtrot.getInstance().getServer().getOnlinePlayers()) { + + if (!onlinePlayer.getWorld().getName().equalsIgnoreCase("sg")) { + player.sendMessage(onlinePlayer.getName() + " is not IN!"); + } + + } + } + + @Command(names = {"cavenite scan"}, permission = "op") + public static void execute(CommandSender sender) { + final Team team = Foxtrot.getInstance().getTeamHandler().getTeam("CaveNite"); + + if (team == null) { + sender.sendMessage(ChatColor.RED + "The 'CaveNite' faction doesn't exist!"); + return; + } + + sender.sendMessage(ChatColor.GREEN + "Scanning Cave Nite chests..."); + + Foxtrot.getInstance().getCaveNiteHandler().scanLoot(); + + sender.sendMessage(ChatColor.GREEN + "Done! Scanned " + Foxtrot.getInstance().getCaveNiteHandler().getChestLocations().size() + " chests!"); + } + + + @Command(names = {"cavenite chests"}, permission = "op") + public static void asd(CommandSender sender) { + final Team team = Foxtrot.getInstance().getTeamHandler().getTeam("CaveNite"); + + if (team == null) { + sender.sendMessage(ChatColor.RED + "The 'CaveNite' faction doesn't exist!"); + return; + } + + sender.sendMessage(ChatColor.GREEN + "Resettng Cave Nite chests..."); + + Foxtrot.getInstance().getCaveNiteHandler().respawnChests(); + } + +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/cavenite/command/CaveNiteStartCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/cavenite/command/CaveNiteStartCommand.java new file mode 100644 index 0000000..b4a93b0 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/cavenite/command/CaveNiteStartCommand.java @@ -0,0 +1,32 @@ +package net.frozenorb.foxtrot.gameplay.events.cavenite.command; + +import cc.fyre.proton.command.Command; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.events.cavenite.CaveNiteHandler; +import net.frozenorb.foxtrot.gameplay.events.cavenite.CaveNiteState; +import net.frozenorb.foxtrot.team.Team; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; + +public class CaveNiteStartCommand { + + @Command(names = {"cavenite start"}, permission = "op") + public static void execute(CommandSender sender) { + final CaveNiteHandler caveniteHandler = Foxtrot.getInstance().getCaveNiteHandler(); + + if (caveniteHandler.getGameState() != CaveNiteState.INACTIVE) { + sender.sendMessage(ChatColor.RED + "Its a no for me"); + return; + } + + final Team team = Foxtrot.getInstance().getTeamHandler().getTeam("CaveNite"); + + if (team == null) { + sender.sendMessage(ChatColor.RED + "The 'CaveNite' faction doesn't exist!"); + return; + } + + caveniteHandler.start(); + } + +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/cavenite/listener/CaveNiteListener.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/cavenite/listener/CaveNiteListener.java new file mode 100644 index 0000000..266735f --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/cavenite/listener/CaveNiteListener.java @@ -0,0 +1,232 @@ +package net.frozenorb.foxtrot.gameplay.events.cavenite.listener; + +import lombok.AllArgsConstructor; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.events.cavenite.CaveNiteHandler; +import net.frozenorb.foxtrot.gameplay.events.cavenite.CaveNiteState; +import net.frozenorb.foxtrot.gameplay.events.cavenite.SpectateMenu; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.*; +import org.bukkit.inventory.ItemStack; +import org.cavepvp.suge.kit.event.KitUseEvent; + +@AllArgsConstructor +public class CaveNiteListener implements Listener { + private Foxtrot instance; + private CaveNiteHandler caveNiteHandler; + + @EventHandler(priority = EventPriority.LOW) + private void onDeath(PlayerDeathEvent event) { + final Player player = event.getEntity(); + + if (this.caveNiteHandler.getGameState() != CaveNiteState.RUNNING) { + return; + } + + if (!this.caveNiteHandler.getOnlinePlayers().contains(player)) { + return; + } + + this.caveNiteHandler.disqualify(player); + } + + @EventHandler(priority = EventPriority.LOW) + private void onDrop(PlayerDropItemEvent event) { + final Player player = event.getPlayer(); + final CaveNiteHandler caveNiteHandler = this.caveNiteHandler; + + if (this.caveNiteHandler.getPlayersRemaining().contains(player.getUniqueId()) && this.caveNiteHandler.getGameState().equals(CaveNiteState.SCATTERING)) { + event.getItemDrop().remove(); + } + + if (caveNiteHandler.getGameState() == CaveNiteState.INACTIVE) { + return; + } + + if (this.caveNiteHandler.getSpectators().contains(player.getUniqueId()) && this.caveNiteHandler.getGameState() != CaveNiteState.INACTIVE) { + event.setCancelled(true); + } + } + + + @EventHandler(priority = EventPriority.LOW) + private void onPickup(PlayerPickupItemEvent event) { + final Player player = event.getPlayer(); + final CaveNiteHandler caveNiteHandler = this.caveNiteHandler; + + if (caveNiteHandler.getGameState() == CaveNiteState.INACTIVE) { + return; + } + + if (this.caveNiteHandler.getSpectators().contains(player.getUniqueId()) && this.caveNiteHandler.getGameState() != CaveNiteState.INACTIVE) { + event.setCancelled(true); + } + } + + @EventHandler(priority = EventPriority.LOW) + private void onQuit(PlayerQuitEvent event) { + final Player player = event.getPlayer(); + + if (this.caveNiteHandler.getGameState() != CaveNiteState.RUNNING) { + return; + } + + if (!this.caveNiteHandler.getOnlinePlayers().contains(player)) { + return; + } + + this.caveNiteHandler.disqualify(player); + } + + @EventHandler(priority = EventPriority.LOW) + private void onKitUse(KitUseEvent event) { + if (this.caveNiteHandler.getGameState() == CaveNiteState.INACTIVE) { + return; + } + + if (event.getPlayer().isOp()) { + return; + } + + event.getPlayer().sendMessage(ChatColor.RED + "Cant use a kit now!"); + event.setCancelled(true); + } + + @EventHandler(priority = EventPriority.MONITOR) + private void onMove(PlayerMoveEvent event) { + if (this.caveNiteHandler.getGameState() == CaveNiteState.INACTIVE) { + return; + } + + if (event.isCancelled() || event.getFrom().getBlockX() == event.getTo().getBlockX() && event.getFrom().getBlockZ() == event.getTo().getBlockZ()) { + return; + } + + final CaveNiteHandler caveNiteHandler = this.caveNiteHandler; + + if (this.caveNiteHandler.getGameState() == CaveNiteState.SCATTERING && caveNiteHandler.getOnlinePlayers().contains(event.getPlayer())) { + event.setCancelled(true); + } + } + + @EventHandler(priority = EventPriority.MONITOR) + private void onTeleport(PlayerTeleportEvent event) { + if (this.caveNiteHandler.getGameState() == CaveNiteState.INACTIVE) { + return; + } + + if (event.isCancelled() || event.getFrom().getBlockX() == event.getTo().getBlockX() && event.getFrom().getBlockZ() == event.getTo().getBlockZ()) { + return; + } + + final CaveNiteHandler caveNiteHandler = this.caveNiteHandler; + + if (this.caveNiteHandler.getGameState() == CaveNiteState.SCATTERING && caveNiteHandler.getOnlinePlayers().contains(event.getPlayer())) { + event.setCancelled(true); + } + } + + @EventHandler(priority = EventPriority.LOW) + private void onAttack(EntityDamageByEntityEvent event) { + if (!(event.getDamager() instanceof Player)) { + return; + } + + final CaveNiteHandler caveNiteHandler = this.caveNiteHandler; + + if (caveNiteHandler.getGameState() == CaveNiteState.INACTIVE) { + return; + } + + final Player damager = (Player) event.getDamager(); + + if (this.caveNiteHandler.getSpectators().contains(damager.getUniqueId()) && this.caveNiteHandler.getGameState() != CaveNiteState.INACTIVE) { + event.setCancelled(true); + } + } + + @EventHandler(priority = EventPriority.LOW) + private void onInteract(PlayerInteractEvent event) { + final Player player = event.getPlayer(); + + if (caveNiteHandler.getGameState() == CaveNiteState.INACTIVE) { + return; + } + + if (!this.caveNiteHandler.getOnlineSpectators().contains(player)) { + return; + } + + if (event.getClickedBlock() != null && event.getClickedBlock().getType().name().contains("CHEST")) { + event.setCancelled(true); + return; + } + + final ItemStack itemStack = event.getItem(); + + if (itemStack == null || itemStack.getType() != Material.WATCH) { + return; + } + + new SpectateMenu().openMenu(player); + } + + @EventHandler(priority = EventPriority.LOW) + private void onDamage(EntityDamageEvent event) { + if (this.caveNiteHandler.getGameState() == CaveNiteState.INACTIVE) { + return; + } + + if (!(event.getEntity() instanceof Player)) { + return; + } + + final Player player = (Player) event.getEntity(); + + if (this.caveNiteHandler.getSpectators().contains(player.getUniqueId()) && this.caveNiteHandler.getGameState() != CaveNiteState.INACTIVE) { + event.setCancelled(true); + return; + } + + if (!this.caveNiteHandler.getOnlinePlayers().contains(player)) { + return; + } + + if (this.caveNiteHandler.getGameState() == CaveNiteState.RUNNING) { + return; + } + + event.setCancelled(true); + } + + @EventHandler(priority = EventPriority.LOW) + private void onBreak(BlockBreakEvent event) { + + final Player player = event.getPlayer(); + + if (player.getWorld().getName().equalsIgnoreCase("sg") && !player.isOp()) { + event.setCancelled(true); + } + } + + @EventHandler(priority = EventPriority.LOW) + private void onPlace(BlockPlaceEvent event) { + + final Player player = event.getPlayer(); + + if (player.getWorld().getName().equalsIgnoreCase("sg") && !player.isOp()) { + event.setCancelled(true); + } + } + +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/citadel/CitadelHandler.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/citadel/CitadelHandler.java new file mode 100644 index 0000000..364235d --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/citadel/CitadelHandler.java @@ -0,0 +1,253 @@ +package net.frozenorb.foxtrot.gameplay.events.citadel; + +import cc.fyre.proton.serialization.LocationSerializer; +import com.mongodb.BasicDBList; +import com.mongodb.BasicDBObject; +import com.mongodb.util.JSON; +import lombok.Getter; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.events.Event; +import net.frozenorb.foxtrot.gameplay.events.citadel.events.CitadelCapturedEvent; +import net.frozenorb.foxtrot.gameplay.events.citadel.listeners.CitadelListener; +import net.frozenorb.foxtrot.gameplay.events.citadel.tasks.CitadelSaveTask; +import net.frozenorb.foxtrot.gameplay.events.koth.KOTH; +import net.frozenorb.foxtrot.team.Team; +import net.frozenorb.foxtrot.team.claims.Claim; +import net.frozenorb.foxtrot.team.claims.LandBoard; +import net.frozenorb.foxtrot.team.dtr.DTRBitmask; +import net.frozenorb.foxtrot.util.CuboidRegion; +import net.frozenorb.foxtrot.util.InventorySerialization; +import net.frozenorb.foxtrot.util.LocationUtil; +import net.minecraft.util.org.apache.commons.io.FileUtils; +import org.bson.types.ObjectId; +import org.bukkit.*; +import org.bukkit.block.BlockState; +import org.bukkit.block.Chest; +import com.google.gson.JsonParser; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import java.io.File; +import java.util.*; +import java.util.concurrent.ThreadLocalRandom; +import java.util.stream.Collectors; + +public class CitadelHandler { + public static final String PREFIX = ChatColor.DARK_PURPLE + "[Citadel]"; + + private File citadelInfo; + @Getter + private Set cappers = new HashSet<>(); + @Getter private Date lootable; + + @Getter private Set citadelChests = new HashSet<>(); + @Getter private List citadelLoot = new ArrayList<>(); + + public CitadelHandler() { + citadelInfo = new File(Foxtrot.getInstance().getDataFolder(), "citadelInfo.json"); + + loadCitadelInfo(); + Foxtrot.getInstance().getServer().getPluginManager().registerEvents(new CitadelListener(), Foxtrot.getInstance()); + + if (!Foxtrot.getInstance().getMapHandler().isKitMap()) { + return; + } + + (new CitadelSaveTask()).runTaskTimerAsynchronously(Foxtrot.getInstance(), 0L, 20 * 60 * 5); + } + + public KOTH getEvent() { + for (Event event : Foxtrot.getInstance().getEventHandler().getEvents()) { + if (event instanceof KOTH && event.getName().equalsIgnoreCase("Citadel")) { + return (KOTH) event; + } + } + return null; + } + + public boolean isActive() { + return getEvent() != null; + } + + public void loadCitadelInfo() { + + if (!Foxtrot.getInstance().getMapHandler().isKitMap()) { + return; + } + + try { + if (!citadelInfo.exists() && citadelInfo.createNewFile()) { + BasicDBObject dbo = new BasicDBObject(); + + dbo.put("cappers", new HashSet<>()); + dbo.put("lootable", new Date()); + dbo.put("chests", new BasicDBList()); + dbo.put("loot", new BasicDBList()); + + FileUtils.write(citadelInfo, Foxtrot.GSON.toJson(new JsonParser().parse(dbo.toString()))); + } + + BasicDBObject dbo = (BasicDBObject) JSON.parse(FileUtils.readFileToString(citadelInfo)); + + if (dbo != null) { + // Conversion + if (dbo.containsField("capper")) { + cappers.add(new ObjectId(dbo.getString("capper"))); + } + + for (String capper : (List) dbo.get("cappers")) { + cappers.add(new ObjectId(capper)); + } + + this.lootable = dbo.getDate("lootable"); + + BasicDBList chests = (BasicDBList) dbo.get("chests"); + BasicDBList loot = (BasicDBList) dbo.get("loot"); + + for (Object chestObj : chests) { + BasicDBObject chest = (BasicDBObject) chestObj; + citadelChests.add(LocationSerializer.deserialize((BasicDBObject) chest.get("location"))); + } + + for (Object lootObj : loot) { + citadelLoot.add(InventorySerialization.deserialize((BasicDBObject) lootObj)); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + public void saveCitadelInfo() { + if (!Foxtrot.getInstance().getMapHandler().isKitMap()) { + return; + } + + try { + BasicDBObject dbo = new BasicDBObject(); + + dbo.put("cappers", cappers.stream().map(ObjectId::toString).collect(Collectors.toList())); + dbo.put("lootable", lootable); + + BasicDBList chests = new BasicDBList(); + BasicDBList loot = new BasicDBList(); + + for (Location citadelChest : citadelChests) { + BasicDBObject chest = new BasicDBObject(); + chest.put("location", LocationSerializer.serialize(citadelChest)); + chests.add(chest); + } + + for (ItemStack lootItem : citadelLoot) { + loot.add(InventorySerialization.serialize(lootItem)); + } + + dbo.put("chests", chests); + dbo.put("loot", loot); + + citadelInfo.delete(); + FileUtils.write(citadelInfo, Foxtrot.GSON.toJson(new JsonParser().parse(dbo.toString()))); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public void resetCappers() { + this.cappers.clear(); + } + + public void addCapper(ObjectId capper) { + this.cappers.add(capper); + this.lootable = generateLootableDate(); + + Foxtrot.getInstance().getServer().getPluginManager().callEvent(new CitadelCapturedEvent(capper)); + saveCitadelInfo(); + } + + public boolean canLootCitadel(Player player) { + if (!Foxtrot.getInstance().getMapHandler().isKitMap()) { + return false; + } + + final Calendar calendar = Calendar.getInstance(); + calendar.setTime(new Date(System.currentTimeMillis())); + + if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.WEDNESDAY || calendar.get(Calendar.DAY_OF_WEEK) == Calendar.THURSDAY) { + return true; + } + + if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.FRIDAY && calendar.get(Calendar.HOUR_OF_DAY) <= 14) { + return true; + } + + Team team = Foxtrot.getInstance().getTeamHandler().getTeam(player); + return ((team != null && cappers.contains(team.getUniqueId()))); + } + + // Credit to http://stackoverflow.com/a/3465656 on StackOverflow. + private Date generateLootableDate() { + Calendar date = Calendar.getInstance(); + int diff = Calendar.TUESDAY - date.get(Calendar.DAY_OF_WEEK); + + if (diff <= 0) { + diff += 7; + } + + date.add(Calendar.DAY_OF_MONTH, diff); + + // 11:59 PM + date.set(Calendar.HOUR_OF_DAY, 23); + date.set(Calendar.MINUTE, 59); + date.set(Calendar.SECOND, 59); + + return (date.getTime()); + } + + public void scanLoot() { + citadelChests.clear(); + + for (Team team : Foxtrot.getInstance().getTeamHandler().getTeams()) { + if (team.getOwner() != null) { + continue; + } + + if (team.hasDTRBitmask(DTRBitmask.CITADEL)) { + for (Claim claim : team.getClaims()) { + for (Location location : new CuboidRegion("Citadel", claim.getMinimumPoint(), claim.getMaximumPoint())) { + if (location.getBlock().getType() == Material.CHEST) { + citadelChests.add(location); + } + } + } + } + } + } + + public int respawnCitadelChests() { + int respawned = 0; + + for (Location chest : citadelChests) { + if (respawnCitadelChest(chest)) { + respawned++; + } + } + + return (respawned); + } + + public boolean respawnCitadelChest(Location location) { + BlockState blockState = location.getBlock().getState(); + + if (blockState instanceof Chest) { + Chest chest = (Chest) blockState; + + chest.getBlockInventory().clear(); + chest.getBlockInventory().addItem(citadelLoot.get(ThreadLocalRandom.current().nextInt(citadelLoot.size()))); + return (true); + } else { + Foxtrot.getInstance().getLogger().warning("Citadel chest defined at [" + location.getBlockX() + ", " + location.getBlockY() + ", " + location.getBlockZ() + "] isn't a chest!"); + return (false); + } + } + +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/citadel/commands/CitadelCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/citadel/commands/CitadelCommand.java new file mode 100644 index 0000000..d2803f7 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/citadel/commands/CitadelCommand.java @@ -0,0 +1,52 @@ +package net.frozenorb.foxtrot.gameplay.events.citadel.commands; + +import cc.fyre.proton.command.Command; +import net.minecraft.util.com.google.common.base.Joiner; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.events.Event; +import net.frozenorb.foxtrot.gameplay.events.citadel.CitadelHandler; +import net.frozenorb.foxtrot.team.Team; +import org.bson.types.ObjectId; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashSet; +import java.util.Set; + +public class CitadelCommand { + + // Make this pretty. + @Command(names={ "citadel" }, permission="") + public static void citadel(Player sender) { + if (!Foxtrot.getInstance().getMapHandler().isKitMap()) { + sender.sendMessage(ChatColor.RED + "This command may only be used on Kitmap!"); + return; + } + + Set cappers = Foxtrot.getInstance().getCitadelHandler().getCappers(); + Set capperNames = new HashSet<>(); + + for (ObjectId capper : cappers) { + Team capperTeam = Foxtrot.getInstance().getTeamHandler().getTeam(capper); + + if (capperTeam != null) { + capperNames.add(capperTeam.getName()); + } + } + + if (!capperNames.isEmpty()) { + sender.sendMessage(CitadelHandler.PREFIX + " " + ChatColor.YELLOW + "Citadel was captured by " + ChatColor.GREEN + Joiner.on(", ").join(capperNames) + ChatColor.YELLOW + "."); + } else { + Event citadel = Foxtrot.getInstance().getEventHandler().getEvent("Citadel"); + + if (citadel != null && citadel.isActive()) { + sender.sendMessage(CitadelHandler.PREFIX + " " + ChatColor.YELLOW + "Citadel can be captured now."); + } else { + sender.sendMessage(CitadelHandler.PREFIX + " " + ChatColor.YELLOW + "Citadel was not captured last week."); + } + } + } + +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/citadel/commands/CitadelLoadLoottableCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/citadel/commands/CitadelLoadLoottableCommand.java new file mode 100644 index 0000000..80c68f8 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/citadel/commands/CitadelLoadLoottableCommand.java @@ -0,0 +1,30 @@ +package net.frozenorb.foxtrot.gameplay.events.citadel.commands; + +import cc.fyre.proton.command.Command; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.events.citadel.CitadelHandler; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +public class CitadelLoadLoottableCommand { + + @Command(names={"citadel loadloottable"}, permission="op") + public static void citadelLoadLoottable(Player sender) { + if (!Foxtrot.getInstance().getMapHandler().isKitMap()) { + sender.sendMessage(ChatColor.RED + "This command may only be used on Kitmap!"); + return; + } + + sender.getInventory().clear(); + int itemIndex = 0; + + for (ItemStack itemStack : Foxtrot.getInstance().getCitadelHandler().getCitadelLoot()) { + sender.getInventory().setItem(itemIndex, itemStack); + itemIndex++; + } + + sender.sendMessage(CitadelHandler.PREFIX + " " + ChatColor.YELLOW + "Loaded Citadel loot into your inventory."); + } + +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/citadel/commands/CitadelRescanChestsCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/citadel/commands/CitadelRescanChestsCommand.java new file mode 100644 index 0000000..b6e5eb3 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/citadel/commands/CitadelRescanChestsCommand.java @@ -0,0 +1,24 @@ +package net.frozenorb.foxtrot.gameplay.events.citadel.commands; + +import cc.fyre.proton.command.Command; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.events.citadel.CitadelHandler; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; + +public class CitadelRescanChestsCommand { + + @Command(names={"citadel rescanchests"}, permission="op") + public static void citadelRescanChests(Player sender) { + + if (!Foxtrot.getInstance().getMapHandler().isKitMap()) { + sender.sendMessage(ChatColor.RED + "This command may only be used on Kitmap!"); + return; + } + + Foxtrot.getInstance().getCitadelHandler().scanLoot(); + Foxtrot.getInstance().getCitadelHandler().saveCitadelInfo(); + sender.sendMessage(CitadelHandler.PREFIX + " " + ChatColor.YELLOW + "Rescanned all Citadel chests."); + } + +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/citadel/commands/CitadelRespawnChestsCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/citadel/commands/CitadelRespawnChestsCommand.java new file mode 100644 index 0000000..9d6759f --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/citadel/commands/CitadelRespawnChestsCommand.java @@ -0,0 +1,23 @@ +package net.frozenorb.foxtrot.gameplay.events.citadel.commands; + +import cc.fyre.proton.command.Command; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.events.citadel.CitadelHandler; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; + +public class CitadelRespawnChestsCommand { + + @Command(names={"citadel respawnchests"}, permission="op") + public static void citadelRespawnChests(Player sender) { + + if (!Foxtrot.getInstance().getMapHandler().isKitMap()) { + sender.sendMessage(ChatColor.RED + "This command may only be used on Kitmap!"); + return; + } + + int i = Foxtrot.getInstance().getCitadelHandler().respawnCitadelChests(); + sender.sendMessage(CitadelHandler.PREFIX + " " + ChatColor.YELLOW + "Respawned all " + i + " Citadel chests."); + } + +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/citadel/commands/CitadelSaveCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/citadel/commands/CitadelSaveCommand.java new file mode 100644 index 0000000..1b5350b --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/citadel/commands/CitadelSaveCommand.java @@ -0,0 +1,23 @@ +package net.frozenorb.foxtrot.gameplay.events.citadel.commands; + +import cc.fyre.proton.command.Command; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.events.citadel.CitadelHandler; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; + +public class CitadelSaveCommand { + + @Command(names={"citadel save"}, permission="op") + public static void citadelSave(Player sender) { + + if (!Foxtrot.getInstance().getMapHandler().isKitMap()) { + sender.sendMessage(ChatColor.RED + "This command may only be used on Kitmap!"); + return; + } + + Foxtrot.getInstance().getCitadelHandler().saveCitadelInfo(); + sender.sendMessage(CitadelHandler.PREFIX + " " + ChatColor.YELLOW + "Saved Citadel info to file."); + } + +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/citadel/commands/CitadelSaveLoottableCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/citadel/commands/CitadelSaveLoottableCommand.java new file mode 100644 index 0000000..8e3dc31 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/citadel/commands/CitadelSaveLoottableCommand.java @@ -0,0 +1,33 @@ +package net.frozenorb.foxtrot.gameplay.events.citadel.commands; + +import cc.fyre.proton.command.Command; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.events.citadel.CitadelHandler; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +public class CitadelSaveLoottableCommand { + + @Command(names={"citadel saveloottable"}, permission="op") + public static void citadelSaveLoottable(Player sender) { + + if (!Foxtrot.getInstance().getMapHandler().isKitMap()) { + sender.sendMessage(ChatColor.RED + "This command may only be used on Kitmap!"); + return; + } + + Foxtrot.getInstance().getCitadelHandler().getCitadelLoot().clear(); + + for (ItemStack itemStack : sender.getInventory().getContents()) { + if (itemStack != null && itemStack.getType() != Material.AIR) { + Foxtrot.getInstance().getCitadelHandler().getCitadelLoot().add(itemStack); + } + } + + Foxtrot.getInstance().getCitadelHandler().saveCitadelInfo(); + sender.sendMessage(CitadelHandler.PREFIX + " " + ChatColor.YELLOW + "Saved Citadel loot from your inventory."); + } + +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/citadel/commands/CitadelSetCapperCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/citadel/commands/CitadelSetCapperCommand.java new file mode 100644 index 0000000..cb73fc4 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/citadel/commands/CitadelSetCapperCommand.java @@ -0,0 +1,49 @@ +package net.frozenorb.foxtrot.gameplay.events.citadel.commands; + +import cc.fyre.proton.command.Command; +import cc.fyre.proton.command.param.Parameter; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.events.citadel.CitadelHandler; +import net.frozenorb.foxtrot.team.Team; +import org.bson.types.ObjectId; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.List; + +public class CitadelSetCapperCommand { + + @Command(names={ "citadel setcapper" }, permission="op") + public static void citadelSetCapper(Player sender, @Parameter(name="cappers") String cappers) { + + if (!Foxtrot.getInstance().getMapHandler().isKitMap()) { + sender.sendMessage(ChatColor.RED + "This command may only be used on Kitmap!"); + return; + } + + if (cappers.equals("null")) { + Foxtrot.getInstance().getCitadelHandler().resetCappers(); + sender.sendMessage(CitadelHandler.PREFIX + " " + ChatColor.YELLOW + "Reset Citadel cappers."); + } else { + String[] teamNames = cappers.split(","); + List teams = new ArrayList<>(); + + for (String teamName : teamNames) { + Team team = Foxtrot.getInstance().getTeamHandler().getTeam(teamName); + + if (team != null) { + teams.add(team.getUniqueId()); + } else { + sender.sendMessage(ChatColor.RED + "Team '" + teamName + "' cannot be found."); + return; + } + } + + Foxtrot.getInstance().getCitadelHandler().getCappers().clear(); + Foxtrot.getInstance().getCitadelHandler().getCappers().addAll(teams); + sender.sendMessage(CitadelHandler.PREFIX + " " + ChatColor.YELLOW + "Updated Citadel cappers."); + } + } + +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/citadel/commands/CitadelViewLootTableCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/citadel/commands/CitadelViewLootTableCommand.java new file mode 100644 index 0000000..9a0e63d --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/citadel/commands/CitadelViewLootTableCommand.java @@ -0,0 +1,70 @@ +package net.frozenorb.foxtrot.gameplay.events.citadel.commands; + +import cc.fyre.proton.command.Command; +import cc.fyre.proton.menu.Button; +import cc.fyre.proton.menu.Menu; +import net.frozenorb.foxtrot.Foxtrot; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class CitadelViewLootTableCommand { + + @Command(names = {"citadel viewloot", "citadel loot", "citadelloot"}, permission = "") + public static void execute(Player player) { + if (!Foxtrot.getInstance().getMapHandler().isKitMap()) { + player.sendMessage(ChatColor.RED + "This command can only be used on Kits!"); + return; + } + + new Menu() { + @Override + public String getTitle(Player player) { + return "Citadel Loot"; + } + + @Override + public Map getButtons(Player player) { + final Map toReturn = new HashMap<>(); + + for (ItemStack itemStack : Foxtrot.getInstance().getCitadelHandler().getCitadelLoot()) { + + if (itemStack == null || itemStack.getType().equals(Material.AIR)) { + continue; + } + + toReturn.put(toReturn.size(), new Button() { + @Override + public String getName(Player player) { + return null; + } + + @Override + public List getDescription(Player player) { + return null; + } + + @Override + public Material getMaterial(Player player) { + return null; + } + + @Override + public ItemStack getButtonItem(Player player) { + return itemStack.clone(); + } + }); + } + + return toReturn; + } + }.openMenu(player); + + } + +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/citadel/events/CitadelActivatedEvent.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/citadel/events/CitadelActivatedEvent.java new file mode 100644 index 0000000..d78b65c --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/citadel/events/CitadelActivatedEvent.java @@ -0,0 +1,18 @@ +package net.frozenorb.foxtrot.gameplay.events.citadel.events; + +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +public class CitadelActivatedEvent extends Event { + + private static final HandlerList handlers = new HandlerList(); + + public HandlerList getHandlers() { + return handlers; + } + + public static HandlerList getHandlerList() { + return handlers; + } + +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/citadel/events/CitadelCapturedEvent.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/citadel/events/CitadelCapturedEvent.java new file mode 100644 index 0000000..98783c1 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/citadel/events/CitadelCapturedEvent.java @@ -0,0 +1,27 @@ +package net.frozenorb.foxtrot.gameplay.events.citadel.events; + +import org.bson.types.ObjectId; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +import lombok.Getter; + +public class CitadelCapturedEvent extends Event { + + private static final HandlerList handlers = new HandlerList(); + + @Getter private ObjectId capper; + + public CitadelCapturedEvent(ObjectId capper) { + this.capper = capper; + } + + public HandlerList getHandlers() { + return handlers; + } + + public static HandlerList getHandlerList() { + return handlers; + } + +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/citadel/listeners/CitadelListener.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/citadel/listeners/CitadelListener.java new file mode 100644 index 0000000..4e412fc --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/citadel/listeners/CitadelListener.java @@ -0,0 +1,40 @@ +package net.frozenorb.foxtrot.gameplay.events.citadel.listeners; + +import cc.fyre.proton.event.HourEvent; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.events.citadel.events.CitadelActivatedEvent; +import net.frozenorb.foxtrot.gameplay.events.events.EventActivatedEvent; +import net.frozenorb.foxtrot.gameplay.events.events.EventCapturedEvent; +import net.frozenorb.foxtrot.team.Team; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; + +public class CitadelListener implements Listener { + + @EventHandler + public void onKOTHActivated(EventActivatedEvent event) { + if (event.getEvent().getName().contains("Citadel")) { + Foxtrot.getInstance().getServer().getPluginManager().callEvent(new CitadelActivatedEvent()); + } + } + + @EventHandler + public void onHour(HourEvent event) { + if (event.getHour() % 6 == 0) { + Foxtrot.getInstance().getCitadelHandler().respawnCitadelChests(); + } + } + + @EventHandler(priority=EventPriority.MONITOR) + public void onKOTHCaptured(EventCapturedEvent event) { + if (event.getEvent().getName().contains("Citadel")) { + Team playerTeam = Foxtrot.getInstance().getTeamHandler().getTeam(event.getPlayer()); + + if (playerTeam != null) { + playerTeam.setCitadelsCapped(playerTeam.getCitadelsCapped() + 1); + Foxtrot.getInstance().getCitadelHandler().addCapper(playerTeam.getUniqueId()); + } + } + } +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/citadel/tasks/CitadelSaveTask.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/citadel/tasks/CitadelSaveTask.java new file mode 100644 index 0000000..ab1bfcf --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/citadel/tasks/CitadelSaveTask.java @@ -0,0 +1,12 @@ +package net.frozenorb.foxtrot.gameplay.events.citadel.tasks; + +import net.frozenorb.foxtrot.Foxtrot; +import org.bukkit.scheduler.BukkitRunnable; + +public class CitadelSaveTask extends BukkitRunnable { + + public void run() { + Foxtrot.getInstance().getCitadelHandler().saveCitadelInfo(); + } + +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/conquest/ConquestHandler.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/conquest/ConquestHandler.java new file mode 100644 index 0000000..8833fff --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/conquest/ConquestHandler.java @@ -0,0 +1,22 @@ +package net.frozenorb.foxtrot.gameplay.events.conquest; + +import lombok.Getter; +import lombok.Setter; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.events.conquest.game.ConquestGame; +import org.bukkit.ChatColor; + +public class ConquestHandler { + + public static final String PREFIX = ChatColor.YELLOW + "[Conquest]"; + + public static final int POINTS_DEATH_PENALTY = 20; + public static final String KOTH_NAME_PREFIX = "Conquest-"; + public static final int TIME_TO_CAP = 30; + + @Getter @Setter private ConquestGame game; + + public static int getPointsToWin() { + return Foxtrot.getInstance().getConfig().getInt("conquestWinPoints", 250); + } +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/conquest/commands/conquest/ConquestCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/conquest/commands/conquest/ConquestCommand.java new file mode 100644 index 0000000..4a795a6 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/conquest/commands/conquest/ConquestCommand.java @@ -0,0 +1,47 @@ +package net.frozenorb.foxtrot.gameplay.events.conquest.commands.conquest; + +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.events.conquest.ConquestHandler; +import net.frozenorb.foxtrot.gameplay.events.conquest.game.ConquestGame; +import net.frozenorb.foxtrot.team.Team; +import cc.fyre.proton.command.Command; +import org.bson.types.ObjectId; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; + +import java.util.Map; + +public class ConquestCommand { + + @Command(names={ "conquest" }, permission="") + public static void conquest(Player sender) { + ConquestGame game = Foxtrot.getInstance().getConquestHandler().getGame(); + + if (game == null) { + sender.sendMessage(ChatColor.RED + "Conquest is not active."); + return; + } + + Map caps = game.getTeamPoints(); + + sender.sendMessage(ChatColor.YELLOW + "Conquest Scores:"); + boolean sent = false; + + for (Map.Entry capEntry : caps.entrySet()) { + Team resolved = Foxtrot.getInstance().getTeamHandler().getTeam(capEntry.getKey()); + + if (resolved != null) { + sender.sendMessage(resolved.getName(sender) + ": " + ChatColor.WHITE + capEntry.getValue() + " point" + (capEntry.getValue() == 1 ? "" : "s")); + sent = true; + } + } + + if (!sent) { + sender.sendMessage(ChatColor.GRAY + "No points have been scored!"); + } + + sender.sendMessage(""); + sender.sendMessage(ChatColor.YELLOW.toString() + ConquestHandler.getPointsToWin() + " points are required to win."); + } + +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/conquest/commands/conquestadmin/ConquestAdminSetScoreCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/conquest/commands/conquestadmin/ConquestAdminSetScoreCommand.java new file mode 100644 index 0000000..1f45f1f --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/conquest/commands/conquestadmin/ConquestAdminSetScoreCommand.java @@ -0,0 +1,27 @@ +package net.frozenorb.foxtrot.gameplay.events.conquest.commands.conquestadmin; + +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.events.conquest.ConquestHandler; +import net.frozenorb.foxtrot.gameplay.events.conquest.game.ConquestGame; +import net.frozenorb.foxtrot.team.Team; +import cc.fyre.proton.command.Command; +import cc.fyre.proton.command.param.Parameter; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; + +public class ConquestAdminSetScoreCommand { + + @Command(names={ "conquestadmin setscore" }, permission="op") + public static void conquestAdminSetScore(CommandSender sender, @Parameter(name="team") Team team, @Parameter(name="score") int score) { + ConquestGame game = Foxtrot.getInstance().getConquestHandler().getGame(); + + if (game == null) { + sender.sendMessage(ChatColor.RED + "Conquest is not active."); + return; + } + + game.getTeamPoints().put(team.getUniqueId(), score); + sender.sendMessage(ConquestHandler.PREFIX + " " + ChatColor.GOLD + "Updated the score for " + team.getName() + ChatColor.GOLD + "."); + } + +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/conquest/commands/conquestadmin/ConquestAdminStartCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/conquest/commands/conquestadmin/ConquestAdminStartCommand.java new file mode 100644 index 0000000..2b9db76 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/conquest/commands/conquestadmin/ConquestAdminStartCommand.java @@ -0,0 +1,23 @@ +package net.frozenorb.foxtrot.gameplay.events.conquest.commands.conquestadmin; + +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.events.conquest.game.ConquestGame; +import cc.fyre.proton.command.Command; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; + +public class ConquestAdminStartCommand { + + @Command(names={ "conquestadmin start" }, permission="op") + public static void conquestAdminStart(CommandSender sender) { + ConquestGame game = Foxtrot.getInstance().getConquestHandler().getGame(); + + if (game != null) { + sender.sendMessage(ChatColor.RED + "Conquest is already active."); + return; + } + + new ConquestGame(); + } + +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/conquest/commands/conquestadmin/ConquestAdminStopCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/conquest/commands/conquestadmin/ConquestAdminStopCommand.java new file mode 100644 index 0000000..2c222c9 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/conquest/commands/conquestadmin/ConquestAdminStopCommand.java @@ -0,0 +1,23 @@ +package net.frozenorb.foxtrot.gameplay.events.conquest.commands.conquestadmin; + +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.events.conquest.game.ConquestGame; +import cc.fyre.proton.command.Command; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; + +public class ConquestAdminStopCommand { + + @Command(names={ "conquestadmin stop" }, permission="op") + public static void conquestAdminStop(CommandSender sender) { + ConquestGame game = Foxtrot.getInstance().getConquestHandler().getGame(); + + if (game == null) { + sender.sendMessage(ChatColor.RED + "Conquest is not active."); + return; + } + + game.endGame(null); + } + +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/conquest/enums/ConquestCapzone.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/conquest/enums/ConquestCapzone.java new file mode 100644 index 0000000..3b92c06 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/conquest/enums/ConquestCapzone.java @@ -0,0 +1,18 @@ +package net.frozenorb.foxtrot.gameplay.events.conquest.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.bukkit.ChatColor; + +@AllArgsConstructor +public enum ConquestCapzone { + + RED(ChatColor.RED, "Red"), + BLUE(ChatColor.BLUE, "Blue"), + GREEN(ChatColor.GREEN, "Green"), + YELLOW(ChatColor.YELLOW, "Yellow"); + + @Getter private ChatColor chatColor; + @Getter private String name; + +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/conquest/game/ConquestGame.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/conquest/game/ConquestGame.java new file mode 100644 index 0000000..94e86bc --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/conquest/game/ConquestGame.java @@ -0,0 +1,198 @@ +package net.frozenorb.foxtrot.gameplay.events.conquest.game; + +import lombok.Getter; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.events.Event; +import net.frozenorb.foxtrot.gameplay.events.EventType; +import net.frozenorb.foxtrot.gameplay.events.conquest.ConquestHandler; +import net.frozenorb.foxtrot.gameplay.events.conquest.enums.ConquestCapzone; +import net.frozenorb.foxtrot.gameplay.events.events.EventCapturedEvent; +import net.frozenorb.foxtrot.gameplay.events.koth.KOTH; +import net.frozenorb.foxtrot.gameplay.events.koth.events.EventControlTickEvent; +import net.frozenorb.foxtrot.gameplay.events.koth.events.KOTHControlLostEvent; +import net.frozenorb.foxtrot.team.Team; +import cc.fyre.proton.util.UUIDUtils; +import org.bson.types.ObjectId; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.HandlerList; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.scheduler.BukkitRunnable; + +import java.util.*; + +public class ConquestGame implements Listener { + + @Getter private LinkedHashMap teamPoints = new LinkedHashMap<>(); + + public ConquestGame() { + Foxtrot.getInstance().getServer().getPluginManager().registerEvents(this, Foxtrot.getInstance()); + + for (Event event : Foxtrot.getInstance().getEventHandler().getEvents()) { + if (event.getType() != EventType.KOTH) continue; + KOTH koth = (KOTH) event; + if (koth.getName().startsWith(ConquestHandler.KOTH_NAME_PREFIX)) { + if (!koth.isHidden()) { + koth.setHidden(true); + } + + if (koth.getCapTime() != ConquestHandler.TIME_TO_CAP) { + koth.setCapTime(ConquestHandler.TIME_TO_CAP); + } + + koth.activate(); + } + } + + Foxtrot.getInstance().getServer().broadcastMessage(ConquestHandler.PREFIX + " " + ChatColor.GOLD + "Conquest has started! Use /conquest for more information."); + Foxtrot.getInstance().getConquestHandler().setGame(this); + } + + public void endGame(final Team winner) { + if (winner == null) { + Foxtrot.getInstance().getServer().broadcastMessage(ConquestHandler.PREFIX + " " + ChatColor.GOLD + "Conquest has ended."); + } else { + winner.setConquestsCapped(winner.getConquestsCapped() + 1); + Foxtrot.getInstance().getServer().broadcastMessage(ConquestHandler.PREFIX + " " + ChatColor.GOLD.toString() + ChatColor.BOLD + winner.getName() + ChatColor.GOLD + " has won Conquest!"); + } + + for (Event koth : Foxtrot.getInstance().getEventHandler().getEvents()) { + if (koth.getName().startsWith(ConquestHandler.KOTH_NAME_PREFIX)) { + koth.deactivate(); + } + } + + HandlerList.unregisterAll(this); + Foxtrot.getInstance().getConquestHandler().setGame(null); + } + + @EventHandler + public void onKOTHCaptured(final EventCapturedEvent event) { + if (!event.getEvent().getName().startsWith(ConquestHandler.KOTH_NAME_PREFIX)) { + return; + } + + final Team team = Foxtrot.getInstance().getTeamHandler().getTeam(event.getPlayer()); + final ConquestCapzone capZone = ConquestCapzone.valueOf(event.getEvent().getName().replace(ConquestHandler.KOTH_NAME_PREFIX, "").toUpperCase()); + + if (team == null) { + new BukkitRunnable() { + + public void run() { + if (Foxtrot.getInstance().getConquestHandler().getGame() != null) { + event.getEvent().activate(); + } + } + + }.runTaskLater(Foxtrot.getInstance(), 10L); + return; + } + + int points = 1; + + if (teamPoints.containsKey(team.getUniqueId())) { + if (capZone.getName().equalsIgnoreCase("Sky") || capZone.getName().equalsIgnoreCase("Middle")) { + teamPoints.put(team.getUniqueId(), teamPoints.get(team.getUniqueId()) + 2); + points = 2; + } else { + teamPoints.put(team.getUniqueId(), teamPoints.get(team.getUniqueId()) + 1); + } + } else { + if (capZone.getName().equalsIgnoreCase("Sky") || capZone.getName().equalsIgnoreCase("Middle")) { + teamPoints.put(team.getUniqueId(), 2); + points = 2; + } else { + teamPoints.put(team.getUniqueId(), 1); + } + } + + teamPoints = sortByValues(teamPoints); + Foxtrot.getInstance().getServer().broadcastMessage(ConquestHandler.PREFIX + " " + ChatColor.GOLD + team.getName() + ChatColor.GOLD + " captured " + capZone.getChatColor() + capZone.getName() + ChatColor.GOLD + " and earned " + ChatColor.WHITE.toString() + points + " point(s)" + ChatColor.GOLD + "!" + ChatColor.AQUA + " (" + teamPoints.get(team.getUniqueId()) + + "/" + ConquestHandler.getPointsToWin() + ")"); + + if (teamPoints.get(team.getUniqueId()) >= ConquestHandler.getPointsToWin()) { + endGame(team); + + Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "cr givekey " + event.getPlayer().getName() + " koth 7"); + } else { + new BukkitRunnable() { + public void run() { + if (Foxtrot.getInstance().getConquestHandler().getGame() != null) { + event.getEvent().activate(); + } + } + + }.runTaskLater(Foxtrot.getInstance(), 10L); + } + } + + @EventHandler + public void onKOTHControlLost(KOTHControlLostEvent event) { + if (!event.getKOTH().getName().startsWith(ConquestHandler.KOTH_NAME_PREFIX)) { + return; + } + + Team team = Foxtrot.getInstance().getTeamHandler().getTeam(UUIDUtils.uuid(event.getKOTH().getCurrentCapper())); + ConquestCapzone capzone = ConquestCapzone.valueOf(event.getKOTH().getName().replace(ConquestHandler.KOTH_NAME_PREFIX, "").toUpperCase()); + + if (team == null) { + return; + } + + team.sendMessage(ConquestHandler.PREFIX + ChatColor.GOLD + " " + event.getKOTH().getCurrentCapper() + " was knocked off of " + capzone.getChatColor() + capzone.getName() + ChatColor.GOLD + "!"); + } + @EventHandler + public void onKOTHControlTick(EventControlTickEvent event) { + + if (!event.getKOTH().getName().startsWith(ConquestHandler.KOTH_NAME_PREFIX) || event.getKOTH().getRemainingCapTime() % 5 != 0) { + return; + } + + ConquestCapzone capzone = ConquestCapzone.valueOf(event.getKOTH().getName().replace(ConquestHandler.KOTH_NAME_PREFIX, "").toUpperCase()); + Player capper = Foxtrot.getInstance().getServer().getPlayerExact(event.getKOTH().getCurrentCapper()); + + if (capper != null) { + capper.sendMessage(ConquestHandler.PREFIX + " " + ChatColor.GOLD + "Attempting to capture " + capzone.getChatColor() + capzone.getName() + ChatColor.GOLD + "!" + ChatColor.AQUA + " (" + event.getKOTH().getRemainingCapTime() + "s)"); + } + } + + + @EventHandler + public void onPlayerDeath(PlayerDeathEvent event) { + if (Foxtrot.getInstance().getDeathbanArenaHandler().isDeathbanArena(event.getEntity())) { + return; + } + + this.death(event.getEntity()); + } + + public void death(Player player) { + Team team = Foxtrot.getInstance().getTeamHandler().getTeam(player); + + if (team == null || !teamPoints.containsKey(team.getUniqueId())) { + return; + } + + teamPoints.put(team.getUniqueId(), Math.max(0, teamPoints.get(team.getUniqueId()) - ConquestHandler.POINTS_DEATH_PENALTY)); + teamPoints = sortByValues(teamPoints); + team.sendMessage(ConquestHandler.PREFIX + ChatColor.GOLD + " Your team has lost " + ConquestHandler.POINTS_DEATH_PENALTY + " points because of " + player.getName() + "'s death!" + ChatColor.AQUA + " (" + teamPoints.get(team.getUniqueId()) + "/" + ConquestHandler.getPointsToWin() + ")"); + } + + private static LinkedHashMap sortByValues(Map map) { + LinkedList> list = new LinkedList<>(map.entrySet()); + Collections.sort(list, (o1, o2) -> o2.getValue().compareTo(o1.getValue())); + LinkedHashMap sortedHashMap = new LinkedHashMap<>(); + Iterator> iterator = list.iterator(); + + while (iterator.hasNext()) { + java.util.Map.Entry entry = iterator.next(); + sortedHashMap.put(entry.getKey(), entry.getValue()); + } + + return sortedHashMap; + } + +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/dtc/DTC.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/dtc/DTC.java new file mode 100644 index 0000000..fe42105 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/dtc/DTC.java @@ -0,0 +1,118 @@ +package net.frozenorb.foxtrot.gameplay.events.dtc; + +import java.util.concurrent.TimeUnit; + +import org.bukkit.ChatColor; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.util.BlockVector; + +import lombok.Getter; +import lombok.Setter; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.events.Event; +import net.frozenorb.foxtrot.gameplay.events.EventType; +import net.frozenorb.foxtrot.gameplay.events.events.EventActivatedEvent; +import net.frozenorb.foxtrot.gameplay.events.events.EventCapturedEvent; +import net.frozenorb.foxtrot.gameplay.events.events.EventDeactivatedEvent; + +public class DTC implements Event { + + @Getter private String name; + @Getter private BlockVector capLocation; + @Getter private String world; + @Getter private boolean hidden = false; + @Getter @Setter boolean active; + + @Getter private int currentPoints = 0; + @Getter final private int startingPoints = 175; + + @Getter private long lastBlockBreak = -1L; + @Getter private long lastPointIncrease = -1L; + + @Getter private EventType type = EventType.DTC; + + public DTC(String name, Location location) { + this.name = name; + this.capLocation = location.toVector().toBlockVector(); + this.world = location.getWorld().getName(); + this.currentPoints = this.startingPoints; + + Foxtrot.getInstance().getEventHandler().getEvents().add(this); + Foxtrot.getInstance().getEventHandler().saveEvents(); + } + + public void setLocation(Location location) { + this.capLocation = location.toVector().toBlockVector(); + this.world = location.getWorld().getName(); + Foxtrot.getInstance().getEventHandler().saveEvents(); + } + + @Override + public void tick() { + if (this.currentPoints == this.startingPoints) { + return; + } else if (this.startingPoints <= this.currentPoints) { + this.currentPoints = this.startingPoints; + } + + long timeSinceLastBlockBreak = System.currentTimeMillis() - lastBlockBreak; + long timeSinceLastPointIncrease = System.currentTimeMillis() - lastPointIncrease; + + if (TimeUnit.SECONDS.toMillis(15) <= timeSinceLastBlockBreak && TimeUnit.SECONDS.toMillis(15) <= timeSinceLastPointIncrease) { + this.currentPoints++; + this.lastPointIncrease = System.currentTimeMillis(); + + if (this.currentPoints % 10 == 0) { + Bukkit.broadcastMessage(ChatColor.translateAlternateColorCodes('&', "&6[DTC] &e" + this.getName() + " &6is regenerating &9[" + this.getCurrentPoints() + "]")); + } + } + } + + @Override + public void setHidden(boolean hidden) { + this.hidden = hidden; + Foxtrot.getInstance().getEventHandler().saveEvents(); + } + + public boolean activate() { + if (active) { + return (false); + } + + Foxtrot.getInstance().getServer().getPluginManager().callEvent(new EventActivatedEvent(this)); + + this.active = true; + this.currentPoints = startingPoints; + + return (true); + } + + public boolean deactivate() { + if (!active) { + return (false); + } + + Foxtrot.getInstance().getServer().getPluginManager().callEvent(new EventDeactivatedEvent(this)); + + this.active = false; + this.currentPoints = startingPoints; + + return (true); + } + + public void blockBroken(Player player) { + if (--this.currentPoints <= 0) { + Foxtrot.getInstance().getServer().getPluginManager().callEvent(new EventCapturedEvent(this, player)); + deactivate(); + } + + if (this.currentPoints % 10 == 0) { + Bukkit.broadcastMessage(ChatColor.translateAlternateColorCodes('&', "&6[DTC] &e" + this.getName() + " &6is being broken &9[" + this.getCurrentPoints() + "]")); + } + + this.lastBlockBreak = System.currentTimeMillis(); + } + +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/dtc/DTCListener.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/dtc/DTCListener.java new file mode 100644 index 0000000..de147ac --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/dtc/DTCListener.java @@ -0,0 +1,41 @@ +package net.frozenorb.foxtrot.gameplay.events.dtc; + +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.block.BlockBreakEvent; + +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.events.Event; +import net.frozenorb.foxtrot.gameplay.events.EventType; +import net.frozenorb.foxtrot.team.dtr.DTRBitmask; + +public class DTCListener implements Listener { + + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) // so people don't get their chat spammed + public void onBreak(BlockBreakEvent event) { + if (event.getPlayer().getGameMode() == GameMode.CREATIVE) { + return; + } + + Location location = event.getBlock().getLocation(); + if (!DTRBitmask.DTC.appliesAt(location)) { + return; + } + + DTC activeDTC = (DTC) Foxtrot.getInstance().getEventHandler().getEvents().stream().filter(Event::isActive).filter(ev -> ev.getType() == EventType.DTC).findFirst().orElse(null); + + if (activeDTC == null) { + return; + } + + if (event.getBlock().getType() == Material.OBSIDIAN) { + event.setCancelled(true); + activeDTC.blockBroken(event.getPlayer()); + } + } + +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/dtc/commands/DTCCreateCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/dtc/commands/DTCCreateCommand.java new file mode 100644 index 0000000..6023a48 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/dtc/commands/DTCCreateCommand.java @@ -0,0 +1,18 @@ +package net.frozenorb.foxtrot.gameplay.events.dtc.commands; + +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; + +import net.frozenorb.foxtrot.gameplay.events.dtc.DTC; +import cc.fyre.proton.command.Command; +import cc.fyre.proton.command.param.Parameter; + +public class DTCCreateCommand { + + @Command(names={ "DTC Create" }, permission="foxtrot.dtc.admin") + public static void kothCreate(Player sender, @Parameter(name="dtc") String koth) { + new DTC(koth, sender.getLocation()); + sender.sendMessage(ChatColor.GRAY + "Created a DTC named " + koth + "."); + } + +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/events/EventActivatedEvent.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/events/EventActivatedEvent.java new file mode 100644 index 0000000..228b4ad --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/events/EventActivatedEvent.java @@ -0,0 +1,24 @@ +package net.frozenorb.foxtrot.gameplay.events.events; + +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor + public class EventActivatedEvent extends Event { + + private static final HandlerList handlers = new HandlerList(); + + @Getter private net.frozenorb.foxtrot.gameplay.events.Event event; + + public HandlerList getHandlers() { + return (handlers); + } + + public static HandlerList getHandlerList() { + return (handlers); + } + +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/events/EventCapturedEvent.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/events/EventCapturedEvent.java new file mode 100644 index 0000000..7c8aca2 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/events/EventCapturedEvent.java @@ -0,0 +1,33 @@ +package net.frozenorb.foxtrot.gameplay.events.events; + +import org.bukkit.entity.Player; +import org.bukkit.event.Cancellable; +import org.bukkit.event.HandlerList; +import org.bukkit.event.player.PlayerEvent; + +import lombok.Getter; +import lombok.Setter; +import net.frozenorb.foxtrot.gameplay.events.Event; + +public class EventCapturedEvent extends PlayerEvent implements Cancellable { + + private static final HandlerList handlers = new HandlerList(); + + @Getter private Event event; + @Getter @Setter private boolean cancelled; + + public EventCapturedEvent(Event event, Player capper) { + super(capper); + + this.event = event; + } + + public HandlerList getHandlers() { + return (handlers); + } + + public static HandlerList getHandlerList() { + return (handlers); + } + +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/events/EventDeactivatedEvent.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/events/EventDeactivatedEvent.java new file mode 100644 index 0000000..ef3ec60 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/events/EventDeactivatedEvent.java @@ -0,0 +1,24 @@ +package net.frozenorb.foxtrot.gameplay.events.events; + +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +public class EventDeactivatedEvent extends Event { + + private static final HandlerList handlers = new HandlerList(); + + @Getter private net.frozenorb.foxtrot.gameplay.events.Event event; + + public HandlerList getHandlers() { + return (handlers); + } + + public static HandlerList getHandlerList() { + return (handlers); + } + +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/fury/FuryCapZone.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/fury/FuryCapZone.java new file mode 100644 index 0000000..96f4b0c --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/fury/FuryCapZone.java @@ -0,0 +1,16 @@ +package net.frozenorb.foxtrot.gameplay.events.fury; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.bukkit.ChatColor; + +@AllArgsConstructor +public enum FuryCapZone { + OVERWORLD("Overworld", ChatColor.DARK_GREEN, 1), + END("End", ChatColor.DARK_PURPLE, 2), + NETHER("Nether", ChatColor.RED,3); + + @Getter String displayName; + @Getter ChatColor chatColor; + @Getter int order; +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/fury/FuryHandler.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/fury/FuryHandler.java new file mode 100644 index 0000000..e1c724a --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/fury/FuryHandler.java @@ -0,0 +1,122 @@ +package net.frozenorb.foxtrot.gameplay.events.fury; + +import lombok.Getter; +import lombok.Setter; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.events.EventType; +import net.frozenorb.foxtrot.gameplay.events.conquest.ConquestHandler; +import net.frozenorb.foxtrot.gameplay.events.fury.listener.FuryListener; +import net.frozenorb.foxtrot.gameplay.events.koth.KOTH; +import net.frozenorb.foxtrot.team.Team; +import org.bson.types.ObjectId; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; + +import java.util.*; +import java.util.stream.Collectors; + +public class FuryHandler { + private final Foxtrot instance; + + public static String PREFIX = ChatColor.DARK_GRAY + "[" + ChatColor.GOLD + ChatColor.BOLD + "FURY" + ChatColor.DARK_GRAY + "]"; + + @Getter @Setter private LinkedHashMap teamPoints = new LinkedHashMap<>(); + @Getter private boolean active; + @Getter private long lastSwitchTime; + @Getter private FuryCapZone furyCapZone; + + public FuryHandler(Foxtrot instance) { + this.instance = instance; + + this.active = false; + this.furyCapZone = FuryCapZone.OVERWORLD; + + this.instance.getServer().getPluginManager().registerEvents(new FuryListener(this.instance, this), this.instance); + } + + public void start() { + this.getAllCapZones().forEach(it -> { + if (!it.isHidden()) { + it.setHidden(true); + } + + if (it.getCapTime() != 25) { + it.setCapTime(25); + } + }); + + this.active = true; + this.lastSwitchTime = System.currentTimeMillis(); + this.furyCapZone = FuryCapZone.OVERWORLD; + this.getActiveCapZone().activate(); + + this.instance.getServer().broadcastMessage(ChatColor.translate(PREFIX + " &eFury &6has started!")); + } + + public void switchCapZone() { + this.getActiveCapZone().deactivate(); + + this.furyCapZone = Arrays.stream(FuryCapZone.values()).filter(it -> it.getOrder() == this.furyCapZone.getOrder()+1).findFirst().orElse(FuryCapZone.OVERWORLD); + this.lastSwitchTime = System.currentTimeMillis(); + + this.getActiveCapZone().activate(); + + this.instance.getServer().broadcastMessage(ChatColor.translate(PREFIX + " &6Switched Capzones to " + this.furyCapZone.getChatColor() + this.furyCapZone.getDisplayName() + "&6.")); + } + + public void death(Player player) { + final Team team = Foxtrot.getInstance().getTeamHandler().getTeam(player); + + if (team == null || !this.teamPoints.containsKey(team.getUniqueId())) { + return; + } + + this.teamPoints.put(team.getUniqueId(), Math.max(0, this.teamPoints.get(team.getUniqueId()) - 20)); + this.teamPoints = sortByValues(this.teamPoints); + + this.instance.getServer().broadcastMessage(PREFIX + ChatColor.YELLOW + team.getName() + ChatColor.GOLD + " has lost " + ChatColor.YELLOW + "20 points " + ChatColor.GOLD + "because " + ChatColor.YELLOW + player.getName() + ChatColor.GOLD + " died. " + ChatColor.RED + " (" + teamPoints.get(team.getUniqueId()) + "/" + 150 + ")"); + } + + public void endGame(Team winner) { + this.active = false; + this.furyCapZone = FuryCapZone.OVERWORLD; + this.lastSwitchTime = 0; + this.getTeamPoints().clear(); + + this.getAllCapZones().forEach(KOTH::deactivate); + + if (winner == null) { + Foxtrot.getInstance().getServer().broadcastMessage(PREFIX + " " + ChatColor.GOLD + "Fury has ended."); + return; + } + + winner.setFurysCaptured(winner.getFurysCaptured() + 1); + + this.instance.getServer().broadcastMessage(ConquestHandler.PREFIX + " " + ChatColor.GOLD + ChatColor.BOLD + winner.getName() + ChatColor.GOLD + " has won Conquest!"); + } + + + public LinkedHashMap sortByValues(Map map) { + LinkedList> list = new LinkedList<>(map.entrySet()); + list.sort((o1, o2) -> o2.getValue().compareTo(o1.getValue())); + LinkedHashMap sortedHashMap = new LinkedHashMap<>(); + + for (Map.Entry entry : list) { + sortedHashMap.put(entry.getKey(), entry.getValue()); + } + + return sortedHashMap; + } + + public KOTH getKoth(FuryCapZone furyCapZone) { + return (KOTH) this.instance.getEventHandler().getEvent("Fury_" + furyCapZone.name()); + } + + public List getAllCapZones() { + return this.instance.getEventHandler().getEvents().stream().filter(it -> it.getType() == EventType.KOTH && it.getName().startsWith("Fury_")).map(it -> (KOTH)it).collect(Collectors.toList()); + } + + public KOTH getActiveCapZone() { + return this.getKoth(this.furyCapZone); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/fury/command/FuryCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/fury/command/FuryCommand.java new file mode 100644 index 0000000..f005162 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/fury/command/FuryCommand.java @@ -0,0 +1,80 @@ +package net.frozenorb.foxtrot.gameplay.events.fury.command; + +import cc.fyre.proton.command.Command; +import cc.fyre.proton.command.param.Parameter; +import cc.fyre.proton.scoreboard.construct.ScoreFunction; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.events.Event; +import net.frozenorb.foxtrot.gameplay.events.conquest.ConquestHandler; +import net.frozenorb.foxtrot.gameplay.events.fury.FuryHandler; +import net.frozenorb.foxtrot.team.Team; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.util.BlockVector; + +import java.util.concurrent.TimeUnit; + +public class FuryCommand { + @Command(names = {"fury start"}, permission = "op") + public static void execute(Player player) { + if (Foxtrot.getInstance().getFuryHandler().isActive()) { + player.sendMessage(ChatColor.RED + "Fury is already active!"); + return; + } + + Foxtrot.getInstance().getFuryHandler().start(); + } + +// @Command(names = {"fury show", "f show fury", "fury"}, permission = "") +// public static void show(Player player) { +// if (!Foxtrot.getInstance().getFuryHandler().isActive()) { +// player.sendMessage(ChatColor.RED + "Fury isn't currently active!"); +// return; +// } +// +// final FuryHandler furyHandler = Foxtrot.getInstance().getFuryHandler(); +// +// player.sendMessage(Team.GRAY_LINE); +// player.sendMessage(furyHandler.getFuryCapZone().getChatColor() + ChatColor.BOLD.toString() + "Fury " + furyHandler.getFuryCapZone().getDisplayName()); +// +// final BlockVector location = furyHandler.getActiveCapZone().getCapLocation(); +// +// player.sendMessage(ChatColor.YELLOW + "Location: " + ChatColor.RED + location.getBlockX() + ", " + location.getBlockZ() + " (" + furyHandler.getFuryCapZone().getDisplayName() + ")"); +// final long time = furyHandler.getActiveCapZone().getRemainingCapTime() <= 0 ? ConquestHandler.TIME_TO_CAP : furyHandler.getActiveCapZone().getRemainingCapTime(); +// player.sendMessage(ChatColor.YELLOW + "Remaining: " + ChatColor.RED + time + "s"); +// player.sendMessage(ChatColor.YELLOW + "World Switch in: " + ChatColor.RED + (ScoreFunction.TIME_SIMPLE.apply((float) (furyHandler.getLastSwitchTime() + TimeUnit.MINUTES.toMillis(15) - System.currentTimeMillis()) / 1000))); +// player.sendMessage(Team.GRAY_LINE); +// } + + @Command(names = {"fury stop"}, permission = "op") + public static void stop(Player player) { + if (!Foxtrot.getInstance().getFuryHandler().isActive()) { + player.sendMessage(ChatColor.RED + "Fury isn't currently active!"); + return; + } + + Foxtrot.getInstance().getFuryHandler().endGame(null); + } + + @Command(names = {"fury setpoints"}, permission = "op") + public static void setPoints(Player player, @Parameter(name = "team")Team team, @Parameter(name = "amount")int amount) { + if (!Foxtrot.getInstance().getFuryHandler().isActive()) { + player.sendMessage(ChatColor.RED + "Fury isn't currently active!"); + return; + } + + player.sendMessage(ChatColor.translate("&6You have set &f" + team.getName() + "'s points &6to &f" + amount + "&6.")); + Foxtrot.getInstance().getFuryHandler().getTeamPoints().replace(team.getUniqueId(), amount); + } + + @Command(names = {"fury swap"}, permission = "op") + public static void swap(Player player) { + if (!Foxtrot.getInstance().getFuryHandler().isActive()) { + player.sendMessage(ChatColor.RED + "Fury isn't currently active!"); + return; + } + + Foxtrot.getInstance().getFuryHandler().switchCapZone(); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/fury/listener/FuryListener.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/fury/listener/FuryListener.java new file mode 100644 index 0000000..b33e0dc --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/fury/listener/FuryListener.java @@ -0,0 +1,108 @@ +package net.frozenorb.foxtrot.gameplay.events.fury.listener; + +import cc.fyre.proton.util.UUIDUtils; +import lombok.AllArgsConstructor; +import lombok.Getter; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.events.conquest.ConquestHandler; +import net.frozenorb.foxtrot.gameplay.events.conquest.enums.ConquestCapzone; +import net.frozenorb.foxtrot.gameplay.events.events.EventCapturedEvent; +import net.frozenorb.foxtrot.gameplay.events.fury.FuryCapZone; +import net.frozenorb.foxtrot.gameplay.events.fury.FuryHandler; +import net.frozenorb.foxtrot.gameplay.events.koth.events.EventControlTickEvent; +import net.frozenorb.foxtrot.gameplay.events.koth.events.KOTHControlLostEvent; +import net.frozenorb.foxtrot.team.Team; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.scheduler.BukkitRunnable; + +@AllArgsConstructor +public class FuryListener implements Listener { + + @Getter private Foxtrot instance; + @Getter private FuryHandler furyHandler; + + @EventHandler(priority = EventPriority.LOW) + private void onCapture(EventCapturedEvent event) { + if (!event.getEvent().getName().startsWith("Fury_")) { + return; + } + + final Team team = Foxtrot.getInstance().getTeamHandler().getTeam(event.getPlayer()); + final FuryCapZone capZone = FuryCapZone.valueOf(event.getEvent().getName().replace("Fury_", "").toUpperCase()); + + if (team == null) { + this.instance.getServer().getScheduler().runTaskLater(this.instance, () -> { + if (Foxtrot.getInstance().getFuryHandler().isActive()) { + event.getEvent().activate(); + } + }, 10); + return; + } + + this.furyHandler.getTeamPoints().put(team.getUniqueId(), this.furyHandler.getTeamPoints().getOrDefault(team.getUniqueId(), 0)+1); + + this.furyHandler.setTeamPoints(this.furyHandler.sortByValues(this.furyHandler.getTeamPoints())); + + this.instance.getServer().broadcastMessage(FuryHandler.PREFIX + " " + ChatColor.YELLOW + team.getName() + ChatColor.GOLD + " captured " + capZone.getChatColor() + capZone.getDisplayName() + ChatColor.GOLD + " and earned " + ChatColor.WHITE + "1 point" + ChatColor.GOLD + "!" + ChatColor.RED + " (" + this.furyHandler.getTeamPoints().get(team.getUniqueId()) + "/" + 150 + ")"); + + if (this.furyHandler.getTeamPoints().get(team.getUniqueId()) >= 150) { + this.furyHandler.endGame(team); + } else { + new BukkitRunnable() { + public void run() { + if (Foxtrot.getInstance().getFuryHandler().isActive()) { + event.getEvent().activate(); + } + } + + }.runTaskLater(Foxtrot.getInstance(), 10L); + } + } + + + @EventHandler + public void onKOTHControlLost(KOTHControlLostEvent event) { + if (!event.getKOTH().getName().startsWith("Fury_")) { + return; + } + + final Team team = Foxtrot.getInstance().getTeamHandler().getTeam(UUIDUtils.uuid(event.getKOTH().getCurrentCapper())); + final FuryCapZone furyCapZone = this.furyHandler.getFuryCapZone(); + + if (team == null) { + return; + } + + team.sendMessage(FuryHandler.PREFIX + ChatColor.YELLOW + " " + event.getKOTH().getCurrentCapper() + ChatColor.GOLD + " was knocked off of " + furyCapZone.getChatColor() + furyCapZone.getDisplayName() + ChatColor.GOLD + "!"); + } + @EventHandler + public void onKOTHControlTick(EventControlTickEvent event) { + + if (!event.getKOTH().getName().startsWith("Fury_") || event.getKOTH().getRemainingCapTime() % 5 != 0) { + return; + } + + final Player capper = Foxtrot.getInstance().getServer().getPlayerExact(event.getKOTH().getCurrentCapper()); + final FuryCapZone furyCapZone = this.furyHandler.getFuryCapZone(); + + if (capper != null) { + capper.sendMessage(FuryHandler.PREFIX + " " + ChatColor.GOLD + "Attempting to capture " + furyCapZone.getChatColor() + furyCapZone.getDisplayName() + ChatColor.GOLD + "!" + ChatColor.RED + " (" + event.getKOTH().getRemainingCapTime() + "s)"); + } + } + + @EventHandler + public void onPlayerDeath(PlayerDeathEvent event) { + if (Foxtrot.getInstance().getDeathbanArenaHandler().isDeathbanArena(event.getEntity())) { + return; + } + this.furyHandler.death(event.getEntity()); + } + + +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/koth/KOTH.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/koth/KOTH.java new file mode 100644 index 0000000..35ec07e --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/koth/KOTH.java @@ -0,0 +1,270 @@ +package net.frozenorb.foxtrot.gameplay.events.koth; + +import cc.fyre.modsuite.mod.ModHandler; +import lombok.Getter; +import lombok.Setter; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.events.Event; +import net.frozenorb.foxtrot.gameplay.events.EventType; +import net.frozenorb.foxtrot.gameplay.events.events.EventActivatedEvent; +import net.frozenorb.foxtrot.gameplay.events.events.EventCapturedEvent; +import net.frozenorb.foxtrot.gameplay.events.events.EventDeactivatedEvent; +import net.frozenorb.foxtrot.gameplay.events.koth.events.EventControlTickEvent; +import net.frozenorb.foxtrot.gameplay.events.koth.events.KOTHControlLostEvent; +import net.frozenorb.foxtrot.team.Team; + +import org.bukkit.ChatColor; +import java.awt.Color; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.util.BlockVector; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class KOTH implements Event { + + @Getter private String name; + @Getter private BlockVector capLocation; + @Getter private String world; + @Getter private int capDistance; + @Getter private int capTime; + @Getter private boolean hidden = false; + @Getter @Setter private boolean mini = false; + @Getter @Setter boolean active; + + @Getter private transient String currentCapper; + @Getter private transient int remainingCapTime; + @Getter @Setter private transient boolean terminate; + + @Getter public boolean koth = true; + + @Getter private EventType type = EventType.KOTH; + + public KOTH(String name, Location location) { + this.name = name; + this.capLocation = location.toVector().toBlockVector(); + this.world = location.getWorld().getName(); + this.capDistance = 3; + this.capTime = 60 * 15; + this.terminate = false; + + Foxtrot.getInstance().getEventHandler().getEvents().add(this); + Foxtrot.getInstance().getEventHandler().saveEvents(); + } + + public void setLocation(Location location) { + this.capLocation = location.toVector().toBlockVector(); + this.world = location.getWorld().getName(); + Foxtrot.getInstance().getEventHandler().saveEvents(); + } + + public void setCapDistance(int capDistance) { + this.capDistance = capDistance; + Foxtrot.getInstance().getEventHandler().saveEvents(); + } + + public java.awt.Color getWaypointColor() { + switch (this.getName()) { + case "Hell": + case "Conquest-Red": + return java.awt.Color.RED; + case "Conquest-Yellow": + return java.awt.Color.YELLOW; + case "Conquest-Green": + return java.awt.Color.GREEN; + case "Conquest-Middle": + case "Citadel": + case "End": + return Color.MAGENTA; + default: + return Color.blue; + } + } + + public ChatColor getWaypointChatColor() { + switch (this.getName()) { + case "Hell": + case "Conquest-Red": + return ChatColor.RED; + case "Conquest-Yellow": + return ChatColor.YELLOW; + case "Conquest-Green": + return ChatColor.GREEN; + case "Conquest-Middle": + case "Citadel": + case "End": + return ChatColor.DARK_PURPLE; + default: + return ChatColor.AQUA; + } + } + + public void setCapTime(int capTime) { + int oldCapTime = this.capTime; + this.capTime = capTime; + + if (this.remainingCapTime > capTime) { + this.remainingCapTime = capTime; + } else if (remainingCapTime == oldCapTime) { // this will catch the time going up + this.remainingCapTime = capTime; + } + + Foxtrot.getInstance().getEventHandler().saveEvents(); + } + + public void setHidden(boolean hidden) { + this.hidden = hidden; + Foxtrot.getInstance().getEventHandler().saveEvents(); + } + + public boolean activate() { + if (active) { + return (false); + } + + Foxtrot.getInstance().getServer().getPluginManager().callEvent(new EventActivatedEvent(this)); + + this.active = true; + this.currentCapper = null; + this.remainingCapTime = this.capTime; + this.terminate = false; + + return (true); + } + + public boolean deactivate() { + if (!active) { + return (false); + } + + Foxtrot.getInstance().getServer().getPluginManager().callEvent(new EventDeactivatedEvent(this)); + + this.active = false; + this.currentCapper = null; + this.remainingCapTime = this.capTime; + this.terminate = false; + + return (true); + } + + public void startCapping(Player player) { + if (currentCapper != null) { + resetCapTime(); + } + + this.currentCapper = player.getName(); + this.remainingCapTime = capTime; + } + + public boolean finishCapping() { + Player capper = Foxtrot.getInstance().getServer().getPlayerExact(currentCapper); + + if (capper == null) { + resetCapTime(); + return (false); + } + + EventCapturedEvent event = new EventCapturedEvent(this, capper); + Foxtrot.getInstance().getServer().getPluginManager().callEvent(event); + + if (event.isCancelled()) { + resetCapTime(); + return (false); + } + + deactivate(); + return (true); + } + + public void resetCapTime() { + Foxtrot.getInstance().getServer().getPluginManager().callEvent(new KOTHControlLostEvent(this)); + + this.currentCapper = null; + this.remainingCapTime = capTime; + + if (terminate) { + deactivate(); + Foxtrot.getInstance().getServer().broadcastMessage(ChatColor.GOLD + "[KingOfTheHill] " + ChatColor.BLUE + getName() + ChatColor.YELLOW + " has been terminated."); + } + } + + @Override + public void tick() { + if (currentCapper != null) { + Player capper = Foxtrot.getInstance().getServer().getPlayerExact(currentCapper); + + if (capper == null || !onCap(capper.getLocation()) || capper.isDead() || capper.getGameMode() == GameMode.CREATIVE || ModHandler.INSTANCE.isInVanish(capper.getUniqueId())) { + resetCapTime(); + } else if (Foxtrot.getInstance().getTeamHandler().getTeam(capper) == null && isMini()) { + capper.sendMessage(ChatColor.RED + "You must be in a faction to capture a Mini KOTH!"); + resetCapTime(); + } else { + if (remainingCapTime % 60 == 0 && remainingCapTime > 1 && !isHidden()) { + + Team team = Foxtrot.getInstance().getTeamHandler().getTeam(capper); + + if (team != null) { + for (Player player : Foxtrot.getInstance().getServer().getOnlinePlayers()) { + if (team.isMember(player.getUniqueId()) && capper != player) { + player.sendMessage(ChatColor.GOLD + "[KingOfTheHill]" + ChatColor.YELLOW + " Your faction is controlling " + ChatColor.BLUE + getName() + ChatColor.YELLOW + "."); + } + } + } + } + + if (remainingCapTime % 10 == 0 && remainingCapTime > 1 && !isHidden()) { + capper.sendMessage(ChatColor.GOLD + "[KingOfTheHill]" + ChatColor.YELLOW + " Attempting to control " + ChatColor.BLUE + getName() + ChatColor.YELLOW + "."); + } + + if (remainingCapTime <= 0) { + finishCapping(); + } else { + Foxtrot.getInstance().getServer().getPluginManager().callEvent(new EventControlTickEvent(this)); + } + + this.remainingCapTime--; + } + } else { + List onCap = new ArrayList<>(); + + for (Player player : Foxtrot.getInstance().getServer().getOnlinePlayers()) { + if (onCap(player.getLocation())) { + if (Foxtrot.getInstance().getBattlePassHandler() != null) { + Foxtrot.getInstance().getBattlePassHandler().useProgress(player.getUniqueId(), progress -> { + progress.setAttemptCaptureKoth(true); + progress.requiresSave(); + + Foxtrot.getInstance().getBattlePassHandler().checkCompletionsAsync(player); + }); + } + } + + if (onCap(player.getLocation()) && !player.isDead() && player.getGameMode() == GameMode.SURVIVAL && !ModHandler.INSTANCE.isInModMode(player.getUniqueId()) && !Foxtrot.getInstance().getPvPTimerMap().hasTimer(player.getUniqueId())) { + onCap.add(player); + } + } + + Collections.shuffle(onCap); + + if (onCap.size() != 0) { + startCapping(onCap.get(0)); + } + } + } + + public boolean onCap(Location location) { + if (!location.getWorld().getName().equalsIgnoreCase(world)) { + return (false); + } + + int xDistance = Math.abs(location.getBlockX() - capLocation.getBlockX()); + int yDistance = Math.abs(location.getBlockY() - capLocation.getBlockY()); + int zDistance = Math.abs(location.getBlockZ() - capLocation.getBlockZ()); + + return xDistance <= capDistance && yDistance <= 5 && zDistance <= capDistance; + } + +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/koth/commands/koth/KOTHActivateCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/koth/commands/koth/KOTHActivateCommand.java new file mode 100644 index 0000000..06f21f0 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/koth/commands/koth/KOTHActivateCommand.java @@ -0,0 +1,88 @@ +package net.frozenorb.foxtrot.gameplay.events.koth.commands.koth; + +import net.frozenorb.foxtrot.gameplay.events.koth.KOTH; +import net.frozenorb.foxtrot.team.Team; +import net.frozenorb.foxtrot.team.dtr.DTRBitmask; +import org.bukkit.ChatColor; +import org.bukkit.Server; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.events.Event; +import cc.fyre.proton.command.Command; +import cc.fyre.proton.command.param.Parameter; +import org.bukkit.scheduler.BukkitRunnable; + +import static net.frozenorb.foxtrot.commands.FlagCommand.bitmaskInfo; + +public class KOTHActivateCommand { + + @Command(names={ "koth Activate", "koth Active", "events activate", "koth start", "activatekoth"}, permission="foxtrot.command.koth.activate") + public static void kothActivate(CommandSender sender, @Parameter(name="event") Event koth) { + // Don't start a KOTH if another one is active. + for (Event otherKoth : Foxtrot.getInstance().getEventHandler().getEvents()) { + if (otherKoth.isActive()) { + sender.sendMessage(ChatColor.RED + otherKoth.getName() + " is currently active."); + return; + } + } + + if ((koth.getName().contains("citadel") || koth.getName().toLowerCase().contains("conquest")) && !sender.isOp()) { + sender.sendMessage(ChatColor.RED + "Only ops can use the activate command for weekend events."); + return; + } + + + if (koth.getName().equalsIgnoreCase("Citadel") && Foxtrot.getInstance().getTeamHandler().getTeam("Citadel") != null && !Foxtrot.getInstance().getTeamHandler().getTeam("Citadel").hasDTRBitmask(DTRBitmask.CITADEL)) { + Team team = Foxtrot.getInstance().getTeamHandler().getTeam("Citadel"); + + int dtrInt = (int) team.getDTR(); + + dtrInt += DTRBitmask.CITADEL.getBitmask(); + team.setDTR(dtrInt); + + if (sender instanceof Player) { + bitmaskInfo((Player) sender, team); + } + + sender.sendMessage(ChatColor.RED + "No Citadel flag for Citadel found, adding..."); + } + + if (koth.getName().contains("NetherCitadel") && Foxtrot.getInstance().getTeamHandler().getTeam("NetherCitadel") != null && !Foxtrot.getInstance().getTeamHandler().getTeam("NetherCitadel").hasDTRBitmask(DTRBitmask.CITADEL)) { + Team team = Foxtrot.getInstance().getTeamHandler().getTeam("NetherCitadel"); + + int dtrInt = (int) team.getDTR(); + + dtrInt += DTRBitmask.CITADEL.getBitmask(); + team.setDTR(dtrInt); + + if (sender instanceof Player) { + bitmaskInfo((Player) sender, team); + } + + sender.sendMessage(ChatColor.RED + "No Citadel flag for NetherCitadel found, adding..."); + } + + koth.activate(); + sender.sendMessage(ChatColor.GREEN + "Successfully started " + ChatColor.WHITE + koth.getName() + ChatColor.GREEN + "."); + } + + @Command(names = {"koth resettime"}, permission="foxtrot.command.koth.activate") + public static void reset(CommandSender sender, @Parameter(name="event") Event koth) { + if (!koth.isActive()) { + sender.sendMessage(ChatColor.RED + "That event is not active!"); + return; + } + + if (!(koth instanceof KOTH)) { + sender.sendMessage(ChatColor.RED + "That event is not a KOTH!"); + return; + } + + final KOTH koth2 = (KOTH) koth; + + koth2.resetCapTime(); + sender.sendMessage(ChatColor.RED + "Reset time! Flagged as a knock muahahahah"); + } +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/koth/commands/koth/KOTHCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/koth/commands/koth/KOTHCommand.java new file mode 100644 index 0000000..12341dd --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/koth/commands/koth/KOTHCommand.java @@ -0,0 +1,58 @@ +package net.frozenorb.foxtrot.gameplay.events.koth.commands.koth; + +import static org.bukkit.ChatColor.BLUE; +import static org.bukkit.ChatColor.GOLD; +import static org.bukkit.ChatColor.RED; +import static org.bukkit.ChatColor.UNDERLINE; +import static org.bukkit.ChatColor.YELLOW; + +import java.util.Date; +import java.util.Map; + +import org.bukkit.entity.Player; + +import mkremins.fanciful.FancyMessage; +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.events.Event; +import net.frozenorb.foxtrot.gameplay.events.EventScheduledTime; +import net.frozenorb.foxtrot.gameplay.events.koth.KOTH; +import cc.fyre.proton.command.Command; + +public class KOTHCommand { + + // Make this pretty. + @Command(names={ "Event", "Event Next", "Event Info", "Event", "koth", "koth next", "koth info" }, permission="") + public static void koth(Player sender) { + for (Event koth : Foxtrot.getInstance().getEventHandler().getEvents()) { + if (!koth.isHidden() && koth.isActive()) { + FancyMessage fm = new FancyMessage("[Events] ") + .color(GOLD) + .then(koth.getName()) + .color(YELLOW) // koth name should be yellow + .style(UNDERLINE); + if (koth instanceof KOTH) { + fm.tooltip(YELLOW.toString() + ((KOTH) koth).getCapLocation().getBlockX() + ", " + ((KOTH) koth).getCapLocation().getBlockZ()); + } + fm.color(YELLOW) // should color Event coords gray + .then(" can be contested now.") + .color(GOLD); + fm.send(sender); + return; + } + } + + Date now = new Date(); + + for (Map.Entry entry : Foxtrot.getInstance().getEventHandler().getEventSchedule().entrySet()) { + if (entry.getKey().toDate().after(now)) { + sender.sendMessage(GOLD + "[KingOfTheHill] " + YELLOW + entry.getValue() + GOLD + " can be captured at " + BLUE + KOTHScheduleCommand.KOTH_DATE_FORMAT.format(entry.getKey().toDate()) + GOLD + "."); + sender.sendMessage(GOLD + "[KingOfTheHill] " + YELLOW + "It is currently " + BLUE + KOTHScheduleCommand.KOTH_DATE_FORMAT.format(now) + GOLD + "."); + sender.sendMessage(YELLOW + "Type '/koth schedule' to see more upcoming Events."); + return; + } + } + + sender.sendMessage(GOLD + "[KingOfTheHill] " + RED + "Next Event: " + YELLOW + "Undefined"); + } + +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/koth/commands/koth/KOTHCreateCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/koth/commands/koth/KOTHCreateCommand.java new file mode 100644 index 0000000..390ffd8 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/koth/commands/koth/KOTHCreateCommand.java @@ -0,0 +1,18 @@ +package net.frozenorb.foxtrot.gameplay.events.koth.commands.koth; + +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; + +import net.frozenorb.foxtrot.gameplay.events.koth.KOTH; +import cc.fyre.proton.command.Command; +import cc.fyre.proton.command.param.Parameter; + +public class KOTHCreateCommand { + + @Command(names={ "KOTH Create" }, permission="foxtrot.koth.admin") + public static void kothCreate(Player sender, @Parameter(name="koth") String koth) { + new KOTH(koth, sender.getLocation()); + sender.sendMessage(ChatColor.GRAY + "Created a KOTH named " + koth + "."); + } + +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/koth/commands/koth/KOTHDeactivateCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/koth/commands/koth/KOTHDeactivateCommand.java new file mode 100644 index 0000000..c261e49 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/koth/commands/koth/KOTHDeactivateCommand.java @@ -0,0 +1,26 @@ +package net.frozenorb.foxtrot.gameplay.events.koth.commands.koth; + +import net.frozenorb.foxtrot.Foxtrot; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; + +import net.frozenorb.foxtrot.gameplay.events.Event; +import cc.fyre.proton.command.Command; +import cc.fyre.proton.command.param.Parameter; + +public class KOTHDeactivateCommand { + + @Command(names={ "KOTH Deactivate", "KOTH Inactive", "event deactivate" }, permission="foxtrot.koth.admin") + public static void kothDectivate(CommandSender sender, @Parameter(name="koth") Event koth) { + if (!koth.isActive()) { + sender.sendMessage(ChatColor.RED + "That event isn't active!"); + return; + } + + koth.deactivate(); + + Foxtrot.getInstance().getServer().broadcastMessage(sender.getName() + ChatColor.GOLD + " has cancelled " + ChatColor.WHITE + koth.getName() + ChatColor.GOLD + "."); +// Foxtrot.getInstance().getServer().getOnlinePlayers().forEach(it -> LunarClientAPI.Companion.getInstance().getPacketHandler().sendPacket(it, new WayPointRemovePacket(((KOTH)koth).getWaypointChatColor() + koth.getName() + ChatColor.GOLD + " KOTH" + ChatColor.WHITE, it.getWorld()))); + } + +} diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/koth/commands/koth/KOTHDeleteCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/koth/commands/koth/KOTHDeleteCommand.java new file mode 100644 index 0000000..644cf24 --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/koth/commands/koth/KOTHDeleteCommand.java @@ -0,0 +1,20 @@ +package net.frozenorb.foxtrot.gameplay.events.koth.commands.koth; + +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; + +import net.frozenorb.foxtrot.Foxtrot; +import net.frozenorb.foxtrot.gameplay.events.Event; +import cc.fyre.proton.command.Command; +import cc.fyre.proton.command.param.Parameter; + +public class KOTHDeleteCommand { + + @Command(names={ "KOTH Delete", "events delete", "event delete" }, permission="foxtrot.koth.admin") + public static void kothDelete(Player sender, @Parameter(name="koth") Event koth) { + Foxtrot.getInstance().getEventHandler().getEvents().remove(koth); + Foxtrot.getInstance().getEventHandler().saveEvents(); + sender.sendMessage(ChatColor.GRAY + "Deleted event " + koth.getName() + "."); + } + +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/koth/commands/koth/KOTHDistCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/koth/commands/koth/KOTHDistCommand.java new file mode 100644 index 0000000..b7e370c --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/koth/commands/koth/KOTHDistCommand.java @@ -0,0 +1,25 @@ +package net.frozenorb.foxtrot.gameplay.events.koth.commands.koth; + +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; + +import net.frozenorb.foxtrot.gameplay.events.Event; +import net.frozenorb.foxtrot.gameplay.events.EventType; +import net.frozenorb.foxtrot.gameplay.events.koth.KOTH; +import cc.fyre.proton.command.Command; +import cc.fyre.proton.command.param.Parameter; + +public class KOTHDistCommand { + + @Command(names={ "KOTH Dist", "koth radius", "koth distance"}, permission="foxtrot.command.koth.distance") + public static void kothDist(Player sender, @Parameter(name="koth") Event koth, @Parameter(name="distance") int distance) { + if (koth.getType() != EventType.KOTH) { + sender.sendMessage(ChatColor.RED + "Can only set distance for KOTHs"); + return; + } + + ((KOTH) koth).setCapDistance(distance); + sender.sendMessage(ChatColor.GREEN + "Successfully set the radius for the " + koth.getName() + " KOTH."); + } + +} \ No newline at end of file diff --git a/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/koth/commands/koth/KOTHHelpCommand.java b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/koth/commands/koth/KOTHHelpCommand.java new file mode 100644 index 0000000..9ae663b --- /dev/null +++ b/HCF-master/src/main/java/net/frozenorb/foxtrot/gameplay/events/koth/commands/koth/KOTHHelpCommand.java @@ -0,0 +1,23 @@ +package net.frozenorb.foxtrot.gameplay.events.koth.commands.koth; + +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; + +import cc.fyre.proton.command.Command; + +public class KOTHHelpCommand { + + @Command(names={ "KOTH Help" }, permission="foxtrot.koth") + public static void kothHelp(Player sender) { + sender.sendMessage(ChatColor.RED + "/koth list - Lists KOTHs"); + sender.sendMessage(ChatColor.RED + "/koth activate - Activates a KOTH"); + sender.sendMessage(ChatColor.RED + "/koth deactivate - Deactivates a KOTH"); + sender.sendMessage(ChatColor.RED + "/koth loc - Set a KOTH's cap location"); + sender.sendMessage(ChatColor.RED + "/koth time