---++!! !InventoryAppDev __description__: 涓哄簲鐢ㄧ▼搴忓紑鍙戝晢鍜岀敤鎴锋彁渚涘彲浜ゆ槗鐗╁搧鐨勮儗鍖呯┖闂存湇鍔? 鍚屾椂鍖呮嫭鐗╁搧绠$悊锛屼笉鍚岃儗鍖呭唴鐨勭墿鍝佷拱鍗栧拰浜ゆ槗 %TOC{title="Contents:"}% %STARTINCLUDE% ---++ Inventory app for Paraworld | *Title* | Inventory app for Paraworld | | *Author(s)* | LiXizhi | | *Date* | 2008/1/16 | | *File* | script/kids/3DMapSystemApp/Inventory/app_main.lua | ---+++ Description db registration insert script INSERT INTO apps VALUES (NULL, 'Inventory_GUID', 'Inventory', '1.0.0', 'http://www.paraengine.com/apps/Inventory_v1.zip', 'YourCompany', 'enUS', 'script/kids/3DMapSystemApp/Inventory/IP.xml', '', 'script/kids/3DMapSystemApp/Inventory/app_main.lua', 'Map3DSystem.App.Inventory.MSGProc', 1); %T% __Sample Code__ <verbatim> NPL.load("(gl)script/kids/3DMapSystemApp/Inventory/app_main.lua"); </verbatim> ---+++ Member Functions ---++++ !Map3DSystem.App.Inventory.OnConnection requires create class commonlib.setfield("Map3DSystem.App.Inventory", {}); ------------------------------------------- event handlers ------------------------------------------- OnConnection method is the obvious point to place your UI (menus, mainbars, tool buttons) through which the user will communicate to the app. This method is also the place to put your validation code if you are licensing the add-in. You would normally do this before putting up the UI. If the user is not a valid user, you would not want to put the UI into the IDE. * _param_ __app__ : the object representing the current application in the IDE. * _param_ __connectMode__ : type of Map3DSystem.App.ConnectMode. __syntax__ <verbatim>function Map3DSystem.App.Inventory.OnConnection(app, connectMode)</verbatim> __parameters__ | *app* | the object representing the current application in the IDE. | | *connectMode* | | ---++++ !Map3DSystem.App.Inventory.OnDisconnection Receives notification that the Add-in is being unloaded. __syntax__ <verbatim>function Map3DSystem.App.Inventory.OnDisconnection(app, disconnectMode)</verbatim> __parameters__ | *app* | | | *disconnectMode* | | ---++++ !Map3DSystem.App.Inventory.OnQueryStatus This is called when the command's availability is updated When the user clicks a command (menu or mainbar button), the QueryStatus event is fired. The QueryStatus event returns the current status of the specified named command, whether it is enabled, disabled, or hidden in the CommandStatus parameter, which is passed to the msg by reference (or returned in the event handler). * _param_ __commandName__ : The name of the command to determine state for. Usually in the string format "Category.SubCate.Name". * _param_ __statusWanted__ : what status of the command is queried. it is of type Map3DSystem.App.CommandStatusWanted * _return_ ____ : returns according to statusWanted. it may return an integer by adding values in Map3DSystem.App.CommandStatus. __syntax__ <verbatim>function Map3DSystem.App.Inventory.OnQueryStatus(app, commandName, statusWanted)</verbatim> __parameters__ | *app* | | | *commandName* | The name of the command to determine state for. Usually in the string format "Category.SubCate.Name". | | *statusWanted* | | | *return* | returns according to statusWanted. it may return an integer by adding values in Map3DSystem.App.CommandStatus. | ---++++ !Map3DSystem.App.Inventory.OnExec This is called when the command is invoked.The Exec is fired after the QueryStatus event is fired, assuming that the return to the statusOption parameter of QueryStatus is supported and enabled. This is the event where you place the actual code for handling the response to the user click on the command. * _param_ __commandName__ : The name of the command to determine state for. Usually in the string format "Category.SubCate.Name". __syntax__ <verbatim>function Map3DSystem.App.Inventory.OnExec(app, commandName, params)</verbatim> __parameters__ | *app* | | | *commandName* | The name of the command to determine state for. Usually in the string format "Category.SubCate.Name". | | *params* | | ---++++ !Map3DSystem.App.Inventory.OnRenderBox Change and render the 3D world with mcml data that is usually retrieved from the current user's profile page for this application. __syntax__ <verbatim>function Map3DSystem.App.Inventory.OnRenderBox(mcmlData)</verbatim> __parameters__ | *mcmlData* | | ---++++ !Map3DSystem.App.Inventory.Navigate called when the user wants to nagivate to the 3D world location relavent to this application __syntax__ <verbatim>function Map3DSystem.App.Inventory.Navigate()</verbatim> ---++++ !Map3DSystem.App.Inventory.GotoHomepage called when user clicks to check out the homepage of this application. Homepage usually includes: developer info, support, developer worlds information, app global news, app updates, all community user rating, active users, trade, currency transfer, etc. __syntax__ <verbatim>function Map3DSystem.App.Inventory.GotoHomepage()</verbatim> ---++++ !Map3DSystem.App.Inventory.DoQuickAction called when user clicks the quick action for this application. __syntax__ <verbatim>function Map3DSystem.App.Inventory.DoQuickAction()</verbatim> ---++++ !Map3DSystem.App.Inventory.MSGProc ------------------------------------------- client world database function helpers. ------------------------------------------- ------------------------------------------ all related messages ------------------------------------------ ----------------------------------------------------- APPS can be invoked in many ways: Through app Manager mainbar or menu command or buttons Command Line 3D World installed apps ----------------------------------------------------- __syntax__ <verbatim>function Map3DSystem.App.Inventory.MSGProc(window, msg)</verbatim> __parameters__ | *window* | | | *msg* | | ---++ a bag contains stuffs of a person, a bag may contain other bags of the same person. | *Title* | a bag contains stuffs of a person, a bag may contain other bags of the same person. | | *Author(s)* | LiXizhi, WangTian | | *Date* | 2008/1/16 | | *File* | script/kids/3DMapSystemApp/Inventory/BagCtl.lua | ---+++ Description the bag concept is similar to folder in windows. We can exchange items between bags of the same persons, different persons, a shop and a person. We can also link a character with a given bag for the character to sell goods while the user is offline. NOTE: implemented by WangTian, the bag control is a universal item container. The control displays in grid view and almost all the items allows drag and drop. According to develop note 2008/1/17, drag and drop between different bags works in different dragging behaviors. %T% __Sample Code__ <verbatim> NPL.load("(gl)script/kids/3DMapSystemApp/Inventory/BagCtl.lua"); local ctl = Map3DSystem.App.Inventory.BagCtl:new{ name = "BagCtl1", alignment = "_lt", left=0, top=0, width = 512, height = 290, parent = nil, }; ctl:Show(); </verbatim> ---+++ Member Functions ---++++ !Map3DSystem.App.Inventory.Bag:new <verbatim>----------------------------------------------------- bag object ----------------------------------------------------- bag status. Map3DSystem.App.Inventory.BagStatus = { -- unsynchronized LocalBag = nil, Unsynchronized = 1, Synchronized = 2, }; how items in a bag should be drawn Map3DSystem.App.Inventory.BagDisplayOption = { GridIconOnly = nil, GridIconText = 1, ListIconText = 2, }; how items in a bag should be drawn Map3DSystem.App.Inventory.BagType = { -- the bag is the root bag of a given user RootBag = nil, -- give box: objects in the bag are given to the current user free of charge, -- either because of the user just make them, obtained as trophy, or received as gifts from feeds. GiveBox = 1, -- all objects in the bag are for sale. Most marcket pages in application home page uses OnSaleBag to sell products to visitors. -- personal users can also link sub bags to some of their virtual characters to let them sell their own products to other visitors. OnSaleBag = 2, }; NOTE: revised by WangTian how items in a bag should be drawn Map3DSystem.App.Inventory.BagType = { -- the bag is the root bag of a given user RootBag = 1, -- the bag is the sub bag of a root bag MiniBag = 2, -- give box: objects in the bag are given to the current user free of charge, -- either because of the user just make them, obtained as trophy, or received as gifts from feeds. GiveBox = 3, -- all objects in the bag are for sale. Most marcket pages in application home page uses OnSaleBag to sell products to visitors. -- personal users can also link sub bags to some of their virtual characters to let them sell their own products to other visitors. OnSaleBag = 4, -- exchange bag: objects in the bag are for exchange purpose, ExchangeBagSelf shows the objects user want to exchange, -- and ExchangeBagOpponent shows the opponent objects exchange back ExchangeBagSelf = 5, ExchangeBagOpponent = 6, }; a single bag template containing stuffs of a person, a bag may contain other bags of the same person. the bag concept is similar to folder in windows. We can exchange items between bags. Map3DSystem.App.Inventory.Bag = { -- the bag id in the server's bag database. If this is a locally created bag, id is nil. id = nil, -- the user_id of this bag's owner, if nil it means local or the current user. owner_id = nil, -- name of this bag, like folder name. name = nil, -- display name of the bag text = nil, -- E price and P price. only for display purposes, if the bag carries some money. priceE = nil, priceP = nil, -- array {} of tradable item commands (some commands will open other bag objects) objects = nil, -- capacity of the bag capacity = 49, -- bag type of Map3DSystem.App.Inventory.BagType BagType = nil, ------------------------------------------- -- appearances ------------------------------------------- -- how many rows and columns of the bag col = 7, row = 7, -- which page to display, starting from 1 pageNo = nil, -- display option of type Map3DSystem.App.Inventory.BagDisplayOption DisplayOption = nil, -- a filter function(item) return true; end, that will return true if the given item in bag should be shown, -- we can use it to display only a subset of items in the bag. FilterFunc = nil, -- status of this bag. current it is not USED. status = nil, }</verbatim>; a list of active bags in the scene. Map3DSystem.App.Inventory.Bags = {}; create a new bom __syntax__ <verbatim>function Map3DSystem.App.Inventory.Bag:new(o)</verbatim> __parameters__ | *o* | | ---++++ !Map3DSystem.App.Inventory.Bag:ClearAll clear all objects __syntax__ <verbatim>function Map3DSystem.App.Inventory.Bag:ClearAll()</verbatim> ---++++ !Map3DSystem.App.Inventory.Bag:AddObject add a new object to the bag. One need to call manually update the UI of the bag. it may return nil if bag is full. otherwise return true. __syntax__ <verbatim>function Map3DSystem.App.Inventory.Bag:AddObject(obj)</verbatim> __parameters__ | *obj* | | ---++++ !BagCtl:new <verbatim>----------------------------------------------------- bag control for displaying a bag object ----------------------------------------------------- default member attributes local BagCtl = { -- the top level control name name = "BagCtl1", -- normal window size --alignment = "_lt", -- NOTE: bag control don't suggest "_fi" alignment left = 0, top = 0, --width = 300, --height = 290, parent = nil, -- UI backgrounds slotBG = "", highLightBG = "", -- bag information type = nil, -- of type: Map3DSystem.App.Inventory.BagType rows = 8, columns = 6, slotwidth = 64, slotheight = 64, itemwidth = 48, itemheight = 48, itemXoffset = 8, itemYoffset = 8, -- the Map3DSystem.App.Inventory.InventoryWnd.Bag object that this control is bound to. bag = nil, }</verbatim> Map3DSystem.App.Inventory.BagCtl = BagCtl; record all bag control names, mainly for bag items drag drag receiver UI container in the AllBagCtlNames table will be added on drag begin BagCtl.AllBagCtlNames = {}; constructor __syntax__ <verbatim>function BagCtl:new(o)</verbatim> __parameters__ | *o* | | ---++++ !BagCtl:Destroy Destroy the UI control __syntax__ <verbatim>function BagCtl:Destroy()</verbatim> ---++++ !BagCtl:Show * _param_ __bShow__ : boolean to show or hide. if nil, it will toggle current setting. __syntax__ <verbatim>function BagCtl:Show(bShow)</verbatim> __parameters__ | *bShow* | boolean to show or hide. if nil, it will toggle current setting. | ---++++ !BagCtl.SetSlotStyleButton make a button inventory slot style * _param_ __uiobject__ : button UI object * _param_ __backgroundImage__ : background image always shows on slot * _param_ __highlightImage__ : highlight image shows only on mouse over indicating available slot for item or item outer glow highlight __syntax__ <verbatim>function BagCtl.SetSlotStyleButton(uiobject, backgroundImage, highlightImage)</verbatim> __parameters__ | *uiobject* | button UI object | | *backgroundImage* | | | *highlightImage* | highlight image shows only on mouse over indicating available slot for item or item outer glow highlight | ---++++ !BagCtl.DrawCellHandler draw cell according to bag gridcell, if item cell draw, draw item with slot. if empty cell, draw only empty slot __syntax__ <verbatim>function BagCtl.DrawCellHandler(_parent, gridcell)</verbatim> __parameters__ | *parent* | | | *gridcell* | | ---++++ !BagCtl.OnFakeMouseMove ------------------------ DEBUG PURPOSE ------------------------ __syntax__ <verbatim>function BagCtl.OnFakeMouseMove()</verbatim> ---++++ !BagCtl.OnClick ------------------------ DEBUG PURPOSE ------------------------ onclick bagctl object will grab the object beneath the mouse cursor the object then become a floating object on screen waiting for the drop operation(left click), or the cancel operation(right click) __syntax__ <verbatim>function BagCtl.OnClick(bagName, bagObjectIndex)</verbatim> __parameters__ | *bagName* | | | *bagObjectIndex* | | ---++++ !BagCtl.OnDragBegin envisible the drag receiver, currently envisible all BagCtl drag receiver to allow receiving item drag __syntax__ <verbatim>function BagCtl.OnDragBegin(bagName, bagObjectIndex)</verbatim> __parameters__ | *bagName* | | | *bagObjectIndex* | | ---++++ !BagCtl.MoveObject move one item from the source bag to the destination bag positions are indicated by bag index __syntax__ <verbatim>function BagCtl.MoveObject(srcBagName, srcBagObjectIndex, destBagName, destBagObjectIndex)</verbatim> __parameters__ | *srcBagName* | | | *srcBagObjectIndex* | | | *destBagName* | | | *destBagObjectIndex* | | ---++++ !BagCtl.SwapObject swap between the source bag item and the destination bag item both positions are indicated by bag index __syntax__ <verbatim>function BagCtl.SwapObject(srcBagName, srcBagObjectIndex, destBagName, destBagObjectIndex)</verbatim> __parameters__ | *srcBagName* | | | *srcBagObjectIndex* | | | *destBagName* | | | *destBagObjectIndex* | | ---++++ !BagCtl.OnClose close the given control __syntax__ <verbatim>function BagCtl.OnClose(sCtrlName)</verbatim> __parameters__ | *sCtrlName* | | ---++++ !Map3DSystem.App.Inventory.BagCtl.OnClickItemNode clicked the tree node. __syntax__ <verbatim>function Map3DSystem.App.Inventory.BagCtl.OnClickItemNode(treeNode)</verbatim> __parameters__ | *treeNode* | | ---++ Exchanges bags (instanced) are UI for two bags and their money slots. One bag is for a remote user, the other is for the current user. | *Title* | Exchanges bags (instanced) are UI for two bags and their money slots. One bag is for a remote user, the other is for the current user. | | *Author(s)* | LiXizhi | | *Date* | 2008/1/16 | | *File* | script/kids/3DMapSystemApp/Inventory/ExchangeBags.lua | ---+++ Description %T% __Sample Code__ <verbatim> NPL.load("(gl)script/kids/3DMapSystemApp/Inventory/ExchangeBags.lua"); local ctl = Map3DSystem.App.Inventory.ExchangeBags:new{ name = "ExchangeBags1", alignment = "_lt", left=0, top=0, width = 512, height = 290, parent = nil, bag = nil, }; ctl:Show(); </verbatim> ---+++ Member Functions ---++++ !ExchangeBags:new <verbatim> default member attributes local ExchangeBags = { -- the top level control name name = "ExchangeBags1", -- normal window size alignment = "_lt", left = 0, top = 0, width = 300, height = 290, parent = nil, -- the Map3DSystem.App.Inventory.InventoryWnd.Bag object that this control is bound to. bag = nil, }</verbatim> Map3DSystem.App.Inventory.ExchangeBags = ExchangeBags; constructor __syntax__ <verbatim>function ExchangeBags:new (o)</verbatim> __parameters__ | *o* | | ---++++ !ExchangeBags:Destroy Destroy the UI control __syntax__ <verbatim>function ExchangeBags:Destroy ()</verbatim> ---++++ !ExchangeBags:Show * _param_ __bShow__ : boolean to show or hide. if nil, it will toggle current setting. __syntax__ <verbatim>function ExchangeBags:Show(bShow)</verbatim> __parameters__ | *bShow* | boolean to show or hide. if nil, it will toggle current setting. | ---++++ !ExchangeBags.OnClose close the given control __syntax__ <verbatim>function ExchangeBags.OnClose(sCtrlName)</verbatim> __parameters__ | *sCtrlName* | | ---++ Give box (instanced) is a special bag that contains stuffs that is free of charge to the current user. | *Title* | Give box (instanced) is a special bag that contains stuffs that is free of charge to the current user. | | *Author(s)* | LiXizhi | | *Date* | 2008/1/16 | | *File* | script/kids/3DMapSystemApp/Inventory/GiveBox.lua | ---+++ Description %T% __Sample Code__ <verbatim> NPL.load("(gl)script/kids/3DMapSystemApp/Inventory/GiveBox.lua"); local ctl = Map3DSystem.App.Inventory.GiveBox:new{ name = "GiveBox1", alignment = "_lt", left=0, top=0, width = 512, height = 290, parent = nil, bag = nil, }; ctl:Show(); </verbatim> ---+++ Member Functions ---++++ !GiveBox:new <verbatim> default member attributes local GiveBox = { -- the top level control name name = "GiveBox1", -- normal window size alignment = "_lt", left = 0, top = 0, width = 300, height = 290, parent = nil, -- the Map3DSystem.App.Inventory.InventoryWnd.Bag object that this control is bound to. bag = nil, }</verbatim> Map3DSystem.App.Inventory.GiveBox = GiveBox; constructor __syntax__ <verbatim>function GiveBox:new (o)</verbatim> __parameters__ | *o* | | ---++++ !GiveBox:Destroy Destroy the UI control __syntax__ <verbatim>function GiveBox:Destroy ()</verbatim> ---++++ !GiveBox:Show * _param_ __bShow__ : boolean to show or hide. if nil, it will toggle current setting. __syntax__ <verbatim>function GiveBox:Show(bShow)</verbatim> __parameters__ | *bShow* | boolean to show or hide. if nil, it will toggle current setting. | ---++++ !GiveBox.OnClose close the given control __syntax__ <verbatim>function GiveBox.OnClose(sCtrlName)</verbatim> __parameters__ | *sCtrlName* | | ---++ inventory window of a given user | *Title* | inventory window of a given user | | *Author(s)* | LiXizhi | | *Date* | 2008/1/12 | | *File* | script/kids/3DMapSystemApp/Inventory/InventoryWnd.lua | ---+++ Description %T% __Sample Code__ <verbatim> NPL.load("(gl)script/kids/3DMapSystemApp/Inventory/InventoryWnd.lua"); Map3DSystem.App.Inventory.ShowMyInventory(app); </verbatim> ---+++ Member Functions ---++++ !Map3DSystem.App.Inventory.ShowMyInventory common control library NPL.load("(gl)script/ide/common_control.lua"); NPL.load("(gl)script/kids/3DMapSystemApp/Inventory/BagCtl.lua"); commonlib.setfield("Map3DSystem.App.Inventory.InventoryWnd", {}); the current logged in user's root bag object. of type Map3DSystem.App.Inventory.Bag Map3DSystem.App.Inventory.UserBag = nil; display the main inventory window for the current user. __syntax__ <verbatim>function Map3DSystem.App.Inventory.ShowMyInventory(_app)</verbatim> __parameters__ | *app* | | ---++++ !Map3DSystem.App.Inventory.GetCurrentUserRootBag get the current user bag and retrieve data the user bag contains local, profile, and app inventory data. __syntax__ <verbatim>function Map3DSystem.App.Inventory.GetCurrentUserRootBag()</verbatim> ---++++ !Map3DSystem.App.Inventory.InventoryWnd.Show NOTE: InventoryWnd or Map3DSystem.App.Inventory.InventoryWnd is the rootbag of a user * _param_ __bShow__ : boolean to show or hide. if nil, it will toggle current setting. * _param_ ____ :_parent: parent window inside which the content is displayed. it can be nil. __syntax__ <verbatim>function Map3DSystem.App.Inventory.InventoryWnd.Show(bShow, _parent, parentWindow)</verbatim> __parameters__ | *bShow* | boolean to show or hide. if nil, it will toggle current setting. | | *parent* | | | *parentWindow* | | ---++++ !Map3DSystem.App.Inventory.InventoryWnd.ShowTestMini show mini bag __syntax__ <verbatim>function Map3DSystem.App.Inventory.InventoryWnd.ShowTestMini(bShow, _parent, parentWindow)</verbatim> __parameters__ | *bShow* | | | *parent* | | | *parentWindow* | | ---++ Mini Bag (instanced) is used to display sub folders(bags) of the root bag of the current user. | *Title* | Mini Bag (instanced) is used to display sub folders(bags) of the root bag of the current user. | | *Author(s)* | LiXizhi | | *Date* | 2008/1/16 | | *File* | script/kids/3DMapSystemApp/Inventory/MiniBag.lua | ---+++ Description %T% __Sample Code__ <verbatim> NPL.load("(gl)script/kids/3DMapSystemApp/Inventory/MiniBag.lua"); local ctl = Map3DSystem.App.Inventory.MiniBag:new{ name = "MiniBag1", alignment = "_lt", left=0, top=0, width = 512, height = 290, parent = nil, bag = nil, }; ctl:Show(); </verbatim> ---+++ Member Functions ---++++ !MiniBag:new <verbatim> default member attributes local MiniBag = { -- the top level control name name = "MiniBag1", -- normal window size alignment = "_lt", left = 0, top = 0, width = 300, height = 290, parent = nil, -- the Map3DSystem.App.Inventory.InventoryWnd.Bag object that this control is bound to. bag = nil, }</verbatim> Map3DSystem.App.Inventory.MiniBag = MiniBag; constructor __syntax__ <verbatim>function MiniBag:new (o)</verbatim> __parameters__ | *o* | | ---++++ !MiniBag:Destroy Destroy the UI control __syntax__ <verbatim>function MiniBag:Destroy ()</verbatim> ---++++ !MiniBag:Show * _param_ __bShow__ : boolean to show or hide. if nil, it will toggle current setting. __syntax__ <verbatim>function MiniBag:Show(bShow)</verbatim> __parameters__ | *bShow* | boolean to show or hide. if nil, it will toggle current setting. | ---++++ !MiniBag.OnClose close the given control __syntax__ <verbatim>function MiniBag.OnClose(sCtrlName)</verbatim> __parameters__ | *sCtrlName* | | ---++ Shop bag (instanced) is used for NPC or application home page to sell stuffs to visitors. | *Title* | Shop bag (instanced) is used for NPC or application home page to sell stuffs to visitors. | | *Author(s)* | LiXizhi | | *Date* | 2008/1/16 | | *File* | script/kids/3DMapSystemApp/Inventory/ShopBag.lua | ---+++ Description %T% __Sample Code__ <verbatim> NPL.load("(gl)script/kids/3DMapSystemApp/Inventory/ShopBag.lua"); local ctl = Map3DSystem.App.Inventory.ShopBag:new{ name = "ShopBag1", alignment = "_lt", left=0, top=0, width = 512, height = 290, parent = nil, bag = nil, }; ctl:Show(); </verbatim> ---+++ Member Functions ---++++ !ShopBag:new <verbatim> default member attributes local ShopBag = { -- the top level control name name = "ShopBag1", -- normal window size alignment = "_lt", left = 0, top = 0, width = 300, height = 290, parent = nil, -- the Map3DSystem.App.Inventory.InventoryWnd.Bag object that this control is bound to. bag = nil, }</verbatim> Map3DSystem.App.Inventory.ShopBag = ShopBag; constructor __syntax__ <verbatim>function ShopBag:new (o)</verbatim> __parameters__ | *o* | | ---++++ !ShopBag:Destroy Destroy the UI control __syntax__ <verbatim>function ShopBag:Destroy ()</verbatim> ---++++ !ShopBag:Show * _param_ __bShow__ : boolean to show or hide. if nil, it will toggle current setting. __syntax__ <verbatim>function ShopBag:Show(bShow)</verbatim> __parameters__ | *bShow* | boolean to show or hide. if nil, it will toggle current setting. | ---++++ !ShopBag.OnClose close the given control __syntax__ <verbatim>function ShopBag.OnClose(sCtrlName)</verbatim> __parameters__ | *sCtrlName* | | %STOPINCLUDE%
E
dit
|
A
ttach
|
P
rint version
|
H
istory
: r1
|
B
acklinks
|
V
iew topic
|
Ra
w
edit
|
M
ore topic actions
Topic revision: r1 - 2008-02-29
-
LiXizhi
Home
Site map
CCWeb web
HaqiTeen web
Main web
ParaEngine web
TWiki web
Main Web
Users
Groups
Index
Search
Changes
Notifications
RSS Feed
Statistics
导航页WebTopMenu
Preferences
开发指南
Getting Started
ParacraftSDK
NPL
MCML
NPL Reference Manual
美术Mod
Account
Log In
English
简体中文
簡體中文
E
dit
A
ttach
Copyright © 2008-2024 by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki?
Send feedback