Browse Source

* Added base code for loading Ser's UPNP plugin
* Added 'idle_no_share' to battle_athena.conf
* Added item_findingore.txt

git-svn-id: https://svn.code.sf.net/p/rathena/svn/branches/stable@1343 54d463be-8e91-2dee-dedb-b68131a5f0ec

celest 20 years ago
parent
commit
88cfcb9432
10 changed files with 129 additions and 53 deletions
  1. 3 0
      Changelog-SVN.txt
  2. 3 0
      conf-tmpl/battle_athena.conf
  3. 24 0
      db/item_findingore.txt
  4. 47 1
      src/common/socket.c
  5. 2 0
      src/map/battle.c
  6. 1 0
      src/map/battle.h
  7. 9 7
      src/map/itemdb.c
  8. 2 3
      src/map/mob.c
  9. 13 13
      src/map/party.c
  10. 25 29
      src/map/skill.c

+ 3 - 0
Changelog-SVN.txt

@@ -2,6 +2,8 @@
 Date	Added
 Date	Added
 
 
 03/30
 03/30
+	* Added base code for loading Ser's UPNP plugin [celest]
+	* Added 'idle_no_share' to battle_athena.conf [celest]
 	* updated map server to jA1137~1159
 	* updated map server to jA1137~1159
 	  - Added @reloadatcommand, @reloadbattleconf, @reloadstatusdb, @reloadpcdb
 	  - Added @reloadatcommand, @reloadbattleconf, @reloadstatusdb, @reloadpcdb
 
 
@@ -16,6 +18,7 @@ Date	Added
 	  - Updated Hammerfall, Meteor Shower and Lord of Vermillion -- when MvP's
 	  - Updated Hammerfall, Meteor Shower and Lord of Vermillion -- when MvP's
 	    cast them they should have much more range
 	    cast them they should have much more range
 	  - Some other skill tweaks
 	  - Some other skill tweaks
+	  - Added item_findingore.txt
 	* Some tidying up in mob.c and skill.c [celest]
 	* Some tidying up in mob.c and skill.c [celest]
 
 
 03/29
 03/29

+ 3 - 0
conf-tmpl/battle_athena.conf

@@ -823,5 +823,8 @@ exp_calc_type: 1
 // P.S 2: This skill is not implemented on official servers, so its only optional
 // P.S 2: This skill is not implemented on official servers, so its only optional
 require_glory_guild: no
 require_glory_guild: no
 
 
+// Is exp sharing disabled for idle members in the party?
+idle_no_share: no
+
 import: conf/import/battle_conf.txt
 import: conf/import/battle_conf.txt
 
 

+ 24 - 0
db/item_findingore.txt

@@ -0,0 +1,24 @@
+// 鉱石発見スキルでドロップされる鉱石
+// item ID, Jname (dummy), 確率を 1 万倍 (100% なら 1000000)
+// 0 はデフォルト項目
+0,Iron Ore,1002
+714,Emperium,30000
+756,Rough Oridecon,200000
+757,Rough Elunium,200000
+969,Gold,20000
+984,Oridecon,100000
+985,Elunium,100000
+990,Red Blood,300000
+991,Crystal Blue,300000
+992,Wind of Verdure,300000
+993,Green Live,300000
+994,Flame Heart,150000
+995,Mystic Frozen,150000
+996,Rough Wind,150000
+997,Great Nature,150000
+998,Iron,800000
+999,Steel,500000
+1002,Iron Ore,1000000
+1003,Coal,600000
+1010,Phracon,950000
+1011,Emveretarcon,550000

+ 47 - 1
src/common/socket.c

@@ -38,6 +38,20 @@ typedef int socklen_t;
 #include "memwatch.h"
 #include "memwatch.h"
 #endif
 #endif
 
 
+#ifdef UPNP
+	#if defined(CYGWIN)
+		#include <dlfcn.h>
+	#elif _WIN32
+		// windows.h already included
+	#else
+		#error This doesnt work with non-Windows yet
+	#endif
+
+	void *upnp_dll;
+	void (*upnp_init)();
+	void (*upnp_final)();
+#endif
+
 fd_set readfds;
 fd_set readfds;
 int fd_max;
 int fd_max;
 time_t tick_;
 time_t tick_;
