Jump to content
  • 0

a little help with ArrayList and Map


Question

Posted

hello im try to make a code but i have stuck here

first of all i have 3 npc
flag 1
flag 2
flag 3
in flag 2 i have use to spawn something guard all is works file but
am try every time to kill Flag2 to delete or kill guard if have guard alive
my problem is i have much flag and if i kill one flag the guard from all flags is delete
i need delete guard only in killed flag
here is the code

 

in flagGuard i put all name from flag npc
and after i put all spawn from FlagGuardSpawn

	public Map<String, ArrayList<L2Spawn>> _FlagGuard = new ConcurrentHashMap<>();
	public ArrayList<L2Spawn> _FlagGuardSpawn = new ArrayList<>();
	

 

and here is the delete - doDie code

is work but kill all guard from all flags

i need kill only guard from flag name
 


			for(Entry<String, ArrayList<L2Spawn>> TpGuard : FactionData.getInstance()._FlagGuard.entrySet())
			{
				if(TpGuard.getKey().equals(getName()))
				{
					for(L2Spawn g : TpGuard.getValue())
					{
						g.getNpc().doDie(null);
					}
				}
				
				System.out.println("test " + TpGuard);
			}

 

3 answers to this question

Recommended Posts

  • 0
Posted
19 hours ago, tazerman2 said:

tnx for info but can you explance me more like how can start use a map list and how can get from 20 list only one and delete him or kill guard? and if you can explance me how can put that flag with guard in a list

 

You basically ask me to describe/code you a whole system. 

 

Before you code something you need to think of a hierarchy, means how your code will look like.

Ex. each guard belong to a flag and maybe flags belong to a bases. So guards are children of flags and flags are children of bases. 

 

So we start from the top to the bottom, we move from the parents to the children.

 

Let's say we have a Flag class, we want upon spawn to spawn guards around it and upon delete or capture to delete guards. So basically this flag will own a List with the spawned guards.

 

So you create a ArrayList inside the flag that accepts guards as objects. 

Each instance has overriden methods such as onDie(), onSpawn(), deleteMe() e.t.c. 

In these events you must handle the guards.

 

Example:

 

@Override
public void onSpawn()
{
	super.onSpawn();
}

 

Here you should spawn and add to the list all your guards. 

I guess you know how to manage a spawn of an NPC.

 

After you do that you have a list full of guard objects that belong to this flag. 

Now you can manage onDie() method. Same way in there you do a for in your guard list to delete all guards, they will respawn again once the flag is spawned cause the onSpawn() will be called.

 

You should really do some tests and some practice before make such systems. 

You need learn over super and overriden methods, difference between map and a list, thread safety e.t.c. 

 

 

 

 

  • Upvote 1
  • 0
Posted (edited)

Your whole structure is wrong and this is java before VM was a thing.

 

First of all your code can be all in 1 line. You haven't understand what a MAP is and how to use it base on this code i just saw:

 

MAP.getOrDefault("key", Collections.emptyList()).forEach(s -> s.doDie(s));

 

But again this is not the best perspective.

The proper one is to bind the guards on the flag itself.

 

Either create a method on the FlagInstance.java you created such as:

 

public void addSpawn(final L2Spawn spawn)
{
   GUARD_SPAWN.computeIfAbsent("key", k -> new ArrayList<>()).add(spawn);
}

 

and on the @Override method doDie() of the FlagInstance.java simply kill and delete all guards. Then upon onSpawn() method of FlagInstance.java you can spawn again all guards.

 

In addition using a String as a key is not good nor the object itself. Instead use it's objectId and make sure to remove it upon object's delete. 

 

In addition (2). ArrayList is not thread safe since you write and delete. Use CopyOnWriteArrayList (even tho it's slow)

Edited by Kara
  • 0
Posted

tnx for info but can you explance me more like how can start use a map list and how can get from 20 list only one and delete him or kill guard? and if you can explance me how can put that flag with guard in a list

Guest
This topic is now closed to further replies.


  • Posts

    • I already finished my panel for change name and gender, anyway need restart, im used schema  $stmt = $conn->prepare("EXEC lin_ChangeCharacterName2 ?, ?, ?"); for change name... also for change gender i used if ($race == 5) // Kamael race ID; modify this value as per your database { $error = "Gender change is not allowed for Kamael race characters."; } else { $stmt = $conn->prepare(" UPDATE user_data SET gender = ?, face_index = 0, hair_shape_index = 0, hair_color_index = 0 WHERE char_id = ? AND account_name = ? "); Sorry no idea how to add cached update in myext64 about, not have any  solution for this yet compatible to myext64 code. This is my panel make in php http://177.73.143.43:8080/account/ Cool panel for me, without experience in any code. Without help from any people here 🙄
    • Don't listen to that idiot @Nightw0lf — he doesn't know or understand anything... he just talks nonsense. Here's the solution, just to prove that they're the useless ones giving you meaningless and useless answers.   function disableCharacter($charId){ $buf = pack("cVV", 0x14, $charId, 1); return $this->Send($buf); } function enableCharacter($charId, $accountId){ $buf = pack("cVV", 0x15, $charId, $accountId); return $this->Send($buf); } function kickCharacter($charId) { $buf = pack("cV", 0x05, $charId); $tmp = $this->Send($buf); sleep(2); return $tmp; } //-------------------------------------------------------------------------------- if ($func==7)//DESHABILITAR PERSONAJE { $char_id = $var1; $CACHED->kickCharacter($char_id); $respuesta = $CACHED->disableCharacter($char_id); RegistrarActividad("disableCharacter",$respuesta,GetCharNameByCharId($char_id)."(".$char_id.")",0,0,0,0); } else if ($func==8)//HABILITAR PERSONAJE { $char_id = $var1; $account_id = $var2; $CACHED->kickCharacter($char_id); $respuesta = $CACHED->enableCharacter($char_id,$account_id); RegistrarActividad("enableCharacter",$respuesta,GetCharNameByCharId($char_id)."(".$char_id.")",$account_id,0,0,0); } //-------------------------------------------------------------------------------- $CACHED->disableCharacter($char_id); $tabla = sqlsrv_query($conexion_lin2world, "UPDATE user_data SET xxxxxxxxxxxx WHERE char_id=".$char_id.""); $CACHED->enableCharacter($char_id,$account_id); Now just compare the stupidity said by that imbecile @Nightw0lf with the answer I gave you... Thanks to people like this, MaxCheaters is in the state it's in... They keep following useless people who are good for nothing 😉  
    • A new template is available: Mystical-World - Responsive HTML Template    
    • very helpful comment when you say to some random person that is asking for help this: "I hope that the imbeciles that you defend better answer you" indicates you have serious psychological issues, you are a problem for the community at this point  read the rules and stop spreading the toxicity virus you are infected with, seek professional help.     on topic, l2off servers have the issue of real time name changing through website and CacheD server, in some of them even successfully return no errors but its still not working, the player has to restart the game afterwards so in best case you log them out, thats all i can tell you from the website side development. i suggest this to be inside try/catch dont use advext the guy gives errors in the documentation of the website connections and calls other developers idiots who cant make it i have rewrote this function fully (this function contains the errors)  https://wiki.depmax64.com/index.php/Список_php-функций_для_работы_с_пакетами_IL and still i made everything work except the rename, this can be done with other methods and SQL side using function queries
    • Buying & Selling Torn City Cash
  • Topics

×
×
  • Create New...

AdBlock Extension Detected!

Our website is made possible by displaying online advertisements to our members.

Please disable AdBlock browser extension first, to be able to use our community.

I've Disabled AdBlock