diff --git a/language.version b/language.version index ad2bb219d..d09e0b803 100644 --- a/language.version +++ b/language.version @@ -1,3 +1,3 @@ [default] -SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r1169 \cu(Fri Jan 17 14:53:24 CET 2025)\c-"; -SWWM_SHORTVER="\cw1.3pre r1169 \cu(2025-01-17 14:53:24)\c-"; +SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r1170 \cu(sáb 25 ene 2025 14:18:43 CET)\c-"; +SWWM_SHORTVER="\cw1.3pre r1170 \cu(2025-01-25 14:18:43)\c-"; diff --git a/zscript/handler/swwm_handler_process.zsc b/zscript/handler/swwm_handler_process.zsc index 6ef4a6c2f..999b62547 100644 --- a/zscript/handler/swwm_handler_process.zsc +++ b/zscript/handler/swwm_handler_process.zsc @@ -1,8 +1,6 @@ // event processing extend Class SWWMHandler { - // for menu events - transient Array checklist; // for the compact hud transient int WeaponFlash[10]; // weapon selector @@ -214,6 +212,91 @@ extend Class SWWMHandler bar.cummspandn = 120+40*int(Log10(clamp(bar.cummscoredn,1,999999999))); bar.cummflashdn = 15; } + else if ( e.Name ~== "swwmitemused" ) + { + // report back to kbase menu that the item got (or did not get) used + int uid = e.Args[0]; + bool rslt = e.Args[1]; + bool usedup = e.Args[2]; + let kbase = DemolitionistMenu(Menu.GetCurrentMenu()); + if ( kbase ) kbase.ItemUsed(uid,rslt,usedup); + } + else if ( e.Name ~== "swwmitemdropped" ) + { + // report back to kbase menu that the item got (or did not get) dropped + int uid = e.Args[0]; + bool rslt = e.Args[1]; + bool usedup = e.Args[2]; + let kbase = DemolitionistMenu(Menu.GetCurrentMenu()); + if ( kbase ) kbase.ItemDropped(uid,rslt,usedup); + } + } + + override void NetworkCommandProcess( NetworkCommand cmd ) + { + if ( cmd.Command == 'swwmuseitem' ) + { + // kbase menu wants us to use a specific item + int uid = cmd.ReadInt(); + int pid = cmd.ReadInt(); + uint iid = cmd.ReadInt(); + let p = players[pid]; + let i = Inventory(GetNetworkEntity(iid)); + if ( (i.Owner != p.mo) ) + ThrowAbortException("swwmuseitem: attempted to use item '%s' not owned by player '%s'",i.GetTag(),p.GetUserName()); + bool rslt = p.mo.UseInventory(i); + let w = Weapon(i); + if ( w ) + { + rslt = (p.PendingWeapon==Weapon(i)); + // dual wield gun support + if ( (i is 'SWWMWeapon') && (p.PendingWeapon==Weapon(i).SisterWeapon) ) + rslt = true; + } + else if ( (i is 'Key') || (i is 'SWWMCollectible') ) rslt = true; + SendInterfaceEvent(pid,"swwmitemused",uid,rslt,(!i||(i.Amount<=0))); + } + else if ( cmd.Command == 'swwmdropitem' ) + { + // kbase menu wants us to drop a specific item + int uid = cmd.ReadInt(); + int pid = cmd.ReadInt(); + uint iid = cmd.ReadInt(); + let p = players[pid]; + let i = Inventory(GetNetworkEntity(iid)); + if ( (i.Owner != p.mo) ) + ThrowAbortException("swwmdropitem: attempted to drop item '%s' not owned by player '%s'",i.GetTag(),p.GetUserName()); + int amt = i.default.Amount; + // if it's an ammo, check the largest unit givable + if ( i is 'MagAmmo' ) + { + foreach ( cls:AllActorClasses ) + { + let a = (Class)(cls); + if ( !a || (a.GetParentClass() != i.GetClass()) || (GetDefaultByType(a).Amount < amt) ) continue; + amt = GetDefaultByType(a).Amount; + } + } + else if ( i is 'Ammo' ) + { + foreach ( cls:AllActorClasses ) + { + let a = (Class)(cls); + if ( !a || (a.GetParentClass() != i.GetClass()) || (GetDefaultByType(a).Amount < amt) ) continue; + amt = GetDefaultByType(a).Amount; + } + } + if ( amt > i.Amount ) amt = i.Amount; + let drop = p.mo.DropInventory(i,amt); + // randomize movement direction so multiple drops don't get bunched together + if ( drop ) + { + Vector2 vel2d = drop.vel.xy; + drop.vel.xy = Actor.RotateVector(vel2d,FRandom[Junk](-15,15)); + drop.vel.xy *= FRandom[Junk](.9,1.1); + } + SendInterfaceEvent(pid,"swwmitemdropped",uid,!!drop,(!i||(i.Amount<=0))); + } } override void NetworkProcess( ConsoleEvent e ) @@ -466,79 +549,6 @@ extend Class SWWMHandler let idx = l.FindEntry(e.Name.Mid(17)); l.MarkRead(idx); } - else if ( e.Name.Left(12) ~== "swwmuseitem." ) - { - Class item = e.Name.Mid(12); - if ( !item ) return; - let i = players[e.Args[0]].mo.FindInventory(item); - if ( !i ) return; - bool rslt = players[e.Args[0]].mo.UseInventory(i); - if ( e.Args[0] == consoleplayer ) - { - let t = new("MenuTransaction"); - t.uid = e.Args[1]; - t.type = MenuTransaction.TT_ITEMUSE; - let w = (Class)(item); - if ( w ) - { - t.result = (players[e.Args[0]].PendingWeapon==Weapon(i)); - // dual wield gun support - if ( (i is 'SWWMWeapon') && (players[e.Args[0]].PendingWeapon==Weapon(i).SisterWeapon) ) - t.result = true; - } - else if ( (i is 'Key') || (i is 'SWWMCollectible') ) t.result = true; - else t.result = rslt; - t.used = item; - t.usedup = (!i||(i.Amount<=0)); - checklist.Push(t); - } - } - else if ( e.Name.Left(13) ~== "swwmdropitem." ) - { - Class item = e.Name.Mid(13); - if ( !item ) return; - let i = players[e.Args[0]].mo.FindInventory(item); - if ( !i ) return; - int amt = i.default.Amount; - // if it's an ammo, check the largest unit givable - if ( i is 'Ammo' ) - { - foreach ( cls:AllActorClasses ) - { - let a = (Class)(cls); - if ( !a || (a.GetParentClass() != item) || (GetDefaultByType(a).Amount < amt) ) continue; - amt = GetDefaultByType(a).Amount; - } - } - if ( i is 'MagAmmo' ) - { - foreach ( cls:AllActorClasses ) - { - let a = (Class)(cls); - if ( !a || (a.GetParentClass() != item) || (GetDefaultByType(a).Amount < amt) ) continue; - amt = GetDefaultByType(a).Amount; - } - } - if ( amt > i.Amount ) amt = i.Amount; - let drop = players[e.Args[0]].mo.DropInventory(i,amt); - // randomize movement direction so multiple drops don't get bunched together - if ( drop ) - { - Vector2 vel2d = drop.vel.xy; - drop.vel.xy = Actor.RotateVector(vel2d,FRandom[Junk](-15,15)); - drop.vel.xy *= FRandom[Junk](.9,1.1); - } - if ( e.Args[0] == consoleplayer ) - { - let t = new("MenuTransaction"); - t.uid = e.Args[1]; - t.type = MenuTransaction.TT_ITEMDROP; - t.used = item; - t.result = drop; - t.usedup = (!i||(i.Amount<=0)); - checklist.Push(t); - } - } else if ( e.Name ~== "swwmkoraxline" ) { if ( consoleplayer != e.Args[1] ) return; @@ -579,21 +589,6 @@ extend Class SWWMHandler Console.PrintfEx(PRINT_CHAT,"\cx%s\cx: %s\c-",players[e.Args[0]].GetUserName(),txt); } } - else if ( e.Name ~== "swwmcleartransaction" ) - { - if ( e.Args[1] != consoleplayer ) return; - for ( int i=0; i used; - bool result, usedup; -} - enum EKMenuKey { MK_DOWN, @@ -45,9 +32,7 @@ Class DemolitionistMenu : GenericMenu int muns; // other text String clockstr, munstr; - // for checks (duh) - Array checklist; - int lasttuid; + // cached pointers to mod handlers SWWMHandler hnd; SWWMStaticHandler shnd; // seeeeecret @@ -341,7 +326,6 @@ Class DemolitionistMenu : GenericMenu let bar = SWWMStatusBar(StatusBar); if ( bar ) bar.TickInterpolators(); } - CheckTransactions(); // update time string clockstr = CrimeTime(c_year,c_month,c_day,c_hour,c_minute,c_tz); // update money diff --git a/zscript/kbase/swwm_kbase_priv.zsc b/zscript/kbase/swwm_kbase_priv.zsc index 85d1bdc17..1df2d6d0a 100644 --- a/zscript/kbase/swwm_kbase_priv.zsc +++ b/zscript/kbase/swwm_kbase_priv.zsc @@ -176,69 +176,4 @@ extend Class DemolitionistMenu if ( shortform ) return String.Format("%02d:%02d",h,mn); return String.Format("%04d-%02d-%02d %02d:%02d %s",y,m+1,d+1,h,mn,c_tz); } - - // ui->play transaction checks - private void CheckTransactions() - { - for ( int i=0; i)(hnd.checklist[j].used); - if ( w ) - { - // play if actually switching - if ( hnd.checklist[j].result ) - { - String snd = GetDefaultByType(w).UpSound; - MenuSound(snd); - } - } - else if ( (hnd.checklist[j].used is 'SWWMCollectible') || (hnd.checklist[j].used is 'Key') ) - MenuSound("demolitionist/handsup"); - else - { - String snd = GetDefaultByType(hnd.checklist[j].used).UseSound; - MenuSound(snd); - } - } - } - else - { - tmsg = StringTable.Localize("$SWWM_INVFAIL"); - tmsgtic = MenuTime()+70; - MenuSound("menu/noinvuse"); - } - } - else if ( checklist[i].type == MenuTransaction.TT_ITEMDROP ) - { - // check if drop succeeded - if ( !hnd.checklist[j].result ) - { - tmsg = StringTable.Localize("$SWWM_INVNDROP"); - tmsgtic = MenuTime()+70; - MenuSound("menu/noinvuse"); - } - } - EventHandler.SendNetworkEvent("swwmcleartransaction",checklist[i].uid,consoleplayer); - deleteme = true; - break; - } - if ( !deleteme ) continue; - checklist.Delete(i); - i--; - } - } } diff --git a/zscript/kbase/swwm_kbasetab_inventory.zsc b/zscript/kbase/swwm_kbasetab_inventory.zsc index 1fac00cf1..22acd92b6 100644 --- a/zscript/kbase/swwm_kbasetab_inventory.zsc +++ b/zscript/kbase/swwm_kbasetab_inventory.zsc @@ -208,6 +208,20 @@ Class DemolitionistInventoryTab : DemolitionistMenuTab return false; } + // notified that this item has already been used up, so remove it from the list + void UsedUp( Class itm ) + { + for ( int i=0; i i ) invlist.selected = max(0,invlist.selected-1); + i--; + } + } + override void Ticker() { bool mustsort = false; @@ -472,6 +486,99 @@ Class DemolitionistInventoryTab : DemolitionistMenuTab } } +// item use/drop transaction handling +Class MenuTransaction +{ + enum ETransactionType + { + TT_ITEMUSE, + TT_ITEMDROP + }; + int uid, type; + Class used; + bool skipresult; +} + +extend Class DemolitionistMenu +{ + Array checklist; + int lasttuid; + + void ItemUsed( int uid, bool result, bool usedup ) + { + for ( int i=0; i)(checklist[i].used); + if ( w ) + { + // play if actually switching + if ( result ) + { + String snd = GetDefaultByType(w).UpSound; + MenuSound(snd); + } + } + else if ( (checklist[i].used is 'SWWMCollectible') || (checklist[i].used is 'Key') ) + MenuSound("demolitionist/handsup"); + else + { + String snd = GetDefaultByType(checklist[i].used).UseSound; + MenuSound(snd); + } + } + } + else + { + tmsg = StringTable.Localize("$SWWM_INVFAIL"); + tmsgtic = MenuTime()+70; + MenuSound("menu/noinvuse"); + } + if ( usedup ) + { + int j = FindTabType('DemolitionistInventoryTab'); + if ( j != -1 ) DemolitionistInventoryTab(tabs[j]).UsedUp(checklist[i].used); + } + checklist.Delete(i); + i--; + } + } + + void ItemDropped( int uid, bool result, bool usedup ) + { + for ( int i=0; i