@@ -920,6 +934,27 @@ int  Net_Init(void)
   return(0);
   return(0);
 }
 }
 
 
+#ifdef UPNP
+// not implemented yet ^^;
+void do_init_upnp(void)
+{
+	upnp_dll = dlopen("upnp.dll", RTLD_NOW);
+	if (!upnp_dll) {
+		printf ("Cannot open upnp.dll: %s\n", dlerror());
+		return;
+	}
+	upnp_init = (void *)dlsym(upnp_dll, "do_init");
+	upnp_final = (void *)dlsym(upnp_dll, "do_final");
+	if (!upnp_init || !upnp_final) {
+		printf ("Cannot load symbol: %s\n", dlerror());
+		dlclose (upnp_dll);
+		return;
+	}
+	upnp_init();
+	return;
+}
+#endif
+
 void do_final_socket(void)
 void do_final_socket(void)
 {
 {
 	int i;
 	int i;
@@ -945,7 +980,14 @@ void do_final_socket(void)
 	// session[0] のダミーデータを削除
 	// session[0] のダミーデータを削除
 	aFree(session[0]->rdata);
 	aFree(session[0]->rdata);
 	aFree(session[0]->wdata);
 	aFree(session[0]->wdata);
-	aFree(session[0]);	
+	aFree(session[0]);
+
+#ifdef UPNP
+	if (upnp_final)
+		upnp_final();
+	if (upnp_dll)
+		dlclose(upnp_dll);
+#endif
 }
 }
 
 
 void do_socket(void)
 void do_socket(void)
@@ -966,4 +1008,8 @@ void do_socket(void)
 
 
 	// とりあえず5分ごとに不要なデータを削除する
 	// とりあえず5分ごとに不要なデータを削除する
 	add_timer_interval(gettick()+1000,connect_check_clear,0,0,300*1000);
 	add_timer_interval(gettick()+1000,connect_check_clear,0,0,300*1000);
+
+#ifdef UPNP
+	do_init_upnp();
+#endif
 }
 }

+ 2 - 0
src/map/battle.c

