2021-10-18 06:33:39 -05:00
package noppes.npcs.scripted.entity ;
2018-09-13 12:03:28 -04:00
2021-10-20 23:04:52 -05:00
import net.minecraft.entity.player.EntityPlayer ;
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 ;
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 ;
2021-12-05 15:04:03 -06:00
import noppes.npcs.scripted.CustomNPCsException ;
2021-11-16 10:41:04 -06:00
import noppes.npcs.scripted.NpcAPI ;
2021-10-18 06:33:39 -05:00
import noppes.npcs.scripted.ScriptItemStack ;
import noppes.npcs.scripted.ScriptPixelmonPlayerData ;
2018-09-13 12:03:28 -04:00
import noppes.npcs.scripted.constants.EntityType ;
2022-01-12 22:59:03 -06:00
import noppes.npcs.scripted.event.FactionEvent ;
2022-01-12 04:44:08 -06:00
import noppes.npcs.scripted.gui.ScriptGui ;
2022-01-10 15:21:48 -06:00
import noppes.npcs.scripted.handler.data.IQuest ;
2022-01-30 04:05:01 -06:00
import noppes.npcs.scripted.interfaces.* ;
import noppes.npcs.scripted.overlay.ScriptOverlay ;
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 ){
player . getFoodStats (). setFoodLevel ( hunger );
}
public float getSaturation (){
return player . getFoodStats (). getSaturationLevel ();
}
public void setSaturation ( float saturation ){
player . getFoodStats (). setFoodSaturationLevel ( saturation );
}
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 ;
NoppesUtilServer . openDialog ( player , new EntityDialogNpc ( this . player . worldObj ), dialog );
}
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
*/
public int inventoryItemCount ( ScriptItemStack item ){
int i = 0 ;
for ( ItemStack is : player . inventory . mainInventory ){
if ( is != null && is . isItemEqual ( item . item ))
i += is . stackSize ;
}
return i ;
}
/**
* @since 1.7.10d
* @return Returns a IItemStack array size 36
*/
public ScriptItemStack [] getInventory (){
ScriptItemStack [] items = new ScriptItemStack [ 36 ] ;
for ( int i = 0 ; i < player . inventory . mainInventory . length ; i ++ ){
ItemStack item = player . inventory . mainInventory [ i ] ;
if ( item != null )
items [ i ] = new ScriptItemStack ( item );
}
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
*/
public boolean removeItem ( ScriptItemStack item , int amount ){
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 ] ;
if ( is != null && is . isItemEqual ( item . item )){
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 ;
return removeItem ( new ScriptItemStack ( new ItemStack ( item , 1 , damage )), amount );
}
/**
* @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
*/
public boolean giveItem ( ScriptItemStack 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
*/
public void removeAllItems ( ScriptItemStack item ){
for ( int i = 0 ; i < player . inventory . mainInventory . length ; i ++ ){
ItemStack is = player . inventory . mainInventory [ i ] ;
if ( is != null && is . isItemEqual ( item . item ))
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 );
}
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
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-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
}