Jump to content

astralprojection

Members
  • Content Count

    333
  • Joined

  • Last visited

  • Days Won

    8

Posts posted by astralprojection


  1. //===== Hercules Script ======================================
    // MVP Spawn Controller
    //===== By: ==================================================
    // astralprojektion
    //===== Current Version: =====================================
    // 1.3
    //===== Description: =========================================
    // Control MVP Spawn with script. MVP will not respawn on server start or reload using flag.
    // Delete or Comment all MVP and mini boss spawn at npc/pre-re/mobs/dungeons/ or /fields.
    // Make sure set at NifInvasion to make it work.
    //	OnLoDDead:
    //	  // Set LOD as dead ang next respawn is 5580sec
    //	  $S11373 = 2; $T11373 = (gettimetick(2) + 5580);
    //
    //===== Additional Comments: =================================
    // 1.0 Initial Release  
    // 1.1 Use TimeStamp when mvp is killed
    //     Fixed typo on MVP_Map array.
    // 1.2 Set Variables to Global.
    // 1.3 Include some Mini Boss on the controller
    //     Added PvP On/Off MvP is alive
    //     Integrate LOD invasion
    //     Added @mvpcontroller command to reset all or a specific mvp and other settings.
    //============================================================
    /* Credits to Meko
    https://herc.ws/board/files/file/326-array-manipulation-functions/
    */
    function	script	array_find	{
    	.@size = getarraysize(getarg(0));
    	.@neq = getarg(2, false);
    	freeloop(true);
    
    	for (.@i = getarrayindex(getarg(0)); .@i < .@size; ++.@i) {
    		if ((.@neq && (getelementofarray(getarg(0), .@i) != getarg(1))) ||
    			(!(.@neq) && (getelementofarray(getarg(0), .@i) == getarg(1)))) {
    			freeloop(false);
    			return .@i;
    		}
    	}
    
    	freeloop(false);
    	return -1;
    }
    
    -	script	mvpcontroller	FAKE_NPC,{
    end;
    
    OnNPCKillEvent:
    	if(array_find(.mvpid, killedrid) >= 0 ){
    		for( .@i = 0; .@i < getarraysize(.mvpid); .@i++ ) {
    			if( killedrid == .mvpid[.@i] && strcharinfo(PC_MAP) == .mvpmaps$[.@i]) {
    				// 1 - Alive  2 - Dead
    				setd("$S"+.mvpa[.@i]+.mvpid[.@i], 2);
    				// current time + respawn time (seconds)
    				setd("$T"+.mvpa[.@i]+.mvpid[.@i],gettimetick(2)+(.mvptime[.@i]*60));
    				setd("$P"+.mvpa[.@i]+.mvpid[.@i]+"$", strcharinfo(PC_NAME));
    				if( killedrid == 1120 || killedrid == 1096 ||  killedrid == 1388 ) {
    					if(.announce) announce "A mini boss monster [ "+strmobinfo(1,killedrid)+" ] at "+strcharinfo(PC_MAP)+" has been slain.",bc_all;
    				} else {
    					if(.announce) announce "A boss monster [ "+strmobinfo(1,killedrid)+" ] at "+strcharinfo(PC_MAP)+" has been slain.",bc_all;
    					if(.pvp){
    						removemapflag .mvpmaps$[.@i], mf_pvp_nocalcrank;
    						pvpoff .mvpmaps$[.@i];
    					}
    				}
    				break;
    			}
    		}
    	}
    	end;
    
    OnSettings:
    	while(1){
    	switch(select(
    		" ~ PvP On Map [ "+((.pvp)?"^28bf00Yes^000000":"^ff0000No^000000")+" ]:"+
    		" ~ Announce [ "+((.announce)?"^28bf00Yes^000000":"^ff0000No^000000")+" ]:"+
    		" ~ Reset All MvP:"+
    		" ~ Reset Specific MvP:"+ 
    		" ~ ^777777Close^000000"
    	)) {
    	case 1: .pvp  =! .pvp; 
    		for( .@i = 0; .@i < getarraysize(.mvpid); .@i++ ) {
    			if ( getd("$S"+.mvpa[.@i]+.mvpid[.@i]) < 2 	|| getd("$T"+.mvpa[.@i]+.mvpid[.@i]) <= gettimetick(2)  ) {
    				// if mini boss, just ignore pvp
    				if(.pvp){
    					if(.mvpid[.@i] == 1120 || .mvpid[.@i] == 1096 || .mvpid[.@i] == 1388 ){
    						//PASS THROUGH
    					} else {
    						setmapflag .mvpmaps$[.@i], mf_pvp_nocalcrank;
    						pvpon .mvpmaps$[.@i];
    					}
    				} else {
    					removemapflag .mvpmaps$[.@i], mf_pvp_nocalcrank;
    					pvpoff .mvpmaps$[.@i];
    				}
    			}
    		} 
    		break;
    	case 2: .announce =! .announce; break;
    	case 3:
    		freeloop(1);
    		for( .@i = 0; .@i < getarraysize(.mvpid); .@i++ ) {
    			setd("$S"+.mvpa[.@i]+.mvpid[.@i], 1);
    			setd("$T"+.mvpa[.@i]+.mvpid[.@i], 0);
    			setd("$P"+.mvpa[.@i]+.mvpid[.@i]+"$","");
    			killmonsterall .mvpmaps$[.@i];
    		}	
    		for( .@i = 0; .@i < getarraysize(.mvpid); .@i++ ) {			
    				if( compare( .mvpmaps$[.@i], "prt_maze03" ) && .mvpid[.@i] == 1039 ) {			// Baphomet
    					monster .mvpmaps$[.@i],100,100,"--ja--",.mvpid[.@i],1;
    				} else if( compare( .mvpmaps$[.@i], "treasure02" ) && .mvpid[.@i] == 1112 ) {		// Drake
    					monster .mvpmaps$[.@i],101,151,"--ja--",.mvpid[.@i],1;			
    				} else if( compare( .mvpmaps$[.@i], "pay_dun04" ) && .mvpid[.@i] == 1150 ) {		// moonlight
    					monster .mvpmaps$[.@i],120,115,"--ja--",.mvpid[.@i],1;			
    				} else if( compare( .mvpmaps$[.@i], "tur_dun04" ) && .mvpid[.@i] == 1312 ) {		// turtle
    					monster .mvpmaps$[.@i],99,93,"--ja--",.mvpid[.@i],1;			
    				} else if( compare( .mvpmaps$[.@i], "moc_pryd06" ) && .mvpid[.@i] == 1511 ) {		// amon
    					monster .mvpmaps$[.@i],102,166,"--ja--",.mvpid[.@i],1;	
    				} else if( compare( .mvpmaps$[.@i], "ayo_dun02" ) && .mvpid[.@i] == 1688 ) {		// lady
    					monster .mvpmaps$[.@i],150,90,"--ja--",.mvpid[.@i],1;
    				} else if( compare( .mvpmaps$[.@i], "niflheim" ) && .mvpid[.@i] == 1373 ) {		// LOD
    					donpcevent("NifInvasion::OnSpawn");		
    				} else {
    					monster .mvpmaps$[.@i],0,0,"--ja--",.mvpid[.@i],1;	
    				}
    
    			if(.pvp){
    				if(.mvpid[.@i] == 1120 || .mvpid[.@i] == 1096 || .mvpid[.@i] == 1388 ){
    					//PASS THROUGH
    				} else {
    					setmapflag .mvpmaps$[.@i], mf_pvp_nocalcrank;
    					pvpon .mvpmaps$[.@i];
    				}
    			} else {
    				removemapflag .mvpmaps$[.@i], mf_pvp_nocalcrank;
    				pvpoff .mvpmaps$[.@i];
    			}
    		}
    		freeloop(0);
    		dispbottom "All MVP has been reset.";
    		break;
    	case 4:
    		set .@menu$,"";
    		freeloop(1);
    		for( .@i = 0; .@i < getarraysize(.mvpid); .@i++ )
    			set .@menu$, .@menu$+getmonsterinfo(.mvpid[.@i],0)+" - ("+.mvpmaps$[.@i]+"):";
    		set .@menu$, .@menu$+" ~ ^777777Cancel^000000";
    		freeloop(0);
    		set .@i, select(.@menu$)-1;
    		setd("$S"+.mvpa[.@i]+.mvpid[.@i], 1);
    		setd("$T"+.mvpa[.@i]+.mvpid[.@i], 0);
    		setd("$P"+.mvpa[.@i]+.mvpid[.@i]+"$","");
    		killmonsterall .mvpmaps$[.@i];	
    		monster .mvpmaps$[.@i],0,0,"--ja--",.mvpid[.@i],1;
    		if(.pvp){
    			if(.mvpid[.@i] == 1120 || .mvpid[.@i] == 1096 || .mvpid[.@i] == 1388 ){
    				//PASS THROUGH
    			} else {
    				setmapflag .mvpmaps$[.@i], mf_pvp_nocalcrank;
    				pvpon .mvpmaps$[.@i];
    			}
    		} else {
    			removemapflag .mvpmaps$[.@i], mf_pvp_nocalcrank;
    			pvpoff .mvpmaps$[.@i];
    		}
    		dispbottom "Monster [ "+strmobinfo(1,.mvpid[.@i])+" ] at "+.mvpmaps$[.@i]+" has been reset.";
    		break;
    	default:
    		close;
    	}
    	}
    	close;
    
    OnTimer60000:
    	// Let recheck after a minute.
    	for( .@i = 0; .@i < getarraysize(.mvpid); .@i++ ) {
    		/* $S 1 - Alive $S 2 - Dead */
    		// If MvP status is not yet set
    		if ( getd("$S"+.mvpa[.@i]+.mvpid[.@i]) == 2 && getd("$T"+.mvpa[.@i]+.mvpid[.@i]) <= gettimetick(2)  ) {
    			// check if MvP has fixed spawn location in the map.
    			if( compare( .mvpmaps$[.@i], "prt_maze03" ) && .mvpid[.@i] == 1039 ) {		// Baphomet
    				monster .mvpmaps$[.@i],100,100,"--ja--",.mvpid[.@i],1;
    			} else if( compare( .mvpmaps$[.@i], "treasure02" ) && .mvpid[.@i] == 1112 ) {	// Drake
    				monster .mvpmaps$[.@i],101,151,"--ja--",.mvpid[.@i],1;			
    			} else if( compare( .mvpmaps$[.@i], "pay_dun04" ) && .mvpid[.@i] == 1150 ) {	// moonlight
    				monster .mvpmaps$[.@i],120,115,"--ja--",.mvpid[.@i],1;			
    			} else if( compare( .mvpmaps$[.@i], "tur_dun04" ) && .mvpid[.@i] == 1312 ) {	// turtle
    				monster .mvpmaps$[.@i],99,93,"--ja--",.mvpid[.@i],1;			
    			} else if( compare( .mvpmaps$[.@i], "moc_pryd06" ) && .mvpid[.@i] == 1511 ) {	// amon
    				monster .mvpmaps$[.@i],102,166,"--ja--",.mvpid[.@i],1;	
    			} else if( compare( .mvpmaps$[.@i], "ayo_dun02" ) && .mvpid[.@i] == 1688 ) {	// lady
    				monster .mvpmaps$[.@i],150,90,"--ja--",.mvpid[.@i],1;
    			// Initiate LOD invasion at Niflheim	
    			} else if( compare( .mvpmaps$[.@i], "niflheim" ) && .mvpid[.@i] == 1373 ) {	// LOD
    				donpcevent("NifInvasion::OnSpawn");			
    			} else {
    				// Spawn the MvP at random location.
    				monster .mvpmaps$[.@i],0,0,"--ja--",.mvpid[.@i],1;	
    			}
    			if(.announce) announce "Monster [ "+strmobinfo(1,.mvpid[.@i])+" ] at "+.mvpmaps$[.@i]+" has been spawned.",bc_all;
    			// set status of MvP as ALIVE!
    			setd("$S"+.mvpa[.@i]+.mvpid[.@i], 1);
    			// reset killer name.
    			setd("$P"+.mvpa[.@i]+.mvpid[.@i]+"$", "");
    			if(.pvp){
    				// if mini boss, just ignore pvp
    				if(.mvpid[.@i] == 1120 || .mvpid[.@i] == 1096 || .mvpid[.@i] == 1388 ){
    					//PASS THROUGH
    				} else {
    					setmapflag .mvpmaps$[.@i], mf_pvp_nocalcrank;
    					pvpon .mvpmaps$[.@i];
    				}
    			} else {
    				removemapflag .mvpmaps$[.@i], mf_pvp_nocalcrank;
    				pvpoff .mvpmaps$[.@i];
    			}
    		}
    	}
    	initnpctimer();
    	end;
    
    
    OnCheck:
    OnPCLoginEvent:
    	.@rank = 0;
    	query_sql    "SELECT DATABASE()", .@rag_db$;
    	query_logsql "SELECT DATABASE()", .@log_db$;
    	query_sql( "SELECT COUNT(`monster_id`) AS `total`,`char`.`name`,`kill_char_id` FROM "+.@log_db$+".`mvplog`"+" LEFT JOIN "+.@rag_db$+".`char` ON `char`.`char_id` = `mvplog`.`kill_char_id` WHERE `map` <> 'guild_vs5' AND DATE_FORMAT( `mvp_date`, '%Y-%m-%d') = DATE_FORMAT( now(), '%Y-%m-%d') GROUP BY `kill_char_id` ORDER BY `total` DESC LIMIT 10",.@mvptotal,.@mvpname$,.@kill_char_id );
    	for( .@i = 0; .@i < getarraysize(.@kill_char_id); .@i++ ) {
    		if(getcharid(CHAR_ID_CHAR) == .@kill_char_id[.@i]){
    			.@rank = .@i+1; .@total = .@mvptotal[.@i];
    		}
    	}
    	if ( .@rank > 0 && .@rank < 4 ) {
    		if(countitem(.topreward) == 0){
    			dispbottom "Congratulations you ranked as #"+.@rank+" MvP Hunter for today. Total kill "+.@total;
    			getitembound .topreward,1,4;
    			equip(.topreward);
    		}
    	} else {
    		if(countitem(.topreward) > 0){
    			delitem .topreward,countitem(.topreward);
    			dispbottom "Sorry you have lost your rank as Top 3 MvP Hunter of the day.";
    		}
    	}
    	addtimer 300000,strnpcinfo(0) + "::OnCheck";
    	end;
    	
    OnInit:
        .topreward = 31488;  	// top mvp daily reward
    	.toprange = 3; 			// Only Top 3 gets the reward
    	.announce = 1; 			// shall we announce mvp kills and spawn? (yes = 1 no = 0)
    	.pvp = 1;				// shall will make the map pvp?  (yes = 1 no = 0)
    	bindatcmd("mvpcontroller","mvpcontroller::OnSettings",99,99);
    	// Mvp ids
    	setarray .mvpid[0],1511,1096,1096,1388,1039,1272,1272,1046,1046,1389,1112,1115,1115,1418,1252,1120,1120,1120,1120,1086,1492,1251,1147,1147,1059,1150,1087,1190,1038,1157,1159,1312,1373,1630,1688;
    	// Mvp Index is used because there are same mvp that spawn on different maps.
    	setarray .mvpa[0],1,1,2,1,1,1,2,1,2,1,1,1,2,1,1,1,2,3,4,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1;
    	// MvP maps
    	setarray .mvpmaps$[0],"moc_pryd06","pay_fild04","xmas_dun01","yuno_fild02","prt_maze03","gl_chyard","gld_dun04","gef_dun02","gld_dun02","gef_dun01","treasure02","gld_dun01","pay_fild11","gon_dun03","xmas_fild01","gld_dun04","pay_fild04","prt_maze03","treasure02","prt_sewb4","ama_dun03","xmas_dun02","anthell02","gld_dun03","mjolnir_04","pay_dun04","gef_fild14","gef_fild10","moc_pryd04","in_sphinx5","moc_fild15","tur_dun04","niflheim","lou_dun03","ayo_dun02";
    	// How many minutes to respawn?
    	setarray .mvptime[0],60,60,60,60,120,60,480,120,480,60,120,480,120,95,120,240,60,114,32,60,91,60,120,480,120,60,60,120,60,60,120,60,93,117,420;
    	freeloop(1);
    	for( .@i = 0; .@i < getarraysize(.mvpid); .@i++ ) {
    		// If MvP status is not yet set
    		if ( getd("$S"+.mvpa[.@i]+.mvpid[.@i]) < 2 	|| getd("$T"+.mvpa[.@i]+.mvpid[.@i]) <= gettimetick(2)  ) {
    			// check if MvP has fixed spawn location in the map.
    			if( compare( .mvpmaps$[.@i], "prt_maze03" ) && .mvpid[.@i] == 1039 ) {		// Baphomet
    				monster .mvpmaps$[.@i],100,100,"--ja--",.mvpid[.@i],1;
    			} else if( compare( .mvpmaps$[.@i], "treasure02" ) && .mvpid[.@i] == 1112 ) {	// Drake
    				monster .mvpmaps$[.@i],101,151,"--ja--",.mvpid[.@i],1;			
    			} else if( compare( .mvpmaps$[.@i], "pay_dun04" ) && .mvpid[.@i] == 1150 ) {	// moonlight
    				monster .mvpmaps$[.@i],120,115,"--ja--",.mvpid[.@i],1;			
    			} else if( compare( .mvpmaps$[.@i], "tur_dun04" ) && .mvpid[.@i] == 1312 ) {	// turtle
    				monster .mvpmaps$[.@i],99,93,"--ja--",.mvpid[.@i],1;			
    			} else if( compare( .mvpmaps$[.@i], "moc_pryd06" ) && .mvpid[.@i] == 1511 ) {	// amon
    				monster .mvpmaps$[.@i],102,166,"--ja--",.mvpid[.@i],1;	
    			} else if( compare( .mvpmaps$[.@i], "ayo_dun02" ) && .mvpid[.@i] == 1688 ) {	// lady
    				monster .mvpmaps$[.@i],150,90,"--ja--",.mvpid[.@i],1;
    			// Initiate LOD invasion at Niflheim	
    			} else if( compare( .mvpmaps$[.@i], "niflheim" ) && .mvpid[.@i] == 1373 ) {	// LOD
    				donpcevent("NifInvasion::OnSpawn");			
    			} else {
    				// Spawn the MvP at random location.
    				monster .mvpmaps$[.@i],0,0,"--ja--",.mvpid[.@i],1;	
    			}
    			// set status of MvP as ALIVE!
    			setd("$S"+.mvpa[.@i]+.mvpid[.@i], 1);	// status is alive (1)
    			// reset killer name.
    			setd("$P"+.mvpa[.@i]+.mvpid[.@i]+"$", "");	// killer name reset
    			if(.pvp){
    				// if mini boss, just ignore pvp
    				if(.mvpid[.@i] == 1120 || .mvpid[.@i] == 1096 || .mvpid[.@i] == 1388 ){
    					//PASS THROUGH
    				} else {
    					setmapflag .mvpmaps$[.@i], mf_pvp_nocalcrank;
    					pvpon .mvpmaps$[.@i];
    				}
    			} else {
    				removemapflag .mvpmaps$[.@i], mf_pvp_nocalcrank;
    				pvpoff .mvpmaps$[.@i];
    			}
    		}
    	}
    	freeloop(0);
    	initnpctimer();
    	end;
    }
    
    /* If you want your player have access to spawn time, you can use this function to display status of each MvP and who killed them
    {
    	Id: 501
    	AegisName: "Red_Potion"
    	Name: "Red Potion"
    	Type: "IT_HEALING"
    	Buy: 50
    	Weight: 70
    	Script: <" callfunc "F_MVPTime"; ">
    },
    */
    
    function	script	F_MVPTime	{
    	mes "^FF0000MvP Status^000000";
    	for( .@i = 0; .@i < getarraysize(getvariableofnpc(.mvpid,"mvpcontroller")); .@i++ ) {
    		.@time =  getd("$T" +getvariableofnpc(.mvpindex[.@i],"mvpcontroller") + getvariableofnpc(.mvpid[.@i],"mvpcontroller"));
    		.@alive = getd("$S" +getvariableofnpc(.mvpindex[.@i],"mvpcontroller") + getvariableofnpc(.mvpid[.@i],"mvpcontroller"));
    
    		set .@hours, (.@time - gettimetick(2)) / 3600;
    		set .@mins,  (.@time - gettimetick(2))%3600/60;
    		set .@secs,  (.@time - gettimetick(2))%60;
    
    		set .@mobname$,getmonsterinfo( getvariableofnpc(.mvpid[.@i], "mvpcontroller"),0 );
    		set .@map$,getvariableofnpc(.mvpmaps$[.@i], "mvpcontroller");
    		set .@player$,getd("$P"+getvariableofnpc(.mvpindex[.@i], "mvpcontroller") + getvariableofnpc(.mvpid[.@i], "mvpcontroller") +"$");
    		
    		mes ((.@alive == 1) ? "[ ^01DF01+^000000 ]" : "[ ^FF0000x^000000 ]")+((getstrlen( .@mobname$ ) > 10 ) ? " ^0055FF"+substr(.@mobname$,0, 10)+"^000000" : " ^0055FF"+.@mobname$+"^000000")+" ^777777"+.@map$+"^000000 ";
    		if( .@alive == 2 ) {
    			mes "^FF0000"+((.@hours) ? .@hours +"h" : "")+" "+((.@mins)  ? .@mins  +"m" : "")+" "+((.@secs)  ? .@secs  +"s" : "")+"^000000 "+"^777777 kiiled by "+.@player$+"^000000";
    		}
    	}
    	close;
    }

    What does it do?
    -  prevents spawn of mvp on each server starts or reload.
    -  spawns mvp or mini only at specific time based when it was killed + spawn time
    -  reward x top mvp killers.

    Cons:
    - you can not use convex mirrors to show mvp in the map
    - you can not find mvp using @whereis.

    How to use:
    - Delete or Comment target MVP and mini boss spawn from your npc/pre-re/mobs/dungeons/ or /fields.
    - Add these mvps to array.

    FAQ:
    #Q1 What the heck is this?

    	setarray .mvpa[0],1,1,2,1,1,1,2,1,2,1,1,1,2,1,1,1,2,3,4,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1;

    #A1: since there are same kind of MVP spawn on multile map (i.e Angeling spawns at pay_fild04, xmas_dun01, yuno_fild03) those numbers are the unique identifiers. 
    if there is only 1 spawn, then just write 1. 
    succeeding spawn is 2  then 3 ....

    All other suggestions to simplify and improve @AnnieRuru yohoo! my master.  
     


  2. 1. Delete or Comment all MVP and mini boss spawn at npc/pre-re/mobs/dungeons/ or /fields.
    2. add all MobID, spawn time and map of mvp to array. 
     

    OnInit:
    	setarray .mvpid[0],1511,1039; <- osiris and baphomet
    	setarray .mvptime[0],60,60;
    	setarray .mvpmaps$[0],"moc_pryd06","prt_maze03";

    3. Upon script load add global variables to each item in .mvpid and initialize timer.
     

    OnInit:
    /* Loop to each mvp.
     lets set global variable
    getd("$S"+.mvpid[.@i] = 0 <- not set
    getd("$S"+.mvpid[.@i] = 1 <- alive
    getd("$S"+.mvpid[.@i] = 2 <- dead
    */
    for( .@i = 0; .@i < getarraysize(.mvpid); .@i++ ) {
    	/*
    	if variable is not yet set or getd("$S"+.mvpid[.@i] < 2 (alive or not set) OR time from setarray .mvptime[0] has elapse
        	setd("$S"+.mvpid[.@i],1); (alive)
     		spawn .mvpid[.@i]
    	}
        */
    }    
    initnpctimer();  

    4  Check every 1 minutes 

    OnTimer60000:
    	for( .@i = 0; .@i < getarraysize(.mvpid); .@i++ ) {
    	/* same thing just check on each mvp if flag is dead then skip, if alive then spawn.
    		if variable is not yet set or getd("$S"+.mvpid[.@i] < 2 (alive or not set) OR time from setarray .mvptime[0] has elapse
    			set global mvp status variable to (alive)
    			clear global mvp death variable.
     			spawn .mvpid[.@i]
    		}
        */
    }    
    initnpctimer();  

    5. Finally, record if mvp is killed and set flag to killed.
     

    /* must load that useful function array_find from meko
    https://herc.ws/board/files/file/326-array-manipulation-functions/
    */
    OnNPCKillEvent:
    	if(array_find(.mvpid, killedrid) >= 0 ){ // check if monster killed is part of your mvp array
    		// loop to that array until it matches mvpid and map
    		for( .@i = 0; .@i < getarraysize(.mvpid); .@i++ ) {
                   // if match then set variable to dead and set the global mvptime variable to timestamp.
    				break;                                                 
    		}                                                 
    	}
    	end;                                                 


     


  3. 4 hours ago, Samuel said:

    can't reproduce this

     

    are you using latest hercules? and any modifications made in src?

    yes using latest herc now with no mod and using official database. Sometimes its okay, but there are times that i experience the issue for unknown reason.

     


  4. Still getting this nasty unknown HERC itemskill bug. Still not able to identify how to simulate.
    PRE-RE
    - Using flywing, butterfly wing or other consumable dont function but deduct item from inventory.

    I hope it will be fix, its been long time experience this issue with players.


  5. 1. its usually inter-network issue, if you host your server at Singapore and player connecting from Europe, then you will be having lots of those packet loss.
    2. Your net provider (ISP) maybe having issue or maintenance along the route.
    3. You maybe have high net usage at your home network.


  6. On 12/23/2020 at 10:09 PM, fiction said:

    correct me if im wrong map zone only prevents u to cast a skill, if u enter a restricted zone with that buff, it will ignore it


  7. not tested by u can try

     

    -	script	woe_joblimit	FAKE_NPC,{
    end;
    
    OnPCLoadMapEvent:
    	.@guild_id = getcharid(CHAR_ID_GUILD);
    	if (!.@guild_id || !getmapflag(strcharinfo(PC_MAP), MF_GVG_CASTLE) || !agitcheck() || !agitcheck2() ) end;
    	if(.joblimit){
    		.@origin = playerattached();
    		.@class = Class;
    		.@map$ = strcharinfo(PC_MAP);
    		.@climit = 0;
    		getguildmember getcharid(CHAR_ID_GUILD), 1;
    		getguildmember getcharid(CHAR_ID_GUILD), 2;
    		for ( .@i = 0; .@i < $@guildmembercount; ++.@i ) {
    			if (isloggedin( $@guildmemberaid[.@i], $@guildmembercid[.@i] ) == 0) {
    					continue;
    			} else {
    				if (attachrid($@guildmemberaid[.@i])) {
    					if( .@class == Class && strcharinfo(PC_MAP) == .@map$ ) {
    						++.@climit;
    					}
    				}
    			}
    		}
    		if ( .@origin ) {
    			attachrid(.@origin);
    			if(.@climit > .joblimit){
    				message strcharinfo(0), "REGULATION: Your guild reached the max of ( "+.joblimit+" ) "+jobname(Class)+" that can join the siege.";
    				warp "SavePoint",0,0;
    			}
    		} else {
    			detachrid;
    		}
    	}
    	end;
        
    OnInit:
    	.joblimit = 6;
    	setarray .castle$[0],
    		"aldeg_cas01","aldeg_cas02","aldeg_cas03","aldeg_cas04","aldeg_cas05",
    		"gefg_cas01","gefg_cas02","gefg_cas03","gefg_cas04","gefg_cas05",
    		"payg_cas01","payg_cas02","payg_cas03","payg_cas04","payg_cas05",
    		"prtg_cas01","prtg_cas02","prtg_cas03","prtg_cas04","prtg_cas05",
    		"arug_cas01","arug_cas02","arug_cas03","arug_cas04","arug_cas05",
    		"schg_cas01","schg_cas02","schg_cas03","schg_cas04","schg_cas05";
    	for (.@i = 0; .@i < 30; ++.@i) {
    		setmapflag .castle$[.@i], MF_GVG_CASTLE;
    		setmapflag .castle$[.@i], MF_LOADEVENT;
    	}
    	end;
    }

     


  8. check in your script.c if you have entry
     

    BUILDIN(get_unique_id)
    {
    	char temp[20];
    	struct map_session_data* sd = script_rid2sd(st);
    
    	if (sd == NULL)
    	{
    		script_pushconststr(st, "");
    		return false;
    	}
    
    	sprintf(temp, "%lu", sockt->session[sd->fd]->gepard_info.unique_id);
    	script_pushstrcopy(st, temp);
    	return true;
    }
    static void script_parse_builtin(void)
    {
    	struct script_function BUILDIN[] = {
    		BUILDIN_DEF(get_unique_id, ""),

     

×
×
  • Create New...

Important Information

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