@@ -4202,6 +4202,7 @@ static const struct {
 	{ "exp_calc_type",          &battle_config.exp_calc_type}, // [celest]
 	{ "exp_calc_type",          &battle_config.exp_calc_type}, // [celest]
 	{ "min_skill_delay_limit",    &battle_config.min_skill_delay_limit}, // [celest]
 	{ "min_skill_delay_limit",    &battle_config.min_skill_delay_limit}, // [celest]
 	{ "require_glory_guild",    &battle_config.require_glory_guild}, // [celest]
 	{ "require_glory_guild",    &battle_config.require_glory_guild}, // [celest]
+	{ "idle_no_share",			&battle_config.idle_no_share}, // [celest], for a feature by [MouseJstr]
 
 
 //SQL-only options start
 //SQL-only options start
 #ifndef TXT_ONLY
 #ifndef TXT_ONLY
@@ -4450,6 +4451,7 @@ void battle_set_defaults() {
 	battle_config.exp_calc_type = 1;
 	battle_config.exp_calc_type = 1;
 	battle_config.min_skill_delay_limit = 100;
 	battle_config.min_skill_delay_limit = 100;
 	battle_config.require_glory_guild = 0;
 	battle_config.require_glory_guild = 0;
+	battle_config.idle_no_share = 0;
 
 
 //SQL-only options start
 //SQL-only options start
 #ifndef TXT_ONLY
 #ifndef TXT_ONLY

+ 1 - 0
src/map/battle.h

@@ -312,6 +312,7 @@ extern struct Battle_Config {
 	int exp_calc_type;
 	int exp_calc_type;
 	int min_skill_delay_limit;
 	int min_skill_delay_limit;
 	int require_glory_guild;
 	int require_glory_guild;
+	int idle_no_share;
 
 
 #ifndef TXT_ONLY /* SQL-only options */
 #ifndef TXT_ONLY /* SQL-only options */
 	int mail_system; // [Valaris]
 	int mail_system; // [Valaris]

+ 9 - 7
src/map/itemdb.c

@@ -26,9 +26,9 @@
 
 
 static struct dbt* item_db;
 static struct dbt* item_db;
 
 
-static struct random_item_data blue_box[MAX_RANDITEM],violet_box[MAX_RANDITEM],card_album[MAX_RANDITEM],gift_box[MAX_RANDITEM],scroll[MAX_RANDITEM];
-static int blue_box_count=0,violet_box_count=0,card_album_count=0,gift_box_count=0,scroll_count=0;
-static int blue_box_default=0,violet_box_default=0,card_album_default=0,gift_box_default=0,scroll_default=0;
+static struct random_item_data blue_box[MAX_RANDITEM], violet_box[MAX_RANDITEM], card_album[MAX_RANDITEM], gift_box[MAX_RANDITEM], scroll[MAX_RANDITEM], finding_ore[MAX_RANDITEM];
+static int blue_box_count=0, violet_box_count=0, card_album_count=0, gift_box_count=0, scroll_count=0, finding_ore_count = 0;
+static int blue_box_default=0, violet_box_default=0, card_album_default=0, gift_box_default=0, scroll_default=0, finding_ore_default = 0;
 
 
 // Function declarations
 // Function declarations
 
 
@@ -102,7 +102,7 @@ int itemdb_searchrandomid(int flags)
 	struct {
 	struct {
 		int nameid,count;
 		int nameid,count;
 		struct random_item_data *list;
 		struct random_item_data *list;
-	} data[6];
+	} data[7];
 
 
 	// for BCC32 compile error
 	// for BCC32 compile error
 	data[0].nameid = 0;						data[0].count = 0; 					data[0].list = NULL;
 	data[0].nameid = 0;						data[0].count = 0; 					data[0].list = NULL;
@@ -111,8 +111,9 @@ int itemdb_searchrandomid(int flags)
 	data[3].nameid = card_album_default;	data[3].count = card_album_count;	data[3].list = card_album;
 	data[3].nameid = card_album_default;	data[3].count = card_album_count;	data[3].list = card_album;
 	data[4].nameid = gift_box_default;		data[4].count = gift_box_count;		data[4].list = gift_box;
 	data[4].nameid = gift_box_default;		data[4].count = gift_box_count;		data[4].list = gift_box;
 	data[5].nameid = scroll_default;		data[5].count = scroll_count;		data[5].list = scroll;
 	data[5].nameid = scroll_default;		data[5].count = scroll_count;		data[5].list = scroll;
+	data[6].nameid = finding_ore_default;	data[6].count = finding_ore_count;	data[6].list = finding_ore;
 
 
-	if(flags>=1 && flags<=5){
+	if(flags>=1 && flags<=6){
 		nameid=data[flags].nameid;
 		nameid=data[flags].nameid;
 		count=data[flags].count;
 		count=data[flags].count;
 		list=data[flags].list;
 		list=data[flags].list;
@@ -410,8 +411,9 @@ static int itemdb_read_randomitem()
 		{"db/item_bluebox.txt",		blue_box,	&blue_box_count, &blue_box_default		},
 		{"db/item_bluebox.txt",		blue_box,	&blue_box_count, &blue_box_default		},
 		{"db/item_violetbox.txt",	violet_box,	&violet_box_count, &violet_box_default	},
 		{"db/item_violetbox.txt",	violet_box,	&violet_box_count, &violet_box_default	},
 		{"db/item_cardalbum.txt",	card_album,	&card_album_count, &card_album_default	},
 		{"db/item_cardalbum.txt",	card_album,	&card_album_count, &card_album_default	},
-		{"db/item_giftbox.txt",	gift_box,	&gift_box_count, &gift_box_default	},
-		{"db/item_scroll.txt",	scroll,	&scroll_count, &scroll_default	},
+		{"db/item_giftbox.txt",		gift_box,	&gift_box_count, &gift_box_default	},
+		{"db/item_scroll.txt",		scroll,		&scroll_count, &scroll_default	},
+		{"db/item_findingore.txt",	finding_ore,&finding_ore_count, &finding_ore_default	},
 	};
 	};
 
 
 	for(i=0;i<sizeof(data)/sizeof(data[0]);i++){
 	for(i=0;i<sizeof(data)/sizeof(data[0]);i++){

+ 2 - 3
src/map/mob.c

@@ -2624,11 +2624,10 @@ int mob_damage(struct block_list *src,struct mob_data *md,int damage,int type)
 		}
 		}
 
 
 		// Ore Discovery [Celest]
 		// Ore Discovery [Celest]
-		if (sd && pc_checkskill(sd,BS_FINDINGORE)>0 && battle_config.finding_ore_rate/100 >= rand()%1000) {
+		if (sd == mvp_sd && pc_checkskill(sd,BS_FINDINGORE)>0 && battle_config.finding_ore_rate/100 >= rand()%1000) {
 			struct delay_item_drop *ditem;
 			struct delay_item_drop *ditem;
-			int itemid[17] = { 714, 756, 757, 969, 984, 985, 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, 1002 };
 			ditem=(struct delay_item_drop *)aCalloc(1,sizeof(struct delay_item_drop));
 			ditem=(struct delay_item_drop *)aCalloc(1,sizeof(struct delay_item_drop));
-			ditem->nameid = itemid[rand()%17]; //should return from 0 to 16
+			ditem->nameid = itemdb_searchrandomid(6);
 			if (drop_ore<0) i=8; //we have only 10 slots in LOG, there's a check to not overflow (9th item usually a card, so we use 8th slot)
 			if (drop_ore<0) i=8; //we have only 10 slots in LOG, there's a check to not overflow (9th item usually a card, so we use 8th slot)
 			log_item[i] = ditem->nameid; //it's for logging only
 			log_item[i] = ditem->nameid; //it's for logging only
 			drop_items++; //we cound if there were any drops
 			drop_items++; //we cound if there were any drops

+ 13 - 13
src/map/party.c

@@ -586,23 +586,23 @@ int party_exp_share(struct party *p,int map,int base_exp,int job_exp,int zeny)
 
 
 	nullpo_retr(0, p);
 	nullpo_retr(0, p);
 	
 	
-	for(i=c=0;i<MAX_PARTY;i++)
-		if((sd=p->member[i].sd)!=NULL && p->member[i].online && sd->bl.m==map  && session[sd->fd] != NULL)
+	for (i=c=0; i < MAX_PARTY; i++)
+		if ((sd = p->member[i].sd) != NULL && p->member[i].online && sd->bl.m == map /*&& session[sd->fd] != NULL*/)	// should be done in socket.c
 			c++;
 			c++;
-		
-	if(c==0)
+
+	if(c == 0)
 		return 0;
 		return 0;
-	for(i=0;i<MAX_PARTY;i++)
-		if((sd=p->member[i].sd)!=NULL && p->member[i].online && sd->bl.m==map  && session[sd->fd] != NULL) {
-			if (/* pc_issit(sd) || */ sd->chatID || (sd->idletime < (tick_ - 120)))
+	for (i = 0; i < MAX_PARTY; i++)
+		if ((sd = p->member[i].sd) != NULL && p->member[i].online && sd->bl.m == map /*&& session[sd->fd] != NULL*/) {
+			if (battle_config.idle_no_share && (/* pc_issit(sd) || */ sd->chatID || (sd->idletime < (tick_ - 120))))
 				continue;
 				continue;
-#ifdef TWILIGHT
+		#ifdef TWILIGHT
 			pc_gainexp(sd,base_exp,job_exp);
 			pc_gainexp(sd,base_exp,job_exp);
-#else
-			pc_gainexp(sd,base_exp/c+1,job_exp/c+1);
-#endif
-			if(battle_config.zeny_from_mobs) // zeny from mobs [Valaris]
-				pc_getzeny(sd,zeny/c+1);
+		#else
+			pc_gainexp(sd,(base_exp/c)+1,(job_exp/c)+1);
+		#endif
+			if (battle_config.zeny_from_mobs) // zeny from mobs [Valaris]
+				pc_getzeny(sd,(zeny/c)+1);
 		}
 		}
 	return 0;
 	return 0;
 }
 }

+ 25 - 29
src/map/skill.c

@@ -608,8 +608,8 @@ int skillnotok(int skillid, struct map_session_data *sd)
 			return 1;
 			return 1;
 	}
 	}
 
 
-     if (pc_isGM(sd) >= 20)
-           return 0;  // gm's can do anything damn thing they want
+	if (pc_isGM(sd) >= 20)
+		return 0;  // gm's can do anything damn thing they want
 
 
 	// Check skill restrictions [Celest]
 	// Check skill restrictions [Celest]
 	if(!map[sd->bl.m].flag.pvp && !map[sd->bl.m].flag.gvg && skill_get_nocast (skillid) & 1)
 	if(!map[sd->bl.m].flag.pvp && !map[sd->bl.m].flag.gvg && skill_get_nocast (skillid) & 1)
@@ -630,7 +630,7 @@ int skillnotok(int skillid, struct map_session_data *sd)
 		case MC_IDENTIFY:
 		case MC_IDENTIFY:
 			return 0; // always allowed
 			return 0; // always allowed
 		default:
 		default:
-			return(map[sd->bl.m].flag.noskill);
+			return (map[sd->bl.m].flag.noskill);
 	}
 	}
 }
 }
 
 
