Назад

Vending за TCG

Автор: 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:
поменять уровень скила на 11

41,1,6,4,0,0x1,0,11,1,no,0,0,0,none,0, MC_VENDING,Vending
db\skill_tree.txt:
так же поменять уровень скила у всех профессий у которых есть этот скил.

В клиенте:

leveluseskillspamount.txt
добавить:
MC_VENDING#
30#
30#
30#
30#
30#
30#
30#
30#
30#
30#
30#
@
Чтоб была возможность выбирать уровень скила.

Также поменять в файле skilltreeview.txt уровень скила.

Если используются lua files, то с ними аналогично.

Для торговли за тцг используется 11 уровень скила.

P.S. Если обнаружите ошибку, пишите.

Автор: 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;
+ }


Кэп как бэ намекает :lol:

Автор: 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:~$

Автор: 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


поправил:rolleyes:

Автор: Gy9vin: Дата: 05.18.2011

ап

Автор: Gy9vin: Дата: 05.20.2011

захожу в ро открываю скилы он не видит что можно прокачать на 11 лвл тыкаю на скилл он качается после того нажимаю применить и он опять становится 10 почему ?