Üdv!
Hogy tudnám kivitelezni ezt https://metin2dev.org/board/index.php?/topic/17071-gf-v175-active-pet-seal-effect/ a kis módosítást a meglevő questes mountsystemeken, azaz mikor aktiválódik egy pecsét és a karakter egy mountot ride-ol, akkor a leltárban ill a tálcán is jelzi a játék, hogy az adott pecsét aktiválva van?
Jó, tom lehet maradi az elgondolás és már 2014-ben meg kellett volna nyitnom egy ilyen témát, de azért biztosra venném, hogy jópár fórumozót érdekelne ez a fejlesztés.
Előre is köszönöm a segítséget!
most mivel slotba rakja a mount pecsétet, így fölösleges arra :D
http://metin2hungary.net/index.php/topic,201359.msg1064544.html#msg1064544
Gondolom nem használ emiatt sem costume_mountot, sem sima felvehetőset.
Mondjuk az a delay szerintem olyan kicsi, hogy én ameddig nem láttam a témát, észre sem vettem.
Hasonlóképpen megoldható a dolog, mint a petes, mindössze questben módosítod a tárgy socket értékét és kliens oldalon meg megírod melyik tárgyakat vegye figyelembe mountként.
valahogy így? quest ride begin
state start begin
function Ride( vnum, remain_time )
ride_info = {
[52001] = { 20116, 60*60*24*365, apply.ATTBONUS_MONSTER, 0, 1, false, true }, --Ez egy vadkan
}
if pc.level < ride_info[vnum][5] then
syschat("Még nincs meg a szinted.")
else
if ride_info[vnum][2] == 0 and remain_time != 0 then
pc.mount( ride_info[vnum][1], remain_time*60 )
pc.mount_bonus( ride_info[vnum][3], ride_info[vnum][4], remain_time*60 )
else
pc.mount( ride_info[vnum][1], ride_info[vnum][2] )
pc.mount_bonus( ride_info[vnum][3], ride_info[vnum][4], ride_info[vnum][2] )
end
if true == ride_info[vnum][6] then
pc.remove_item(vnum, 1)
end
end
end
when login begin
local vnum, remain_time = pc.get_special_ride_vnum()
if 0 != vnum then
ride.Ride(vnum, remain_time)
end
end
when 52001.use begin
if pc.is_polymorphed() then
syschat("Próbáld újra ha nem vagy átváltoztva.")
elseif false == pc.is_riding() then
if true == horse.is_summon() then
horse.unsummon()
end
item.set_socket(1) -->tom, hogy kinda bullshit de a bekapcsolása megy
ride.Ride(item.vnum, 0)
else
item.set_socket(1) --> csak a kikapcsolásával adódnak gondjaim o_o
pc.unmount()
chat("Leszálltál a hátasodról.")
end
end
end
end
~Az effekt működik, csak a leszállás utáni kikapcsolása kérdésesebb, mert az effekt még mindig fut?!
Idézelseif false == pc.is_riding() then
if true == horse.is_summon() then
horse.unsummon()
end
item.set_socket(1) -->tom, hogy kinda bullshit de a bekapcsolása megy
ride.Ride(item.vnum, 0)
else
item.set_socket(1) --> csak a kikapcsolásával adódnak gondjaim o_o
pc.unmount()
chat("Leszálltál a hátasodról.")
end
Nulla kellene szerintem oda.
Yes... egy kis elírás, de már cseréltem, visszatöltöttem, qc-ztem, relogoltam, /reload questeztem, /ipztem, újralehívtam és újra bekapcsoltam, majd kikapcsoltam, de az effekt el se akar indulni?
uitaskbar
## QuickSlot
def RefreshQuickSlot(self):
pageNum = player.GetQuickPage()
try:
self.quickPageNumImageBox.LoadImage(TaskBar.QUICKPAGE_NUMBER_FILENAME[pageNum])
except:
pass
startNumber = 0
for slot in self.quickslot:
for i in xrange(4):
slotNumber = i+startNumber
(Type, Position) = player.GetLocalQuickSlot(slotNumber)
if player.SLOT_TYPE_NONE == Type:
slot.ClearSlot(slotNumber)
continue
if player.SLOT_TYPE_INVENTORY == Type:
itemIndex = player.GetItemIndex(Position)
itemCount = player.GetItemCount(Position)
if itemCount <= 1:
itemCount = 0
## ŔÚµżą°ľŕ (#72723, #72724) ĆŻĽöĂł¸® - ľĆŔĚĹŰŔεĄµµ ˝˝·Ôżˇ ȰĽşČ/şńȰĽşČ ÇĄ˝Ă¸¦ Ŕ§ÇŃ ŔŰľ÷ŔÓ - [hyo]
if constInfo.IS_AUTO_POTION(itemIndex):
# metinSocket - [0] : ȰĽşČ ż©şÎ, [1] : »çżëÇŃ ľç, [2] : ĂÖ´ë żë·®
metinSocket = [player.GetItemMetinSocket(Position, j) for j in xrange(player.METIN_SOCKET_MAX_NUM)]
if 0 != int(metinSocket[0]):
slot.ActivateSlot(slotNumber)
else:
slot.DeactivateSlot(slotNumber)
##PET
elif itemIndex >= 53001 and itemIndex <= 53999:
metinSocket = [int(player.GetItemMetinSocket(Position, j)) for j in xrange(player.METIN_SOCKET_MAX_NUM)]
if 0 != metinSocket[1]:
slot.ActivateSlot(slotNumber)
else:
slot.DeactivateSlot(slotNumber)
##PET
##MOUNT
elif itemIndex >= 52000 and itemIndex <= 52999:
metinSocket = [int(player.GetItemMetinSocket(Position, j)) for j in xrange(player.METIN_SOCKET_MAX_NUM)]
if 0 != metinSocket[1]:
slot.ActivateSlot(slotNumber)
else:
slot.DeactivateSlot(slotNumber)
##MOUNT
slot.SetItemSlot(slotNumber, itemIndex, itemCount)
uiinventory részlet:
def RefreshBagSlotWindow(self):
getItemVNum=player.GetItemIndex
getItemCount=player.GetItemCount
setItemVNum=self.wndItem.SetItemSlot
for i in xrange(player.INVENTORY_PAGE_SIZE):
slotNumber = self.__InventoryLocalSlotPosToGlobalSlotPos(i)
itemCount = getItemCount(slotNumber)
# itemCount == 0ŔĚ¸é ĽŇÄĎŔ» şńżî´Ů.
if 0 == itemCount:
self.wndItem.ClearSlot(i)
continue
elif 1 == itemCount:
itemCount = 0
itemVnum = getItemVNum(slotNumber)
setItemVNum(i, itemVnum, itemCount)
## ŔÚµżą°ľŕ (HP: #72723 ~ #72726, SP: #72727 ~ #72730) ĆŻĽöĂł¸® - ľĆŔĚĹŰŔεĄµµ ˝˝·Ôżˇ ȰĽşČ/şńȰĽşČ ÇĄ˝Ă¸¦ Ŕ§ÇŃ ŔŰľ÷ŔÓ - [hyo]
if constInfo.IS_AUTO_POTION(itemVnum):
# metinSocket - [0] : ȰĽşČ ż©şÎ, [1] : »çżëÇŃ ľç, [2] : ĂÖ´ë żë·®
metinSocket = [player.GetItemMetinSocket(slotNumber, j) for j in xrange(player.METIN_SOCKET_MAX_NUM)]
#if slotNumber >= player.INVENTORY_PAGE_SIZE:
# slotNumber -= player.INVENTORY_PAGE_SIZE
if slotNumber >= player.INVENTORY_PAGE_SIZE:
slotNumber -= player.INVENTORY_PAGE_SIZE
isActivated = 0 != metinSocket[0]
if isActivated:
self.wndItem.ActivateSlot(slotNumber)
potionType = 0;
if constInfo.IS_AUTO_POTION_HP(itemVnum):
potionType = player.AUTO_POTION_TYPE_HP
elif constInfo.IS_AUTO_POTION_SP(itemVnum):
potionType = player.AUTO_POTION_TYPE_SP
usedAmount = int(metinSocket[1])
totalAmount = int(metinSocket[2])
player.SetAutoPotionInfo(potionType, isActivated, (totalAmount - usedAmount), totalAmount, self.__InventoryLocalSlotPosToGlobalSlotPos(i))
else:
self.wndItem.DeactivateSlot(slotNumber)
self.wndItem.RefreshSlot()
##PET
if 53000 <= itemVnum and 53999 >= itemVnum:
metinSocket = [player.GetItemMetinSocket(slotNumber, j) for j in xrange(player.METIN_SOCKET_MAX_NUM)]
if slotNumber >= player.INVENTORY_PAGE_SIZE*self.inventoryPageIndex:
slotNumber -= player.INVENTORY_PAGE_SIZE*self.inventoryPageIndex
isActivated = 0 != metinSocket[1]
if isActivated:
self.wndItem.ActivateSlot(slotNumber)
self.wndItem.RefreshSlot()
else:
self.wndItem.DeactivateSlot(slotNumber)
self.wndItem.RefreshSlot()
##PET
##MOUNT
if 52000 <= itemVnum and 52999 >= itemVnum:
metinSocket = [player.GetItemMetinSocket(slotNumber, j) for j in xrange(player.METIN_SOCKET_MAX_NUM)]
if slotNumber >= player.INVENTORY_PAGE_SIZE*self.inventoryPageIndex:
slotNumber -= player.INVENTORY_PAGE_SIZE*self.inventoryPageIndex
isActivated = 0 != metinSocket[1]
if isActivated:
self.wndItem.ActivateSlot(slotNumber)
self.wndItem.RefreshSlot()
else:
self.wndItem.DeactivateSlot(slotNumber)
self.wndItem.RefreshSlot()
##MOUNT
Szia, próbáld meg így, hátha.
quest ride begin
state start begin
function Ride( vnum, remain_time )
ride_info = {
[52001] = { 20116, 60*60*24*365, apply.ATTBONUS_MONSTER, 0, 1, false, true }, --Ez egy vadkan
}
if pc.level < ride_info[vnum][5] then
syschat("Még nincs meg a szinted.")
else
if ride_info[vnum][2] == 0 and remain_time != 0 then
pc.mount( ride_info[vnum][1], remain_time*60 )
pc.mount_bonus( ride_info[vnum][3], ride_info[vnum][4], remain_time*60 )
else
pc.mount( ride_info[vnum][1], ride_info[vnum][2] )
pc.mount_bonus( ride_info[vnum][3], ride_info[vnum][4], ride_info[vnum][2] )
end
if true == ride_info[vnum][6] then
pc.remove_item(vnum, 1)
end
end
end
when login begin
local vnum, remain_time = pc.get_special_ride_vnum()
if 0 != vnum then
ride.Ride(vnum, remain_time)
end
end
when 52001.use begin
if pc.is_polymorphed() then
syschat("Próbáld újra ha nem vagy átváltoztva.")
elseif false == pc.is_riding() then
if true == horse.is_summon() then
horse.unsummon()
end
item.set_socket(1,1) -->tom, hogy kinda bullshit de a bekapcsolása megy
ride.Ride(item.vnum, 0)
else
item.set_socket(1,0) --> csak a kikapcsolásával adódnak gondjaim o_o
pc.unmount()
chat("Leszálltál a hátasodról.")
end
end
end
end
Köszönöm, ment a plussz és a dolog remekel! Zárom a témát! ;D
Üzenet összefésülés: 2018-09-04, 19:39:51
A ctrl+ G-s parancs eltávolításáról kérhetnék egy gyors pár soros javaslatot? ;D
Ki akarod venni?
game.py:
def __PressGKey(self):
if app.IsPressed(app.DIK_LCONTROL) or app.IsPressed(app.DIK_RCONTROL):
net.SendChatPacket("/ride")
else:
if self.ShowNameFlag:
self.interface.ToggleGuildWindow()
else:
app.PitchCamera(app.CAMERA_TO_POSITIVE)
to
def __PressGKey(self):
if self.ShowNameFlag:
self.interface.ToggleGuildWindow()
else:
app.PitchCamera(app.CAMERA_TO_POSITIVE)
Szerintem nem kiakarja venni, mivel sokan úgy szokták meg(köztük én is). Úgy szeretné, hogy amikor ctrl+g-vel leszállnak róla, akkor leszedje az effektet az ikonról.
Nyilván úgy lenne célszerű, ezért is kérdeztem meg.
IdézA ctrl+ G-s parancs eltávolításáról
Csakhát ugye nem az effekt hanem a parancs eltávolítását írta.
Amúgy a /ride parancshoz forrásban simán oda kell írni a socket állítást mint a peteknél.
pItem->SetSocket(1, TRUE); (be)
pItem->SetSocket(1, FALSE); (ki)
(pItem lehet más néven fut, most nem tudom megnézni)
Pontosan hogyan gondoltad?
Hát én úgy akartam csinálni, ahogy de ha már valaki bölcset kérdez, akkor nem állhatok meg a saját igényeimnél... Am ezutóbbi módosítás a forrás game\src\cmd.cpp-s parancsainál lenne a kiegészítés?
cmd_general.cpp ACMD(do_ride)-ba kell, bár most belenéztem és csak úgy simán nem lehet beleírni mint pl a peteknél, lesz vele egy kis munka :D
Esetleg így?
ACMD(do_unmount)
{
if (true == ch->UnEquipSpecialRideUniqueItem())
{
for (WORD i = 0; i < INVENTORY_MAX_NUM; ++i)
{
LPITEM pkItem = ch->GetItem(TItemPos(INVENTORY, i));
if (pkItem && !pkItem->IsRideItem() && UNIQUE_GROUP_SPECIAL_RIDE == pkItem->GetSpecialGroup() && pkItem->GetSocket(1) == TRUE)
{
pkItem->SetSocket(1, FALSE);
}
}
ch->RemoveAffect(AFFECT_MOUNT);
ch->RemoveAffect(AFFECT_MOUNT_BONUS);
if (ch->IsHorseRiding())
{
ch->StopRiding();
}
}
else
{
ch->ChatPacket( CHAT_TYPE_INFO, LC_TEXT("ŔÎşĄĹ丮°ˇ ˛Ë Â÷Ľ ł»¸± Ľö ľř˝Ŕ´Ď´Ů."));
}
}
Várj és és az unmount hol teszi zéróra a socketet?
pkItem->SetSocket(1, FALSE);
Üzenet összefésülés: 2018-09-05, 18:42:00
Köszi P3NG3R, de sajnos nem akar működni, nem szedi le az effektet róla.
nos a módosítás tényleg két rebuild után se nagyon kapcsolta ki az effektet az unmount résznél, szóval jó okkal kérdeztem az előbbi kommentemnél azt a socket dolgot :D
esetleg valahogy másképpen? :o
A pecsét Vnumja benne van a special_item_group.txt 10030-as csoportban?
erre gondolsz?
Group Mounts
{
Vnum 10030
1 52001 1 1
}
Ó, thenx már jó' 8)