@@ -639,9 +639,9 @@ static int distance(int x0,int y0,int x1,int y1)
 {
 {
 	int dx,dy;
 	int dx,dy;
 
 
-	dx=abs(x0-x1);
-	dy=abs(y0-y1);
-	return dx>dy ? dx : dy;
+	dx = abs(x0 - x1);
+	dy = abs(y0 - y1);
+	return dx > dy ? dx : dy;
 }
 }
 
 
 /* スキルユニットの配置情報を返す */
 /* スキルユニットの配置情報を返す */
@@ -649,26 +649,25 @@ struct skill_unit_layout skill_unit_layout[MAX_SKILL_UNIT_LAYOUT];
 int firewall_unit_pos;
 int firewall_unit_pos;
 int icewall_unit_pos;
 int icewall_unit_pos;
 
 
-struct skill_unit_layout *skill_get_unit_layout(int skillid,int skilllv,struct block_list *src,int x,int y)
-{
-	
+struct skill_unit_layout *skill_get_unit_layout (int skillid, int skilllv, struct block_list *src, int x, int y)
+{	
 	int pos = skill_get_unit_layout_type(skillid,skilllv);
 	int pos = skill_get_unit_layout_type(skillid,skilllv);
 	int dir;
 	int dir;
 
 
-	if (pos!=-1)
+	if (pos != -1)
 		return &skill_unit_layout[pos];
 		return &skill_unit_layout[pos];
 
 
-	if (src->x==x && src->y==y)
+	if (src->x == x && src->y == y)
 		dir = 2;
 		dir = 2;
 	else
 	else
 		dir = map_calc_dir(src,x,y);
 		dir = map_calc_dir(src,x,y);
 
 
-	if (skillid==MG_FIREWALL)
-		return &skill_unit_layout[firewall_unit_pos+dir];
-	else if (skillid==WZ_ICEWALL)
-		return &skill_unit_layout[icewall_unit_pos+dir];
+	if (skillid == MG_FIREWALL)
+		return &skill_unit_layout [firewall_unit_pos + dir];
+	else if (skillid == WZ_ICEWALL)
+		return &skill_unit_layout [icewall_unit_pos + dir];
 
 
-	printf("unknown unit layout for skill %d, %d\n",skillid,skilllv);
+	printf("Unknown unit layout for skill %d, %d\n",skillid,skilllv);
 	return &skill_unit_layout[0];
 	return &skill_unit_layout[0];
 }
 }
 
 
