Jump to content

AnnieRuru

Script Developers
  • Content Count

    1677
  • Joined

  • Last visited

  • Days Won

    245

Posts posted by AnnieRuru


  1. run this script, and click on it

    prontera,155,185,4	script	ksjdhfksdjfh	1_F_MARIA,{
    	ModExp = 100;
    	ModDrop = 100;
    	ModDeath = 100;
    //	BankVault = 1000; // in-game bank variable, limit to INT signed
    	end;
    }

    to reset everything back to normal

     

    additionally, its store in SQL table `account_data`

    select * from account_data;

    where your account bank balance store there as well


  2. https://github.com/AnnieRuru/Release/blob/master/Guides/What is dynamic_mob and how it affects scripts.md.
    https://rathena.org/board/topic/102715-mvp-board/#comment-357487

    unfortunately, Hercules/rAthena has dynamic_mob option, which is not available on Aegis, official ragnarok emulator
    we can't just simply mobcount the MVP because the boss_monster are not loaded until someone warp into the map

    the TBL_MOB in the topic you link to, using iteration, is equivalent to getunits script command, also doesn't cache the boss_monster

    there is a tricky way to do this however, which, in my theory, whenever a script command boss_monster pops up, push a source variable,
    and again this source variable can be read by scripts, and thus provide us to check either that MVP is available or not

     

    this question also has been asked to me privately in discord, and currently in 1 of my todo list


  3. @RagnarokOnline2015 must be using RENEWAL

    in renewal, its base atk + weapon atk
    simply equip any weapon will do, like I'm using priest, equip a club

    "@refine 0 10", the refine will increase the value along with bonus bAtk or bonus bAtk2

    in renewal, equip fire-brand will increase the value there


    @Orca must be using pre-renewal

    yes, equip a fire-brand doesn't increase that value,

    to increase bAtk2, the only way is through refine "@refine 0 10" on your fire-brand, or using bonus bAtk2

     

    and I repeat again, THIS IS OFFICIAL <-- tested same thing happen in rathena as well(EDIT)
    this atk/matk stuffs has even confuse some developers

     

    EDIT: seems like I misunderstood the question,
    you want to increase the 65535, not to add to the bAtk2 bonus ...


  4. 15 hours ago, Myriad said:

    Found an issue. Console getting spammed with this:

     

    
    [Mar/29 14:50:41][Warning]: npc_event: player's event queue is full, can't add event 'RecalcStat::OnPCStatCalcEvent' !

     

    this isn't an issue, it just say it runs this event too many times
    probably having some scripts runs jobchange + statusup +equip + .... etc stuffs

    I remember you said something about having a refiner script runs in loop ... probably caused by that
    and even that ... it shouldn't effect anything ... just an error message


  5. 6 hours ago, 4144 said:

    because client exe almost latest, better get grf and other files from official kro or from any clean data/grf without custom modifications.

    yes, I having some doubts why it always display rathena website when I change screen resolution in-game

    so akkarin actually insert some modification to make the client exit and always go visit rathena.org, I think
    downloading the one provided by Ridley one .... now this gonna take another 3~4 days


  6. hercules is compatible with newer hexed client
    but that doesn't mean every hexed client is stable for use in live server

    currently the recommended client date everyone using is 2018-06-21aRagexeRE
    I'm just using this one to test some newer stuffs, like the barter system

    yeah, this client seems to crash... probably because of gravity ... doing that ragexe/ragexere name restriction ..

    also can't enable zoom out, and can't remove chat limit ...


  7. why not?

    prontera,155,185,5	script	quest	1_F_MARIA,{
    	mes "quest giver";
    	next;
    	for ( .@i = 0; .@i < 3; ++.@i )
    		.@menu$[.@i] = sprintf( _$( "%sQuest %d" ), F_MesColor((quest > .@i *2)? C_GRAY : C_BLACK), .@i +1 );
    	.@s = select( implode( .@menu$, ":" ) ) -1;
    	.@state = .@s *2;
    	if ( quest > .@state ) {
    		mes "you have completed this quest";
    		close;
    	}
    	else if ( quest < .@state ) {
    		mes "you can't take this quest yet.";
    		close;
    	}
    	mesf "Go talk to npc %d", .@s +1;
    	quest = .@state +1;
    	close;
    }
    function	script	F_quest_state	{
    	.@npcid = getarg(0);
    	.@state = (.@npcid -1) *2 +1;
    	if ( quest == .@state ) {
    		dispbottom sprintf( _$( "complete %d" ), .@npcid );
    		quest = .@state +1;
    	}
    	end;
    }
    prontera,150,180,5	script	npc 1	1_F_MARIA,{ F_quest_state(1); }
    prontera,155,180,5	script	npc 2	1_F_MARIA,{ F_quest_state(2); }
    prontera,160,180,5	script	npc 3	1_F_MARIA,{ F_quest_state(3); }
    
    prontera,160,185,5	script	reset	1_F_MARIA,{ quest = 0; }

     

    and this is quest log with achievement system

    {
    	Id: 49920
    	Name: "Quest 1"
    },
    {
    	Id: 49921
    	Name: "Quest 2"
    },
    {
    	Id: 49922
    	Name: "Quest 3"
    },
    	[49920] = {
    		Title = "Quest 1",
    		IconName = "ico_nq.bmp",
    		Description = {
    			"Talk to <NAVI>NPC 1<INFO>prontera,150,180,</INFO></NAVI>"
    		},
    		Summary = "Talk to NPC 1",
    		NpcSpr = "1_F_MARIA",
    		NpcNavi = "prontera",
    		NpcPosX = 150,
    		NpcPosY = 180,
    	},
    	[49921] = {
    		Title = "Quest 2",
    		IconName = "ico_nq.bmp",
    		Description = {
    			"Talk to <NAVI>NPC 2<INFO>prontera,155,180,</INFO></NAVI>"
    		},
    		Summary = "Talk to NPC 2",
    		NpcSpr = "1_F_MARIA",
    		NpcNavi = "prontera",
    		NpcPosX = 155,
    		NpcPosY = 180,
    	},
    	[49922] = {
    		Title = "Quest 3",
    		IconName = "ico_nq.bmp",
    		Description = {
    			"Talk to <NAVI>NPC 3<INFO>prontera,160,180,</INFO></NAVI>"
    		},
    		Summary = "Talk to NPC 3",
    		NpcSpr = "1_F_MARIA",
    		NpcNavi = "prontera",
    		NpcPosX = 160,
    		NpcPosY = 180,
    	}
    {
    	Id: 109993
    	Name: "Custom Quest"
    	Type: "ACH_QUEST"
    	Objectives: {
    		*1: {
    			Description: "Complete Quest 1"
    		}
    		*2: {
    			Description: "Complete Quest 2"
    		}
    		*3: {
    			Description: "Complete Quest 3"
    		}
    	}
    	Points: 0
    },
    	[109993] = {
    		UI_Type = 0,
    		group = "CHATTING",
    		major = 4,
    		minor = 0,
    		title = "Custom Quest",
    		content = {
    			summary = "Visit the Quest Giver",
    			details = "Visit the Quest Giver."
    		},
    		resource = {
    			[1] = { text = "Complete Quest 1" },
    			[2] = { text = "Complete Quest 2" },
    			[3] = { text = "Complete Quest 3" }
    		},
    		score = 0
    	},
    prontera,155,185,5	script	quest	1_F_MARIA,{
    	mes "quest giver";
    	next;
    	for ( .@i = 0; .@i < 3; ++.@i )
    		.@menu$[.@i] = sprintf( _$( "%sQuest %d" ), F_MesColor((questprogress( 49920+ .@i ) == 2)? C_GRAY : C_BLACK), .@i +1 );
    	.@s = select( implode( .@menu$, ":" ) ) -1;
    	.@qid = 49920+ .@s;
    	if ( questprogress(.@qid) == 2 ) {
    		mes "you have completed this quest";
    		close;
    	}
    	else if ( .@qid == 49920 ); // break;
    	else if ( questprogress(.@qid -1) != 2 ) {
    		mes "you can't take this quest yet.";
    		close;
    	}
    	mesf "Go talk to npc %d", .@s +1;
    	if ( questprogress(.@qid) == 0 )
    		setquest .@qid;
    	close;
    }
    function	script	F_quest_state	{
    	.@npcid = getarg(0);
    	.@qid = .@npcid -1 + 49920;
    	if ( questprogress(.@qid) == 1 ) {
    		completequest .@qid;
    		dispbottom sprintf( _$( "complete %d" ), .@npcid );
    		achievement_progress 109993, .@npcid, 1, 1;
    	}
    	end;
    }
    prontera,150,180,5	script	npc 1	1_F_MARIA,{ F_quest_state(1); }
    prontera,155,180,5	script	npc 2	1_F_MARIA,{ F_quest_state(2); }
    prontera,160,180,5	script	npc 3	1_F_MARIA,{ F_quest_state(3); }
    
    prontera,160,185,5	script	reset	1_F_MARIA,{
    	for ( .@i = 49920; .@i <= 49922; ++.@i )
    		if ( questprogress(.@i) )
    			erasequest(.@i);
    	end;
    }

     

    have fun playing with it :P

    actually this is very simple script, just wanna play around a little bit


  8. the latest available KRO client download...
    https://rathena.org/board/topic/106413-kro-full-client-2019-02-25-includes-bgm-rsu/

    so I try download the nearest hexed client ...
    http://nemo.herc.ws/clients/2019-02-20aRagexeRE/

     

    Everything seems to be working fine in-game

    the problem is during exit the client, it just crash ...
    1. press Alt+F4
    2. click -> Game Option -> Exit to Windows button
    exit the program in both methods also crash

    20190220RE_crash.png

    I noticed that when click -> Game Option -> Exit to Windows button,
    my mouse cursor stuck in-game

    @4144

    9 Disable 1rag1 type parameters (Recommended)
    13 Disable Ragexe Filename Check (Recommended)
    23 Enable /who command (Recommended)
    34 Enable /showname (Recommended)
    35 Read Data Folder First
    36 Read msgstringtable.txt (Recommended)
    38 Remove Gravity Ads (Recommended)
    39 Remove Gravity Logo (Recommended)
    41 Disable Nagle Algorithm (Recommended)
    44 Translate Client (Recommended)
    46 Use Normal Guild Brackets (Recommended)
    47 Use Ragnarok Icon
    49 Enable Multiple GRFs (Recommended)
    64 @ Bug Fix (Recommended)
    65 Load Custom lua file instead of iteminfo*.lub (Recommended)
    84 Remove Serial Display (Recommended)
    90 Enable DNS Support (Recommended)
    208 Restore Cash Shop Icon
    212 Restore Roulette
    213 Disable Help Message on Login (Recommended)
    230 Always load Korea ExternalSettings lua file
    231 Remove hardcoded address/port (Recommended)
    232 Restore old login packet (Recommended)
    

     


  9. 3 hours ago, WhiteEagle said:

    The problem is, that normally you can only skill your 2nd job skills, when you have already skill your 1st job skills.
    But in the screenshot you can see, I dont need to use my 40/50 skillpoints from my 1st job.
    So I can spend more skillpoints for my 2nd job after my reset.

    it caused by a setting in conf/map/battle/player.conf

    // When set to true, forces skill points gained from 1st class to be put into 1st class
    // skills, and forces novice skill points to be put into the basic skill. (Note 1)
    player_skillup_limit: true

     

    so its either you have set that to false ... OR ...

    //	src/map/pc.c  - LINE 1928
    static int pc_calc_skilltree_normalize_job(struct map_session_data *sd)
    {
    	int skill_point, novice_skills;
    	uint16 job;
    
    	nullpo_ret(sd);
    	job = sd->job;
    	if (!battle_config.skillup_limit || pc_has_permission(sd, PC_PERM_ALL_SKILL))
    		return job;

    you are using GM account that has permission to bypass this


  10. static void guild_block_skill(struct map_session_data *sd, int time)
    {
    	uint16 skill_id[] = { GD_BATTLEORDER, GD_REGENERATION, GD_RESTORE, GD_EMERGENCYCALL };
    	int i;
    	for (i = 0; i < 4; i++)
    		skill->blockpc_start(sd, skill_id[i], time);
    }

    hercules uses skill->blockpc_start and skill->blockpc_end to just set sd->blockskill[skill_id] = true:false;

    so you can just hook to skill->blockpc_end to display the message for the guild master

    to display the time left in min:sec, when guild master use the skill, run DIFF_TICK function

     

    oh wait this is request section ....


  11. wait wait, I was asking question back before attempting to write out this script,
    and I still haven't made title system script commands plugin yet ...

    I don't understand why you mark that as answer while I was actually asking for more information ...

     

    rephrase again

    1. you have to list out which MVP are easy/normal/hard,
    easy - MVPID 1 , MVPID 2 ...
    normal - MVPID 1 , MVPID 2 ...
    ...

    2. wait until I make title system script commands plugin .... going to write now

    3. rewards give out by weekly or monthly are entire different formula ... you can only pick one ...

    4. MVP points will trigger on MVP maps only  <-- means only trigger like .... inside MVP room only ?


  12. 7 hours ago, astralprojection said:

    I think there is no way we can trigger on mob drop.

    of course it can

    #include "common/hercules.h"
    #include "map/mob.h"
    #include "map/npc.h"
    #include "map/mapreg.h"
    #include "plugins/HPMHooking.h"
    #include "common/HPMDataCheck.h"
    
    HPExport struct hplugin_info pinfo = {
    	"OnMobDrop",
    	SERVER_TYPE_MAP,
    	"x.x",
    	HPM_VERSION,
    };
    
    const char *event_label = "itemdrop::OnMobDrop";
    
    struct item_drop *mob_setdropitem_post( struct item_drop* retVal, int nameid, int qty, struct item_data *data ) {
    	mapreg->setreg( reference_uid( script->add_variable("$@mobdrop_itemid"), 0), nameid );
    	npc->event_do(event_label);
    	return retVal;
    }
    
    HPExport void server_online( void ) {
    	struct event_data *ev = (struct event_data*)strdb_get( npc->ev_db, event_label );
    	if ( ev == NULL || ev->nd == NULL ) {
    		ShowWarning( "NPC label "CL_WHITE"%s"CL_RESET" does not found. Unloading "CL_WHITE"OnMobDrop"CL_RESET" Plugin.\n", event_label );
    //		core->runflag = CORE_ST_STOP;
    	}
    	else
    		addHookPost( mob, setdropitem, mob_setdropitem_post );
    }

    because it doesn't attach to any player during processing drop, so you can run this as *donpcevent

    prontera,155,185,5	script	itemdrop	1_F_MARIA,{
    	end;
    OnMobDrop:
    	announce F_ITEML($@mobdrop_itemid), bc_all;
    	end;
    }

     


     

    7 hours ago, astralprojection said:

    The plugin will trigger  
    - someone traded you.
    - use old card album if card
    - get from storage

    I was looking for trigger only if picked from mob drop but i think its impossible.

    /// obtain log type character for item/zeny logs
    static char log_picktype2char(e_log_pick_type type)
    {
    	switch( type ) {
    		case LOG_TYPE_TRADE:            return 'T';  // (T)rade
    		case LOG_TYPE_VENDING:          return 'V';  // (V)ending
    		case LOG_TYPE_PICKDROP_PLAYER:  return 'P';  // (P)player
    		case LOG_TYPE_PICKDROP_MONSTER: return 'M';  // (M)onster
    		case LOG_TYPE_NPC:              return 'S';  // NPC (S)hop
    		case LOG_TYPE_SCRIPT:           return 'N';  // (N)PC Script
    		case LOG_TYPE_STEAL:            return 'D';  // Steal/Snatcher
    		case LOG_TYPE_CONSUME:          return 'C';  // (C)onsumed
    		case LOG_TYPE_PRODUCE:          return 'O';  // Pr(O)duced/Ingredients
    		case LOG_TYPE_MVP:              return 'U';  // MVP Rewards
    		case LOG_TYPE_COMMAND:          return 'A';  // (A)dmin command
    		case LOG_TYPE_STORAGE:          return 'R';  // Sto(R)age
    		case LOG_TYPE_GSTORAGE:         return 'G';  // (G)uild storage
    		case LOG_TYPE_MAIL:             return 'E';  // (E)mail attachment
    		case LOG_TYPE_AUCTION:          return 'I';  // Auct(I)on
    		case LOG_TYPE_BUYING_STORE:     return 'B';  // (B)uying Store
    		case LOG_TYPE_LOOT:             return 'L';  // (L)oot (consumed monster pick/drop)
    		case LOG_TYPE_BANK:             return 'K';  // Ban(K) Transactions
    		case LOG_TYPE_DIVORCE:          return 'Y';  // Divorce
    		case LOG_TYPE_ROULETTE:         return 'Z';  // Roulette
    		case LOG_TYPE_RENTAL:           return 'W';  // Rental
    		case LOG_TYPE_CARD:             return 'Q';  // Card
    		case LOG_TYPE_INV_INVALID:      return 'J';  // Invalid in inventory
    		case LOG_TYPE_CART_INVALID:     return 'H';  // Invalid in cart
    		case LOG_TYPE_EGG:              return '@';  // Egg
    		case LOG_TYPE_QUEST:            return '0';  // Quest
    		case LOG_TYPE_SKILL:            return '1';  // Skill
    		case LOG_TYPE_REFINE:           return '2';  // Refine
    		case LOG_TYPE_OTHER:            return 'X';  // Other
    	}

    see src\map\log.c for more information

    see previous post, make sure only run with @pickup_action == LOG_TYPE_PICKDROP_PLAYER flag


  13. Spoiler

    https://github.com/AnnieRuru/Release/blob/master/plugins/OnPCPickUpEvent/OnPCPickUpEvent_0.2.c
    - fix the unique ID
    - add item option

    
    prontera,155,185,5	script	dfskhfs	1_F_MARIA,{
    	end;
    OnPCPickUpEvent:
    	announce sprintf( _$( "%s has pick up %s !!" ), strcharinfo(PC_NAME), getitemname2( @pickup_itemid, @pickup_identify, @pickup_refine, @pickup_attribute, @pickup_card1, @pickup_card2, @pickup_card3, @pickup_card4 ) ), bc_all;
    	end;
    }

    EDIT: I think should hook to pc->additem, not pc->takeitem

    Spoiler

    https://github.com/AnnieRuru/Release/blob/master/plugins/OnPCPickUpEvent/OnPCPickUpEvent_0.3.c
    - fix unique ID not display properly, by hook pc->additem this time

    
    prontera,155,185,5	script	dfskhfs	1_F_MARIA,{
    	end;
    OnPCPickUpEvent:
    	if ( @pickup_action != LOG_TYPE_PICKDROP_PLAYER )
    		end;
    	announce sprintf( _$( "%s has pick up %s !!" ), strcharinfo(PC_NAME), getitemname2( @pickup_itemid, @pickup_identify, @pickup_refine, @pickup_attribute, @pickup_card1, @pickup_card2, @pickup_card3, @pickup_card4 ) ), bc_all;
    	dispbottom @pickup_uniqueid1 +" "+ @pickup_uniqueid2;
    	end;
    }

     

    https://github.com/AnnieRuru/Release/blob/master/plugins/OnPCPickUpEvent/OnPCPickUpEvent_0.4.c
    - add pc->delitem to run when player drop item

    prontera,155,185,5	script	dfskhfs	1_F_MARIA,{
    	end;
    OnPCPickUpEvent:
    	if ( @pickup_action != LOG_TYPE_PICKDROP_PLAYER && @pickup_amount > 0 )
    		end;
    	announce sprintf( _$( "%s has pick up %s !!" ), strcharinfo(PC_NAME), getitemname2( @pickup_itemid, @pickup_identify, @pickup_refine, @pickup_attribute, @pickup_card1, @pickup_card2, @pickup_card3, @pickup_card4 ) ), bc_all;
    //	dispbottom @pickup_amount +" "+ @pickup_uniqueid1 +" "+ @pickup_uniqueid2;
    	end;
    }

     


  14. the monster drop are not attaching to any player, because it just simply drop on the floor
    the only time it attach the player is when the one of the party member has "@autoloot" enabled, and also just attach to the party member having "@autoloot"

    what's the idea behind this modification ?

     

    I remember I made rare drop announcement patch during eathena time

    			if( sd && sd->status.mod_drop != 100 ) {
    				drop_rate = drop_rate * sd->status.mod_drop / 100;
    				if( drop_rate < 1 )
    					drop_rate = 1;
    			}

    just add announce blah blah after this line in mob_dead function

     

    or if you mean it trigger when player pick up an item, then can try my OnPCPickUpEvent


  15. 5 hours ago, WhiteEagle said:

    I would have to switch off the normal drop completely and just let makeitem run.

    exactly the point, I assumed this is use in events, so you already have mf_nomobloot enabled
    disable monster drop on the map, and use makeitem2 script command to make monster drop items instead

    so you mean this is use on normal monster drop as well ?

    #include "common/hercules.h"
    #include "map/mob.h"
    #include "plugins/HPMHooking.h"
    #include "common/HPMDataCheck.h"
    
    HPExport struct hplugin_info pinfo = {
    	"addrefinedrop",
    	SERVER_TYPE_MAP,
    	"x.x",
    	HPM_VERSION,
    };
    
    struct item_drop *mob_setdropitem_post( struct item_drop* retVal, int nameid, int qty, struct item_data *data ) {
    	if ( retVal->item_data.nameid == 1202 )
    		retVal->item_data.refine = 2;
    	return retVal;
    }
    
    HPExport void plugin_init( void ) {
    	addHookPost( mob, setdropitem, mob_setdropitem_post );
    }

    tested with killing poring repeatedly, "@monster 1002 100" and go for item Knife_ drop


  16. 1 hour ago, Emistry said:

    anyway, just curious, since its just adding a new field "event_label", why not consider alter the existing "skill_db" and add the field there?

    possible, but the event label can't throw error anymore during server start-up

    you see, the server has an order when loading stuffs

    [Status]: Done reading '64' command aliases in 'conf/atcommand.conf'.
    [Status]: Done reading '4' channels in 'conf/channels.conf'.
    [Status]: Done reading '10600' entries in 're/item_db.conf'.
      ...
    [Status]: Done reading '1128' entries in 'db/re/skill_db.conf'. // <--- HERE !!!
    [Status]: Done reading '264' entries in 'db/produce_db.txt'.
    [Status]: Done reading '136' entries in 'db/create_arrow_db.txt'.
      ....
    [Status]: Done reading '15' zones in 'db/re/map_zone_db.conf'.
    [Status]: Done reading '0' entries in 'db/mob_item_ratio.txt'.
    [Status]: Done reading '40' entries in 'mob_chat_db.txt'.
    [Status]: Done reading '1724' entries in 're/mob_db.conf'.
      ...
    [Status]: Done reading '3064' entries in 'quest_db.conf'.
    [Status]: Done reading '344' entries in 'db/re/achievement_db.conf'.
    [Status]: Done reading '11' entries in 'db/achievement_rank_db.conf'.
    [Info]: Done loading '8' NPCs:      <-------------------------------------- HERE !!!
            -'0' Warps
            -'0' Shops
            -'8' Scripts
            -'0' Spawn sets
            -'0' Mobs Cached
            -'0' Mobs Not Cached
    [Status]: Done reading '56' entries in 'db/stylist_db.conf'.
    [Status]: Event 'OnInit' executed with '4' NPCs.
    [Info]: Hercules, Copyright (C) 2012-2018, Hercules Dev Team and others.
    [Info]: Licensed under the GNU General Public License, version 3 or later.
    [Status]: Server is 'ready' and listening on port '5121'.
    
    [Status]: Done reading '4' entries in 'conf/import/OnPCUseSkillEvent.conf'. <------ HERE !!!

    if I hook to the skill_validate_additional_fields, it will always say Event label NOT FOUND, because the npc wasn't loaded yet

    my plugin doesn't read the OnPCUseSkillEvent.conf file during [HPExport void plugin_init] function, but at [HPExport void server_online] function
    this is to make sure it runs AFTER the npc files are loaded

     

    yes, its possible to just hook to the skill_validate_additional_fields function, but it wont throw error on server start-up anymore
    the npc label check will be done when player is casting the skill instead, <-- which is already too late
    --> I want the error thrown during server start-up

    		struct event_data *ev = (struct event_data*)strdb_get(npc->ev_db, event);
    		if ( ev == NULL || ev->nd == NULL ) {
    			ShowWarning( "OnPCUseSkillEvent: NPC label "CL_WHITE"%s"CL_RESET" does not found on skill "CL_WHITE"%s(%d)"CL_RESET" entry no."CL_WHITE"%d"CL_RESET" in '"CL_WHITE"%s"CL_RESET"'.\n", event, skillname, skillid, i, confpath );
    			continue;
    		}

     


    EDIT:

    hmm ... yeah, why not just try hook both ...
    hook to the skill_validate_additional_fields function, then check the npc label again at [HPExport void server_online] function ...
    ... give it a try ...

     

    EDIT2:

    there is no addToSKILLDATA in HPMi.h !!

×
×
  • Create New...

Important Information

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