Автор: Incubus: Дата: 06.14.2010
[FONT=Comic Sans MS][FONT=Verdana]Может кому понадобится[/FONT] :)[/FONT]
Index: skill.c
===================================================================
--- skill.c (revision 14293)
+++ skill.c (working copy)
@@ -4410,7 +4410,10 @@
if ( !pc_can_give_items(pc_isGM(sd)) )
clif_skill_fail(sd,skillid,0,0);
else
+ {
+ sd->vending->skilllv = skilllv;
clif_openvendingreq(sd,2+skilllv);
+ }
}
break;
Index: vending.c
===================================================================
--- vending.c (revision 14293)
+++ vending.c (working copy)
@@ -58,7 +58,7 @@
*------------------------------------------*/
void vending_purchasereq(struct map_session_data* sd, int aid, int cid, const uint8* data, int count)
{
- int i, j, cursor, w, new_ = 0, blank, vend_list[MAX_VENDING];
+ int i, j, cursor, w, k, new_ = 0, blank, vend_list[MAX_VENDING];
double z;
struct s_vending vending[MAX_VENDING]; // against duplicate packets
struct map_session_data* vsd = map_id2sd(aid);
@@ -87,6 +87,7 @@
{
short amount = *(uint16*)(data + 4*i + 0);
short idx = *(uint16*)(data + 4*i + 2);
+ int inv_count;
idx -= 2;
if( amount <= 0 )
@@ -103,16 +104,53 @@
vend_list = j;
z += ((double)vsd->vending[j].value * (double)amount);
- if( z > (double)sd->status.zeny || z < 0. || z > (double)MAX_ZENY )
+ if(vsd->vending->skilllv <= 10)
{
- clif_buyvending(sd, idx, amount, 1); // you don't have enough zeny
- return;
+ if( z > (double)sd->status.zeny || z < 0. || z > (double)MAX_ZENY )
+ {
+ clif_buyvending(sd, idx, amount, 1); // you don't have enough zeny
+ return;
+ }
+ if( z + (double)vsd->status.zeny > (double)MAX_ZENY && !battle_config.vending_over_max )
+ {
+ clif_buyvending(sd, idx, vsd->vending[j].amount, 4); // too much zeny = overflow
+ return;
+
+ }
}
- if( z + (double)vsd->status.zeny > (double)MAX_ZENY && !battle_config.vending_over_max )
+ else
{
- clif_buyvending(sd, idx, vsd->vending[j].amount, 4); // too much zeny = overflow
- return;
-
+ int invent = 0;
+ for( k = 0; k < MAX_INVENTORY; k++)
+ {
+ if( sd->status.inventory[k].nameid == TRADE_ITEM)
+ {
+ if( z > sd->status.inventory[k].amount)
+ {
+ clif_displaymessage(sd->fd,"У вас не хватает TCG.");
+ return;
+ }
+ invent++;
+ }
+ }
+
+ if(invent == 0)
+ {
+ clif_displaymessage(sd->fd,"У вас нет TCG.");
+ return;
+ }
+
+ for (k = 0,inv_count = 0; k < MAX_INVENTORY; k++)
+ {
+ if(vsd->status.inventory[k].nameid > 0)
+ inv_count += (!itemdb_isstackable(vsd->status.inventory[k].nameid)?vsd->status.inventory[k].amount:1);
+ }
+
+ if(inv_count > MAX_INVENTORY)
+ {
+ clif_displaymessage(sd->fd,"Продавец не унесет все TCG");
+ return;
+ }
}
w += itemdb_weight(vsd->status.cart[idx].nameid) * amount;
if( w + sd->weight > sd->max_weight )
@@ -149,15 +187,28 @@
}
}
- //Logs (V)ending Zeny [Lupus]
- if( log_config.zeny > 0 )
- log_zeny(vsd, "V", sd, (int)z);
-
- pc_payzeny(sd, (int)z);
- if( battle_config.vending_tax )
- z -= z * (battle_config.vending_tax/10000.);
- pc_getzeny(vsd, (int)z);
-
+ if(vsd->vending->skilllv <= 10)
+ {
+ //Logs (V)ending Zeny [Lupus]
+ if( log_config.zeny > 0 )
+ log_zeny(vsd, "V", sd, (int)z);
+
+ pc_payzeny(sd, (int)z);
+ if( battle_config.vending_tax )
+ z -= z * (battle_config.vending_tax/10000.);
+ pc_getzeny(vsd, (int)z);
+
+ }else{
+ for( i = 0; i < MAX_INVENTORY; i++)
+ {
+ if(sd->status.inventory.nameid == TRADE_ITEM)
+ {
+ pc_additem(vsd, &sd->status.inventory, (int)z);
+ pc_delitem(sd, i, (int)z,0);
+ }
+ }
+ }
+
for( i = 0; i < count; i++ )
{
short amount = *(uint16*)(data + 4*i + 0);
@@ -229,10 +280,12 @@
*------------------------------------------*/
void vending_openvending(struct map_session_data* sd, const char* message, bool flag, const uint8* data, int count)
{
- int i, j;
+ int i, j, weight_tradeitem = 0, inv_count;
int vending_skill_lvl;
+ char tcg[MESSAGE_SIZE];
nullpo_retv(sd);
+ memset(tcg, '\0', sizeof(tcg));
if( !flag ) // cancelled
return; // nothing to do
@@ -276,7 +329,7 @@
sd->vending.index = index;
sd->vending.amount = amount;
sd->vending.value = cap_value(value, 1, (unsigned int)battle_config.vending_max_value);
-
+ weight_tradeitem += amount*itemdb_weight(TRADE_ITEM);
i++; // item successfully added
}
@@ -288,12 +341,27 @@
clif_skill_fail(sd, MC_VENDING, 0, 0); // custom reply packet
return;
}
-
+ for (j = 0,inv_count = 0; j < MAX_INVENTORY; j++)
+ {
+ if(sd->status.inventory[j].nameid > 0)
+ inv_count += (!itemdb_isstackable(sd->status.inventory[j].nameid)?sd->status.inventory[j].amount:1);
+ }
+
+ if((weight_tradeitem + sd->weight > sd->max_weight) || inv_count > MAX_INVENTORY)
+ {
+ clif_displaymessage(sd->fd,"Вы не унесете все TCG");
+ return;
+ }
+
sd->vender_id = sd->bl.id;
sd->vend_num = i;
- safestrncpy(sd->message, message, MESSAGE_SIZE);
-
+ if(sd->vending->skilllv > 10){
+ strcpy(tcg,"TCG> ");
+ }
+ strcat(tcg,message);
+ safestrncpy(sd->message, tcg, MESSAGE_SIZE);
+
pc_stop_walking(sd,1);
clif_openvending(sd,sd->vender_id,sd->vending);
- clif_showvendingboard(&sd->bl,message,0);
+ clif_showvendingboard(&sd->bl,tcg,0);
}
Index: vending.h
===================================================================
--- vending.h (revision 14293)
+++ vending.h (working copy)
@@ -5,6 +5,8 @@
#define _VENDING_H_
#include "../common/cbasetypes.h"
+
+#define TRADE_ITEM 7227
//#include "map.h"
struct map_session_data;
@@ -12,6 +14,7 @@
short index;
short amount;
unsigned int value;
+ int skilllv;
};
void vending_closevending(struct map_session_data* sd);
db\skill_db.txt:
41,1,6,4,0,0x1,0,11,1,no,0,0,0,none,0, MC_VENDING,Vending
db\skill_tree.txt:MC_VENDING#
30#
30#
30#
30#
30#
30#
30#
30#
30#
30#
30#
@
Чтоб была возможность выбирать уровень скила.Автор: Incubus: Дата: 06.15.2010
http://rus-ea.ru/showthread.php?t=1055
Тут обсуждалось.
Автор: ShadowOfLight: Дата: 12.31.2010
По идее всё поставил правильно, но получилось, что нет проверки на наличие ТЦГ у покупателя - т.е. если выставить цену 5 ТЦГ и у покупателя будет 5 зени, но не будет ТЦГ, он на халяву сможет получить 1 вещь (к тому же зени не исчезнут)
Сам бы поискал, но в 7 утра уже голова не варит искать место исправления)))
Автор: Kill Spirit: Дата: 12.31.2010
+ if( z > sd->status.inventory[k].amount)
+ {
+ clif_displaymessage(sd->fd,"У вас не хватает TCG.");
+ return;
+ }
Автор: ShadowOfLight: Дата: 12.31.2010
Разобрался. И Кэп как бэ ни при чем, я не про то спрашивал)))
Просто под утро мозги действительно отключились - я забыл одну проверку удалить, откуда и полетела ошибка.
Заметил пару неточностей:
1. Насколько я понял, в проверке if(inv_count > MAX_INVENTORY) лучше написать не "Продавец не унесет все TCG", а "У продавца нету свободных слотов для ТЦГ"
2. А вот как раз проверка <сможет ли продавец унести все ТЦГ> отсутствует.
- int i, j, cursor, w, k, new_ = 0, blank, vend_list[MAX_VENDING];
+ int i, j, cursor, w, k, n, new_ = 0, blank, vend_list[MAX_VENDING];
--------------
clif_displaymessage(sd->fd,"У вас не хватает TCG.");
return;
}
invent++;
+ n = k;
}
}
--------------
+ if( itemdb_weight(sd->status.inventory[n].nameid)*z + vsd->weight > vsd->max_weight)
+ {
+ clif_displaymessage(sd->fd,"Продавец не сможет унести столько ТЦГ");
+ return;
+ }
if(inv_count > MAX_INVENTORY)
{
Автор: Gy9vin: Дата: 05.09.2011
У меня ошибки (
vending.h:27: error: expected identifier or '(' before '--' token
vending.h:29: error: stray '@' in program
vending.h:29: error: stray '@' in program
vending.h:34: error: stray '#' in program
vending.h:38: error: stray '@' in program
vending.h:38: error: expected identifier or '(' before '-' token
vending.h:38: error: stray '@' in program
vending.h:42: error: expected identifier or '(' before '+' token
vending.h:43: error: expected identifier or '(' before '}' token
vending.h:45: error: conflicting types for 'vending_closevending'
vending.h:18: error: previous declaration of 'vending_closevending' was here
make[1]: *** [obj_sql/map.o] Error 1
make[1]: Leaving directory `/home/rouser/ea/src/map'
make: *** [map_sql] Error 2
ERROR!!! Something goes wrong, check your Source files on errors!
rouser@ea03:~$
Автор: Jarek: Дата: 05.09.2011
//_-
Модификация представлена в формате *.diff
Его можно вставить либо с помощью черепашки (на вин), либо консолью (на никсах), либо руками ("-" означает, что эту строчку нужно удалить, "+" - добавить)
Автор: Gy9vin: Дата: 05.15.2011
Опять ошибка вот скрипт со строкой ошибки
if(vsd->vending->skilllv <= 10)
{
//Logs (V)ending Zeny [Lupus]
if( log_config.zeny > 0 )
log_zeny(vsd, "V", sd, (int)z);
pc_payzeny(sd, (int)z);
if( battle_config.vending_tax )
z -= z * (battle_config.vending_tax/10000.);
pc_getzeny(vsd, (int)z);
}else{
for( i = 0; i < MAX_INVENTORY; i++)
{
if(sd->status.inventory.nameid == TRADE_ITEM)
{
pc_additem(vsd, &sd->status.inventory, (int)z);
pc_delitem(sd, i, (int)z,0); здесь ошибка
}
}
}
vending.c: In function 'vending_purchasereq':
vending.c:224: error: too few arguments to function 'pc_delitem'
make[1]: *** [obj_sql/vending.o] Error 1
make[1]: Leaving directory `/home/rouser/ea/src/map'
make: *** [map_sql] Error 2
ERROR!!! Something goes wrong, check your Source files on errors!
rouser@ea03:~$
Автор: kadze: Дата: 05.15.2011
http://www.eathena.ws/board/index.php?showtopic=254984&st=0&p=1420711entry1420711
Автор: Gy9vin: Дата: 05.15.2011
Теперь захожу в ро открываю скилы он не видит что можно прокачать на 11 лвл тыкаю на скилл он качается после того нажимаю применить и он опять становится 10 почему ?
Автор: kadze: Дата: 05.15.2011
в клиенте все поменял?
Автор: Gy9vin: Дата: 05.15.2011
да перепроверил
даже
Автор: Gy9vin: Дата: 05.15.2011
ап
Автор: Gy9vin: Дата: 05.15.2011
ап
Автор: Gy9vin: Дата: 05.16.2011
захожу в ро открываю скилы он не видит что можно прокачать на 11 лвл тыкаю на скилл он качается после того нажимаю применить и он опять становится 10 почему ?
Автор: kadze: Дата: 05.16.2011
как тебе еще ро не дали удивляюсь :)
Автор: Gremlin: Дата: 05.16.2011
Quadruple post!!!! Ultra KILL!!!!
Автор: kadze: Дата: 05.16.2011
Флуд: quadruple* :D
Автор: Gy9vin: Дата: 05.16.2011
харе флудить по теме дава
Автор: Gremlin: Дата: 05.16.2011
Цитата kadze;41373:
Флуд: quadruple* :D
Автор: Gy9vin: Дата: 05.18.2011
ап
Автор: Gy9vin: Дата: 05.20.2011
захожу в ро открываю скилы он не видит что можно прокачать на 11 лвл тыкаю на скилл он качается после того нажимаю применить и он опять становится 10 почему ?