「模组:常用方法」修訂間的差異
跳至導覽
跳至搜尋
第21行: | 第21行: | ||
public Object(int parentSheetIndex, int initialStack, bool isRecipe = false, int price = -1, int quality = 0); | public Object(int parentSheetIndex, int initialStack, bool isRecipe = false, int price = -1, int quality = 0); | ||
public Object(Vector2 tileLocation, int parentSheetIndex, string Givenname, bool canBeSetDown, bool canBeGrabbed, bool isHoedirt, bool isSpawnedObject); | public Object(Vector2 tileLocation, int parentSheetIndex, string Givenname, bool canBeSetDown, bool canBeGrabbed, bool isHoedirt, bool isSpawnedObject); | ||
− | </ | + | </syntaxhighlight> |
'''parentSheetIndex'''为该物品的ID(储存在 ObjectInformation.xnb 文件中)。 | '''parentSheetIndex'''为该物品的ID(储存在 ObjectInformation.xnb 文件中)。 | ||
第31行: | 第31行: | ||
// 调用: | // 调用: | ||
Game1.getLocationFromName("Farm").dropObject(new StardewValley.Object(itemId, 1, false, -1, 0), new Vector2(x, y) * 64f, Game1.viewport, true, (Farmer)null); | Game1.getLocationFromName("Farm").dropObject(new StardewValley.Object(itemId, 1, false, -1, 0), new Vector2(x, y) * 64f, Game1.viewport, true, (Farmer)null); | ||
− | </ | + | </syntaxhighlight> |
===添加物品到背包=== | ===添加物品到背包=== | ||
第37行: | 第37行: | ||
// You can add items found in ObjectInformation using: | // You can add items found in ObjectInformation using: | ||
Game1.player.addItemByMenuIfNecessary((Item)new StardewValley.Object(int parentSheetIndex, int initialStack, [bool isRecipe = false], [int price = -1], [int quality = 0])); | Game1.player.addItemByMenuIfNecessary((Item)new StardewValley.Object(int parentSheetIndex, int initialStack, [bool isRecipe = false], [int price = -1], [int quality = 0])); | ||
− | </ | + | </syntaxhighlight> |
例2: | 例2: | ||
<syntaxhighlight lang="c#"> | <syntaxhighlight lang="c#"> | ||
第46行: | 第46行: | ||
// Note: This code WORKS. | // Note: This code WORKS. | ||
− | </ | + | </syntaxhighlight> |
===从背包移除物品=== | ===从背包移除物品=== | ||
第70行: | 第70行: | ||
); | ); | ||
} | } | ||
− | </ | + | </syntaxhighlight> |
遍历: | 遍历: | ||
第78行: | 第78行: | ||
// ... | // ... | ||
} | } | ||
− | </ | + | </syntaxhighlight> |
注意:联机中客机是拿不到所有地点的。见[[模组:制作指南/APIs/Multiplayer#Get active locations|获取有效的地点]]。 | 注意:联机中客机是拿不到所有地点的。见[[模组:制作指南/APIs/Multiplayer#Get active locations|获取有效的地点]]。 |
於 2021年6月9日 (三) 12:04 的修訂
← 目錄
頁面仍需完善
該頁面不完善且缺少信息。您可以通過擴充內容來幫助我們。 |
此頁面展示了製作SMAPI模組時常見的任務。在閱讀時,請結合參考模組製作入門和遊戲基本架構。
基礎技巧
追蹤一個值的變化
在寫模組時,你可能常常需要了解一個值的變化(什麼時候變,變化前後的值分別是多少,等等)。如果該值沒有包括在SMAPI內置的事件 (event)中,那麼你可以為該值創建一個私有變量,然後在SMAPI的update tick事件中刷新此變量,以達到追蹤值變化的目的。
示例見:[模組:製作指南/APIs/Events#變化監控]
物品 (Items)
物品 代表那些能夠放在背包里的東西,比如說工具、農作物等等。
創建一個物品的實例(Object)
Object中所有的構造函數:
public Object(Vector2 tileLocation, int parentSheetIndex, int initialStack);
public Object(Vector2 tileLocation, int parentSheetIndex, bool isRecipe = false);
public Object(int parentSheetIndex, int initialStack, bool isRecipe = false, int price = -1, int quality = 0);
public Object(Vector2 tileLocation, int parentSheetIndex, string Givenname, bool canBeSetDown, bool canBeGrabbed, bool isHoedirt, bool isSpawnedObject);
parentSheetIndex為該物品的ID(儲存在 ObjectInformation.xnb 文件中)。
在地上生成物品
public virtual bool dropObject(Object obj, Vector2 dropLocation, xTile.Dimensions.Rectangle viewport, bool initialPlacement, Farmer who = null);
// 调用:
Game1.getLocationFromName("Farm").dropObject(new StardewValley.Object(itemId, 1, false, -1, 0), new Vector2(x, y) * 64f, Game1.viewport, true, (Farmer)null);
添加物品到背包
// You can add items found in ObjectInformation using:
Game1.player.addItemByMenuIfNecessary((Item)new StardewValley.Object(int parentSheetIndex, int initialStack, [bool isRecipe = false], [int price = -1], [int quality = 0]));
例2:
// Add a weapon directly into player's inventory
const int WEAP_ID = 19; // Shadow Dagger -- see Data/weapons
Item weapon = new MeleeWeapon(WEAP_ID); // MeleeWeapon is a class in StardewValley.Tools
Game1.player.addItemByMenuIfNecessary(weapon);
// Note: This code WORKS.
從背包移除物品
取決於你背包的具體情況。很少有情況需要你親自來調用,因為相關的方法在Farmer類中已經有了。
在大多數情況下,僅需調用 .removeItemFromInventory(Item) 方法。
地點(Locations)
見 遊戲基本架構#地點。
獲取所有地點
Game1.locations屬性中儲存着主要的地點,但是不包括建築的室內。以下這個方法提供了主玩家的所有地點。
/// <summary>Get all game locations.</summary>
public static IEnumerable<GameLocation> GetLocations()
{
return Game1.locations
.Concat(
from location in Game1.locations.OfType<BuildableGameLocation>()
from building in location.buildings
where building.indoors.Value != null
select building.indoors.Value
);
}
遍歷:
foreach (GameLocation location in this.GetLocations())
{
// ...
}
注意:聯機中客機是拿不到所有地點的。見獲取有效的地點。