diff --git a/src/game/g_items.pas b/src/game/g_items.pas
index 64ffe3e62697d8ac162de5f236987561ca2068c5..9693ad07f31270f0d4e691a33ebcd66de8cbe04d 100644 (file)
--- a/src/game/g_items.pas
+++ b/src/game/g_items.pas
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
+ * the Free Software Foundation, version 3 of the License ONLY.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
it.ItemType := ItemType;
it.Respawnable := Respawnable;
- if g_Game_IsServer and (ITEM_RESPAWNTIME = 0) then it.Respawnable := False;
it.InitX := X;
it.InitY := Y;
it.RespawnTime := 0;
for i := 0 to High(ggItems) do
begin
if (ggItems[i].ItemType = ITEM_NONE) then continue;
+ if not ggItems[i].slotIsUsed then continue; // just in case
with ggItems[i] do
begin
// Íàäî óáðàòü ñ êàðòû, åñëè ýòî íå êëþ÷, êîòîðûì íóæíî ïîäåëèòüñÿ ñ äðóãèì èãðîêîì
if r then
begin
- if not Respawnable then g_Items_Remove(i) else g_Items_Pick(i);
+ if not (Respawnable and (ITEM_RESPAWNTIME > 0)) then
+ g_Items_Remove(i)
+ else
+ g_Items_Pick(i);
if g_Game_IsNet then MH_SEND_ItemDestroy(False, i);
nxt := True;
break;
for i := 0 to High(ggItems) do
begin
it := @ggItems[i];
+ if (not it.slotIsUsed) or (it.ItemType = ITEM_NONE) then continue; // just in case
if not it.alive then continue;
if (it.dropped <> dropflag) then continue;
begin
if not g_Items_ValidId(ID) then
begin
- //raise Exception.Create('g_Items_Remove: invalid item id');
- writeln('g_Items_Remove: invalid item id: ', ID);
- exit;
+ //writeln('g_Items_Remove: invalid item id: ', ID);
+ raise Exception.Create('g_Items_Remove: invalid item id');
+ //exit;
end;
it := @ggItems[ID];
begin
// Ñ÷èòàåì êîëè÷åñòâî ñóùåñòâóþùèõ ïðåäìåòîâ
count := 0;
- for i := 0 to High(ggItems) do if (ggItems[i].ItemType <> ITEM_NONE) then Inc(count);
+ for i := 0 to High(ggItems) do if (ggItems[i].ItemType <> ITEM_NONE) and (ggItems[i].slotIsUsed) then Inc(count);
// Êîëè÷åñòâî ïðåäìåòîâ
utils.writeInt(st, LongInt(count));
for i := 0 to High(ggItems) do
begin
- if (ggItems[i].ItemType <> ITEM_NONE) then
+ if (ggItems[i].ItemType <> ITEM_NONE) and (ggItems[i].slotIsUsed) then
begin
// Ñèãíàòóðà ïðåäìåòà
utils.writeSign(st, 'ITEM');
for i := 0 to High(ggItems) do
begin
it := @ggItems[i];
- if it.Respawnable then
+ if not it.slotIsUsed then continue;
+ if it.Respawnable and (it.ItemType <> ITEM_NONE) then
begin
it.QuietRespawn := True;
it.RespawnTime := 0;
begin
for idx := High(ggItems) downto 0 do
begin
- if ggItems[idx].alive then
+ if ggItems[idx].alive and ggItems[idx].slotIsUsed then
begin
result := cb(@ggItems[idx]);
if result then exit;
begin
for idx := 0 to High(ggItems) do
begin
- if ggItems[idx].alive then
+ if ggItems[idx].alive and ggItems[idx].slotIsUsed then
begin
result := cb(@ggItems[idx]);
if result then exit;