|
You last visited: Today at 15:49
Advertisement
[(Zwangs-)Release] Achievementshop
Discussion on [(Zwangs-)Release] Achievementshop within the Metin2 PServer Guides & Strategies forum part of the Metin2 Private Server category.
04/18/2014, 12:45
|
#1
|
elite*gold: 0
Join Date: Mar 2013
Posts: 2,449
Received Thanks: 6,448
|
[(Zwangs-)Release] Achievementshop
Hallo,
ich release mal den Achievementshop.
Achtung: Ich baue das System nicht bei euch ein und gebe auch kein Support! Habe das Tutorial mehrfach ausprobiert und es hat jedes mal problemlos geklappt!
Erstmal die Quest:
Code:
quest achievement begin
state start begin
function get_points()
return tonumber(mysql_query("select achievement from player.player where id = ".. pc.get_player_id() ..";")[1][1]) or 0
end
function GetInput(value)
cmdchat("GetInputStart")
local ret = input(cmdchat(value))
cmdchat("GetInputStop")
return ret
end
function set_points(p)
mysql_query("update player.player set achievement = ".. p .." where id = ".. pc.get_player_id() ..";")
end
when 20095.chat."Achievementshop" begin
cmdchat("SetIsNpc")
npc.open_shop(49)
setskin(NOWINDOW)
cmdchat("SetPrice 100|100|100|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0")
end
when login begin
cmdchat("SetQuestIndex "..q.getcurrentquestindex())
cmdchat("setPP "..pc.getqf("achievement"))
loop_timer("update", 4)
if pc.getqf("first") == 0 then
pc.setqf("achievement", pc.getqf("achievement")+10)
cmdchat("achievement Dein_erster_Login%".. pc.getqf("achievement"))
pc.setqf("first",1)
end
end
when update.timer begin
cmdchat("setPP "..pc.getqf("achievement"))
end
when button or info begin
local items = {
[1]={19, 1, 100},
[2]={29, 1, 100},
[3]={39, 1, 100},
}
local slot = tonumber(achievement.GetInput("GetInput"))+1
if pc.getqf("achievement") >= items[slot][3] then
pc.setqf("achievement", pc.getqf("achievement")-items[slot][3])
cmdchat("setPP "..pc.getqf("achievement"))
pc.give_item2(items[slot][1], items[slot][2])
else
cmdchat("NieMamPP")
end
end
when kill with not npc.is_pc() and pc.getqf(npc.get_race()) == 0 begin
local data = {
[101] = 5,
[1095] = 100,
[691] = 10,
}
local v = npc.get_race()
local killcount = pc.getqf(v .."_kill")
local p = data[v] or 1000
cmdchat("setachieve ".. pc.getqf("achievement") + p)
cmdchat("achievement ".. mob_name(v) .."_getötet#".. killcount + 1 .."%".. pc.getqf("achievement") + p .."")
pc.setqf("achievement", pc.getqf("achievement") + data[v])
end
end
end
(Es sind auch Ansätze von den Mobs etc zum Killen drin)
Es ist wichtig, dass bei der dieser Stelle:
Code:
cmdchat("SetPrice 100|100|100|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0")
Die ganze Zahlenreihe vorhanden ist - wenn es nicht so viele Items gibt, einfach eine 0 beim Rest eintragen.
Bei der Stelle:
Code:
local items = {
[1]={19, 1, 100},
[2]={29, 1, 100},
[3]={39, 1, 100},
}
Stehen die Items für den Shop.
Aufbau:
[slot] = {vnum, count, kosten}
Dann müsste ihr noch einen Shop mit der Vnum 49 erstellen. Die Spalte für Npc Vnum auf 0 lassen - zu dem auch in player.shop_item die Items eintragen (mit richtiger Anzahl) - (macht euch um Yangkosten keine Gedanken).
Zum Clientteil:
Öffnet die inventorywindow.py und ersetzt den Inhalt damit:
Code:
import uiScriptLocale
import item
EQUIPMENT_START_INDEX = 90
window = {
"name" : "InventoryWindow",
## 600 - (width + ¿À¸¥ÂÊÀ¸·Î ºÎÅÍ ¶ç¿ì±â 24 px)
"x" : SCREEN_WIDTH - 176,
"y" : SCREEN_HEIGHT - 37 - 589,
"style" : ("movable", "float",),
"width" : 176,
"height" : 589,
"children" :
(
## Inventory, Equipment Slots
{
"name" : "board",
"type" : "board",
"style" : ("attach",),
"x" : 0,
"y" : 0,
"width" : 176,
"height" : 595,
"children" :
(
## Title
{
"name" : "TitleBar",
"type" : "titlebar",
"style" : ("attach",),
"x" : 8,
"y" : 7,
"width" : 161,
"color" : "yellow",
"children" :
(
{ "name":"TitleName", "type":"text", "x":77, "y":3, "text":uiScriptLocale.INVENTORY_TITLE, "text_horizontal_align":"center" },
),
},
## Equipment Slot
{
"name" : "Equipment_Base",
"type" : "image",
"x" : 10,
"y" : 33,
"image" : "d:/ymir work/ui/equipment_bg_without_ring.tga",
"children" :
(
{
"name" : "EquipmentSlot",
"type" : "slot",
"x" : 3,
"y" : 3,
"width" : 150,
"height" : 182,
"slot" : (
{"index":EQUIPMENT_START_INDEX+0, "x":39, "y":37, "width":32, "height":64},
{"index":EQUIPMENT_START_INDEX+1, "x":39, "y":2, "width":32, "height":32},
{"index":EQUIPMENT_START_INDEX+2, "x":39, "y":145, "width":32, "height":32},
{"index":EQUIPMENT_START_INDEX+3, "x":75, "y":67, "width":32, "height":32},
{"index":EQUIPMENT_START_INDEX+4, "x":3, "y":3, "width":32, "height":96},
{"index":EQUIPMENT_START_INDEX+5, "x":114, "y":67, "width":32, "height":32},
{"index":EQUIPMENT_START_INDEX+6, "x":114, "y":35, "width":32, "height":32},
{"index":EQUIPMENT_START_INDEX+7, "x":2, "y":145, "width":32, "height":32},
{"index":EQUIPMENT_START_INDEX+8, "x":75, "y":145, "width":32, "height":32},
{"index":EQUIPMENT_START_INDEX+9, "x":114, "y":2, "width":32, "height":32},
{"index":EQUIPMENT_START_INDEX+10, "x":75, "y":35, "width":32, "height":32},
## »õ ¹ÝÁö1
##{"index":item.EQUIPMENT_RING1, "x":2, "y":106, "width":32, "height":32},
## »õ ¹ÝÁö2
##{"index":item.EQUIPMENT_RING2, "x":75, "y":106, "width":32, "height":32},
## »õ º§Æ®
{"index":item.EQUIPMENT_BELT, "x":39, "y":106, "width":32, "height":32},
),
},
## Dragon Soul Button
{
"name" : "DSSButton",
"type" : "button",
"x" : 114,
"y" : 107,
"tooltip_text" : uiScriptLocale.TASKBAR_DRAGON_SOUL,
"default_image" : "d:/ymir work/ui/dragonsoul/dss_inventory_button_01.tga",
"over_image" : "d:/ymir work/ui/dragonsoul/dss_inventory_button_02.tga",
"down_image" : "d:/ymir work/ui/dragonsoul/dss_inventory_button_03.tga",
},
## MallButton
{
"name" : "MallButton",
"type" : "button",
"x" : 118,
"y" : 148,
"tooltip_text" : uiScriptLocale.MALL_TITLE,
"default_image" : "d:/ymir work/ui/game/TaskBar/Mall_Button_01.tga",
"over_image" : "d:/ymir work/ui/game/TaskBar/Mall_Button_02.tga",
"down_image" : "d:/ymir work/ui/game/TaskBar/Mall_Button_03.tga",
},
## CostumeButton
{
"name" : "CostumeButton",
"type" : "button",
"x" : 78,
"y" : 5,
"tooltip_text" : uiScriptLocale.COSTUME_TITLE,
"default_image" : "d:/ymir work/ui/game/taskbar/costume_Button_01.tga",
"over_image" : "d:/ymir work/ui/game/taskbar/costume_Button_02.tga",
"down_image" : "d:/ymir work/ui/game/taskbar/costume_Button_03.tga",
},
{
"name" : "Equipment_Tab_01",
"type" : "radio_button",
"x" : 86,
"y" : 161,
"default_image" : "d:/ymir work/ui/game/windows/tab_button_small_01.sub",
"over_image" : "d:/ymir work/ui/game/windows/tab_button_small_02.sub",
"down_image" : "d:/ymir work/ui/game/windows/tab_button_small_03.sub",
"children" :
(
{
"name" : "Equipment_Tab_01_Print",
"type" : "text",
"x" : 0,
"y" : 0,
"all_align" : "center",
"text" : "I",
},
),
},
{
"name" : "Equipment_Tab_02",
"type" : "radio_button",
"x" : 86 + 32,
"y" : 161,
"default_image" : "d:/ymir work/ui/game/windows/tab_button_small_01.sub",
"over_image" : "d:/ymir work/ui/game/windows/tab_button_small_02.sub",
"down_image" : "d:/ymir work/ui/game/windows/tab_button_small_03.sub",
"children" :
(
{
"name" : "Equipment_Tab_02_Print",
"type" : "text",
"x" : 0,
"y" : 0,
"all_align" : "center",
"text" : "II",
},
),
},
),
},
{
"name" : "Inventory_Tab_01",
"type" : "radio_button",
"x" : 10,
"y" : 33 + 191,
"default_image" : "d:/ymir work/ui/game/windows/tab_button_large_01.sub",
"over_image" : "d:/ymir work/ui/game/windows/tab_button_large_02.sub",
"down_image" : "d:/ymir work/ui/game/windows/tab_button_large_03.sub",
"tooltip_text" : uiScriptLocale.INVENTORY_PAGE_BUTTON_TOOLTIP_1,
"children" :
(
{
"name" : "Inventory_Tab_01_Print",
"type" : "text",
"x" : 0,
"y" : 0,
"all_align" : "center",
"text" : "I",
},
),
},
{
"name" : "Inventory_Tab_02",
"type" : "radio_button",
"x" : 10 + 78,
"y" : 33 + 191,
"default_image" : "d:/ymir work/ui/game/windows/tab_button_large_01.sub",
"over_image" : "d:/ymir work/ui/game/windows/tab_button_large_02.sub",
"down_image" : "d:/ymir work/ui/game/windows/tab_button_large_03.sub",
"tooltip_text" : uiScriptLocale.INVENTORY_PAGE_BUTTON_TOOLTIP_2,
"children" :
(
{
"name" : "Inventory_Tab_02_Print",
"type" : "text",
"x" : 0,
"y" : 0,
"all_align" : "center",
"text" : "II",
},
),
},
## Item Slot
{
"name" : "ItemSlot",
"type" : "grid_table",
"x" : 8,
"y" : 246,
"start_index" : 0,
"x_count" : 5,
"y_count" : 9,
"x_step" : 32,
"y_step" : 32,
"image" : "d:/ymir work/ui/public/Slot_Base.sub"
},
{
"name":"Money_Slot",
"type":"button",
"x":8,
"y":28+24,
"horizontal_align":"center",
"vertical_align":"bottom",
"default_image" : "d:/ymir work/ui/public/parameter_slot_05.sub",
"over_image" : "d:/ymir work/ui/public/parameter_slot_05.sub",
"down_image" : "d:/ymir work/ui/public/parameter_slot_05.sub",
"children" :
(
{
"name":"Money_Icon",
"type":"image",
"x":-18,
"y":2,
"image":"d:/ymir work/ui/game/windows/money_icon.sub",
},
{
"name" : "Money",
"type" : "text",
"x" : 3,
"y" : 3,
"horizontal_align" : "right",
"text_horizontal_align" : "right",
"text" : "123456789",
},
),
},
## Print
{
"name":"Premium_Slot",
"type":"button",
"x":8,
"y":28,
"horizontal_align":"center",
"vertical_align":"bottom",
"default_image" : "d:/ymir work/ui/public/parameter_slot_05.sub",
"over_image" : "d:/ymir work/ui/public/parameter_slot_05.sub",
"down_image" : "d:/ymir work/ui/public/parameter_slot_05.sub",
"children" :
(
{
"name":"Premium_Icon",
"type":"image",
"x":-18,
"y":2,
"image":"d:/ymir work/ui/game/windows/money_icon.sub",
},
{
"name" : "Premium",
"type" : "text",
"x" : 3,
"y" : 3,
"horizontal_align" : "right",
"text_horizontal_align" : "right",
"text" : "123456789",
},
),
},
),
},
),
}
Nun öffnet die game.py und sucht nach servercommandlist
In die Liste das einfügen:
Code:
"GetInputStart" : self.GetInputStart,
"GetInputStop" : self.GetInputStop,
"GetInput" : self.GetInput,
"SetQuestIndex" : self.QuestIndexShop,
"SetIsNpc" : self.SetIsNpc,
"SetPrice" : self.SetIsPrice,
"NieMamPP" : self.NieMamPP,
"setPP" : self.__setAchievementPoints,
Unter die Liste das einfügen:
Code:
def NieMamPP(self):
import uiShop
self.wndShop = uiShop.ShopDialog()
self.wndShop.NieMamPP()
def __setAchievementPoints(self, points):
constInfo.ACHIEVEMENT_POINTS = int(points)
self.interface.wndInventory.UpdatePremiumInSlot()
def SetIsPrice(self, value):
self.interface.dlgShop.SetShopPrice(value)
def SetIsNpc(self):
constInfo.IsItemShop = 1
def QuestIndexShop(self, value):
constInfo.IS_QUEST = int(value)
def GetInputStart(self):
constInfo.INPUT_IGNORE = 1
def GetInputStop(self):
constInfo.INPUT_IGNORE = 0
def GetInput(self):
net.SendQuestInputStringPacket(str(constInfo.INPUT_DATA))
In die constinfo.py das einfügen:
Code:
ACHIEVEMENT_POINTS = 0
IS_QUEST = 0
IsItemShop = 0
INPUT_IGNORE = 0
INPUT_DATA = ""
Dann in der uitooltip.py nach der Funktion def SetShopItem suchen - diese löschen und das einfügen:
Code:
def CutMoneyString(self, sourceText, startIndex, endIndex, insertingText, backText):
sourceLength = len(sourceText)
if sourceLength < startIndex:
return backText
text = sourceText[max(0, sourceLength-endIndex):sourceLength-startIndex]
if not text:
return backText
if int(text) <= 0:
return backText
text = str(int(text))
if backText:
backText = " " + backText
return text + insertingText + backText
def NumberToMoneyString(self, number):
if number <= 0:
return "0 Yang"
number = str(number)
result = self.CutMoneyString(number, 0, 4, "", "")
result = self.CutMoneyString(number, 4, 8, "¸¸", result)
result = self.CutMoneyString(number, 8, 12, "¾ï", result)
result = result + " Yang"
return result
def SetShopItem(self, slotIndex, addprice = 0, waltype = 0):
import locale
itemVnum = shop.GetItemID(slotIndex)
if 0 == itemVnum:
return
price = shop.GetItemPrice(slotIndex)
self.ClearToolTip()
self.isShopItem = TRUE
item.SelectItem(itemVnum)
metinSlot = []
for i in xrange(player.METIN_SOCKET_MAX_NUM):
metinSlot.append(shop.GetItemMetinSocket(slotIndex, i))
attrSlot = []
for i in xrange(player.ATTRIBUTE_SLOT_MAX_NUM):
attrSlot.append(shop.GetItemAttribute(slotIndex, i))
self.AddItemData(itemVnum, metinSlot, attrSlot)
if waltype == 0:
self.AppendPrice(price)
else:
self.AppendSpace(5)
self.AppendTextLine("Kosten: %s A-Punkte" % (self.NumberToMoneyString(addprice)[:-5]), self.SPECIAL_TITLE_COLOR)
Dann die uiinventory.py öffnen und die Funktion def RefreshStatus suchen.
Dadrunter das einfügen:
Code:
def UpdatePremiumInSlot(self):
import constInfo
value = str(constInfo.ACHIEVEMENT_POINTS)
self.wndPremium.SetText(str(constInfo.ACHIEVEMENT_POINTS) + " A-Punkte")
Dann in der gleichen Datei nach self.wndMoneySlot = 0 suchen und das dadrunter einfügen:
Code:
self.wndPremium = 0
self.wndPremiumSlot = 0
Dann nach self.wndMoneySlot = self.GetChild("Money_Slot") suchen und das dadrunter einfügen:
Code:
self.wndPremium = self.GetChild("Premium")
self.wndPremiumSlot = self.GetChild("Premium_Slot")
Dann nach der Funktion def SelectEmptySlot suchen, diese löschen und das einfügen:
Code:
def SelectEmptySlot(self, selectedSlotPos):
if constInfo.GET_ITEM_DROP_QUESTION_DIALOG_STATUS() == 1:
return
selectedSlotPos = self.__InventoryLocalSlotPosToGlobalSlotPos(selectedSlotPos)
if mouseModule.mouseController.isAttached():
attachedSlotType = mouseModule.mouseController.GetAttachedType()
attachedSlotPos = mouseModule.mouseController.GetAttachedSlotNumber()
attachedItemCount = mouseModule.mouseController.GetAttachedItemCount()
attachedItemIndex = mouseModule.mouseController.GetAttachedItemIndex()
if player.SLOT_TYPE_INVENTORY == attachedSlotType:
itemCount = player.GetItemCount(attachedSlotPos)
attachedCount = mouseModule.mouseController.GetAttachedItemCount()
self.__SendMoveItemPacket(attachedSlotPos, selectedSlotPos, attachedCount)
if item.IsRefineScroll(attachedItemIndex):
self.wndItem.SetUseMode(FALSE)
elif player.SLOT_TYPE_PRIVATE_SHOP == attachedSlotType:
mouseModule.mouseController.RunCallBack("INVENTORY")
elif player.SLOT_TYPE_SHOP == attachedSlotType:
if constInfo.IsItemShop == 0:
net.SendShopBuyPacket(attachedSlotPos)
else:
import uiShop
self.wndShop = uiShop.ShopDialog()
self.wndShop.BuyFromIS(attachedSlotPos)
elif player.SLOT_TYPE_SAFEBOX == attachedSlotType:
if player.ITEM_MONEY == attachedItemIndex:
net.SendSafeboxWithdrawMoneyPacket(mouseModule.mouseController.GetAttachedItemCount())
snd.PlaySound("sound/ui/money.wav")
else:
net.SendSafeboxCheckoutPacket(attachedSlotPos, selectedSlotPos)
elif player.SLOT_TYPE_MALL == attachedSlotType:
net.SendMallCheckoutPacket(attachedSlotPos, selectedSlotPos)
mouseModule.mouseController.DeattachObject()
Dann die uishop.py öffnen, den kompletten Inhalt löschen und das einfügen:
Code:
import net
import player
import item
import snd
import shop
import net
import wndMgr
import app
import chat
import ui
import uiCommon
import mouseModule
import locale
import constInfo
import event
###################################################################################################
## Shop
class ShopDialog(ui.ScriptWindow):
def __init__(self):
ui.ScriptWindow.__init__(self)
self.tooltipItem = 0
self.xShopStart = 0
self.yShopStart = 0
self.questionDialog = None
self.popup = None
self.itemBuyQuestionDialog = None
self.shopPrice = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
def __del__(self):
ui.ScriptWindow.__del__(self)
def Refresh(self):
getItemID=shop.GetItemID
getItemCount=shop.GetItemCount
setItemID=self.itemSlotWindow.SetItemSlot
for i in xrange(shop.SHOP_SLOT_COUNT):
itemCount = getItemCount(i)
if itemCount <= 1:
itemCount = 0
setItemID(i, getItemID(i), itemCount)
wndMgr.RefreshSlot(self.itemSlotWindow.GetWindowHandle())
def SetShopPrice(self, arg):
slots = arg.split("|")
for i in xrange(40):
self.shopPrice[i] = int(slots[i])
def SetItemData(self, pos, itemID, itemCount, itemPrice):
shop.SetItemData(pos, itemID, itemCount, itemPrice)
def LoadDialog(self):
try:
PythonScriptLoader = ui.PythonScriptLoader()
PythonScriptLoader.LoadScriptFile(self, "UIScript/shopdialog.py")
except:
import exception
exception.Abort("ShopDialog.LoadDialog.LoadObject")
try:
GetObject = self.GetChild
self.itemSlotWindow = GetObject("ItemSlot")
self.btnBuy = GetObject("BuyButton")
self.btnSell = GetObject("SellButton")
self.btnClose = GetObject("CloseButton")
self.titleBar = GetObject("TitleBar")
except:
import exception
exception.Abort("ShopDialog.LoadDialog.BindObject")
self.itemSlotWindow.SetSlotStyle(wndMgr.SLOT_STYLE_NONE)
self.itemSlotWindow.SAFE_SetButtonEvent("LEFT", "EMPTY", self.SelectEmptySlot)
self.itemSlotWindow.SAFE_SetButtonEvent("LEFT", "EXIST", self.SelectItemSlot)
self.itemSlotWindow.SAFE_SetButtonEvent("RIGHT", "EXIST", self.UnselectItemSlot)
self.itemSlotWindow.SetOverInItemEvent(ui.__mem_func__(self.OverInItem))
self.itemSlotWindow.SetOverOutItemEvent(ui.__mem_func__(self.OverOutItem))
self.btnBuy.SetToggleUpEvent(ui.__mem_func__(self.CancelShopping))
self.btnBuy.SetToggleDownEvent(ui.__mem_func__(self.OnBuy))
self.btnSell.SetToggleUpEvent(ui.__mem_func__(self.CancelShopping))
self.btnSell.SetToggleDownEvent(ui.__mem_func__(self.OnSell))
self.btnClose.SetEvent(ui.__mem_func__(self.AskClosePrivateShop))
self.titleBar.SetCloseEvent(ui.__mem_func__(self.Close))
self.Refresh()
def Destroy(self):
self.shopPrice = None
constInfo.IsItemShop = 0
self.Close()
self.ClearDictionary()
self.tooltipItem = 0
self.itemSlotWindow = 0
self.btnBuy = 0
self.btnSell = 0
self.btnClose = 0
self.titleBar = 0
self.questionDialog = None
self.popup = None
def Open(self, vid):
isPrivateShop = FALSE
isMainPlayerPrivateShop = FALSE
import chr
if chr.IsNPC(vid):
isPrivateShop = FALSE
else:
isPrivateShop = TRUE
if player.IsMainCharacterIndex(vid):
isMainPlayerPrivateShop = TRUE
self.btnBuy.Hide()
self.btnSell.Hide()
self.btnClose.Show()
else:
isMainPlayerPrivateShop = FALSE
self.btnBuy.Show()
self.btnSell.Show()
self.btnClose.Hide()
shop.Open(isPrivateShop, isMainPlayerPrivateShop)
self.Refresh()
self.SetTop()
self.Show()
(self.xShopStart, self.yShopStart, z) = player.GetMainCharacterPosition()
def Close(self):
self.shopPrice = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
constInfo.IsItemShop = 0
self.OnCloseQuestionDialog()
shop.Close()
net.SendShopEndPacket()
self.CancelShopping()
self.tooltipItem.HideToolTip()
self.Hide()
def AskClosePrivateShop(self):
questionDialog = uiCommon.QuestionDialog()
questionDialog.SetText(locale.PRIVATE_SHOP_CLOSE_QUESTION)
questionDialog.SetAcceptEvent(ui.__mem_func__(self.OnClosePrivateShop))
questionDialog.SetCancelEvent(ui.__mem_func__(self.OnCloseQuestionDialog))
questionDialog.Open()
self.questionDialog = questionDialog
return TRUE
def OnClosePrivateShop(self):
net.SendChatPacket("/close_shop")
self.OnCloseQuestionDialog()
return TRUE
def OnPressEscapeKey(self):
self.Close()
return TRUE
def OnPressExitKey(self):
self.Close()
return TRUE
def OnBuy(self):
chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.SHOP_BUY_INFO)
app.SetCursor(app.BUY)
self.btnSell.SetUp()
def OnSell(self):
chat.AppendChat(chat.CHAT_TYPE_INFO, locale.SHOP_SELL_INFO)
app.SetCursor(app.SELL)
self.btnBuy.SetUp()
def CancelShopping(self):
self.btnBuy.SetUp()
self.btnSell.SetUp()
app.SetCursor(app.NORMAL)
def __OnClosePopupDialog(self):
self.pop = None
def SellAttachedItem(self):
if shop.IsPrivateShop():
mouseModule.mouseController.DeattachObject()
return
attachedSlotType = mouseModule.mouseController.GetAttachedType()
attachedSlotPos = mouseModule.mouseController.GetAttachedSlotNumber()
attachedCount = mouseModule.mouseController.GetAttachedItemCount()
if player.SLOT_TYPE_INVENTORY == attachedSlotType:
itemIndex = player.GetItemIndex(attachedSlotPos)
item.SelectItem(itemIndex)
if item.IsAntiFlag(item.ITEM_ANTIFLAG_SELL):
popup = uiCommon.PopupDialog()
popup.SetText(locale.SHOP_CANNOT_SELL_ITEM)
popup.SetAcceptEvent(self.__OnClosePopupDialog)
popup.Open()
self.popup = popup
elif player.IsValuableItem(attachedSlotPos):
itemPrice = item.GetISellItemPrice()
if item.Is1GoldItem():
itemPrice = attachedCount / itemPrice / 5
else:
itemPrice = itemPrice * max(1, attachedCount) / 5
itemName = item.GetItemName()
questionDialog = uiCommon.QuestionDialog()
questionDialog.SetText(locale.DO_YOU_SELL_ITEM(itemName, attachedCount, itemPrice))
questionDialog.SetAcceptEvent(lambda arg1=attachedSlotPos, arg2=attachedCount: self.OnSellItem(arg1, arg2))
questionDialog.SetCancelEvent(ui.__mem_func__(self.OnCloseQuestionDialog))
questionDialog.Open()
self.questionDialog = questionDialog
else:
self.OnSellItem(attachedSlotPos, attachedCount)
else:
snd.PlaySound("sound/ui/loginfail.wav")
mouseModule.mouseController.DeattachObject()
def OnSellItem(self, slotPos, count):
net.SendShopSellPacketNew(slotPos, count)
snd.PlaySound("sound/ui/money.wav")
self.OnCloseQuestionDialog()
def NieMamPP(self):
self.popup = uiCommon.PopupDialog()
self.popup.SetText("Du hast nicht genug A-Punkte")
self.popup.SetAcceptEvent(self.__OnClosePopupDialog)
self.popup.Open()
def OnCloseQuestionDialog(self):
if self.questionDialog:
self.questionDialog.Close()
self.questionDialog = None
def SelectEmptySlot(self, selectedSlotPos):
isAttached = mouseModule.mouseController.isAttached()
if isAttached:
self.SellAttachedItem()
def CutMoneyString(self, sourceText, startIndex, endIndex, insertingText, backText):
sourceLength = len(sourceText)
if sourceLength < startIndex:
return backText
text = sourceText[max(0, sourceLength-endIndex):sourceLength-startIndex]
if not text:
return backText
if int(text) <= 0:
return backText
text = str(int(text))
if backText:
backText = " " + backText
return text + insertingText + backText
def UnselectItemSlot(self, selectedSlotPos):
if shop.IsPrivateShop():
self.AskBuyItem(selectedSlotPos)
else:
if constInfo.IsItemShop == 1:
self.BuyFromIS(selectedSlotPos)
else:
net.SendShopBuyPacket(selectedSlotPos)
def NumberToMoneyString(self, number):
if number <= 0:
return "0 Yang"
number = str(number)
result = self.CutMoneyString(number, 0, 4, "", "")
result = self.CutMoneyString(number, 4, 8, "¸¸", result)
result = self.CutMoneyString(number, 8, 12, "¾ï", result)
result = result + " Yang"
return result
def SelectItemSlot(self, selectedSlotPos):
isAttached = mouseModule.mouseController.isAttached()
if isAttached:
self.SellAttachedItem()
else:
if TRUE == shop.IsMainPlayerPrivateShop():
return
curCursorNum = app.GetCursor()
if app.BUY == curCursorNum:
if constInfo.IsItemShop == 1:
self.AskBuyFromIS(selectedSlotPos)
else:
self.AskBuyItem(selectedSlotPos)
elif app.SELL == curCursorNum:
chat.AppendChat(chat.CHAT_TYPE_INFO, locale.SHOP_SELL_INFO)
else:
selectedItemID = shop.GetItemID(selectedSlotPos)
itemCount = shop.GetItemCount(selectedSlotPos)
type = player.SLOT_TYPE_SHOP
if shop.IsPrivateShop():
type = player.SLOT_TYPE_PRIVATE_SHOP
mouseModule.mouseController.AttachObject(self, type, selectedSlotPos, selectedItemID, itemCount)
mouseModule.mouseController.SetCallBack("INVENTORY", ui.__mem_func__(self.DropToInventory))
snd.PlaySound("sound/ui/pick.wav")
def DropToInventory(self):
attachedSlotPos = mouseModule.mouseController.GetAttachedSlotNumber()
self.AskBuyItem(attachedSlotPos, constInfo.IsItemShop)
def BuyFromIS(self, slotPos, type=0):
constInfo.INPUT_DATA = slotPos
event.QuestButtonClick(constInfo.IS_QUEST)
if type == 1:
self.itemBuyQuestionDialog.Close()
self.itemBuyQuestionDialog = None
def AskBuyFromIS(self, slotPos):
itemIndex = shop.GetItemID(slotPos)
itemPrice = shop.GetItemPrice(slotPos)
itemCount = shop.GetItemCount(slotPos)
item.SelectItem(itemIndex)
itemName = item.GetItemName()
itemBuyQuestionDialog = uiCommon.QuestionDialog()
itemBuyQuestionDialog.SetText("Czy chcesz kupić " + itemName + " za " + (self.NumberToMoneyString(self.shopPrice[slotPos])[:-5]) + " TR?")
itemBuyQuestionDialog.SetAcceptEvent(lambda arg=TRUE: self.BuyFromIS(slotPos, 1))
itemBuyQuestionDialog.SetCancelEvent(lambda arg=FALSE: self.AnswerBuyItem(arg, type))
itemBuyQuestionDialog.Open()
itemBuyQuestionDialog.pos = slotPos
self.itemBuyQuestionDialog = itemBuyQuestionDialog
def AskBuyItem(self, slotPos, type=0):
if type == 1:
self.AskBuyFromIS(slotPos)
return
itemIndex = shop.GetItemID(slotPos)
itemPrice = shop.GetItemPrice(slotPos)
itemCount = shop.GetItemCount(slotPos)
item.SelectItem(itemIndex)
itemName = item.GetItemName()
itemBuyQuestionDialog = uiCommon.QuestionDialog()
itemBuyQuestionDialog.SetText(locale.DO_YOU_BUY_ITEM(itemName, itemCount, self.NumberToMoneyString(itemPrice)))
itemBuyQuestionDialog.SetAcceptEvent(lambda arg=TRUE: self.AnswerBuyItem(arg, type))
itemBuyQuestionDialog.SetCancelEvent(lambda arg=FALSE: self.AnswerBuyItem(arg, type))
itemBuyQuestionDialog.Open()
itemBuyQuestionDialog.pos = slotPos
self.itemBuyQuestionDialog = itemBuyQuestionDialog
def AnswerBuyItem(self, flag, type):
if flag:
pos = self.itemBuyQuestionDialog.pos
if type == 0:
net.SendShopBuyPacket(pos)
else:
self.BuyFromIS(pos)
self.itemBuyQuestionDialog.Close()
self.itemBuyQuestionDialog = None
def SetItemToolTip(self, tooltipItem):
self.tooltipItem = tooltipItem
def OverInItem(self, slotIndex):
if mouseModule.mouseController.isAttached():
return
if 0 != self.tooltipItem:
if constInfo.IsItemShop == 0:
self.tooltipItem.SetShopItem(slotIndex, 0, 0)
else:
self.tooltipItem.SetShopItem(slotIndex, self.shopPrice[slotIndex], 1)
def OverOutItem(self):
if 0 != self.tooltipItem:
self.tooltipItem.HideToolTip()
def OnUpdate(self):
USE_SHOP_LIMIT_RANGE = 1000
(x, y, z) = player.GetMainCharacterPosition()
if abs(x - self.xShopStart) > USE_SHOP_LIMIT_RANGE or abs(y - self.yShopStart) > USE_SHOP_LIMIT_RANGE:
self.Close()
class MallPageDialog(ui.ScriptWindow):
def __init__(self):
ui.ScriptWindow.__init__(self)
def __del__(self):
ui.ScriptWindow.__del__(self)
def Destroy(self):
self.ClearDictionary()
def Open(self):
scriptLoader = ui.PythonScriptLoader()
scriptLoader.LoadScriptFile(self, "uiscript/mallpagedialog.py")
self.GetChild("titlebar").SetCloseEvent(ui.__mem_func__(self.Close))
(x, y)=self.GetGlobalPosition()
x+=10
y+=30
MALL_PAGE_WIDTH = 600
MALL_PAGE_HEIGHT = 480
app.ShowWebPage(
"http://metin2.co.kr/08_mall/game_mall/login_fail.htm",
(x, y, x+MALL_PAGE_WIDTH, y+MALL_PAGE_HEIGHT))
self.Lock()
self.Show()
def Close(self):
app.HideWebPage()
self.Unlock()
self.Hide()
def OnPressEscapeKey(self):
self.Close()
return TRUE
MfG iRemix
Special Thanks:
-TheodorPL (verbuggte Vorlage)
P.S: Keiner fickt mit Exodius
|
|
|
04/18/2014, 12:48
|
#2
|
elite*gold: 44
Join Date: Dec 2009
Posts: 1,696
Received Thanks: 3,835
|
Schade das dus Releasen musstest...
System ist einwandfrei.
|
|
|
04/18/2014, 12:49
|
#3
|
Trade Restricted
elite*gold: 0
Join Date: Jun 2013
Posts: 1,332
Received Thanks: 535
|
Quote:
ich release mal den Achievementshop (ohne MySQL Base - alles per Quest), da die Bimbos von He3o mal wieder alle Features verkaufen muss und alles von Exodius klaut.
|
-.- Schade... naja danke für´s Teilen!
|
|
|
04/18/2014, 12:54
|
#4
|
elite*gold: 0
Join Date: Jan 2011
Posts: 1,296
Received Thanks: 1,295
|
Achso ja wir sind die Bimbos die "Sachen" klauen mhm genau :
|
|
|
04/18/2014, 12:54
|
#5
|
elite*gold: 1
Join Date: Apr 2013
Posts: 273
Received Thanks: 236
|
Exodius ich wusste nichtmal das ihr sowas hattet oder jetzt habt nunja unsere Gründe sind da ja eher anderer Natur *Prof. Ente*
Was ich aber nicht verstehe ist das du das jetzt überhaupt released unser Aufbau ist ganz anders wie eurer und wir haben unsere eigenen Ideen mit eingebracht aber was solls
Thx for Share
Mfg
Copy
|
|
|
04/18/2014, 12:56
|
#6
|
elite*gold: 0
Join Date: May 2011
Posts: 2,806
Received Thanks: 8,536
|
The same presider as every year day.
Danke dennoch für das Release :/
Wie immer super Arbeit von dir!
Quote:
Originally Posted by .He3o Copy™
Exodius ich wusste nichtmal das ihr sowas hattet oder jetzt habt nunja unsere Gründe sind da ja eher anderer Natur *Prof. Ente*
Was ich aber nicht verstehe ist das du das jetzt überhaupt released unser Aufbau ist ganz anders wie eurer und wir haben unsere eigenen Ideen mit eingebracht aber was solls
Thx for Share
Mfg
Copy
|
Eig gehts mich ja nichts an und ich will mich auch garnich einmischen weil ich garnich weiß um was es genau geht aber... dein Name passt einfach zu geil zu der Aussage
|
|
|
04/18/2014, 12:57
|
#7
|
elite*gold: 0
Join Date: Mar 2013
Posts: 2,449
Received Thanks: 6,448
|
Komisch, ihr habt immer die Features von Exodius aber wisst nie, dass Exodius die auch hat.
Was könnt ihr eigentlich?
Ihr seid er Ansicht, wenn es ein anderer Code ist, ist es nicht nachmachen oder so.
Guckt mal bei Wikipedia, was das Wort "Nachmache" bedeutet.
|
|
|
04/18/2014, 12:59
|
#8
|
elite*gold: 1
Join Date: Apr 2013
Posts: 273
Received Thanks: 236
|
Quote:
Originally Posted by [iRemix]
Komisch, ihr habt immer die Features von Exodius habt aber nie wisst, dass Exodius die auch hat.
Was könnt ihr eigentlich?
Ihr seid er Ansicht, wenn es ein anderer Code ist, ist es nicht nachmachen oder so.
Guckt mal bei Wikipedia, was das Wort "Nachmache" bedeutet.
|
Wie ich dir schon gesagt habe haben wir das ganze wegen Ephyra2 angefangen da unser Gildenlager nachgemacht wurde. So wollten wir sein AchievementShop nach machen und genauso verkaufen wie er falls du mich verstehst was ich meine das hat aber auch 0% mit euch zutun.
Mfg
Copy
|
|
|
04/18/2014, 13:08
|
#9
|
elite*gold: 47
Join Date: Feb 2014
Posts: 648
Received Thanks: 157
|
die .He3o crew
sind schon 3 armselige kleine Kinder
war klar das die wieder so was machen
schade ums system
|
|
|
04/18/2014, 13:39
|
#10
|
elite*gold: 748
Join Date: Jul 2012
Posts: 1,597
Received Thanks: 1,982
|
Schade das es so sein muss. Aber hey, jetzt hat die Com wieder nen Grund noch beschissener zu sein
peace
|
|
|
04/18/2014, 13:46
|
#11
|
elite*gold: 0
Join Date: Jan 2011
Posts: 1,296
Received Thanks: 1,295
|
Quote:
Originally Posted by .Harlem²
Da ist enivois und enivois hatte ne verbindung zu souli...
Enivois hat ja auch sämtliche design von sora weitergegeben und verkauft.
Schade das es so sein muss. Aber hey, jetzt hat die Com wieder nen Grund noch beschissener zu sein
peace
|
Was hat Enivois damit zutun ? Enivois hatte komplett mit der M2 Szene abgeschlossen und ist aus der Sektion raus gegangen. Vor ein paar Tagen habe ihn wiede in Facebook angeschrieben das er mein BA werden soll und "zurück kommen soll".. Von daher was hat den bitte er damit zutun ?
|
|
|
04/18/2014, 14:04
|
#12
|
elite*gold: 2
Join Date: Jun 2013
Posts: 1,063
Received Thanks: 1,725
|
Quote:
Originally Posted by .He3o Copy™
Wie ich dir schon gesagt habe haben wir das ganze wegen Ephyra2 angefangen da unser Gildenlager nachgemacht wurde. So wollten wir sein AchievementShop nach machen und genauso verkaufen wie er falls du mich verstehst was ich meine das hat aber auch 0% mit euch zutun.
Mfg
Copy
|
xD!
Naja ich geb auchmal mein Senf dazu wie das ganze tatsaechlich aussah, von meiner Seite zum Gildenlager jedenfalls, da ich's erst letztens wem erklaert hab wie es zu der Entwicklung kam.
Ich zensier hier mal keine Namen.
Das erste mal als ich von einem Gildenlager gehoert hab, kam von "Contract2" (Noa und analyze). Ich habe von der Idee durch NiiceOne gehoert, der mich damals dazu beauftragt hat einige Features zu coden, welche aber nicht wirklich seine waren. Als ich dann noch gehoert habe, dass er die Serverfiles geklaut hat, hatte ich ihn verpfiffen an die "Contract2" Leute, da die davon garnix wussten was er abzieht.
Danach war es dann eine Zeit lang ruhig um das Gildenlager.
Als naechstes habt ihr dann euren Verbesserungsthread fuer das Gildenlager erstellt und direkt am selben Tag kam der erste Auftrag rein von .TRON der das Gildenlager genauso haben wollte.
[12.02.2014 19:31:02] ProfEnte: willst du es zu 100% genauso? oder irgendwelche eigenen ideen dafuer
[12.02.2014 19:33:05] .TRON™: Hm eigendlich wie das, außer du kennst noch bessere Stellen
[12.02.2014 19:33:28] ProfEnte: ja nee, nur das es nachher nicht heisst du hast es geklaut
[12.02.2014 19:34:18] .TRON™: Ja kleine Sachen kann man ja ändern
[12.02.2014 19:44:12] ProfEnte: nja ich mach das ganze mal heut oder morgen soweit fertig, vllt faellt mir ja noch was ein
Soweit so gut, das Gildenlager wurde gecoded und er sollte es eig abkaufen. Daraus wurd nix da er irgendwelche Probleme hatte mit seinen Teammembern aufeinmal.
Da ich eine sehr schlaue Ente bin und nicht umsonst arbeite, steht das Gildenlager nun zum oeffentlichen Verkauf.
Und das war es mit meinem Senf, nun bin ich wieder still und aus dem Thread raus.
|
|
|
04/18/2014, 14:21
|
#13
|
elite*gold: 1
Join Date: Apr 2013
Posts: 273
Received Thanks: 236
|
Quote:
Originally Posted by ProfessorEnte
xD!
Naja ich geb auchmal mein Senf dazu wie das ganze tatsaechlich aussah, von meiner Seite zum Gildenlager jedenfalls, da ich's erst letztens wem erklaert hab wie es zu der Entwicklung kam.
Ich zensier hier mal keine Namen.
Das erste mal als ich von einem Gildenlager gehoert hab, kam von "Contract2" (Noa und analyze). Ich habe von der Idee durch NiiceOne gehoert, der mich damals dazu beauftragt hat einige Features zu coden, welche aber nicht wirklich seine waren. Als ich dann noch gehoert habe, dass er die Serverfiles geklaut hat, hatte ich ihn verpfiffen an die "Contract2" Leute, da die davon garnix wussten was er abzieht.
Danach war es dann eine Zeit lang ruhig um das Gildenlager.
Als naechstes habt ihr dann euren Verbesserungsthread fuer das Gildenlager erstellt und direkt am selben Tag kam der erste Auftrag rein von .TRON der das Gildenlager genauso haben wollte.
[12.02.2014 19:31:02] ProfEnte: willst du es zu 100% genauso? oder irgendwelche eigenen ideen dafuer
[12.02.2014 19:33:05] .TRON™: Hm eigendlich wie das, außer du kennst noch bessere Stellen
[12.02.2014 19:33:28] ProfEnte: ja nee, nur das es nachher nicht heisst du hast es geklaut
[12.02.2014 19:34:18] .TRON™: Ja kleine Sachen kann man ja ändern
[12.02.2014 19:44:12] ProfEnte: nja ich mach das ganze mal heut oder morgen soweit fertig, vllt faellt mir ja noch was ein
Soweit so gut, das Gildenlager wurde gecoded und er sollte es eig abkaufen. Daraus wurd nix da er irgendwelche Probleme hatte mit seinen Teammembern aufeinmal.
Da ich eine sehr schlaue Ente bin und nicht umsonst arbeite, steht das Gildenlager nun zum oeffentlichen Verkauf.
Und das war es mit meinem Senf, nun bin ich wieder still und aus dem Thread raus.
|
Deswegen hat deine Kreativität auch zum selben Abschluss der GUI geführt, wie bei uns ,nicht war
Mfg
Copy
|
|
|
04/18/2014, 14:26
|
#14
|
elite*gold: 0
Join Date: Jan 2011
Posts: 143
Received Thanks: 17
|
Quote:
Originally Posted by .He3o Copy™
Deswegen hat deine Kreativität auch zum selben Abschluss der GUI geführt, wie bei uns ,nicht war
Mfg
Copy
|
ich hab mit dem Thema zwar garnix zu tun hier aber:
|
|
|
04/18/2014, 14:51
|
#15
|
elite*gold: 0
Join Date: Mar 2013
Posts: 2,449
Received Thanks: 6,448
|
Könnt ihr nicht woanders flamen?
Haben soweit erstmal alles mit He3o geklärt und 'ne closerequest ist bereits raus - also lasst es gut sein.
|
|
|
|
|
Similar Threads
|
[Zwangs-Release]Aza Homepage
10/03/2013 - Metin2 PServer Guides & Strategies - 12 Replies
http://www.elitepvpers.com/forum/metin2-pserver-gu ides-strategies/2882600-zwangs-release-aza-homepag e-script.html
Die Version², wenn Aza damit ein Problem hat soll er sich bitte bei mir melden.
Screen:http://i.epvpimg.com/CuU3h.jpg
Download:https://mega.co.nz/#!Y8VTXQzS!biNiPBuWfN to14yQ1yG3sn9f6BNJQdneOmVRedixXuw
|
[Release] Zwangs Passwortänderung
07/20/2013 - Metin2 PServer Guides & Strategies - 26 Replies
Hallo e*pvp,
Da ja in letzter Zeit immer mehr Server gehackt werden und oftmals nur die account.sql released werden hatte ich vor einige Zeit mal das Skript für Shiro2 gemacht.
Es ist so aufgebaut das man die Account-ID braucht, das Passwort, ein Charakternamen und die Anzahl der Charaktere. Sollte alles stimmen wird das Passwort geändert und der Accountstatus geht zurück auf OK.
Ihr fügt die sysbugpwchange.php in eurem Pages Ordner ein. Ihr müsst ggf. anpassung an eurem Design machen....
|
[Zwangs-Release] Injashi Homepage
03/16/2013 - Metin2 PServer Guides & Strategies - 33 Replies
Hallo Leute, da ich gesehen habe das viele, sehr viele Leute meine Gekaufte Homepage Rippen und weiter verkaufen, sehe ich mich gezwungen diese nun öffentlich zu machen.
Es handelt sich, wie ihr Sicherlich schon um die Injashi Homepage von Chris ( iKyroja ), welche so Aussieht :
http://fc04.deviantart.net/fs71/f/2012/189/3/0/in jashi_webdesign_by_ikyroja-d56g85e.jpg
Diese Homepage bietet euch :
Komplette anpassung in HTML und CSS.
Ein Funktionierender und einfacher jQuery Slider.
|
[Re-Release]Achievementshop Quest
02/19/2012 - Metin2 PServer Guides & Strategies - 26 Replies
Joa, wie wohl damals bekannt wurde, wurde mein damaliger Server, der inzwischen nicht mehr existiert wohl einmal ausgeräumt.
Die Achievementshop Quest ist meine Quest, genauso wie damals der verbuggte Ranking Quest.
Werde nacher einfach meine Files releasen, da die ja anscheinend immernoch schön gekauft werden, sodass die, die ihr Geld da reingesteckt haben schön dumm aussehen dürfen ;)
Dazu überlege ich mir den Tradehack(Video mitsamt Thread folgt^^) zu publizieren.
Zum...
|
All times are GMT +2. The time now is 15:49.
|
|