Index: src/server/adminmanager.cpp =================================================================== --- src/server/adminmanager.cpp (Revision 1702) +++ src/server/adminmanager.cpp (Arbeitskopie) @@ -5968,7 +5968,7 @@ if (data.value == 0 || data.item.IsEmpty()) { - psserver->SendSystemError(me->clientnum, "Syntax: \"/[giveitem|takeitem] [target] [quantity|'all'|''] [item]\""); + psserver->SendSystemError(me->clientnum, "Syntax: \"/[giveitem|takeitem] [target] [quantity|'all'|''] [item|tria]\""); return; } @@ -5982,71 +5982,103 @@ psCharacter* targetchar = target->GetCharacterData(); psCharacter* sourcechar = source->GetCharacterData(); - InventoryTransaction srcTran( &sourcechar->Inventory() ); + //int slot = sourcechar->Inventory().FindItemInTopLevelBulkWithStats(itemstats); size_t slot = sourcechar->Inventory().FindItemStatIndex(itemstats); - if (slot == SIZET_NOT_FOUND) + + if (slot != SIZET_NOT_FOUND) { - psserver->SendSystemError(me->clientnum, "Cannot find any %s in %s's inventory.", - data.item.GetData(), source->GetActor()->GetName() ); - return; - } + InventoryTransaction srcTran( &sourcechar->Inventory() ); + psItem* item; + item = sourcechar->Inventory().RemoveItemIndex(slot,data.value); // data.value is the stack count to move, or -1 + if (!item) + { + Error2("Cannot RemoveItemIndex on slot %zu.\n", slot); + psserver->SendSystemError(me->clientnum, "Cannot remove %s from %s's inventory.", + data.item.GetData(), source->GetActor()->GetName() ); + return; + } + psserver->GetCharManager()->UpdateItemViews(source->GetClientNum()); - psItem* item; - item = sourcechar->Inventory().RemoveItemIndex(slot,data.value); // data.value is the stack count to move, or -1 - if (!item) - { - Error2("Cannot RemoveItemIndex on slot %zu.\n", slot); - psserver->SendSystemError(me->clientnum, "Cannot remove %s from %s's inventory.", - data.item.GetData(), source->GetActor()->GetName() ); - return; - } - psserver->GetCharManager()->UpdateItemViews(source->GetClientNum()); + if (item->GetStackCount() < data.value) + { + psserver->SendSystemError(me->clientnum, "There are only %d, not %d in the stack.", item->GetStackCount(), data.value ); + return; + } - if (item->GetStackCount() < data.value) - { - psserver->SendSystemError(me->clientnum, "There are only %d, not %d in the stack.", item->GetStackCount(), data.value ); - return; - } + bool wasEquipped = item->IsEquipped(); - bool wasEquipped = item->IsEquipped(); + // Now here we handle the target machine + InventoryTransaction trgtTran( &targetchar->Inventory() ); - // Now here we handle the target machine - InventoryTransaction trgtTran( &targetchar->Inventory() ); + if (!targetchar->Inventory().Add(item)) + { + psserver->SendSystemError(me->clientnum, "Target inventory is too full to accept item transfer."); + return; + } + psserver->GetCharManager()->UpdateItemViews(target->GetClientNum()); - if (!targetchar->Inventory().Add(item)) - { - psserver->SendSystemError(me->clientnum, "Target inventory is too full to accept item transfer."); + // Inform the GM doing the transfer + psserver->SendSystemOK(me->clientnum, "%s transferred from %s's %s to %s", + item->GetName(), + source->GetActor()->GetName(), + wasEquipped?"equipment":"inventory", + target->GetActor()->GetName() ); + + // If we're giving to someone else, notify them + if (target->GetClientNum() != me->clientnum) + { + psserver->SendSystemOK(target->GetClientNum(), "You were given %s by GM %s.", + item->GetName(), + source->GetActor()->GetName() ); + } + + // If we're taking from someone else, notify them + if (source->GetClientNum() != me->clientnum) + { + psserver->SendSystemResult(source->GetClientNum(), "%s was taken by GM %s.", + item->GetName(), + target->GetActor()->GetName() ); + } + + trgtTran.Commit(); + srcTran.Commit(); return; } - psserver->GetCharManager()->UpdateItemViews(target->GetClientNum()); - - // Inform the GM doing the transfer - psserver->SendSystemOK(me->clientnum, "%s transferred from %s's %s to %s", - item->GetName(), - source->GetActor()->GetName(), - wasEquipped?"equipment":"inventory", - target->GetActor()->GetName() ); - - // If we're giving to someone else, notify them - if (target->GetClientNum() != me->clientnum) + else if (data.item == "tria") { - psserver->SendSystemOK(target->GetClientNum(), "You were given %s by GM %s.", - item->GetName(), - source->GetActor()->GetName() ); + psMoney srcMoney = sourcechar->Money(); + psMoney targetMoney = targetchar->Money(); + int value = data.value; + if (value == -1) + { + value = srcMoney.GetTotal(); + } + else if (value > srcMoney.GetTotal()) + { + value = srcMoney.GetTotal(); + psserver->SendSystemError(me->clientnum, "Only %d tria taken.",srcMoney.GetTotal()); + } + psMoney transferMoney(0, 0, 0, value); + transferMoney = transferMoney.Normalized(); + sourcechar->SetMoney( srcMoney - transferMoney ); + targetchar->SetMoney( targetMoney + transferMoney ); + // If we're taking from someone else, notify them + if (source->GetClientNum() != me->clientnum) + { + psserver->SendSystemResult(source->GetClientNum(), "%d tria was taken by %s.", + value, + target->GetActor()->GetName() ); + } + return; } - - // If we're taking from someone else, notify them - if (source->GetClientNum() != me->clientnum) + else { - psserver->SendSystemResult(source->GetClientNum(), "%s was taken by GM %s.", - item->GetName(), - target->GetActor()->GetName() ); + psserver->SendSystemError(me->clientnum, "Cannot find any %s in %s's inventory.", + data.item.GetData(), source->GetActor()->GetName() ); + return; } - - trgtTran.Commit(); - srcTran.Commit(); } void AdminManager::FreezeClient(MsgEntry* me, psAdminCmdMessage& msg, AdminCmdData& data, Client* client, Client* target)