2021-10-18 06:33:39 -05:00
package noppes.npcs.scripted.entity ;
2018-09-13 12:03:28 -04:00
2022-05-03 11:26:04 -05:00
import net.minecraft.entity.Entity ;
2018-09-13 12:03:28 -04:00
import net.minecraft.entity.player.EntityPlayerMP ;
import net.minecraft.item.Item ;
import net.minecraft.item.ItemStack ;
2022-01-12 04:44:08 -06:00
import net.minecraft.nbt.NBTTagCompound ;
2022-05-16 18:47:16 -05:00
import net.minecraft.nbt.NBTTagList ;
2018-09-13 12:03:28 -04:00
import net.minecraft.stats.Achievement ;
import net.minecraft.stats.StatBase ;
import net.minecraft.stats.StatList ;
import net.minecraft.util.ChatComponentTranslation ;
import net.minecraft.util.ChunkCoordinates ;
import net.minecraft.world.WorldSettings ;
2022-01-12 22:59:03 -06:00
import noppes.npcs.* ;
2018-09-13 12:03:28 -04:00
import noppes.npcs.constants.EnumPacketClient ;
2021-10-24 01:53:20 -05:00
import noppes.npcs.constants.EnumQuestType ;
2022-01-12 04:44:08 -06:00
import noppes.npcs.containers.ContainerCustomGui ;
import noppes.npcs.controllers.* ;
2022-01-12 22:59:03 -06:00
import noppes.npcs.entity.EntityDialogNpc ;
2022-05-03 11:26:04 -05:00
import noppes.npcs.scripted.* ;
2018-09-13 12:03:28 -04:00
import noppes.npcs.scripted.constants.EntityType ;
2022-01-12 04:44:08 -06:00
import noppes.npcs.scripted.gui.ScriptGui ;
2022-05-11 22:08:31 -05:00
import noppes.npcs.scripted.interfaces.entity.IEntity ;
2022-05-11 16:43:14 -05:00
import noppes.npcs.scripted.interfaces.handler.data.IQuest ;
2022-01-30 04:05:01 -06:00
import noppes.npcs.scripted.interfaces.* ;
2022-05-11 16:43:14 -05:00
import noppes.npcs.scripted.interfaces.entity.IPlayer ;
import noppes.npcs.scripted.interfaces.gui.ICustomGui ;
import noppes.npcs.scripted.interfaces.item.IItemStack ;
import noppes.npcs.scripted.interfaces.overlay.ICustomOverlay ;
2022-01-30 04:05:01 -06:00
import noppes.npcs.scripted.overlay.ScriptOverlay ;
2022-05-11 22:08:31 -05:00
import noppes.npcs.scripted.NpcAPI ;
2018-09-13 12:03:28 -04:00
import noppes.npcs.util.ValueUtil ;
2022-01-10 15:21:48 -06:00
import java.util.ArrayList ;
2021-12-05 15:04:03 -06:00
import java.util.Iterator ;
2022-01-10 15:21:48 -06:00
import java.util.List ;
2021-12-05 15:04:03 -06:00
import java.util.Set ;
2021-10-12 02:57:32 -05:00
public class ScriptPlayer < T extends EntityPlayerMP > extends ScriptLivingBase < T > implements IPlayer {
2021-10-18 07:02:19 -05:00
public T player ;
2022-01-10 15:21:48 -06:00
private PlayerData data ;
2021-10-12 02:57:32 -05:00
public ScriptPlayer ( T player ){
2018-09-13 12:03:28 -04:00
super ( player );
this . player = player ;
}
/**
* @return Returns the displayed name of the player
*/
public String getDisplayName (){
return player . getDisplayName ();
}
/**
* @return Returns the players name
*/
public String getName (){
return player . getCommandSenderName ();
}
@Override
public void setPosition ( double x , double y , double z ){
NoppesUtilPlayer . teleportPlayer ( player , x , y , z , player . dimension );
}
2021-10-15 09:17:31 -05:00
2021-11-16 10:41:04 -06:00
public void setPosition ( double x , double y , double z , int dimensionId ){
if ( NpcAPI . Instance (). getIWorld ( dimensionId ) == null )
return ;
NoppesUtilPlayer . teleportPlayer ( player , x , y , z , dimensionId );
}
2022-01-31 20:16:00 -06:00
public int getHunger (){
return player . getFoodStats (). getFoodLevel ();
}
public void setHunger ( int hunger ){
2022-03-19 22:51:39 -05:00
int prevHunger = this . getHunger ();
if ( hunger < 0 )
hunger = 0 ;
player . getFoodStats (). addStats ( hunger - prevHunger , 0 );
2022-01-31 20:16:00 -06:00
}
public float getSaturation (){
return player . getFoodStats (). getSaturationLevel ();
}
public void setSaturation ( float saturation ){
2022-03-19 22:51:39 -05:00
float prevSaturation = this . getHunger ();
if ( saturation < 0 )
saturation = 0 ;
player . getFoodStats (). addStats ( 0 , saturation - prevSaturation );
2022-01-31 20:16:00 -06:00
}
2021-10-15 09:17:31 -05:00
public int getDimension (){
return player . dimension ;
}
2018-09-13 12:03:28 -04:00
public boolean hasFinishedQuest ( int id ){
PlayerQuestData data = PlayerDataController . instance . getPlayerData ( player ). questData ;
return data . finishedQuests . containsKey ( id );
}
public boolean hasActiveQuest ( int id ){
PlayerQuestData data = PlayerDataController . instance . getPlayerData ( player ). questData ;
return data . activeQuests . containsKey ( id );
}
2022-01-12 22:59:03 -06:00
public void showDialog ( int id ){
Dialog dialog = ( Dialog ) DialogController . instance . get ( id );
if ( dialog == null )
return ;
2022-04-09 00:17:16 -05:00
NoppesUtilServer . openDialog ( player , new EntityDialogNpc ( this . player . worldObj ), dialog , 0 );
2022-01-12 22:59:03 -06:00
}
2018-09-13 12:03:28 -04:00
public boolean hasReadDialog ( int id ){
PlayerDialogData data = PlayerDataController . instance . getPlayerData ( player ). dialogData ;
return data . dialogsRead . contains ( id );
}
/**
* Add the quest from active quest list
* @param id The Quest ID
*/
public void startQuest ( int id ){
Quest quest = QuestController . instance . quests . get ( id );
if ( quest == null )
return ;
PlayerData data = PlayerDataController . instance . getPlayerData ( player );
if ( data . questData . activeQuests . containsKey ( id ))
return ;
QuestData questdata = new QuestData ( quest );
data . questData . activeQuests . put ( id , questdata );
Server . sendData (( EntityPlayerMP ) player , EnumPacketClient . MESSAGE , "quest.newquest" , quest . title );
Server . sendData (( EntityPlayerMP ) player , EnumPacketClient . CHAT , "quest.newquest" , ": " , quest . title );
}
/**
* Add the quest from finished quest list
* @param id The Quest ID
*/
public void finishQuest ( int id ){
Quest quest = QuestController . instance . quests . get ( id );
if ( quest == null )
return ;
PlayerData data = PlayerDataController . instance . getPlayerData ( player );
data . questData . finishedQuests . put ( id , System . currentTimeMillis ());
}
/**
* Removes the quest from active quest list
* @param id The Quest ID
*/
public void stopQuest ( int id ){
Quest quest = QuestController . instance . quests . get ( id );
if ( quest == null )
return ;
PlayerData data = PlayerDataController . instance . getPlayerData ( player );
data . questData . activeQuests . remove ( id );
}
/**
* Removes the quest from active and finished quest list
* @param id The Quest ID
*/
public void removeQuest ( int id ){
Quest quest = QuestController . instance . quests . get ( id );
if ( quest == null )
return ;
PlayerData data = PlayerDataController . instance . getPlayerData ( player );
data . questData . activeQuests . remove ( id );
data . questData . finishedQuests . remove ( id );
}
@Override
public int getType (){
return EntityType . PLAYER ;
}
@Override
public boolean typeOf ( int type ){
return type == EntityType . PLAYER ? true : super . typeOf ( type );
}
/**
* @param faction The faction id
* @param points The points to increase. Use negative values to decrease
*/
public void addFactionPoints ( int faction , int points ){
PlayerData data = PlayerDataController . instance . getPlayerData ( player );
2022-01-12 22:59:03 -06:00
data . factionData . increasePoints ( faction , points , player );
2018-09-13 12:03:28 -04:00
}
/**
* @param faction The faction id
* @return points
*/
public int getFactionPoints ( int faction ) {
PlayerData data = PlayerDataController . instance . getPlayerData ( player );
return data . factionData . getFactionPoints ( faction );
}
/**
* @param message The message you want to send
*/
public void sendMessage ( String message ){
player . addChatMessage ( new ChatComponentTranslation ( NoppesStringUtils . formatText ( message , player )));
}
/**
* @return Return gamemode. 0: Survival, 1: Creative, 2: Adventure
*/
public int getMode (){
return player . theItemInWorldManager . getGameType (). getID ();
}
/**
* @param type The gamemode type. 0:SURVIVAL, 1:CREATIVE, 2:ADVENTURE
*/
public void setMode ( int type ){
player . setGameType ( WorldSettings . getGameTypeById ( type ));
}
/**
* @param item The item to be checked
* @return How many of this item the player has
*/
2022-05-11 22:08:31 -05:00
public int inventoryItemCount ( IItemStack item ){
2018-09-13 12:03:28 -04:00
int i = 0 ;
for ( ItemStack is : player . inventory . mainInventory ){
2022-05-11 22:08:31 -05:00
if ( is != null && is . isItemEqual ( item . getMCItemStack ()))
2018-09-13 12:03:28 -04:00
i += is . stackSize ;
}
return i ;
}
/**
* @since 1.7.10d
* @return Returns a IItemStack array size 36
*/
2022-05-11 01:10:31 -05:00
public IItemStack [] getInventory (){
IItemStack [] items = new IItemStack [ 36 ] ;
2018-09-13 12:03:28 -04:00
for ( int i = 0 ; i < player . inventory . mainInventory . length ; i ++ ){
ItemStack item = player . inventory . mainInventory [ i ] ;
if ( item != null )
2022-05-11 17:12:48 -05:00
items [ i ] = NpcAPI . Instance (). getIItemStack ( item );
2018-09-13 12:03:28 -04:00
}
return items ;
}
/**
* @param item The Item type to be removed
* @param amount How many will be removed
* @return Returns true if the items were removed succesfully. Returns false incase a bigger amount than what the player has was given
*/
2022-05-11 22:08:31 -05:00
public boolean removeItem ( IItemStack item , int amount ){
2018-09-13 12:03:28 -04:00
int count = inventoryItemCount ( item );
if ( amount > count )
return false ;
else if ( count == amount )
removeAllItems ( item );
else {
for ( int i = 0 ; i < player . inventory . mainInventory . length ; i ++ ){
ItemStack is = player . inventory . mainInventory [ i ] ;
2022-05-11 22:08:31 -05:00
if ( is != null && is . isItemEqual ( item . getMCItemStack ())){
2018-09-13 12:03:28 -04:00
if ( amount > is . stackSize ){
player . inventory . mainInventory [ i ] = null ;
amount -= is . stackSize ;
}
else {
is . splitStack ( amount );
break ;
}
}
}
}
2021-10-24 01:53:20 -05:00
this . updatePlayerInventory ();
2018-09-13 12:03:28 -04:00
return true ;
}
/**
* @since 1.7.10c
* @param id The items name
* @param damage The damage value
* @param amount How many will be removed
* @return Returns true if the items were removed succesfully. Returns false incase a bigger amount than what the player has was given or item doesnt exist
*/
public boolean removeItem ( String id , int damage , int amount ){
Item item = ( Item ) Item . itemRegistry . getObject ( id );
if ( item == null )
return false ;
2022-05-11 22:08:31 -05:00
return removeItem ( NpcAPI . Instance (). getIItemStack ( new ItemStack ( item , 1 , damage )), amount );
2018-09-13 12:03:28 -04:00
}
/**
* @since 1.7.10c
* @param item Item to be added
* @param amount The amount of the item to be added
* @return Returns whether or not it gave the item succesfully
*/
2022-05-11 22:08:31 -05:00
public boolean giveItem ( IItemStack item , int amount ){
2021-09-05 21:48:36 -05:00
if ( item != null && item . getMCItemStack () != null ) {
item . setStackSize ( amount );
2021-10-24 01:53:20 -05:00
boolean bool = this . player . inventory . addItemStackToInventory ( item . getMCItemStack ());
this . updatePlayerInventory ();
return bool ;
2021-09-05 21:48:36 -05:00
} else {
return false ;
}
2018-09-13 12:03:28 -04:00
}
/**
* @since 1.7.10c
* @param id The items name
* @param damage The damage value
* @param amount The amount of the item to be added
* @return Returns whether or not it gave the item succesfully
*/
public boolean giveItem ( String id , int damage , int amount ){
Item item = ( Item ) Item . itemRegistry . getObject ( id );
if ( item == null )
return false ;
return player . inventory . addItemStackToInventory ( new ItemStack ( item , amount , damage ));
}
/**
* Same as the /spawnpoint command
* @param x The x position
* @param y The y position
* @param z The z position
*/
public void setSpawnpoint ( int x , int y , int z ){
x = ValueUtil . CorrectInt ( x , - 30000000 , 30000000 );
z = ValueUtil . CorrectInt ( z , - 30000000 , 30000000 );
y = ValueUtil . CorrectInt ( y , 0 , 256 );
player . setSpawnChunk ( new ChunkCoordinates ( x , y , z ), true );
}
public void resetSpawnpoint (){
player . setSpawnChunk ( null , false );
}
/**
* @param item The item to be removed from the players inventory
*/
2022-05-11 22:08:31 -05:00
public void removeAllItems ( IItemStack item ){
2018-09-13 12:03:28 -04:00
for ( int i = 0 ; i < player . inventory . mainInventory . length ; i ++ ){
ItemStack is = player . inventory . mainInventory [ i ] ;
2022-05-11 22:08:31 -05:00
if ( is != null && is . isItemEqual ( item . getMCItemStack ()))
2018-09-13 12:03:28 -04:00
player . inventory . mainInventory [ i ] = null ;
}
}
2021-10-24 23:33:22 -05:00
2022-01-31 20:16:00 -06:00
public void setRotation ( float rotationYaw ){
NoppesUtilPlayer . teleportPlayer ( player , player . posX , player . posY , player . posZ , rotationYaw , player . rotationPitch , player . dimension );
}
2021-10-24 23:33:22 -05:00
public void setRotation ( float rotationYaw , float rotationPitch ){
NoppesUtilPlayer . teleportPlayer ( player , player . posX , player . posY , player . posZ , rotationYaw , rotationPitch , player . dimension );
}
2022-05-02 01:41:43 -05:00
public void swingHand (){
NoppesUtilPlayer . swingPlayerArm ( player );
}
2022-05-03 11:26:04 -05:00
public void stopUsingItem (){
player . stopUsingItem ();
}
public void clearItemInUse (){
player . clearItemInUse ();
}
public void playSound ( String name , float volume , float pitch ){
player . playSound ( name , volume , pitch );
}
public void mountEntity ( Entity ridingEntity ){
player . mountEntity ( ridingEntity );
}
2022-05-11 22:08:31 -05:00
public IEntity dropOneItem ( boolean dropStack ){
return NpcAPI . Instance (). getIEntity ( player . dropOneItem ( dropStack ));
2022-05-03 11:26:04 -05:00
}
public boolean canHarvestBlock ( ScriptBlock block ){
return player . canHarvestBlock ( block . getMCBlock ());
}
2022-05-11 22:08:31 -05:00
public boolean interactWith ( IEntity entity ){
2022-05-03 11:26:04 -05:00
return player . interactWith ( entity . getMCEntity ());
}
2018-09-13 12:03:28 -04:00
/**
* @param achievement The achievement id. For a complete list see http://minecraft.gamepedia.com/Achievements
* @return Returns whether or not the player has this achievement
*/
public boolean hasAchievement ( String achievement ){
StatBase statbase = StatList . func_151177_a ( achievement );
if ( statbase == null || ! ( statbase instanceof Achievement )){
return false ;
}
return player . func_147099_x (). hasAchievementUnlocked (( Achievement ) statbase );
}
/**
* @param permission Bukkit/Cauldron permission
* @return Returns whether or not the player has the permission
*/
public boolean hasBukkitPermission ( String permission ){
return CustomNpcsPermissions . hasPermissionString ( player , permission );
}
/**
* @since 1.7.10c
* @return Returns the exp level
*/
public int getExpLevel (){
return player . experienceLevel ;
}
/**
* @since 1.7.10c
* @param level The new exp level you want to set
*/
public void setExpLevel ( int level ){
player . experienceLevel = level ;
player . addExperienceLevel ( 0 );
}
/**
* Requires pixelmon to be installed
* @since 1.7.10d
*/
public ScriptPixelmonPlayerData getPixelmonData (){
if ( ! PixelmonHelper . Enabled )
return null ;
return new ScriptPixelmonPlayerData ( player );
}
2021-10-20 23:04:52 -05:00
public ITimers getTimers () {
2021-10-22 02:22:45 -05:00
return PlayerDataController . instance . getPlayerData ( player ). timers ;
2021-10-20 23:04:52 -05:00
}
2021-10-24 01:53:20 -05:00
public void updatePlayerInventory () {
(( EntityPlayerMP ) this . entity ). inventoryContainer . detectAndSendChanges ();
2022-02-02 07:18:33 -06:00
PlayerData playerData = PlayerDataController . instance . getPlayerData ( player );
PlayerQuestData questData = playerData . questData ;
questData . checkQuestCompletion ( playerData , EnumQuestType . Item );
2021-10-24 01:53:20 -05:00
}
2021-11-16 10:41:04 -06:00
2022-05-11 16:31:14 -05:00
@Deprecated
2021-11-16 10:41:04 -06:00
public boolean checkGUIOpen () {
NoppesUtilPlayer . isGUIOpen ( player );
PlayerData data = PlayerDataController . instance . getPlayerData ( player );
return data . getGUIOpen ();
}
2021-12-05 15:04:03 -06:00
public ScriptDBCPlayer < T > getDBCPlayer () {
2021-12-13 18:33:20 -06:00
Set keySet = player . getEntityData (). getCompoundTag ( "PlayerPersisted" ). func_150296_c ();
2021-12-05 15:04:03 -06:00
Iterator iterator = keySet . iterator ();
while ( iterator . hasNext ())
{
String s = ( String ) iterator . next ();
if ( s . contains ( "jrmc" ))
2021-12-13 18:33:20 -06:00
return new ScriptDBCPlayer < T > ( this . player );
2021-12-05 15:04:03 -06:00
}
return null ;
}
2021-12-15 00:02:27 -06:00
public boolean blocking () {
return player . isBlocking ();
}
2022-01-10 15:21:48 -06:00
private PlayerData getData () {
if ( this . data == null ) {
this . data = PlayerDataController . instance . getPlayerData ( player );
}
return this . data ;
}
public IQuest [] getActiveQuests () {
PlayerQuestData data = this . getData (). questData ;
List < IQuest > quests = new ArrayList ();
Iterator var3 = data . activeQuests . keySet (). iterator ();
while ( var3 . hasNext ()) {
int id = ( Integer ) var3 . next ();
IQuest quest = ( IQuest ) QuestController . instance . quests . get ( id );
if ( quest != null ) {
quests . add ( quest );
}
}
return ( IQuest [] ) quests . toArray ( new IQuest [ quests . size () ] );
}
2022-01-12 04:44:08 -06:00
public IContainer getOpenContainer () {
return NpcAPI . Instance (). getIContainer ((( EntityPlayerMP ) this . entity ). openContainer );
}
public void showCustomGui ( ICustomGui gui ) {
CustomGuiController . openGui ( this , ( ScriptGui ) gui );
}
public ICustomGui getCustomGui () {
return (( EntityPlayerMP ) this . entity ). openContainer instanceof ContainerCustomGui ? (( ContainerCustomGui )(( EntityPlayerMP ) this . entity ). openContainer ). customGui : null ;
}
public void closeGui () {
(( EntityPlayerMP ) this . entity ). closeContainer ();
2022-01-30 04:05:01 -06:00
Server . sendData (( EntityPlayerMP ) this . entity , EnumPacketClient . GUI_CLOSE , - 1 , new NBTTagCompound ());
}
public void showCustomOverlay ( ICustomOverlay overlay ) {
CustomGuiController . openOverlay ( this , ( ScriptOverlay ) overlay );
}
public void closeOverlay ( int id ) {
Server . sendData (( EntityPlayerMP ) this . entity , EnumPacketClient . OVERLAY_CLOSE , id , new NBTTagCompound ());
2022-01-12 04:44:08 -06:00
}
2022-05-16 22:04:54 -05:00
public void setSkinOverlay ( int id , ScriptSkinOverlay overlay ) {
if ( overlay != null ) {
2022-05-16 18:47:16 -05:00
NBTTagCompound data = new NBTTagCompound ();
NBTTagCompound compound = new NBTTagCompound ();
compound . setInteger ( "SkinOverlayID" , id );
2022-05-16 22:04:54 -05:00
compound . setString ( "SkinOverlayTexture" , overlay . getTexture ());
compound . setBoolean ( "SkinOverlayGlow" , overlay . getGlow ());
2022-05-16 18:47:16 -05:00
if ( ! player . getEntityData (). hasKey ( "SkinOverlayData" )) {
NBTTagList tagList = new NBTTagList ();
tagList . appendTag ( compound );
player . getEntityData (). setTag ( "SkinOverlayData" , tagList );
} else {
for ( int i = 0 ; i < player . getEntityData (). getTagList ( "SkinOverlayData" , 10 ). tagCount (); i ++ ) {
int tagID = player . getEntityData (). getTagList ( "SkinOverlayData" , 10 ). getCompoundTagAt ( i ). getInteger ( "SkinOverlayID" );
if ( tagID == id ) {
player . getEntityData (). getTagList ( "SkinOverlayData" , 10 ). removeTag ( i );
}
}
player . getEntityData (). getTagList ( "SkinOverlayData" , 10 ). appendTag ( compound );
}
data . setTag ( "SkinOverlayData" , player . getEntityData (). getTagList ( "SkinOverlayData" , 10 ));
Server . sendData (( EntityPlayerMP ) this . entity , EnumPacketClient . CLIENT_UPDATE_SKIN_OVERLAYS , data );
}
}
public void removeSkinOverlay ( int id ) {
if ( player . getEntityData (). hasKey ( "SkinOverlayData" )) {
NBTTagCompound data = new NBTTagCompound ();
for ( int i = 0 ; i < player . getEntityData (). getTagList ( "SkinOverlayData" , 10 ). tagCount (); i ++ ) {
int tagID = player . getEntityData (). getTagList ( "SkinOverlayData" , 10 ). getCompoundTagAt ( i ). getInteger ( "SkinOverlayID" );
if ( tagID == id ) {
player . getEntityData (). getTagList ( "SkinOverlayData" , 10 ). removeTag ( i );
}
}
data . setTag ( "SkinOverlayData" , player . getEntityData (). getTagList ( "SkinOverlayData" , 10 ));
Server . sendData (( EntityPlayerMP ) this . entity , EnumPacketClient . CLIENT_UPDATE_SKIN_OVERLAYS , data );
}
2022-05-16 05:45:00 -05:00
}
2022-01-10 15:21:48 -06:00
public IQuest [] getFinishedQuests () {
PlayerQuestData data = this . getData (). questData ;
List < IQuest > quests = new ArrayList ();
Iterator var3 = data . finishedQuests . keySet (). iterator ();
while ( var3 . hasNext ()) {
int id = ( Integer ) var3 . next ();
IQuest quest = ( IQuest ) QuestController . instance . quests . get ( id );
if ( quest != null ) {
quests . add ( quest );
}
}
return ( IQuest [] ) quests . toArray ( new IQuest [ quests . size () ] );
}
2018-09-13 12:03:28 -04:00
}