Incubus
-
Постов
42 -
Зарегистрирован
-
Посещение
-
Победитель дней
28
Сообщения, опубликованные Incubus
-
-
Гильд мастер, собрав нужный лут, может создать вещь, закрепленную за гильдией.
Список вещей и нужного на нее лута указывается в отдельном файле.
Вещь подписывается именем гильдии.
Эту вещь нельзя выкинуть, передать игроку не в гильдии или положить в обычный склад.
При выходе из гильдии вещь перекидывается в гильд склад.
При удалении гильдии вещь удаляется.
Цена вопроса: 1000р.
Обращаться в ПМ или icq 260474081
-
для rA в файле skill_cast_db.txt есть колонка Cool down
для eA в исходниках есть функция clif_skill_cooldown(struct map_session_data *sd, int skillid, unsigned int tick);
- 1
-
Подобие стандартных массивов(числовых). Сейчас макс. размер выставлен до 500.
BUILDIN_DEF(long_array,"si*"),
BUILDIN_DEF(getelementoflongarray,"si"),
BUILDIN_DEF(deletelongarray,"si?"),- 11
-
Предлагаю проверить будет ли сумма двух массивов: $@sns_group2 и $@sns_group1 равна размеру массива $@mapusersid, когда количество игроков не четное.
В этом куске ты наверное не изменил ничего?
for (set .i, 0; .i < $@sns_member; set .i, .i+1) {
warpchar "pvp_n_1-5",66,100,$@sns_group1[.i];
warpchar "pvp_n_1-5",136,100,$@sns_group2[.i];}
pvpon "pvp_n_1-5";
}не проще ли варпать командой warpparty раз ты уже всех раскидал по пати?
А также тут внимательно посмотри
if(getmapusers("pvp_n_1-5")>2 && getmapusers("pvp_n_1-5")<4) {
inviteparty($@sns_group2[0],$@sns_member);}
else if (getmapusers("pvp_n_1-5")>3) {
inviteparty($@sns_group1[0],$@sns_member);
inviteparty($@sns_group2[0],$@sns_member);}думаю лучше будет писать типа такого:
inviteparty($@sns_group2[0],getarraysize($@sns_group2));
- 1
-
как вариант из первого поста замени строку
copyarray $@sns_group2[0],$@mapusersid[$@sns_member],$@sns_member;
на
copyarray $@sns_group2[0],$@mapusersid[$@sns_member],(getarraysize($@mapusersid)%2>0?($@sns_member+1):$@sns_member);
если я правильно понял команду inviteparty.
В этом случае будет последнего игрока всегда добавлять в $@sns_group2
В твоем первом посте всегда последний игрок отметался, потому как при делении в афине округление идет в меньшую сторону, т.е. 5/2 будет 2.
- 1
-
Сильно не вникал в скрипт, если проблема все еще в том что остается в центре последний игрок, попробуй так:
if(getarraysize($@mapusersid)%2>0)
{
и тут уже делаешь с этим игроком ($@mapusersid[getarraysize($@mapusersid-1)]), что хочешь
}
-
в skill.c
case SN_FALCONASSAULT:
case PA_PRESSURE:
case CR_ACIDDEMONSTRATION:
case TF_THROWSTONE:
case NPC_SMOKING:
case GS_FLING:
case NJ_ZENYNAGE:
case GN_THORNS_TRAP:
case GN_BLOOD_SUCKER:
case GN_HELLS_PLANT_ATK:
skill_attack(BF_MISC,src,src,bl,skillid,skilllv,tick,flag);
break;замени на
case PA_PRESSURE:
case CR_ACIDDEMONSTRATION:
case TF_THROWSTONE:
case NPC_SMOKING:
case GS_FLING:
case NJ_ZENYNAGE:
case GN_THORNS_TRAP:
case GN_BLOOD_SUCKER:
case GN_HELLS_PLANT_ATK:
skill_attack(BF_MISC,src,src,bl,skillid,skilllv,tick,flag);
break;
case SN_FALCONASSAULT:
skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
break;- 1
-
case SN_FALCONASSAULT:
skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
break;
- 1
-
OnNPCKillEvent:
if(killedrid == 1002 && @val < 20)
set @val,@val+1;
end;
- 1
-
-
Правильно, косяк в резидене. Насколько я помню у вас в файле clif.c
эта строка:
status_calc_pc(sd, true);
стоит до условия:
if(!map[sd->bl.m].flag.resident && sd->state.resident)
{
sd->state.resident = 0;
pc_disguise(sd,0);
}А должно выглядеть вот так:
if(!map[sd->bl.m].flag.resident && sd->state.resident)
{
status_calc_pc(sd, true);
sd->state.resident = 0;
pc_disguise(sd,0);
}- 1
-
У кого есть этот мод, тот увидит(не полная часть этого лейбла):
if(map[sd->bl.m].flag.resident && sd->state.resident == 1)
{
npc_script_event(sd,NPCE_DAMAGE);
pc_stop_attack((TBL_PC*)src);
}в функции
void pc_damage(struct map_session_data *sd,struct block_list *src,unsigned int hp, unsigned int sp)
и как я уже сказал нужно добавить проверку скила.
Какой пруф тебе еще нужен?
-
В моде резидет евил такой лейбл присутствует, только к нему нужно добавить определение скила.
-
Может будет не так зрелищно как картинками, но можно сделать через announce.
-
Сохраняем ид гильдии убийцы
Set .id, getcharid(2);
дальше приаттачиваешь убитого
attachrid(killedrid);
и сравниваешь
if( getcharid(2) == .id)
....
- 1
-
Первый пост обновлен. Исправлена ошибка с количеством символов.
в файле clif.c начало функции void badword(char *mes1,char *mes)
должно выглядеть так:
void badword(char *mes1,char *mes)
{
char uk[1];
char *line = NULL;
int i,k;
line = mes;
for(i=0; i < strlen(line); i++)
line[i] = tolower(line[i]);- 2
-
rdamage = cap_value(rdamage,1,max_damage);
но она на прямую зависит от max_damage
-
Мб if( rdamage > max_damage ) rdamage = max_damage;
-
левая карта + табы
поди там до этого еще наворочено.
-
- Популярный пост
- Популярный пост
Вдруг кому понадобится.
Команда помогает в просмотре picklog(только в SQL таблице).
вводится: @loginfo <ник>,<ид вещи>,<дата>
дата вводится в виде: гггг-мм-дд
Также пишите как можно было бы улучшить эту команду.
- 22
-
У вас у самих нету столько сообщений ... хайд опустите хотя бы до 150...а то я в первый раз не скопировал диф
Ну ты облажался, шанс то был . Тебе осталось то всего ничего нафлудить.
Инкубус конечно няшечка, но 200 постов флудить как-то западло.. "Я слишком стар для этого дерьма" (с)
Может пора тебе свой статус отрабатывать? А серьезно, если очень нужно, пиши в личку.
- 1
-
Да, по стоимости что и покупал при сохранении набора.
- 2
-
- Популярный пост
- Популярный пост
Команда упрощает покупку расхода путем сохранения их в наборы и закупки всего набора.
Пополнять набор можно только в городе.
Сохранение набора: вводим команду @restock new:<имя набора> и в течении 30 секунд открываем магазин.
Покупаем расход и он сохраняется у вас в наборе.
@restock select выбор и пополнение набора
@restock info информация о наборах
@restock del удаляет выбранный набор
Index: atcommand.c
===================================================================
--- atcommand.c (revision 15066)
+++ atcommand.c (working copy)
@@ -8561,13 +8563,155 @@
return 0;
}
+ACMD_FUNC(restock)
+{
+ char new[20], menu[1024];
+ char* data;
+ int info = 1, del = 1, i=0;
+ size_t len;
+
+ memset(new, '\0', sizeof(new));
+ memset(menu, '\0', sizeof(menu));
+ memset(sd->restock_name, '\0', sizeof(sd->restock_name));
+
+ if(sscanf(message, "new: %s", new) == 1)
+ {
+ if(sd->restock.timer > 0)
+ delete_timer(sd->restock.timer, restock);
+ if( SQL_ERROR == Sql_Query(mmysql_handle,"SELECT name FROM restock WHERE char_id = '%d' GROUP BY name",sd->status.char_id) )
+ {
+ Sql_ShowDebug(mmysql_handle);
+ Sql_Free(mmysql_handle);
+ return 0;
+ }
+ while( SQL_SUCCESS == Sql_NextRow(mmysql_handle) )
+ {
+ Sql_GetData(mmysql_handle, 0, &data, &len);
+ if(strcmp(data,new) == 0)
+ {
+ clif_displaymessage(fd,"Такой набор уже существует.");
+ return 0;
+ }
+ i++;
+ }
+ Sql_FreeResult(mmysql_handle);
+
+ if( i > 9)
+ {
+ clif_displaymessage(fd,"У тебя максимальное количество наборов(10).");
+ return 0;
+ }
+
+ strcpy(sd->restock_name,new);
+ clif_displaymessage(fd,"У тебя есть 30 секунд.");
+ sd->restock.timer = add_timer(gettick()+30000, restock, sd->bl.id, 0);
+ } else
+ if(strcmp(message,"select") == 0 || (info = strcmp(message,"info")) == 0 || (del = strcmp(message,"del")) == 0)
+ {
+ i=0;
+
+ sd->state.restock = (!del)?3:(!info)?2:1;
+ if( SQL_ERROR == Sql_Query(mmysql_handle,"SELECT name FROM restock WHERE char_id = '%d' GROUP BY name",sd->status.char_id))
+ {
+ Sql_ShowDebug(mmysql_handle);
+ Sql_FreeResult(mmysql_handle);
+ return 0;
+ }
+
+ while( SQL_SUCCESS == Sql_NextRow(mmysql_handle) )
+ {
+ if(i++ > 0)
+ strcat(menu,":");
+ Sql_GetData(mmysql_handle, 0, &data, &len);
+ strcat(menu,data);
+ }
+ Sql_FreeResult(mmysql_handle);
+ clif_scriptmenu(sd, 0,menu);
+ }
+ else
+ {
+ clif_displaymessage(sd->fd,"Для создания набора введи @restock new:<name> и в течении 30 сек открой магазин.");
+ clif_displaymessage(sd->fd,"@restock select - для пополнения запасов.");
+ clif_displaymessage(sd->fd,"@restock info - показывает информацию о наборах.");
+ clif_displaymessage(sd->fd,"@restock del - удаляет выбранный набор.");
+ }
+ return 0;
+}
+
/*==========================================
* atcommand_info[] structure definition
*------------------------------------------*/
AtCommandInfo atcommand_info[] = {
+ {"restock", 0,40, atcommand_restock },
{ "rura", 40,40, atcommand_mapmove },
{ "warp", 40,40, atcommand_mapmove },
{ "mapmove", 40,40, atcommand_mapmove }, // + /mm
Index: clif.c
===================================================================
--- clif.c (revision 15066)
+++ clif.c (working copy)
@@ -1700,10 +1700,19 @@
void clif_buylist(struct map_session_data *sd, struct npc_data *nd)
{
int fd,i,c;
-
+
nullpo_retv(sd);
nullpo_retv(nd);
+
+ memset(sd->restock.name, '\0', sizeof(sd->restock.name));
+ if(sd->restock.timer > 0)
+ {
+ strcpy(sd->restock.name, sd->restock_name);
+ delete_timer(sd->restock.timer, restock);
+ sd->restock.timer = INVALID_TIMER;
+ }
+
fd = sd->fd;
WFIFOHEAD(fd, 4 + nd->u.shop.count * 11);
WFIFOW(fd,0) = 0xc6;
@@ -1888,6 +1897,7 @@
int slen = strlen(mes) + 9;
struct block_list *bl = NULL;
+ if(!sd->state.restock)
if (!sd->state.using_fake_npc && (npcid == fake_nd->bl.id || ((bl = map_id2bl(npcid)) && (bl->m!=sd->bl.m ||
bl->x<sd->bl.x-AREA_SIZE-1 || bl->x>sd->bl.x+AREA_SIZE+1 ||
bl->y<sd->bl.y-AREA_SIZE-1 || bl->y>sd->bl.y+AREA_SIZE+1))))
@@ -1896,7 +1906,7 @@
WFIFOHEAD(fd, slen);
WFIFOW(fd,0)=0xb7;
WFIFOW(fd,2)=slen;
- WFIFOL(fd,4)=npcid;
+ WFIFOL(fd,4)=(sd->state.restock?0:npcid);
memcpy((char*)WFIFOP(fd,8), mes, slen-8);
WFIFOSET(fd,WFIFOW(fd,2));
}
@@ -10806,11 +10935,137 @@
return;
}
idx = RFIFOL(fd,packet_db[sd->packet_ver][RFIFOW(fd,0)].pos[0]);
skill_weaponrefine(sd, idx-2);
sd->menuskill_val = sd->menuskill_id = 0;
}
+int restock(int tid, unsigned int tick, int id, intptr data)
+{
+ struct map_session_data* sd = map_id2sd(id);
+
+ memset(sd->restock_name, '\0', sizeof(sd->restock_name));
+ if(strcmp(sd->restock.name,"") == 0)
+ clif_displaymessage(sd->fd,"Чтобы сохранить набор - еще раз введите команду @restock new:<name>");
+ sd->restock.timer = INVALID_TIMER;
+ return 0;
+}
+void clif_restock(struct map_session_data *sd, uint8 select)
+{
+ int i = 0;
+ char nabors[10][20];
+ char* data;
+ size_t len;
+ if(select < 255)
+ {
+ if( SQL_ERROR == Sql_Query(mmysql_handle,"SELECT name FROM restock WHERE char_id = '%d' GROUP BY name",sd->status.char_id) )
+ {
+ Sql_ShowDebug(mmysql_handle);
+ Sql_FreeResult(mmysql_handle);
+ return;
+ }
+ while( SQL_SUCCESS == Sql_NextRow(mmysql_handle) )
+ {
+ Sql_GetData(mmysql_handle, 0, &data, &len);
+ strcpy(&nabors[i++][20],data);
+ }
+ Sql_FreeResult(mmysql_handle);
+
+ {
+ int nameid[20], amount[20], price[20], k, i=0;
+ char output[200];
+ struct item_data *item;
+ struct item it;
+
+ memset(output, '\0', sizeof(output));
+
+ if( SQL_ERROR == Sql_Query(mmysql_handle,"SELECT item_id,amount,price FROM restock WHERE char_id = '%d' AND name = '%s'",sd->status.char_id,&nabors[select-1][20]) )
+ {
+ Sql_ShowDebug(mmysql_handle);
+ Sql_Free(mmysql_handle);
+ return;
+ }
+ while( SQL_SUCCESS == Sql_NextRow(mmysql_handle) )
+ {
+ Sql_GetData(mmysql_handle, 0, &data, NULL); nameid[i] = atoi(data);
+ Sql_GetData(mmysql_handle, 1, &data, NULL); amount[i] = atoi(data);
+ Sql_GetData(mmysql_handle, 2, &data, NULL); price[i++] = atoi(data);
+ }
+ Sql_FreeResult(mmysql_handle);
+
+ switch(sd->state.restock)
+ {
+ case 1:
+ for( i = 0; item = itemdb_exists(nameid[i]); i++)
+ {
+ for(k = 0; k < MAX_INVENTORY; k++)
+ {
+ if(sd->status.inventory[k].nameid == nameid[i])
+ if(sd->status.inventory[k].amount < amount[i])
+ amount[i] -= sd->status.inventory[k].amount;
+ else
+ amount[i] = 0;
+ }
+
+
+ if((amount[i] > 0) && (price[i]*amount[i] < sd->status.zeny) && (item->weight*amount[i] + sd->weight < sd->max_weight))
+ {
+ memset(&it, 0, sizeof(it));
+ it.nameid = nameid[i];
+ it.identify = 1;
+ pc_additem(sd,&it,amount[i]);
+ pc_payzeny(sd,price[i]*amount[i]);
+ }
+ }
+ break;
+
+ case 2:
+ {
+ int count = 0;
+ sprintf(output,"-------------- %s --------------",&nabors[select-1][20]);
+ clif_displaymessage(sd->fd,output);
+ for( i = 0; item = itemdb_exists(nameid[i]); i++)
+ {
+ count +=amount[i]*price[i];
+ sprintf(output,"%s [ %d шт. ] - %d zeny",item->jname,amount[i],price[i]);
+ clif_displaymessage(sd->fd,output);
+ }
+ clif_displaymessage(sd->fd," ");
+ sprintf(output,"Общая цена: %d zeny",count);
+ clif_displaymessage(sd->fd,output);
+ clif_displaymessage(sd->fd,"-------------------------------------");
+ }
+ break;
+
+ case 3:
+ if( SQL_ERROR == Sql_Query(mmysql_handle,"DELETE FROM restock WHERE char_id = '%d' AND name = '%s'",sd->status.char_id,&nabors[select-1][20]) )
+ {
+ Sql_ShowDebug(mmysql_handle);
+ Sql_Free(mmysql_handle);
+ return;
+ }
+ sprintf(output,"Набор %s удален",&nabors[select-1][20]);
+ clif_displaymessage(sd->fd,output);
+ break;
+ }
+ }
+ }
+ sd->state.restock = 0;
+ clif_scriptclose(sd, 0);
+}
+
/// Answer to script menu dialog (CZ_CHOOSE_MENU).
/// 00b8 <npc id>.L <choice>.B
/// choice:
@@ -10823,16 +11078,21 @@
int npc_id = RFIFOL(fd,2);
uint8 select = RFIFOB(fd,6);
- if( (select > sd->npc_menu && select != 0xff) || select == 0 )
+ if(!sd->state.restock)
{
- TBL_NPC* nd = map_id2nd(npc_id);
- ShowWarning("Invalid menu selection on npc %d:'%s' - got %d, valid range is [%d..%d] (player AID:%d, CID:%d, name:'%s')!\n", npc_id, (nd)?nd->name:"invalid npc id", select, 1, sd->npc_menu, sd->bl.id, sd->status.char_id, sd->status.name);
- clif_GM_kick(NULL,sd);
- return;
+ if( (select > sd->npc_menu && select != 0xff) || select == 0 )
+ {
+ TBL_NPC* nd = map_id2nd(npc_id);
+ ShowWarning("Invalid menu selection on npc %d:'%s' - got %d, valid range is [%d..%d] (player AID:%d, CID:%d, name:'%s')!\n", npc_id, (nd)?nd->name:"invalid npc id", select, 1, sd->npc_menu, sd->bl.id, sd->status.char_id, sd->status.name);
+ clif_GM_kick(NULL,sd);
+ return;
+ }
+
+ sd->npc_menu = select;
+ npc_scriptcont(sd,npc_id);
}
-
- sd->npc_menu = select;
- npc_scriptcont(sd,npc_id);
+ else
+ clif_restock(sd,select);
}
\ No newline at end of file
Index: clif.h
===================================================================
--- clif.h (revision 15066)
+++ clif.h (working copy)
@@ -714,4 +714,7 @@
void clif_open_search_store_info(struct map_session_data* sd);
void clif_search_store_info_click_ack(struct map_session_data* sd, short x, short y);
+int restock(int tid, unsigned int tick, int id, intptr data);
#endif /* _CLIF_H_ */
Index: npc.c
===================================================================
--- npc.c (revision 15066)
+++ npc.c (working copy)
@@ -1264,7 +1264,7 @@
{
struct npc_data* nd;
double z;
- int i,j,w,skill,new_;
+ int k,i,j,w,skill,new_;
nullpo_retr(3, sd);
nullpo_retr(3, item_list);
@@ -1279,7 +1279,7 @@
w = 0;
new_ = 0;
// process entries in buy list, one by one
- for( i = 0; i < n; ++i )
+ for( k = i = 0; i < n; ++i )
{
int nameid, amount, value;
@@ -1323,11 +1323,19 @@
case ADDITEM_OVERAMOUNT:
return 2;
}
-
+
+ if(strcmp(sd->restock.name,"") != 0)
+ {
+ sd->restock.nameid[k] = nameid;
+ sd->restock.amount[k] = amount;
+ sd->restock.price[k++] = value;
+ }
+
value = pc_modifybuyvalue(sd,value);
z += (double)value * amount;
w += itemdb_weight(nameid) * amount;
+
}
if( nd->master_nd != NULL ) //Script-based shops.
@@ -1362,7 +1370,22 @@
log_pick_pc(sd, LOG_TYPE_NPC, item_tmp.nameid, amount, NULL);
//Logs
}
-
+
+ if(strcmp(sd->restock.name,"") != 0)
+ {
+ for( i = 0; sd->restock.nameid[i]; i++)
+ if( SQL_ERROR == Sql_Query(mmysql_handle,"INSERT restock (`char_id`,`name`,`item_id`,`amount`,`price`) VALUES('%d','%s','%d','%d','%d')",
+ sd->status.char_id,sd->restock.name,sd->restock.nameid[i],sd->restock.amount[i],sd->restock.price[i]) )
+ {
+ Sql_ShowDebug(mmysql_handle);
+ Sql_Free(mmysql_handle);
+ return 0;
+ }
+ memset(&sd->restock,0,sizeof(sd->restock));
+ clif_displaymessage(sd->fd,"Набор сохранен.");
+ }
+
// custom merchant shop exp bonus
if( battle_config.shop_exp > 0 && z > 0 && (skill = pc_checkskill(sd,MC_DISCOUNT)) > 0 )
{
Index: pc.h
===================================================================
--- pc.h (revision 15066)
+++ pc.h (working copy)
@@ -137,6 +137,8 @@
unsigned short autolootid; // [Zephyrus]
unsigned short autobonus; //flag to indicate if an autobonus is activated. [Inkfish]
struct guild *gmaster_flag;
+ unsigned int restock :3;
} state;
struct {
unsigned char no_weapon_damage, no_magic_damage, no_misc_damage;
@@ -423,8 +425,18 @@
// temporary debugging of bug #3504
const char* delunit_prevfile;
int delunit_prevline;
+
+ struct {
+ int timer, nameid[20], amount[20], price[20];
+ char name[20];
+ } restock;
+
+ char restock_name[20];
+
};
-
+
//Update this max as necessary. 55 is the value needed for Super Baby currently
#define MAX_SKILL_TREE 55
//Total number of classes (for data storage)DROP TABLE IF EXISTS `имя базы`.`restock`;
CREATE TABLE `имя базы`.`restock` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`char_id` int(10) unsigned NOT NULL,
`name` varchar(45) NOT NULL,
`item_id` int(10) unsigned NOT NULL DEFAULT '0',
`amount` int(10) unsigned NOT NULL DEFAULT '0',
`price` int(10) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=cp1251;
- 25
-
ап, теперь ид\название лута вводится непосредственно при использовании скила.
- 1
[Release] Titanium Control Panel
в Другие
Опубликовано
Человек надежный, не кинет, можете смело покупать.