Jump to content

Recommended Posts

Posted (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 by Andrew2070
changes
Posted

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.

Posted

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.

 

Posted (edited)
17 minutes ago, 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.

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.

 

17 minutes ago, Andrew2070 said:

What i don't understand is why can't i find a pre-done playerlist method in the libraries.

 

17 minutes ago, Andrew2070 said:

There is 0 documentation on player lists, and there are methods for getting total players online.

 

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...

 

17 minutes ago, Andrew2070 said:

Someone told me that i have to get a list of entities and keep filtering it down till i get players.

 

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.

17 minutes ago, Andrew2070 said:

Factions also does their own timer in similar fashion to mine, it just has to work every hour of real time.

 

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 by V0idWa1k3r

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.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.