//=============================================================== // Name: G_SwapItemCmd // Class: None // // Description: Swaps an inventory item with the currently held item // of that type. This is fairly specific at this point // to use the Gameplay Database in a particular way. // // The command takes a single string, which defines an // inventory slot object. We retrieve the name of the // item in that inventory slot. If it isn't found, there // isn't an item there and nothing happens. // // If it is found, we determine if the player already has // an item of that type in their local inventory (hands). // This is done by again checking the database. If they // do have a weapon of that type, we swap this one with // that. Otherwise we just give him this weapon. // // Parameters: gentity_t -- the entity issuing the command. This // is the player who issued the command. // // Returns: qboolean -- true if the command was executed. // //=============================================================== qboolean G_SwapItemCmd( const gentity_t *ent ) { if ( gi.argc() < 1 ) return qfalse ; if ( !ent->entity->isSubclassOf( Player ) ) return qfalse ; Player *player = (Player*)ent->entity ; str objectName = gi.argv( 1 ); str propertyName = gi.argv( 2 ); str heldItem ; weaponhand_t hand = WEAPON_RIGHT; GameplayManager *gpm = GameplayManager::getTheGameplayManager(); if ( !gpm ) return false ; str itemName = gpm->getStringValue( objectName, propertyName ); str tikiName = gpm->getStringValue( itemName, "model" ); str itemType = gpm->getStringValue( itemName, "class" ); str playerItem("CurrentPlayer." + itemType); if ( !gpm->hasObject(playerItem) ) { gi.WPrintf( "Warning: Unknown item type %s for item %s", itemType.c_str(), itemName.c_str() ); return qfalse ; } // Get the currently held item, and replace it with the item we clicked on heldItem = gpm->getStringValue( playerItem, "name" ); gpm->setStringValue( playerItem, "name", itemName ); // Ranged weapons are left hand if ( itemType == "Ranged" ) hand = WEAPON_LEFT ; // Remove the currently held item from the player's inventory player->takeItem( heldItem.c_str() ); // Give the player the new item we clicked on player->giveItem( tikiName ); // Use the weapon we clicked on if we picked a weapon of the same type // that we have currently equipped. Otherwise, we just swap out // the slots Weapon *weap = 0; weap = player->GetActiveWeapon(WEAPON_RIGHT); if ( !weap ) weap = player->GetActiveWeapon(WEAPON_LEFT); if ( weap ) { str tmpstr = gpm->getStringValue(weap->getArchetype(), "class"); if ( tmpstr == itemType ) player->useWeapon( itemType, hand ); } // Put the held item in inventory slot the clicked item was in. gpm->setStringValue( objectName, propertyName, heldItem ); return qtrue ; }
//-------------------------------------------------------------- // // Name: G_DropItemCmd // Class: None // // Description: Drops an item that is clicked on from the inventory // // Parameters: gentity_t -- the entity issuing the command. This // is the player who issued the command. // // Returns: qboolean -- true if the command was executed. // //-------------------------------------------------------------- qboolean G_DropItemCmd( const gentity_t *ent ) { if ( gi.argc() < 1 ) return false ; if ( !ent->entity->isSubclassOf( Player ) ) return false ; Player *player = (Player*)ent->entity ; str objectName = gi.argv( 1 ); str propertyName = gi.argv( 2 ); GameplayManager *gpm = GameplayManager::getTheGameplayManager(); if ( !gpm ) return false ; str itemName = gpm->getStringValue( objectName, propertyName ); if ( itemName == "Empty" ) return false; str tikiName = gpm->getStringValue( itemName, "model" ); str itemType = gpm->getStringValue( itemName, "class" ); str playerItem("CurrentPlayer." + itemType); if ( !gpm->hasObject(playerItem) ) { gi.WPrintf( "Warning: Unknown item type %s for item %s", itemType.c_str(), itemName.c_str() ); return false ; } // Empty the slot gpm->setStringValue( objectName, propertyName, "Empty" ); // Give the player the item to drop //Item *givenItem = player->giveItem(tikiName); Weapon *dropweap; ClassDef *cls; cls = getClass( tikiName.c_str() ); if ( !cls ) { SpawnArgs args; args.setArg( "model", tikiName.c_str() ); cls = args.getClassDef(); if ( !cls ) return false; } dropweap = ( Weapon * )cls->newInstance(); dropweap->setModel( tikiName.c_str() ); dropweap->ProcessPendingEvents(); dropweap->SetOwner(player); dropweap->hideModel(); dropweap->setAttached(true); dropweap->Drop(); return true ; }