Jump to content


Photo

getmapusers - More options

getmapusers

  • Please log in to reply
4 replies to this topic

#1 Klutz

Klutz

    Advanced Member

  • Members
  • PipPipPip
  • 77 posts

Posted 16 April 2017 - 09:54 PM

Lately i been working to switch from eAthena server to Hercules.

with all the new functions Hercules has i started to build new scripts for my npcs.

 

i found myself searching a lot for lists:

1) Name of people on specific map.

2) Char ID of people on specific map.

3) Account ID of people on specific map.

 

BUILDIN(getmapusers) {
	int16 m;
	int type = 0;
	int users = 0;
	struct s_mapiterator* iter;
	struct map_session_data *sd;
	const char *str;
	str = script_getstr(st,2);
	if( (m=map->mapname2mapid(str))< 0) {
		script_pushint(st,-1);
		return true;
	}
	if (script_hasdata(st,3))
		type = script_getnum(st,3);
	else{
		script_pushint(st,map->list[m].users);
		return true;
	}
	iter = mapit_getallusers();
	for (sd = BL_UCAST(BL_PC, mapit->first(iter)); mapit->exists(iter); sd = BL_UCAST(BL_PC, mapit->next(iter))) {
		if (sd->bl.m == m){
			switch (type)
			{
				case 1:
					mapreg->setregstr(reference_uid(script->add_str("[email protected]$"), users), sd->status.name);
					break;
				case 2:
					mapreg->setreg(reference_uid(script->add_str("[email protected]"), users), sd->status.char_id);
					break;
				case 3:
					mapreg->setreg(reference_uid(script->add_str("[email protected]"), users), sd->status.account_id);
					break;
			}
			users++;
		}
	}
	mapit->free(iter);
	return true;
}



BUILDIN_DEF(getmapusers,"s?"),

 

 

 

 

 

I was wondering if you want to add it to Hercules as a new feature.

 

Regards,

Klutx


Edited by Klutz, 16 April 2017 - 10:27 PM.


#2 Khazou

Khazou

    Advanced Member

  • Members
  • PipPipPip
  • 39 posts

Posted 25 April 2017 - 07:37 AM

You can use this :)

 


*getunits(<type>, <variable>, <limit>, "<map>"{, <x1>, <y1>, <x2>, <y2>})

This function searches a whole map or area for units and adds their GID to
the provided <variable> array. It filters units by <type> and stops searching
after <limit> units have been found. Set <limit> to false (0) if you wish to
disable the limit altogether.

Type is the type of unit to search for:

	BL_PC    - Character object
	BL_MOB   - Monster object
	BL_PET   - Pet object
	BL_HOM   - Homunculus object
	BL_MER   - Mercenary object
	BL_IEM   - Item object (item drops)
	BL_SKILL - Skill object (skill fx & sfx)
	BL_NPC   - NPC object
	BL_CHAT  - Chat object
	BL_ELEM  - Elemental object
	BL_CHAR  - Shorthand for (BL_PC|BL_MOB|BL_HOM|BL_MER|BL_ELEM)
	BL_ALL   - Any kind of object

** Do NOT use UNITTYPE_ constants here, they have different values.

Example:

	.@count = getunits((BL_PC | BL_NPC), .@units, false, "prontera");

The above example would search the map "prontera" for all PC and NPC units and
add them to the .@units array, while setting .@count to the amount of units
added to the array (useful in for() loops).



#3 Arduino

Arduino

    Member

  • Members
  • PipPip
  • 21 posts
  • LocationUnder a rock
  • Emulator:Hercules
  • Github:abaddondeseor

Posted 26 April 2017 - 03:27 AM

You can use this :)

 


*getunits(<type>, <variable>, <limit>, "<map>"{, <x1>, <y1>, <x2>, <y2>})

This function searches a whole map or area for units and adds their GID to
the provided <variable> array. It filters units by <type> and stops searching
after <limit> units have been found. Set <limit> to false (0) if you wish to
disable the limit altogether.

Type is the type of unit to search for:

	BL_PC    - Character object
	BL_MOB   - Monster object
	BL_PET   - Pet object
	BL_HOM   - Homunculus object
	BL_MER   - Mercenary object
	BL_IEM   - Item object (item drops)
	BL_SKILL - Skill object (skill fx & sfx)
	BL_NPC   - NPC object
	BL_CHAT  - Chat object
	BL_ELEM  - Elemental object
	BL_CHAR  - Shorthand for (BL_PC|BL_MOB|BL_HOM|BL_MER|BL_ELEM)
	BL_ALL   - Any kind of object

** Do NOT use UNITTYPE_ constants here, they have different values.

Example:

	.@count = getunits((BL_PC | BL_NPC), .@units, false, "prontera");

The above example would search the map "prontera" for all PC and NPC units and
add them to the .@units array, while setting .@count to the amount of units
added to the array (useful in for() loops).

Very useful info, i didn't know it! and before I tried to approach this implementing the addrid command from rathena, but as this is official (of hercules) is better i guess.


From zero to hero


#4 Khazou

Khazou

    Advanced Member

  • Members
  • PipPipPip
  • 39 posts

Posted 26 April 2017 - 06:43 AM

^^

If you're trying to add addrid you should read this http://herc.ws/board...command-addrid/

And the cons about using such a command :)

 

 

Will provide sexual favours to the person who can get this working for latest herc. Can pay money too.



This kind of addrid was rejected from Hercules too. Because this can be dangerous. It can have unexpected behavior when the player is attached to other npc and you call addrid, either that script would stop executing(think doing some quest, the variables changed but you didn't got reward), or the script with addrid would behave oddly(rid not attached but script continued to run)
More info: https://github.com/H...rcules/pull/211



#5 meko

meko

    Newbie

  • Members
  • Pip
  • 3 posts
  • Github:mekolat

Posted 27 April 2017 - 01:06 AM

 Very useful info, i didn't know it! 

 

Yeah that's new: https://github.com/H...cules/pull/1657






0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users


This topic has been visited by 39 user(s)