@@ -691,7 +690,7 @@ struct skill_unit_layout *skill_get_unit_layout(int skillid,int skilllv,struct b
  * スキル追加?果
  * スキル追加?果
  *------------------------------------------
  *------------------------------------------
  */
  */
-int skill_additional_effect( struct block_list* src, struct block_list *bl,int skillid,int skilllv,int attack_type,unsigned int tick)
+int skill_additional_effect (struct block_list* src, struct block_list *bl, int skillid, int skilllv, int attack_type, unsigned int tick)
 {
 {
 	/* MOB追加?果スキル用 */
 	/* MOB追加?果スキル用 */
 	const int sc[]={
 	const int sc[]={
@@ -825,8 +824,9 @@ int skill_additional_effect( struct block_list* src, struct block_list *bl,int s
 	case WZ_FROSTNOVA:		/* フロストノヴァ */
 	case WZ_FROSTNOVA:		/* フロストノヴァ */
 		{
 		{
 			struct status_change *sc_data = status_get_sc_data(bl);
 			struct status_change *sc_data = status_get_sc_data(bl);
-			rate=(skilllv*3+35)*sc_def_mdef/100-(status_get_int(bl)+status_get_luk(bl))/15;
-			rate=rate<=5?5:rate;
+			rate = (skilllv*3+35)*sc_def_mdef/100-(status_get_int(bl)+status_get_luk(bl))/15;
+			if (rate <= 5)
+				rate = 5;
 			if(sc_data && sc_data[SC_FREEZE].timer == -1 && rand()%100 < rate)
 			if(sc_data && sc_data[SC_FREEZE].timer == -1 && rand()%100 < rate)
 				status_change_start(bl,SC_FREEZE,skilllv,0,0,0,skill_get_time2(skillid,skilllv)*(1-sc_def_mdef/100),0);
 				status_change_start(bl,SC_FREEZE,skilllv,0,0,0,skill_get_time2(skillid,skilllv)*(1-sc_def_mdef/100),0);
 			else if (sd && skillid == MG_FROSTDIVER)
 			else if (sd && skillid == MG_FROSTDIVER)
@@ -2384,9 +2384,7 @@ int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int s
 
 
 	case SM_MAGNUM:			/* マグナムブレイク [celest] */
 	case SM_MAGNUM:			/* マグナムブレイク [celest] */
 		if(flag&1 && bl->id != skill_area_temp[1]){
 		if(flag&1 && bl->id != skill_area_temp[1]){
-			int dx = abs( bl->x - skill_area_temp[2] );
-			int dy = abs( bl->y - skill_area_temp[3] );
-			int dist = ((dx>dy)?dx:dy);
+			int dist = distance (bl->x, bl->y, skill_area_temp[2], skill_area_temp[3]);
 			skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,
 			skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,
 				0x0500|dist);
 				0x0500|dist);
 		} else {
 		} else {
@@ -2514,18 +2512,16 @@ int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int s
 	case MG_NAPALMBEAT:			/* ナパ?ムビ?ト */
 	case MG_NAPALMBEAT:			/* ナパ?ムビ?ト */
 	case MG_FIREBALL:			/* ファイヤ?ボ?ル */
 	case MG_FIREBALL:			/* ファイヤ?ボ?ル */
 	case WZ_SIGHTRASHER:		/* サイトラッシャー */
 	case WZ_SIGHTRASHER:		/* サイトラッシャー */
-		if(flag&1){
+		if (flag & 1) {
 			/* 個別にダメ?ジを?える */
 			/* 個別にダメ?ジを?える */
-			if(bl->id!=skill_area_temp[1]){
-				if(skillid==MG_FIREBALL){	/* ファイヤ?ボ?ルなら中心からの距離を計算 */
-					int dx=abs( bl->x - skill_area_temp[2] );
-					int dy=abs( bl->y - skill_area_temp[3] );
-					skill_area_temp[0]=((dx>dy)?dx:dy);
+			if (bl->id != skill_area_temp[1]){
+				if(skillid == MG_FIREBALL){	/* ファイヤ?ボ?ルなら中心からの距離を計算 */
+					skill_area_temp[0] = distance(bl->x, bl->y, skill_area_temp[2], skill_area_temp[3]);
 				}
 				}
 				skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,
 				skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,
 					skill_area_temp[0]| 0x0500);
 					skill_area_temp[0]| 0x0500);
 			}
 			}
-		}else{
+		} else {
 			int ar;
 			int ar;
 			skill_area_temp[0]=0;
 			skill_area_temp[0]=0;
 			skill_area_temp[1]=bl->id;
 			skill_area_temp[1]=bl->id;