Andrew2070 Posted June 12, 2017 Posted June 12, 2017 (edited) Hi. I need to create a task that cycles through a list of players and executes a certain task: For some reason eclipse keeps on providing an error on my EntityPlayer player = (EntityPlayer) player; statement. I cannot figure out why, if anyone can provide me a hand it would be much appreciated: Additionally I would like if someone could tell me how best i could update my citizen profile of a player's power value. Should i just go into the citizen profile and where it says double power, make it double Power = newPower (from this class)? As much specific and detailed help that can be given will be greatly appreciated as i am still learning Java and forge modding. public class PowerUpdateTask { private double power = Config.instance.defaultPower.get(); private double maxpower = Config.instance.defaultMaxPower.get(); private void StartTimer(){ Timer timer = new Timer (); TimerTask hourlyTask = new TimerTask () { @Override public void run () { //Get A List of Entities: for(int i=0; i>MinecraftServer.getServer().getEntityWorld().loadedEntityList.size(); i++) { //Cycle Through List of Entities and choose one: Entity entity = (Entity) MinecraftServer.getServer().getEntityWorld().loadedEntityList.get(i); //Check To See if this probable Player Entity Exists: if (entity != null) { //Check To See if Entity is actually 100% a Player: EntityPlayer player = (EntityPlayer) player; if ( entity == player) { //Check To See if Player is Alive: if (player.isDead) continue; //Check To See if Player Has A Citizen Profile, If Not Then Make One: String playerName = player.getDisplayName(); Citizen res = EmpiresUniverse.instance.getOrMakeCitizen(playerName); //Calculate New Power For This Selected Player: double newPower = res.getPower() + Config.instance.PowerPerHour.get(); //Assign This New Power Through An Event? } } } } }; timer.schedule (hourlyTask, 0l, 1000*60*60); }; }; Edited June 13, 2017 by Andrew2070 changes Quote
V0idWa1k3r Posted June 13, 2017 Posted June 13, 2017 What are you trying to cast to EntityPlayer? You do not yet have a local/field named player. Additionaly you can't have 2 locals with the same name. Moreover if the entity you are casting is not an instanceof EntityPlayer you will crash with a ClassCastException. There is an instanceof check in the language, use it. Comparing a local after casting to a local before casting is redundant. It is the same object, the == check will always be true. Those are java basics. getEntityWorld only returns the overworld. There is a list that holds all players already, it is called something like playerEntitiesList. I have no idea what are you trying to do with that timer but that will not work. If you want to store data related to a player use capabilities. If you want to do something regularly use forge's TickEvent subevents. Quote
Andrew2070 Posted June 13, 2017 Author Posted June 13, 2017 I am trying to create a task that every hour updates a player's power. Similar to what the factions server plugin does, but i need it for my mod. Someone told me that i have to get a list of entities and keep filtering it down till i get players. What i don't understand is why can't i find a pre-done playerlist method in the libraries. There is 0 documentation on player lists, and there are methods for getting total players online. Factions also does their own timer in similar fashion to mine, it just has to work every hour of real time. Also if you pay some attention to my code you can see that i am getting a list of entities in the world. Quote
V0idWa1k3r Posted June 13, 2017 Posted June 13, 2017 (edited) On 6/13/2017 at 10:41 AM, Andrew2070 said: Also if you pay some attention to my code you can see that i am getting a list of entities in the world. Expand Yes, why? To begin with you are getting a list of every entity in the world, but you only care about the players. There is a playerEntities field in a world that contains all the players. You do not need to iterate every singe entity in the world. Additionaly your current code will only work for players in the overworld. If a player is in the nether, for example, you will not iterate over them. On 6/13/2017 at 10:41 AM, Andrew2070 said: What i don't understand is why can't i find a pre-done playerlist method in the libraries. Expand On 6/13/2017 at 10:41 AM, Andrew2070 said: There is 0 documentation on player lists, and there are methods for getting total players online. Expand You can get a list of all players on a server through PlayerList::getPlayers and you can obtain an instance of PlayerList from a server with MinecraftServer::getPlayerList. Those method/class names look pretty self-explanatory to me... On 6/13/2017 at 10:41 AM, Andrew2070 said: Someone told me that i have to get a list of entities and keep filtering it down till i get players. Expand Well tell them that that is very inefficient especially because there are already methods of doing so without iterating every entity in the world and every world of a server. On 6/13/2017 at 10:41 AM, Andrew2070 said: Factions also does their own timer in similar fashion to mine, it just has to work every hour of real time. Expand I do not know what factions is but using a Timer like that is not thread safe. If you are comfortable with multi-threading it might work but considering that this task is only ever executed once an hour I would just use forge's TickEvents. I do not see a need for another thread for a really infrequient task that barely does anything(if you use the PlayerList, that is). 1 hour is 72000 ticks. Edited June 13, 2017 by V0idWa1k3r Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.