Jump to content

AnnieRuru

Members
  • Posts

    2044
  • Joined

  • Last visited

  • Days Won

    51

Posts posted by AnnieRuru

  1. -    script     BattleBadge#2    -1,{
    OnPCKillEvent:
    if (strcharinfo(3)=="guild_vs3" && killedrid != getcharid(3))
           getitem 7828,1;
    end;
    }

    I want to say, this kind of stuff should be discourage

    on the MMORPG I played, I really do encounter people hiding in a corner of the map killing his/her own alt character to farm battleground points

    I left it there 1st, but in time you'll take it out too when your players start abuse this system

     

    hmm ...

    mapannounce "guild_vs3", "Score "+ .winningscore +" rounds to win ! ... GET READY", 0;

    ... I tested in-game and it says "Score 0 rounds to win !"

    you just copy-paste it from my other battleground script don't you ?

    ... there is no way Euphy revise my script and still have the 0 over there ... he would have changed it to bc_map

     

    anyway ... yup, you did correctly

    if you want to have ... multiple rounds to finish the battleground ... try this topic

    t

  2. Rejoice ~~ I just recently stop playing a MMORPG game called - 斗仙2 - a chinese-made MMOPRG game that is heavily PK focused

    of course team PK / guild PK / party PK / Battleground and so on are the main strong points on this game.

     

    Previously I don't understand why members want this feature,

    as I always told them -> players can always multi-client at the last moment join the winning team to catch the reward

    only after I play a battleground for real on a real MMORPG, now I can understand why this is important

     

    so, there are actually some/several protection to prevent players to rip the reward at the last minute, well ... from my experience playing that game

     

    1. although I can multi-client this game with a sandboxie program so all my 4 in-game characters can party up to finish my daily quest faster,

    interestingly, I cannot bring 2 characters at the same time to join a same battleground ID

    in other words, I cannot register 2 characters on Battleground A, but I can multi-client to have character A join Battleground A, and character B join Battleground B

     

    2. lets say this Battleground is a 10vs10, but Blue team only has 4 players joined, and Red team has 7 players

    ( this happened frequently ... I heard some people using company computers to register, but only his main character join the battleground)

    the Red team registration is stopped, only the Blue team application is still open

    at least this is what happened to the game that I just play, cannot have more than 3 players in differences

     

    3. there is a "Vote to kick a player" option in the battleground window

    I can right-click on a noob player that keep feeding the enemy team -> means always give points to the enemy / probably a spy from the enemy team

    and if 1/2 of our total team members select "Yes" to kick, that player is immediately out from the team ... and ...

     

    4. there is a 5 minute delay from rejoining the same battleground ID

    which usually means, if I am somehow gets kick out (happens to me when I having bad internet connection speed),

    I usually just register a new Battleground rather than rejoin an existing one, since people always fill up the existing battleground 1st to rip the reward

     

    conclusion, this is not as simple as you might think

    I can probably do this, but the modification on this script will be very heavy

    especially for case no.1 ... do rathena support MAC address in the 1st place ?

    • Like 1
  3. ah ... found a bug

    I forgotten the loadevent can be use from another script

    if you install another script with loadevent mapflag

    will cause this script to warp out other players indiscriminately

    1 more time

    http://upaste.me/06e6495427daded7f

    EDIT: Jesus ... I made mistake too many times, really lost touch with scripting

     

    yeah ... atm, not a godlike scripter yet XD

     

    btw, did you guys mentioned wrong person ??

    I am @AnnieRuru not @Annie Ruru

    • Upvote 1
    • Love 2
  4. @emistry

            .@map$ = strcharinfo(3);
    	        for (.@i = 0; .@i < .map_size; .@i++) {
                if (.@map$ == .map$[.@i]) {
                    if (getcharid(2) != .guild_id[.@i] && .guild_id[.@i] > 0)
                        warp "SavePoint",0,0;
                    end;
                }
            }

    just 1 glance and I can tell this is wrong

    since you are comparing 2 different kinds of information -> .@map$ == .map$[.@i] and getcharid(2) == .guild_id[.@i]

    shouldn't the 2nd one fall into another loop with .@j index?

     

    for(.@j = 0; .@j < guild_id_size; .@j++) <<--- something like this ?

  5. 5 years ago, @Olrox claimed he was bored, and ask someone to make this script ..... yes, he started it !

    3 years ago, @Olrox said he wants to remake the map

    then suddenly 2 years ago, @Olrox say he don't want to do it anymore !

    Good job !

     

    ok enough this bullshit

    You need 2 things for this battleground script to run

    Download:

    1. the map !
    https://rathena.org/board/topic/104326-arathi-map/

    2. and the script !
    wow_domi_1.4r.txt

    yes, this is a free release as @Olrox said

    thanks to @Olrox for giving nice idea anyways XD

     

    Spoiler

    1.2
    wow_domi_1.2r.txt
    setbgid_20160103r.diff

    1.3
    http://upaste.me/1b3249619f23c7755
    - fix this script no longer need my patch
    - add showdigit (along with the stupid bug)
    - add .maxplayer2join and .imbalance_team_prevent

    1.4
    wow_domi_1.4r.txt
    - fix server crash because rathena love introducing new bugs

    PS: why this wow_domi_1.2r.txt keep appear below even though I tried to remove it several times

    wow_domi_1.2r.txt

    • Upvote 3
    • Love 1
  6. you didn't do anything wrong ...

    why ? because Emistry script isn't working ...

    try this, full complete script

    function	script	timeleft__	{
    	if ( ( .@left = getarg(0) ) <= 0 ) return getarg(0);
    	.@day = .@left / 86400;
    	.@hour = .@left % 86400 / 3600;
    	.@min = .@left % 3600 / 60;
    	.@sec = .@left % 60;
    	if ( .@day )
    		return .@day +" day "+ .@hour +" hour";
    	else if ( .@hour )
    		return .@hour +" hour "+ .@min +" min";
    	else if ( .@min )
    		return .@min +" min "+ .@sec +" sec";
    	else
    		return .@sec +" sec";
    }
    
    -	shop	vipshop#7	-1,501:100
    -	shop	vipshop#30	-1,501:100
    
    -	script	vipnpc	FAKE_NPC,{
    OnInit:
    	bindatcmd "vipshop", strnpcinfo(0)+"::Onvipshop";
    	end;
    Onvipshop:
    	if ( #vipshop == 1 ) callshop "vipshop#7", 1;
    	else if ( #vipshop == 2 ) callshop "vipshop#30", 1;
    	else {
    		mes "which vip status do you want to buy ?";
    		mes "vip 7 days = 10 Cash points";
    		mes "vip 30 days = 20 Cash points";
    		next;
    		if ( select ( "Vip 7 Days", "Vip 30 Days" ) == 1 ) {
    			if ( #CASHPOINTS < 10 ) {
    				mes "you don't have enough Cash points";
    				close;
    			}
    			mes "Thanks for purchasing !";
    			#vipshop = 1;
    			#CASHPOINTS -= 10;
    			addtimer 7*24*60*60*1000, strnpcinfo(0)+"::OnTimeUp";
    			#viptimeleft = 7*24*60*60 + gettimetick(2);
    			close;
    		}
    		else {
    			if ( #CASHPOINTS < 20 ) {
    				mes "you don't have enough Cash points";
    				close;
    			}
    			mes "Thanks for purchasing !";
    			#vipshop = 2;
    			#CASHPOINTS -= 20;
    		//	addtimer 30*24*60*60*1000, strnpcinfo(0)+"::OnTimeUp"; // over integer limit
    			#viptimeleft = 30*24*60*60 + gettimetick(2);
    			close;
    		}
    	}
    	dispbottom "You currently have "+ #CASHPOINTS +" Cash points .Expire in "+ callfunc( "timeleft__", #viptimeleft - gettimetick(2) )+".";
    	end;
    OnPCLoginEvent:
    	if ( #viptimeleft < gettimetick(2) )
    		addtimer 1, strnpcinfo(0)+"::OnTimeUp"; // sometimes doevent doesn't work
    	else if ( #viptimeleft - gettimetick(2) < 2147483 ) // don't execute addtimer if over integer limit
    		addtimer ( #viptimeleft - gettimetick(2) )*1000, strnpcinfo(0)+"::OnTimeUp";
    	end;
    OnTimeUp:
    	#viptimeleft = #vipshop = 0;
    	end;
    }
    
    -	script	vipnpc#7	FAKE_NPC,{
    OnInit:
    	function    addshopitem    {
    		npcshopdelitem "vipshop#7", 501;
    		.@count = getargcount();
    		for ( .@i = 0; .@i < .@count; .@i++ ) {
    			if ( .@i % 2 == 0 )
    				.itemid[ .@i /2 ] = getarg( .@i );
    			else {
    				.itemcost[ .@i /2 ] = getarg( .@i );
    				npcshopadditem "vipshop#7", .itemid[ .@i /2 ], .itemcost[ .@i /2 ];
    			}
    		}
    	}
       addshopitem // adds shop items here for vip#7
            501,10,
            502,20,
            503,30,
            504,40,
            505,50;
    	npcshopattach "vipshop#7";
    	.@itemsize = getarraysize( .itemid );
    	for ( .@i = 0; .@i < .@itemsize; .@i++ )
    		.itemcost[ .itemid[.@i] ] = .itemcost[.@i];
    	end;
    OnBuyItem:
    	if ( !@bought_quantity ) end;
    	.@size = getarraysize( @bought_nameid );
    	for ( .@i = 0; .@i < .@size; .@i++ )
    		.@itemcost += .itemcost[ @bought_nameid[.@i] ] * @bought_quantity[.@i];
    	if ( .@itemcost > #CASHPOINTS ) {
    		mes "you don't have enough Cash points";
    		close;
    	}
    	if ( !checkweight2( @bought_nameid, @bought_quantity ) ) {
    		mes "you can't carry all these items !";
    		close;
    	}
    	#CASHPOINTS -= .@itemcost;
    	for ( .@i = 0; .@i < .@size; .@i++ )
    		getitem @bought_nameid[.@i], @bought_quantity[.@i];
    	end;
    }
    
    -	script	vipnpc#30	FAKE_NPC,{
    OnInit:
    	function    addshopitem    {
    		npcshopdelitem "vipshop#30", 501;
    		.@count = getargcount();
    		for ( .@i = 0; .@i < .@count; .@i++ ) {
    			if ( .@i % 2 == 0 )
    				.itemid[ .@i /2 ] = getarg( .@i );
    			else {
    				.itemcost[ .@i /2 ] = getarg( .@i );
    				npcshopadditem "vipshop#30", .itemid[ .@i /2 ], .itemcost[ .@i /2 ];
    			}
    		}
    	}
       addshopitem // adds shop items here for vip#30
            501,5,
            502,10,
            503,15,
            504,20,
            505,25;
    	npcshopattach "vipshop#30";
    	.@itemsize = getarraysize( .itemid );
    	for ( .@i = 0; .@i < .@itemsize; .@i++ )
    		.itemcost[ .itemid[.@i] ] = .itemcost[.@i];
    	end;
    OnBuyItem:
    	if ( !@bought_quantity ) end;
    	.@size = getarraysize( @bought_nameid );
    	for ( .@i = 0; .@i < .@size; .@i++ )
    		.@itemcost += .itemcost[ @bought_nameid[.@i] ] * @bought_quantity[.@i];
    	if ( .@itemcost > #CASHPOINTS ) {
    		mes "you don't have enough Cash points";
    		close;
    	}
    	if ( !checkweight2( @bought_nameid, @bought_quantity ) ) {
    		mes "you can't carry all these items !";
    		close;
    	}
    	#CASHPOINTS -= .@itemcost;
    	for ( .@i = 0; .@i < .@size; .@i++ )
    		getitem @bought_nameid[.@i], @bought_quantity[.@i];
    	end;
    }
    • Upvote 1
    • Love 1
  7. 			monster .Map$,0,0,"[ Farm Zone ] Resident",rand( 2400,2405 ),80,strnpcinfo(0)+"::OnNormalKill";
    			monster .Map$,0,0,"[ Farm Zone ] Guardian",rand( 2400,2405 ),5,strnpcinfo(0)+"::OnBossKill";
    nope, also the same, it will show up the same mob

    has to use arrays in the case,

    and ... @emistry your script needs to be cleaner

    What the hell is this ???

    set .Hunter[getarraysize( .Hunter )],strcharinfo(0);
    .

    .

    try this

    prontera,155,185,5	script	Farm Zone	1_F_MARIA,{
    	while ( true ) {
    		mes "How can i help you ?";
    		switch( select( "Information:Farm Items" )) {
    		case 1:
    			mes "This is a Farm Zone.";
    			mes "You are able to Hunt Monster inside this Room.";
    			mes "Every Monster will award you random items.";
    			next;
    			mes "But there is some Condition..";
    			mes "You can only go in ^FF0000once every "+.RoomCleanMin+" minutes for 1 times.^000000";
    			mes "And Maximum of ^FF0000"+.MaxPlayers+" Players per "+.RoomCleanMin+" Minutes.^000000";
    			mes "Maximum Hunting Limit ^FF0000"+.MaxItemLimit+"^000000";
    			next;
    			mes "There will be a ^FF0000Room Cleaning^000000 from time to time...";
    			mes "All players will be kicked out, it is your bad luck if you meet this.";
    			mes "Delay will still apply even though you just go in for 1 Seconds..";
    			next;
    			break;
    		case 2:
    //			#HuntRoomDelay = 0;
    			if ( #HuntRoomDelay + .DelayMin * 60 > gettimetick(2) ) {
    				mes "Wait for ^FF0000"+( ( ( #HuntRoomDelay + .DelayMin * 60 ) - gettimetick(2) )/60 )+" Minutes^000000.";
    				close;
    			} else if ( getarraysize( .Hunter ) >= .MaxPlayers ) {
    				mes "Currently the Room is Full. Please try again later.";
    				close;
    			} else {
    				warp .Map$,0,0;
    				set .Hunter[getarraysize( .Hunter )], getcharid(3);
    				set #HuntRoomDelay, gettimetick(2); // please don't set the deny variable into the future, if admin adjust the setting to decrease the value, player will experience long deny
    				set #FarmHunt,0;
    				end;
    			}
    		}
    	}
    	close;
    OnNormalKill:
    	monster .Map$,0,0,"--ja--",.normal_mob[rand(.normal_mob_size)],1,strnpcinfo(0)+"::OnNormalKill";
    	getitem .farm_normal[rand(.farm_normal_size)], 1;
    	goto L_kill;
    OnBossKill:
    	monster .Map$,0,0,"--ja--",.boss_mob[rand(.boss_mob_size)],1,strnpcinfo(0)+"::OnBossKill";
    	getitem .farm_boss[rand(.farm_boss_size)], 1;
    L_kill:
    	#FarmHunt++;
    	dispbottom "[ Farm Zone ] : Farmed "+ #FarmHunt +" / "+.MaxItemLimit+" Items";
    	if ( #FarmHunt >= .MaxItemLimit ) {
    		message strcharinfo(0),"Limit Reach , you may join again later.";
    		sleep2 2000;
    		warp "prontera",155,181;
    	}
    	end;
    OnInit:
    	// Maximum Player can join per X Minutes.
    	set .MaxPlayers,5;
    	// Adding X Minutes of Delay before can go in again.
    	set .DelayMin,15;
    	// Maximum Hunt Limit per round inside the Zone.
    	set .MaxItemLimit,1000;
    	// Map that will be used in thos Zone.
    	set .Map$,"moc_fild19";
    	// Clear Map Every X Minutes.
    	set .RoomCleanMin,15;
    	// Mapflag Initialization
    	setmapflag .Map$, mf_nomobloot;
    	setmapflag .Map$, mf_nomvploot;
    	setmapflag .Map$, mf_nowarpto;
    	setmapflag .Map$, mf_nochat;
    	setmapflag .Map$, mf_novending;
    	setmapflag .Map$, mf_nocommand,60;
    	setmapflag .Map$, mf_nojobexp;
    	setmapflag .Map$, mf_nobaseexp;
    
    	setarray .farm_normal, 501,502,503,504,505; // farm 1 of these items when kill normal mobs
    	setarray .farm_boss, 506,507,508,509,510; // farm 1 of these items when kill boss monsters
    
    	setarray .normal_mob, 2401,2402,2403,2404;
    	setarray .boss_mob, 1388, 1096, 1120;
    	
    	.farm_normal_size = getarraysize(.farm_normal);
    	.farm_boss_size = getarraysize(.farm_boss);
    	.boss_mob_size = getarraysize(.boss_mob);
    	.normal_mob_size = getarraysize(.normal_mob);
    	while ( true ) {
    		killmonster .Map$, "All";
    		cleanmap .Map$; // you also forgot about this command
    		mapwarp .Map$,"prontera",155,181;
    		for ( .@i = 0; .@i < 80; .@i++ )
    			monster .Map$,0,0, "[ Farm Zone ] Resident", .normal_mob[ rand( .normal_mob_size ) ], 1, strnpcinfo(0)+"::OnNormalKill";
    		for ( .@i = 0; .@i < 5; .@i++ )
    			monster .Map$,0,0, "[ Farm Zone ] Guardian", .boss_mob[ rand( .boss_mob_size ) ], 1, strnpcinfo(0)+"::OnBossKill";
    		deletearray .Hunter;
    		announce "[ Farm Zone ] : Farming Zone has been Cleaned up, another 5 Players may go in now.", bc_blue;
    		sleep ( .RoomCleanMin * 60000 );
    		mapannounce .Map$,"[ Farm Zone ] : Room Clean Up now...All Users will be warped Out.", bc_map;
    		killmonster .Map$, "All";
    		sleep 3000;
    	}
    	end;
    }
    
  8. yes, you can do some sort of trick, though, running query_sql repeatedly might eats your server resources

    I don't really recommend though

    -	script	kdhfksfjs	FAKE_NPC,{
    OnInit:
    	query_sql "create table if not exists disconnect_char( account_id int(11) primary key, char_id int(11), name varchar(23) ) engine = innodb;";
    	while ( true ) {
    		.@nb = query_sql( "select * from disconnect_char", .@aid, .@cid, .@name$ );
    		for ( .@i = 0; .@i < .@nb; .@i++ ) {
    			if ( .@aid[.@i] ) {
    				if ( isloggedin( .@aid[.@i] ) ) {
    					atcommand "@kick "+ rid2name( .@aid[.@i] );
    					debugmes "the player AID "+ .@aid[.@i] +" has been kick.";
    				}
    				else
    					debugmes "the player AID "+ .@aid[.@i] +" is not online";
    				query_sql "delete from disconnect_char where account_id = "+ .@aid[.@i];
    			}
    			else if ( .@cid[.@i] ) {
    				if ( query_sql( "select account_id from `char` where char_id = "+ .@cid[.@i], .@taid ) ) {
    					if ( isloggedin( .@taid ) ) {
    						atcommand "@kick "+ rid2name( .@taid );
    						debugmes "the player CID "+ .@cid[.@i] +" has been kick.";
    					}
    					else
    						debugmes "the player CID "+ .@cid[.@i] +" is not online";
    				}
    				else
    					debugmes "the player CID "+ .@cid[.@i] +" doesn't exist";
    				query_sql "delete from disconnect_char where char_id = "+ .@cid[.@i];
    			}
    			else if ( .@name$[.@i] ) {
    				if ( query_sql( "select account_id from `char` where name = '"+ escape_sql(.@name$[.@i]) +"'", .@taid ) ) {
    					if ( isloggedin( .@taid ) ) {
    						atcommand "@kick "+ rid2name( .@taid );
    						debugmes "the player name "+ .@name$[.@i] +" has been kick.";
    					}
    					else
    						debugmes "the player name "+ .@name$[.@i] +" is not online";
    				}
    				else
    					debugmes "the player name "+ .@name$[.@i] +" doesn't exist";
    				query_sql "delete from disconnect_char where name = '"+ escape_sql(.@name$[.@i]) +"'";
    			}
    		}
    		sleep 5000;
    	}
    }
    .

    .

    One last question, Do you know where I can find the sql to see the autotrade players? or any sql to see the buffs from each player. Or it's a kind of custom table?

    its inside `vendings` table

    and the buffs is `sc_data`

    • Upvote 1
  9. ok both of you please stop ...

    if I actually see this in hercules, I'll invisible the post, and send a group PM to both of you to settle this issue privately ...

     

    both of you are respectable scripters in rathena, along with Capuche, Euphy , Brian ... and some others

    despite the difference in emulator we are using, there is no need to create whatever drama that can raise the tension between all of us

     

    anyway ..

    I just found this in the source code ... its a TODO

    https://github.com/rathena/rathena/blob/master/src/map/npc.c#L780

    try report this issue to get this fix

     

    EDIT:

    and this is gettimetick(0) method, which will go negative on 24th day and may create bug

    prontera,158,185,5    script    kjhfksdjf    100,{
        if ( @timeon ) {
            dispbottom "time used -> "+( gettimetick(0) - @start ) +" mili-seconds";
            @start = 0; // clear the var
        }
        else
            @start = gettimetick(0);
        @timeon ^= 1;
        end;
    }
    • Upvote 1
  10. ok, abusing SQL query

    https://rathena.org/board/topic/73478-requesting-card-seller-script/?p=154617

     

    prontera,155,185,5	script	Card collector	1_F_MARIA,{
    	mes "["+ strnpcinfo(0) +"]";
    	if ( !.start ) {
    		mes "I'm not looking for any card right now.";
    		close;
    	}
    	mes "Hi, I'm looking for "+ getitemname(.look4card) +", do you have it ?";
    	next;
    	.@count = countitem(.look4card);
    	if ( !.@count ) {
    		mes "["+ strnpcinfo(0) +"]";
    		mes "Unfortunately you don't have the card I'm looking for";
    		close;
    	}
    	input .@give, 0, .@count;
    	mes "["+ strnpcinfo(0) +"]";
    	if ( !.@give ) {
    		mes "You are not giving me ? ... sob..";
    		close;
    	}
    	mes "Thank You !!";
    	delitem .look4card, .@give;
    	collector_points += ( 5 + .checkmvp * 5 )* .@give;
    	close;
    OnMinute00:
    	if ( gettime(3) % 1 ) end;
    OnStart:
    	.look4card = .allcardid[ rand( .allcards ) ];
    	announce "["+ strnpcinfo(0) +"] I'm looking for "+ getitemname( .look4card ) +" !!!", bc_all;
    	while ( .mvpcardid[.@i] != .look4card && .@i < .mvpcards ) .@i++;
    	.checkmvp = ( .@i < .mvpcards )? 1 : 0;
    	.start = true;
    	sleep 30000; // last 30 seconds
    	.start = false;
    	announce "["+ strnpcinfo(0) +"] Thank you everyone for the participation.", bc_all;
    	end;
    OnInit:
    	.@mobdb$ = checkre(0)? "mob_db_re" : "mob_db";
    	.@itemdb$ = checkre(0)? "item_db_re" : "item_db";
    	.allcards = query_sql("select "+ .@itemdb$ +".id from "+ .@itemdb$ +" right join "+ .@mobdb$ +" on "+ .@itemdb$ +".id = "+ .@mobdb$ +".dropcardid where type = 6 group by name_japanese", .allcardid);
    	.mvpcards = query_sql("select "+ .@itemdb$ +".id from "+ .@itemdb$ +" right join "+ .@mobdb$ +" on "+ .@itemdb$ +".id = "+ .@mobdb$ +".dropcardid where mexp > 0 and type = 6 group by name_japanese;", .mvpcardid);
    //	bindatcmd "test", strnpcinfo(0)+"::OnStart", 99, 100;
    //	bindatcmd "value", strnpcinfo(0)+"::OnValue", 99, 100;
    	end;
    OnValue:
    	dispbottom "Your currently collector points is "+ collector_points;
    	if ( .start )
    		dispbottom "looking for ID "+ .look4card;
    	end;
    }
    ... have to use codebox because this rathena script doesn't compatible with hercules ...

    ok I stop play here for today, might come back here some other day again

    EDIT: yeah Emistry ...

    	OnMinute00:
    		if ( gettime(3) % 2 )
    	OnInit:
    		.card_id = rand( 4001,4500 );
    you know that, you missing the curly bracket right ?

    this means ... it will trigger every hour, always read the line below this

    but the rand only execute when Hour is 1,3,5,7,9,11

    on other hour time, it doesn't random change the card ID

    EDIT: when I was about to publish in hercules forum, I found I mess up @count and @give, fixed

  11. if you are writing something like algorithm script, you can just use gettimetick(0)

    .@start = gettimetick(0);
    callfunc "F_SomeAlgorithm";
    dispbottom "time used -> "+( gettimetick(0) - .@start ) +" mili-seconds";

    you can find various algorithm like sorting algorithm in this topic

    http://herc.ws/board/topic/4321-help-me-improve-this-merge-sort-algorithm/

    or shuffle algorithm in this topic

    https://github.com/HerculesWS/Hercules/pull/872

     

    but if you are just to check how much time it click on the npc, gettimetick(0) cannot be use here because it will go negative at 24th day

    has to use npctimer

     

    *check and see properly did I use rathena test server ? OK*

     

    I think there is a bug, yes, both hercules and rathena, I tested both

    prontera,158,185,5    script    dfgdgdfg    1_F_MARIA,{
        attachnpctimer; // comment this line, it shows the timer
        initnpctimer;
        sleep2 1000;
        stopnpctimer;
        dispbottom getnpctimer(0);
        end;
    }

    if the attachnpctimer is leave on, the timer always show 0, but when I remove it, which makes it attach to npc, the timer will start showing ...

     

    for the time being, stick to gettimetick(0) ...

    • Upvote 1
  12. don't know why, but I feel  the urge to answer this particular topic
    ... hmph ... some of them actually rip off my source code actually...
    1st thing that you need to know is, this rathena unit controller script command is based on mob controller script commands
    which you can find them here 
     

    case UMOB_MASTERAID: md->master_id = value; break;

    the master GID of the monster
    the original mob controller system has *mobattach script command, which is missing in rathena
    means, yes, if you attach a monster to a player, you can use this constant to check this particular monster belongs to which player

    for example, in that script I link the to, pet vs pet system
    if AI_ACTION_TYPE_ATTACK is triggered, that mob controller system doesn't have a RID attached
    so have to check the target it was killed with AI_ACTION_TAR, which push the GID of the unit it killed
    then we can use UMOB_MASTERAID of the AI_ACTION_TAR to know the winner of the duel

    if you don't understand, don't worry, I haven't code mobevent script command yet
    once I did it, rathena will going to have it anyway, so you can play with it later
    so, this is currently useless until I make the mobevent script command
     

    case UMOB_AI: md->special_state.ai = (enum mob_ai)value; break;

    the special_state ai is defined, in rathena, here
    https://github.com/rathena/rathena/blob/master/src/map/map.h#L385
    ... seriously this should go inside mob.h ...
    from the PM you talk to me earlier, you should be able to read the source code to understand how to search these AI_ constants ...
     

    case UMOB_SCOPTION: md->sc.option = (unsigned short)value; break;

    similar to player's setoption
    https://github.com/rathena/rathena/blob/master/doc/script_commands.txt#L3451
    in theory, if you setoption it with OPTION_HIDE, the monster will hide permanently until it dead
    (unsigned short) .. ? LOL this is funny XD

    case UMOB_SLAVECPYMSTRMD: md->state.copy_master_mode = value > 0 ? 1 : 0; if (value > 0) { TBL_MOB *md2 = map_id2md(md->master_id); md->status.mode = md2->status.mode; } break;

    this is currently useless, mobattach script command can attach to the player, and can also attach to another mob
    yes, attach to another mob, then copy the master's mode, which is master's UMOB_MODE
    without mobattach script command, this is useless
     

    case UMOB_DMGIMMUNE: md->ud.immune_attack = (bool)value > 0 ? 1 : 0; break;

    immune attack should be self explain
    you can find the responsible line here
    https://github.com/rathena/rathena/blob/master/src/map/battle.c#L7413
    if the battle_check_target function return 0; you know what it means right ?

    • Upvote 1
  13. LOL ... ok I release my patch

    http://upaste.me/f8a021974df57fd43<--- sad ... nobody buying, but meh

    hercules use status.rhw.atk for physical and status.rhw.atk2 for magical

    https://github.com/HerculesWS/Hercules/blob/master/src/config/const.h#L60

    and minimum and maximum damage is retrieve by function

    but rathena is something else,

    md->status.rhw.atk is minimum attack

    md->status.rhw.atk2 is maximum attack

    md->status.matk_min is minimum magical attack

    md->status.matk_max is maximum magical attack

    good job for copy paste my stuff XD

  14. use your imagination when apply the effects

    prontera,155,174,5	script	sdhfdjskf	100,{
    	mes "select left, center or right";
    	next;
    	.@s = select( "left", "center", "right" );
    	mes "now firing";
    	close2;
    	specialeffect EF_BEGINSPELL3;
    	sleep 1000;
    	donpcevent "#meteorstorm"+ .@s +"::OnEffect";
    	end;
    }
    
    -	script	meteorstorm	-1,{
    	end;
    OnEffect:
    	specialeffect EF_METEORSTORM;
    	sleep 1000;
    	getmapxy .@map$, .@x, .@y, 1;
    	addrid 4, .@map$, .@x-2, .@y-2, .@x+2, .@y+2;
    	announce strcharinfo(0) +" has been hit by the catapult", bc_map; // add this for adding shame
    	percentheal -100, 0;
    	end;
    }
    prontera,148,167,5	duplicate(meteorstorm)	#meteorstorm1	100,{}
    prontera,156,167,5	duplicate(meteorstorm)	#meteorstorm2	100,{}
    prontera,163,167,5	duplicate(meteorstorm)	#meteorstorm3	100,{}
    with your post count and the difficulty of this question is,

    I assumed the countitem and getcastledata check is not a problem for you

    EDIT: added shame announcement

    • Upvote 1
  15. [paste=1w0niwopbpdt]

    not that hard to write

    man ... its been months since I last use a rathena test server to write a script, all the while using hercules

    and just debugging this script alone with the extensive use of @reloadscript, my clean rathena test server can crashed 3 times

    I don't recall my hercules test server can crash so many times in 1 single day

  16. its possible to do this but based on my past experience, when a team is certainly going to lose

    all the player in the losing team will logout and then join the winning team, taking the most benefit of the reward

    if you played counter-strike you should know this

    players just want to enjoy winning the game and don't want to be in the losing team

  17. What i am requesting is i wanna add a Battle Ground Ladder. ( Top 5 Battle Ground Ladder )

    so you mean you just want a ladder script that shows top 5 killer for killing other players in bat_b01 map ?

     

    and a system that will allow anyone to join while the system is running and minimum player to start with is 5 vs 5.

    I thought this system allows everyone to join ?

    when a round is over, those 2 register npc will show up, click on the chat room to join

    minimum player to start

    .minplayer2start = 1; // minimum player to start
    change to 5, will becomes 5vs5
  18. http://en.wikipedia.org/wiki/Blackjack

    split ...

    possible, but need to add another callsub stuffs

    and I saw allow splitting multiple times ? omg rather only stick to once only

    .... just feel lazy to do ...

    insurance ...

    very easy to add in this script but pointless

    insurance only advantage to those doing card counting, but this script simply randomized a number

    heck, it can even random 5 times of the same cards, when there are only 4 of them possible with different color suits

    EDIT:

    oh wait ...

    http://entertainment.howstuffworks.com/how-to-play-blackjack.htm

    A practical system for counting cards in blackjack to gain an edge over the casino was made available to the public in the early 1960s. As it happened, few players ever really learned to beat the dealer. Furthermore, playing conditions have changed since then. Some tables use more than one deck at a time or cut a percentage of the cards out of play so that a card counter never sees them.

×
×
  • Create New...