45 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Python
		
	
	
			
		
		
	
	
			45 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Python
		
	
	
| # -*- coding: utf-8 -*-
 | |
| # takeitem.py
 | |
| # This is one of the files that can be called by an npc_dialog,
 | |
| # The following code runs when a dialog has a post rule of 'takeitem'
 | |
| # The syntax is ["takeitem", "itemtotake", "quantitytotake"]
 | |
| # "quantitytotake" is optional, if it is missing, then 1 is assumed.
 | |
| # if it is 0, then *all* instances of the item are taken.
 | |
| # The player must have a sufficiant quantity of the item being taken
 | |
| # This should normally be determined by doing an "item" check in the
 | |
| # pre-block of the rule
 | |
| # items are matched by item name, not arch name.
 | |
| ## DIALOGCHECK
 | |
| ## MINARGS 1
 | |
| ## MAXARGS 2
 | |
| ## .*
 | |
| ## \d+
 | |
| ## ENDDIALOGCHECK
 | |
| 
 | |
| itemname = args[0]
 | |
| if len(args) == 2:
 | |
|     quantity = int(args[1])
 | |
| else:
 | |
|     quantity = 1
 | |
| Crossfire.Log(Crossfire.LogDebug, "CFDialog: trying to take: %s of item %s from character %s" %(quantity, itemname, character.Name ))
 | |
| if itemname == "money":
 | |
|     paid = character.PayAmount(int(quantity))
 | |
|     if paid == 0:
 | |
|         Crossfire.Log(Crossfire.LogError, "Tried to make player %s pay more than they had" %(character.Name))
 | |
|     character.Write("You give {} to {}".format(Crossfire.CostStringFromValue(int(quantity)), speaker.Name))
 | |
| else:
 | |
|     inv = character.CheckInventory(itemname)
 | |
|     if inv:
 | |
|         if quantity == 0:
 | |
|             character.Write("You give {} {} to {}".format(inv.Quantity, inv.NameSingular if inv.Quantity == 1 else inv.NamePl, speaker.Name))
 | |
|             inv.Remove()
 | |
|         else:
 | |
|             character.Write("You give {} {} to {}".format(int(quantity), inv.NameSingular if quantity == 1 else inv.NamePl, speaker.Name))
 | |
|             status = CFItemBroker.Item(inv).subtract(int(quantity))
 | |
|             if status == 0:
 | |
|                 Crossfire.Log(Crossfire.LogError, "Dialog script tried to remove more items than available from player %s" %(character.Name))
 | |
|         # we might have been wearing an item that was taken.
 | |
|         character.Fix()
 | |
|     else:
 | |
|         Crossfire.Log(Crossfire.LogError, "Dialog script tried to remove non-existant item from player %s" %(character.Name))
 |