DayZ 1.30
DayZ Explorer by KGB
 
Загрузка...
Поиск...
Не найдено

◆ SoundCookingStart()

void ReplaceEdibleWithNewLambda::SoundCookingStart ( string sound_name)
protected

См. определение в файле Edible_Base.c строка 1817

1817 : ItemBase
1818{
1819 const string DIRECT_COOKING_SLOT_NAME = "DirectCooking";
1820
1821 const string SOUND_BAKING_START = "Baking_SoundSet";
1822 const string SOUND_BAKING_DONE = "Baking_Done_SoundSet";
1823 const string SOUND_BOILING_START = "Boiling_SoundSet";
1824 const string SOUND_BOILING_DONE = "Boiling_Done_SoundSet";
1825 const string SOUND_DRYING_START = "Drying_SoundSet";
1826 const string SOUND_DRYING_DONE = "Drying_Done_SoundSet";
1827 const string SOUND_BURNING_DONE = "Food_Burning_SoundSet";
1828
1829 protected bool m_MakeCookingSounds;
1830 protected SoundOnVehicle m_SoundCooking;
1832 protected string m_SoundPlaying;
1833 ref FoodStage m_FoodStage;
1834 protected float m_DecayTimer;
1835 protected float m_DecayDelta = 0.0;
1838
1840
1841 void Edible_Base()
1842 {
1843 if (HasFoodStage())
1844 {
1845 m_FoodStage = new FoodStage(this);
1846
1847 RegisterNetSyncVariableInt("m_FoodStage.m_FoodStageType", FoodStageType.NONE, FoodStageType.COUNT);
1848 RegisterNetSyncVariableFloat("m_FoodStage.m_CookingTime", 0, 600, 0);
1849
1850 m_SoundPlaying = "";
1852 RegisterNetSyncVariableInt("m_CookedByMethod", CookingMethodType.NONE, CookingMethodType.COUNT);
1853 RegisterNetSyncVariableBool("m_MakeCookingSounds");
1854 }
1855 }
1856
1857 override void EEInit()
1858 {
1859 super.EEInit();
1860
1861 UpdateVisualsEx(true); //forced init visuals, mostly for debugs and SP
1862 }
1863
1864 override void EEDelete(EntityAI parent)
1865 {
1866 super.EEDelete(parent);
1867
1868 RemoveAudio();
1869
1871 m_HotVaporParticle.Stop();
1872 }
1873
1874 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
1875 {
1876 super.EEItemLocationChanged(oldLoc, newLoc);
1877
1879 if (oldLoc.GetType() == InventoryLocationType.ATTACHMENT || oldLoc.GetType() == InventoryLocationType.CARGO)
1880 {
1881 switch (oldLoc.GetParent().GetType())
1882 {
1883 case "FryingPan":
1884 case "Pot":
1885 case "Cauldron":
1886 case "SharpWoodenStick":
1887 MakeSoundsOnClient(false);
1888 break;
1889 }
1890
1892 if (oldLoc.GetSlot() > -1 && InventorySlots.GetSlotName(oldLoc.GetSlot()).Contains(DIRECT_COOKING_SLOT_NAME))
1893 {
1894 MakeSoundsOnClient(false);
1895 }
1896 }
1897
1898 if (oldLoc.IsValid())
1900
1901 if (CanHaveTemperature())
1903 }
1904
1905 void UpdateVisualsEx(bool forced = false)
1906 {
1907 if (GetFoodStage())
1908 GetFoodStage().UpdateVisualsEx(forced);
1909 }
1910
1911 bool Consume(float amount, PlayerBase consumer)
1912 {
1913 AddQuantity(-amount, false, false);
1914 OnConsume(amount, consumer);
1915
1916 return true;
1917 }
1918
1919 void OnConsume(float amount, PlayerBase consumer)
1920 {
1922 {
1923 consumer.ProcessDirectDamage(DamageType.CUSTOM, this, "", "EnviroDmg", "0 0 0", PlayerConstants.CONSUMPTION_DAMAGE_PER_BITE);
1924 }
1925 }
1926
1928 int FilterAgents(int agentsIn)
1929 {
1930 int foodStageType;
1931
1932 FoodStage foodStage = GetFoodStage();
1933 if (foodStage)
1934 foodStageType = foodStage.GetFoodStageType();
1935
1937 NutritionalProfile nutritionalProfile = GetNutritionalProfile(this, ClassName(), foodStageType);
1938 if ((agentsIn & eAgents.SALMONELLA == eAgents.SALMONELLA) && (nutritionalProfile.m_Agents == 0 || nutritionalProfile.m_AgentsPerDigest == 0))
1939 agentsIn &= ~eAgents.FOOD_POISON;
1940
1941 return agentsIn;
1942 }
1943
1944 //food staging
1945 override bool CanBeCooked()
1946 {
1947 return false;
1948 }
1949
1950 override bool CanBeCookedOnStick()
1951 {
1952 return false;
1953 }
1954
1955 override float GetTemperatureFreezeTime()
1956 {
1957 if (GetFoodStage())
1958 {
1959 switch (m_FoodStage.GetFoodStageType())
1960 {
1961 case FoodStageType.DRIED:
1962 return super.GetTemperatureFreezeTime() * GameConstants.TEMPERATURE_FREEZE_TIME_COEF_DRIED;
1963
1964 case FoodStageType.BURNED:
1965 return super.GetTemperatureFreezeTime() * GameConstants.TEMPERATURE_FREEZE_TIME_COEF_BURNED;
1966
1967 default:
1968 return super.GetTemperatureFreezeTime();
1969 }
1970 }
1971
1972 return super.GetTemperatureFreezeTime();
1973 }
1974
1975 override float GetTemperatureThawTime()
1976 {
1977 if (GetFoodStage())
1978 {
1979 switch (m_FoodStage.GetFoodStageType())
1980 {
1981 case FoodStageType.DRIED:
1982 return super.GetTemperatureThawTime() * GameConstants.TEMPERATURE_THAW_TIME_COEF_DRIED;
1983
1984 case FoodStageType.BURNED:
1985 return super.GetTemperatureThawTime() * GameConstants.TEMPERATURE_THAW_TIME_COEF_BURNED;
1986
1987 default:
1988 return super.GetTemperatureThawTime();
1989 }
1990 }
1991
1992 return super.GetTemperatureThawTime();
1993 }
1994
1995 override bool CanItemOverheat()
1996 {
1997 return super.CanItemOverheat() && (!GetFoodStage() || (IsFoodBurned() || !GetFoodStage().CanTransitionToFoodStageType(FoodStageType.BURNED))); //for foodstaged items - either is burned, or it can't get burned
1998 }
1999
2000 //================================================================
2001 // SYNCHRONIZATION
2002 //================================================================
2003 void Synchronize()
2004 {
2005 SetSynchDirty();
2006 }
2007
2008 override void OnVariablesSynchronized()
2009 {
2010 super.OnVariablesSynchronized();
2011
2012 //UpdateVisualsEx(); //performed on client only
2013
2014 //update audio
2016 {
2017 RefreshAudio();
2018 }
2019 else
2020 {
2021 RemoveAudio();
2022 }
2023
2024 if (CanHaveTemperature())
2026 }
2027
2028 //================================================================
2029 // AUDIO EFFECTS (WHEN ON DCS)
2030 //================================================================
2031 void MakeSoundsOnClient(bool soundstate, CookingMethodType cookingMethod = CookingMethodType.NONE)
2032 {
2033 m_MakeCookingSounds = soundstate;
2034 m_CookedByMethod = cookingMethod;
2035
2036 Synchronize();
2037 }
2038
2039 protected void RefreshAudio()
2040 {
2041 string soundName = "";
2042
2043 FoodStageType currentFoodStage = GetFoodStageType();
2045
2046 if (currentFoodStage == FoodStageType.BURNED)
2047 {
2048 soundName = SOUND_BURNING_DONE;
2049 }
2050 else
2051 {
2052 switch (m_CookedByMethod)
2053 {
2054 case CookingMethodType.BAKING:
2055 {
2056 if (nextFoodStage == FoodStageType.BAKED)
2057 soundName = SOUND_BAKING_START;
2058 else if (currentFoodStage == FoodStageType.BAKED)
2059 soundName = SOUND_BAKING_DONE;
2060 else
2061 soundName = "";
2062 break;
2063 }
2064
2065 case CookingMethodType.BOILING:
2066 {
2067 if (nextFoodStage == FoodStageType.BOILED)
2068 soundName = SOUND_BOILING_START;
2069 else if (currentFoodStage == FoodStageType.BOILED)
2070 soundName = SOUND_BOILING_DONE;
2071 else
2072 soundName = "";
2073 break;
2074 }
2075
2076 case CookingMethodType.DRYING:
2077 {
2078 if (nextFoodStage == FoodStageType.DRIED)
2079 soundName = SOUND_DRYING_START;
2080 else if (currentFoodStage == FoodStageType.DRIED)
2081 soundName = SOUND_DRYING_DONE;
2082 else
2083 soundName = "";
2084 break;
2085 }
2086
2087 default:
2088 soundName = "";
2089 break;
2090 }
2091
2092 if (nextFoodStage == FoodStageType.BURNED)
2093 {
2094 if (soundName == "") //on 'bad' transitions only, indicates bad outcome
2095 {
2096 soundName = SOUND_BURNING_DONE;
2097 }
2098 else // pre-emptive burning sounds replace regular ones
2099 {
2100 array<float> nextStageProperties = new array<float>();
2101 nextStageProperties = FoodStage.GetAllCookingPropertiesForStage(nextFoodStage, null, GetType());
2102 float nextStageTime = nextStageProperties.Get(eCookingPropertyIndices.COOK_TIME);
2103 float progress01 = GetCookingTime() / nextStageTime;
2104 if (progress01 > Cooking.BURNING_WARNING_THRESHOLD)
2105 {
2106 soundName = SOUND_BURNING_DONE;
2107 }
2108 }
2109 }
2110 }
2111
2112 SoundCookingStart(soundName);
2113 }
2114
2115 protected void RemoveAudio()
2116 {
2117 m_MakeCookingSounds = false;
2119 }
2120
2121 //================================================================
2122 // SERIALIZATION
2123 //================================================================
2124 override void OnStoreSave(ParamsWriteContext ctx)
2125 {
2126 super.OnStoreSave(ctx);
2127
2128 if (GetFoodStage())
2129 {
2130 GetFoodStage().OnStoreSave(ctx);
2131 }
2132
2133 // food decay
2134 ctx.Write(m_DecayTimer);
2136 }
2137
2138 override bool OnStoreLoad(ParamsReadContext ctx, int version)
2139 {
2140 if (!super.OnStoreLoad(ctx, version))
2141 return false;
2142
2143 if (GetFoodStage())
2144 {
2145 if (!GetFoodStage().OnStoreLoad(ctx, version))
2146 return false;
2147 }
2148
2149 if (version >= 115)
2150 {
2151 if (!ctx.Read(m_DecayTimer))
2152 {
2153 m_DecayTimer = 0.0;
2154 return false;
2155 }
2156 if (!ctx.Read(m_LastDecayStage))
2157 {
2159 return false;
2160 }
2161 }
2162
2163 UpdateVisualsEx(true); //forced init visuals
2164 Synchronize();
2165
2166 return true;
2167 }
2168
2169 override void AfterStoreLoad()
2170 {
2171 super.AfterStoreLoad();
2172
2173 Synchronize();
2174 }
2175
2176 //get food stage
2177 override FoodStage GetFoodStage()
2178 {
2179 return m_FoodStage;
2180 }
2181
2182 //food types
2183 override bool IsMeat()
2184 {
2185 return false;
2186 }
2187
2188 override bool IsCorpse()
2189 {
2190 return false;
2191 }
2192
2193 override bool IsFruit()
2194 {
2195 return false;
2196 }
2197
2198 override bool IsMushroom()
2199 {
2200 return false;
2201 }
2202
2203 //================================================================
2204 // NUTRITIONAL VALUES
2205 //================================================================
2206 //food properties
2207 static float GetFoodTotalVolume(ItemBase item, string classname = "", int food_stage = 0)
2208 {
2209 Edible_Base food_item = Edible_Base.Cast(item);
2210 if (food_item && food_item.GetFoodStage())
2211 {
2212 return FoodStage.GetFullnessIndex(food_item.GetFoodStage());
2213 }
2214 else if (classname != "" && food_stage)
2215 {
2216 return FoodStage.GetFullnessIndex(null, food_stage, classname);
2217 }
2218 string class_path = string.Format("cfgVehicles %1 Nutrition", classname);
2219 return g_Game.ConfigGetFloat( class_path + " fullnessIndex" );
2220
2221 }
2222
2223 static float GetFoodEnergy(ItemBase item, string classname = "", int food_stage = 0)
2224 {
2225 Edible_Base food_item = Edible_Base.Cast(item);
2226 if (food_item && food_item.GetFoodStage())
2227 {
2228 return FoodStage.GetEnergy(food_item.GetFoodStage());
2229 }
2230 else if (classname != "" && food_stage)
2231 {
2232 return FoodStage.GetEnergy(null, food_stage, classname);
2233 }
2234 string class_path = string.Format("cfgVehicles %1 Nutrition", classname);
2235 return g_Game.ConfigGetFloat( class_path + " energy" );
2236 }
2237
2238 static float GetFoodWater(ItemBase item, string classname = "", int food_stage = 0)
2239 {
2240 Edible_Base food_item = Edible_Base.Cast(item);
2241 if (food_item && food_item.GetFoodStage())
2242 {
2243 return FoodStage.GetWater(food_item.GetFoodStage());
2244 }
2245 else if (classname != "" && food_stage)
2246 {
2247 return FoodStage.GetWater(null, food_stage, classname);
2248 }
2249 string class_path = string.Format("cfgVehicles %1 Nutrition", classname);
2250 return g_Game.ConfigGetFloat( class_path + " water" );
2251 }
2252
2253 static float GetFoodNutritionalIndex(ItemBase item, string classname = "", int food_stage = 0)
2254 {
2255 Edible_Base food_item = Edible_Base.Cast(item);
2256 if (food_item && food_item.GetFoodStage())
2257 {
2258 return FoodStage.GetNutritionalIndex(food_item.GetFoodStage());
2259 }
2260 else if (classname != "" && food_stage)
2261 {
2262 return FoodStage.GetNutritionalIndex(null, food_stage, classname);
2263 }
2264 string class_path = string.Format("cfgVehicles %1 Nutrition", classname);
2265 return g_Game.ConfigGetFloat( class_path + " nutritionalIndex" );
2266
2267 }
2268
2269 static float GetFoodToxicity(ItemBase item, string classname = "", int food_stage = 0)
2270 {
2271 Edible_Base food_item = Edible_Base.Cast(item);
2272 if (food_item && food_item.GetFoodStage())
2273 {
2274 return FoodStage.GetToxicity(food_item.GetFoodStage());
2275 }
2276 else if (classname != "" && food_stage)
2277 {
2278 return FoodStage.GetToxicity(null, food_stage, classname);
2279 }
2280 string class_path = string.Format("cfgVehicles %1 Nutrition", classname);
2281 return g_Game.ConfigGetFloat( class_path + " toxicity" );
2282 }
2283
2284 static int GetFoodAgents(ItemBase item, string classname = "", int food_stage = 0)
2285 {
2286 Edible_Base food_item = Edible_Base.Cast(item);
2287 if (food_item && food_item.GetFoodStage())
2288 {
2289 return FoodStage.GetAgents(food_item.GetFoodStage());
2290 }
2291 else if (classname != "" && food_stage)
2292 {
2293 return FoodStage.GetAgents(null, food_stage, classname);
2294 }
2295 string class_path = string.Format("cfgVehicles %1 Nutrition", classname);
2296 return g_Game.ConfigGetInt( class_path + " agents" );
2297 }
2298
2299 static float GetFoodDigestibility(ItemBase item, string classname = "", int food_stage = 0)
2300 {
2301 Edible_Base food_item = Edible_Base.Cast(item);
2302 if (food_item && food_item.GetFoodStage())
2303 {
2304 return FoodStage.GetDigestibility(food_item.GetFoodStage());
2305 }
2306 else if (classname != "" && food_stage)
2307 {
2308 return FoodStage.GetDigestibility(null, food_stage, classname);
2309 }
2310 string class_path = string.Format("cfgVehicles %1 Nutrition", classname);
2311 return g_Game.ConfigGetInt( class_path + " digestibility" );
2312 }
2313
2314 static float GetAgentsPerDigest(ItemBase item, string className = "", int foodStage = 0)
2315 {
2316 Edible_Base foodItem = Edible_Base.Cast(item);
2317 if (foodItem && foodItem.GetFoodStage())
2318 {
2319 return FoodStage.GetAgentsPerDigest(foodItem.GetFoodStage());
2320 }
2321 else if (className != "" && foodStage)
2322 {
2323 return FoodStage.GetAgentsPerDigest(null, foodStage, className);
2324 }
2325 string classPath = string.Format("cfgVehicles %1 Nutrition", className);
2326 return g_Game.ConfigGetInt(classPath + " agentsPerDigest");
2327 }
2328
2329 static NutritionalProfile GetNutritionalProfile(ItemBase item, string classname = "", int food_stage = 0)
2330 {
2331 NutritionalProfile profile = new NutritionalProfile();
2332 profile.m_Energy = GetFoodEnergy(item, classname, food_stage);
2333 profile.m_WaterContent = GetFoodWater(item, classname, food_stage);
2334 profile.m_NutritionalIndex = GetFoodNutritionalIndex(item, classname, food_stage);
2335 profile.m_FullnessIndex = GetFoodTotalVolume(item, classname, food_stage);
2336 profile.m_Toxicity = GetFoodToxicity(item, classname, food_stage);
2337 profile.m_Agents = GetFoodAgents(item, classname, food_stage);
2338 profile.m_Digestibility = GetFoodDigestibility(item, classname, food_stage);
2339 profile.m_AgentsPerDigest = GetAgentsPerDigest(item, classname, food_stage);
2340
2341 return profile;
2342 }
2343
2344 //================================================================
2345 // FOOD STAGING
2346 //================================================================
2348 {
2349 return GetFoodStage().GetFoodStageType();
2350 }
2351
2352 //food stage states
2353 bool IsFoodRaw()
2354 {
2355 if ( GetFoodStage() )
2356 {
2357 return GetFoodStage().IsFoodRaw();
2358 }
2359
2360 return false;
2361 }
2362
2363 bool IsFoodBaked()
2364 {
2365 if ( GetFoodStage() )
2366 {
2367 return GetFoodStage().IsFoodBaked();
2368 }
2369
2370 return false;
2371 }
2372
2373 bool IsFoodBoiled()
2374 {
2375 if ( GetFoodStage() )
2376 {
2377 return GetFoodStage().IsFoodBoiled();
2378 }
2379
2380 return false;
2381 }
2382
2383 bool IsFoodDried()
2384 {
2385 if ( GetFoodStage() )
2386 {
2387 return GetFoodStage().IsFoodDried();
2388 }
2389
2390 return false;
2391 }
2392
2393 bool IsFoodBurned()
2394 {
2395 if ( GetFoodStage() )
2396 {
2397 return GetFoodStage().IsFoodBurned();
2398 }
2399
2400 return false;
2401 }
2402
2403 bool IsFoodRotten()
2404 {
2405 if ( GetFoodStage() )
2406 {
2407 return GetFoodStage().IsFoodRotten();
2408 }
2409
2410 return false;
2411 }
2412
2413 //food stage change
2414 void ChangeFoodStage( FoodStageType new_food_stage_type )
2415 {
2416 GetFoodStage().ChangeFoodStage( new_food_stage_type );
2417 }
2418
2420 {
2421 return GetFoodStage().GetNextFoodStageType( cooking_method );
2422 }
2423
2424 string GetFoodStageName( FoodStageType food_stage_type )
2425 {
2426 return GetFoodStage().GetFoodStageName( food_stage_type );
2427 }
2428
2429 bool CanChangeToNewStage( CookingMethodType cooking_method )
2430 {
2431 return GetFoodStage().CanChangeToNewStage( cooking_method );
2432 }
2433
2434 //Use this to receive food stage from another Edible_Base
2435 void TransferFoodStage( notnull Edible_Base source )
2436 {
2437 if ( !source.GetFoodStage())
2438 return;
2439 m_LastDecayStage = source.GetLastDecayStage();
2440 ChangeFoodStage(source.GetFoodStage().GetFoodStageType());
2441 m_DecayTimer = source.GetDecayTimer();
2442 m_DecayDelta = source.GetDecayDelta();
2443 }
2444
2446 void OnFoodStageChange(FoodStageType stageOld, FoodStageType stageNew)
2447 {
2448 HandleFoodStageChangeAgents(stageOld,stageNew);
2449 UpdateVisualsEx(); //performed on server only
2450 }
2451
2454 {
2455 switch (stageNew)
2456 {
2457 case FoodStageType.BAKED:
2458 case FoodStageType.BOILED:
2459 case FoodStageType.DRIED:
2460 RemoveAllAgentsExcept(eAgents.BRAIN|eAgents.HEAVYMETAL);
2461 break;
2462
2463 case FoodStageType.BURNED:
2464 RemoveAllAgentsExcept(eAgents.BRAIN|eAgents.HEAVYMETAL);
2465 break;
2466 }
2467 }
2468
2469 //================================================================
2470 // COOKING
2471 //================================================================
2472 //cooking time
2473 float GetCookingTime()
2474 {
2475 return GetFoodStage().GetCookingTime();
2476 }
2477
2478 void SetCookingTime( float time )
2479 {
2480 GetFoodStage().SetCookingTime( time );
2481
2482 //synchronize when calling on server
2483 Synchronize();
2484 }
2485
2486 void ResetCookingTime()
2487 {
2488 if (GetFoodStage())
2489 {
2490 GetFoodStage().SetCookingTime(0);
2491 Synchronize();
2492 }
2493 }
2494
2495 //replace edible with new item (opening cans)
2496 void ReplaceEdibleWithNew( string typeName )
2497 {
2498 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
2499 if (player)
2500 {
2501 ReplaceEdibleWithNewLambda lambda = new ReplaceEdibleWithNewLambda(this, typeName, player);
2502 player.ServerReplaceItemInHandsWithNew(lambda);
2503 }
2504 else
2505 Error("ReplaceEdibleWithNew - cannot use edible without player");
2506 }
2507
2509 {
2511 }
2512
2513 override void SetActions()
2514 {
2515 super.SetActions();
2516
2519 }
2520
2521 protected void SoundCookingStart(string sound_name)
2522 {
2523 #ifndef SERVER
2524 #ifndef NO_GUI
2525 if (m_SoundPlaying != sound_name)
2526 {
2528
2529 m_SoundEffectCooking = SEffectManager.PlaySound(sound_name, GetPosition(), 0, 0, true);
2530 m_SoundPlaying = sound_name;
2531 }
2532 #endif
2533 #endif
2534 }
2535
2536 protected void SoundCookingStop()
2537 {
2538 #ifndef SERVER
2539 #ifndef NO_GUI
2541 {
2542 m_SoundEffectCooking.Stop();
2543 m_SoundEffectCooking = null;
2544 m_SoundPlaying = "";
2545 }
2546 #endif
2547 #endif
2548 }
2549
2550 override bool CanDecay()
2551 {
2552 return false;
2553 }
2554
2555 override bool CanProcessDecay()
2556 {
2557 return !GetIsFrozen() && ( GetFoodStageType() != FoodStageType.ROTTEN );
2558 }
2559
2560 override void ProcessDecay( float delta, bool hasRootAsPlayer )
2561 {
2562 m_DecayDelta = 0.0;
2563
2564 delta *= DayZGame.Cast(g_Game).GetFoodDecayModifier();
2565 m_DecayDelta += ( 1 + ( 1 - GetHealth01( "", "" ) ) );
2566 if ( hasRootAsPlayer )
2568
2569 /*Print( "-------------------------" );
2570 Print( this );
2571 Print( m_DecayTimer );
2572 Print( m_DecayDelta );
2573 Print( m_LastDecayStage );*/
2574
2575 if ( IsFruit() || IsMushroom() )
2576 {
2577 // fruit, vegetables and mushrooms
2579 {
2580 switch ( GetFoodStageType() )
2581 {
2582 case FoodStageType.RAW:
2585 break;
2586
2587 case FoodStageType.BOILED:
2590 break;
2591
2592 case FoodStageType.BAKED:
2595 break;
2596
2597 case FoodStageType.DRIED:
2598 case FoodStageType.BURNED:
2599 case FoodStageType.ROTTEN:
2600 default:
2601 m_DecayTimer = -1;
2603 return;
2604 }
2605
2606 //m_DecayTimer = m_DecayTimer / 1000.0;
2607 }
2608
2609 m_DecayTimer -= ( delta * m_DecayDelta );
2610
2611 if ( m_DecayTimer <= 0 )
2612 {
2613 if ( m_LastDecayStage != FoodStageType.NONE )
2614 {
2615 // switch to decayed stage
2616 if ( ( m_LastDecayStage == FoodStageType.BOILED ) || ( m_LastDecayStage == FoodStageType.BAKED ) )
2617 {
2619 }
2620 if ( m_LastDecayStage == FoodStageType.RAW )
2621 {
2622 int rng = Math.RandomIntInclusive( 0, 100 );
2624 {
2626 }
2627 else
2628 {
2629 if ( CanChangeToNewStage( FoodStageType.DRIED ) )
2630 {
2632 }
2633 else
2634 {
2636 }
2637 }
2638 }
2639 }
2640 }
2641
2642 }
2643 else if ( IsMeat() )
2644 {
2645 // meat
2647 {
2648 switch ( GetFoodStageType() )
2649 {
2650 case FoodStageType.RAW:
2653 break;
2654
2655 case FoodStageType.BOILED:
2658 break;
2659
2660 case FoodStageType.BAKED:
2663 break;
2664
2665 case FoodStageType.DRIED:
2668 break;
2669
2670 case FoodStageType.BURNED:
2671 case FoodStageType.ROTTEN:
2672 default:
2673 m_DecayTimer = -1;
2675 return;
2676 }
2677 }
2678
2679 m_DecayTimer -= ( delta * m_DecayDelta );
2680
2681 if ( m_DecayTimer <= 0 )
2682 {
2683 if ( m_LastDecayStage != FoodStageType.NONE )
2684 {
2685 // switch to decayed stage
2686 if ( ( m_LastDecayStage == FoodStageType.DRIED ) || ( m_LastDecayStage == FoodStageType.RAW ) || ( m_LastDecayStage == FoodStageType.BOILED ) || ( m_LastDecayStage == FoodStageType.BAKED ) )
2687 {
2689 }
2690 }
2691 }
2692 }
2693 else if ( IsCorpse() )
2694 {
2695 // corpse
2697 {
2698 switch ( GetFoodStageType() )
2699 {
2700 case FoodStageType.RAW:
2703 break;
2704
2705 case FoodStageType.BURNED:
2706 case FoodStageType.ROTTEN:
2707 default:
2708 m_DecayTimer = -1;
2710 return;
2711 }
2712 }
2713
2714 m_DecayTimer -= ( delta * m_DecayDelta );
2715
2716 if ( m_DecayTimer <= 0 )
2717 {
2718 if ( m_LastDecayStage != FoodStageType.NONE )
2719 {
2720 // switch to decayed stage
2721 if ( ( m_LastDecayStage == FoodStageType.DRIED ) || ( m_LastDecayStage == FoodStageType.RAW ) || ( m_LastDecayStage == FoodStageType.BOILED ) || ( m_LastDecayStage == FoodStageType.BAKED ) )
2722 {
2724 }
2725 }
2726 }
2727 }
2728 else
2729 {
2730 // opened cans
2731 m_DecayTimer -= ( delta * m_DecayDelta );
2732
2733 if ( ( m_DecayTimer <= 0 ) && ( m_LastDecayStage == FoodStageType.NONE ) )
2734 {
2737 //m_DecayTimer = m_DecayTimer / 1000.0;
2738 }
2739 else
2740 {
2741 if ( m_DecayTimer <= 0 )
2742 {
2743 InsertAgent(eAgents.FOOD_POISON, 1);
2744 m_DecayTimer = -1;
2745 }
2746 }
2747 }
2748 }
2749
2750 protected void UpdateVaporParticle()
2751 {
2752 if (g_Game.IsHeadlessOrDedicatedServer())
2753 return;
2754
2755 if (m_VarTemperature >= GameConstants.STATE_HOT_LVL_TWO && !m_HotVaporParticle)
2756 {
2757 InventoryLocation invLoc = new InventoryLocation();
2758 GetInventory().GetCurrentInventoryLocation(invLoc);
2759 if (invLoc && (invLoc.GetType() == InventoryLocationType.GROUND || invLoc.GetType() == InventoryLocationType.HANDS || invLoc.GetType() == InventoryLocationType.ATTACHMENT))
2760 {
2761 ParticleManager ptcMgr = ParticleManager.GetInstance();
2762 if (ptcMgr)
2763 {
2764 m_HotVaporParticle = ParticleManager.GetInstance().PlayOnObject(ParticleList.ITEM_HOT_VAPOR, this);
2765 m_HotVaporParticle.SetParticleParam(EmitorParam.SIZE, 0.3);
2766 m_HotVaporParticle.SetParticleParam(EmitorParam.BIRTH_RATE, 10);
2767 m_HotVaporParticle.SetParticleAutoDestroyFlags(ParticleAutoDestroyFlags.ON_STOP);
2768 }
2769 }
2770 }
2771 else if (m_HotVaporParticle)
2772 {
2773 if (m_VarTemperature <= GameConstants.STATE_HOT_LVL_TWO)
2774 {
2775 m_HotVaporParticle.Stop();
2776 m_HotVaporParticle = null;
2777 return;
2778 }
2779
2780 InventoryLocation inventoryLoc = new InventoryLocation();
2781 GetInventory().GetCurrentInventoryLocation(inventoryLoc);
2782 if (invLoc && (invLoc.GetType() != InventoryLocationType.GROUND && invLoc.GetType() != InventoryLocationType.HANDS))
2783 {
2784 m_HotVaporParticle.Stop();
2785 m_HotVaporParticle = null;
2786 }
2787 }
2788 }
2789
2790 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
2791 {
2792 if (GetFoodStage())
2793 {
2794 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.FOOD_NUTRITIONS_DATA, "Food Nutritions Data", FadeColors.WHITE));
2795 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.FOOD_STAGE_PREV, "Food Stage Prev", FadeColors.WHITE));
2796 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.FOOD_STAGE_NEXT, "Food Stage Next", FadeColors.WHITE));
2797 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
2798 }
2799
2800 super.GetDebugActions(outputList);
2801 }
2802
2803 override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
2804 {
2805 super.OnAction(action_id, player, ctx);
2806
2807 if ( g_Game.IsServer() )
2808 {
2809 if ( action_id == EActions.FOOD_STAGE_PREV )
2810 {
2811 int food_stage_prev = GetFoodStageType() - 1;
2812 if (food_stage_prev <= 0)
2813 {
2814 food_stage_prev = FoodStageType.COUNT - 1;
2815 }
2816 ChangeFoodStage(food_stage_prev);
2817 return true;
2818 }
2819 else if ( action_id == EActions.FOOD_STAGE_NEXT )
2820 {
2821 int food_stage_next = GetFoodStageType() + 1;
2822 if (food_stage_next >= FoodStageType.COUNT )
2823 {
2824 food_stage_next = FoodStageType.RAW;
2825 }
2826 ChangeFoodStage(food_stage_next);
2827 return true;
2828 }
2829
2830 }
2831
2832 #ifdef DIAG_DEVELOPER
2833 if (action_id == EActions.FOOD_NUTRITIONS_DATA)
2834 {
2835 PrintNutritionsData();
2836 return true;
2837 }
2838 #endif
2839
2840 return false;
2841 }
2842
2843 override string GetDebugText()
2844 {
2845 string debug_output;
2846
2847 debug_output = super.GetDebugText();
2848
2849 debug_output+="m_CookedByMethod:"+m_CookedByMethod+"\n";
2850 debug_output+="m_MakeCookingSounds:"+m_MakeCookingSounds+"\n";
2851
2852 return debug_output;
2853 }
2854
2855 //================================================================
2856 // GENERAL GETTERS
2857 //================================================================
2858
2859 override float GetBaitEffectivity()
2860 {
2861 float ret = super.GetBaitEffectivity();
2862
2863 if (IsFoodRotten())
2864 {
2865 ret *= 0.5;
2866 }
2867
2868 return ret;
2869 }
2870
2871 float GetDecayTimer()
2872 {
2873 return m_DecayTimer;
2874 }
2875
2876 float GetDecayDelta()
2877 {
2878 return m_DecayDelta;
2879 }
2880
2882 {
2883 return m_LastDecayStage;
2884 }
2885
2886 #ifdef DIAG_DEVELOPER
2887 private void PrintNutritionsData()
2888 {
2889 string nutritionsData = "";
2890
2891 FoodStage stage = GetFoodStage();
2892 FoodStageType stageType = stage.GetFoodStageType();
2893
2894 NutritionalProfile profile = GetNutritionalProfile(this, ClassName(), stageType);
2895 if (profile)
2896 {
2897 nutritionsData = string.Format("Item: %1\n\n", this);
2898 nutritionsData += string.Format("Stage name: %1\n", GetFoodStageName(stageType));
2899 nutritionsData += string.Format("Energy: %1\n", profile.m_Energy);
2900 nutritionsData += string.Format("Water content: %1\n", profile.m_WaterContent);
2901 nutritionsData += string.Format("Nutritional index: %1\n", profile.m_NutritionalIndex);
2902 nutritionsData += string.Format("Fullness index: %1\n", profile.m_FullnessIndex);
2903 nutritionsData += string.Format("Toxicity (obsolete): %1\n", profile.m_Toxicity);
2904 nutritionsData += string.Format("Digestibility: %1\n", profile.m_Digestibility);
2905
2906 if (profile.IsLiquid())
2907 nutritionsData += string.Format("Liquid type: %1\n", profile.m_LiquidClassname);
2908
2909 nutritionsData += string.Format("Agents: %1\n", profile.m_Agents);
2910 nutritionsData += string.Format("Agents per consume: %1\n", profile.m_AgentsPerDigest);
2911 }
2912
2913 nutritionsData += "-----\n";
2914
2915 Debug.Log(nutritionsData);
2916 }
2917 #endif
2918
2920 //DEPRECATED
2922 void UpdateVisuals()
2923 {
2925 }
2926}
2927
2929{
2930 void ReplaceEdibleWithNewLambda(EntityAI old_item, string new_item_type, PlayerBase player) { }
2931};
Param4< int, int, string, int > TSelectableActionInfoWithColor
class LogManager EntityAI
eBleedingSourceType GetType()
AttachActionData ActionData ActionAttach()
Определения ActionAttach.c:9
void ActionDetach()
Определения ActionDetach.c:10
void AddAction(typename actionName)
Определения AdvancedCommunication.c:220
CookingMethodType
Определения Cooking.c:2
DamageType
exposed from C++ (do not change)
Определения DamageSystem.c:11
DayZGame g_Game
Определения DayZGame.c:4074
AbstractWave m_SoundPlaying
Определения DynamicMusicPlayer.c:118
EActions
Определения EActions.c:2
eAgents
Определения EAgents.c:3
EConsumptionPenaltyContext
Определения EConsumptionPenaltyContext.c:2
void ReplaceEdibleWithNew(string typeName)
Определения Edible_Base.c:1792
ref FoodStage m_FoodStage
Определения Edible_Base.c:1129
bool IsFoodRotten()
Определения Edible_Base.c:1699
static float GetFoodWater(ItemBase item, string classname="", int food_stage=0)
Определения Edible_Base.c:1534
override bool CanBeCooked()
Определения Edible_Base.c:1241
bool IsFoodBaked()
Определения Edible_Base.c:1659
override string GetDebugText()
Определения Edible_Base.c:2139
override void AfterStoreLoad()
Определения Edible_Base.c:1465
void Edible_Base()
Определения Edible_Base.c:1137
void OnFoodStageChange(FoodStageType stageOld, FoodStageType stageNew)
called on server
Определения Edible_Base.c:1742
float m_DecayDelta
Определения Edible_Base.c:1131
void Synchronize()
Определения Edible_Base.c:1299
override void OnVariablesSynchronized()
Определения Edible_Base.c:1304
const string SOUND_BURNING_DONE
Определения Edible_Base.c:1123
bool CanChangeToNewStage(CookingMethodType cooking_method)
Определения Edible_Base.c:1725
override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
Определения Edible_Base.c:2099
void RemoveAudio()
Определения Edible_Base.c:1411
override bool CanItemOverheat()
Определения Edible_Base.c:1291
float GetDecayDelta()
Определения Edible_Base.c:2172
override float GetBaitEffectivity()
Определения Edible_Base.c:2155
override FoodStage GetFoodStage()
Определения Edible_Base.c:1473
override void SetActions()
Определения Edible_Base.c:1809
bool m_MakeCookingSounds
Определения Edible_Base.c:1125
override float GetTemperatureFreezeTime()
Определения Edible_Base.c:1251
void SoundCookingStop()
Определения Edible_Base.c:1832
const string DIRECT_COOKING_SLOT_NAME
Определения Edible_Base.c:1115
FoodStageType GetNextFoodStageType(CookingMethodType cooking_method)
Определения Edible_Base.c:1715
void ChangeFoodStage(FoodStageType new_food_stage_type)
Определения Edible_Base.c:1710
void OnConsume(float amount, PlayerBase consumer)
Определения Edible_Base.c:1215
static float GetFoodNutritionalIndex(ItemBase item, string classname="", int food_stage=0)
Определения Edible_Base.c:1549
SoundOnVehicle m_SoundCooking
Определения Edible_Base.c:1126
static float GetFoodToxicity(ItemBase item, string classname="", int food_stage=0)
Определения Edible_Base.c:1565
override bool CanDecay()
Определения Edible_Base.c:1846
void UpdateVisualsEx(bool forced=false)
Определения Edible_Base.c:1201
const string SOUND_BAKING_DONE
Определения Edible_Base.c:1118
static NutritionalProfile GetNutritionalProfile(ItemBase item, string classname="", int food_stage=0)
Определения Edible_Base.c:1625
int FilterAgents(int agentsIn)
Filter agents from the item (override on higher implementations)
Определения Edible_Base.c:1224
override void EEDelete(EntityAI parent)
Определения Edible_Base.c:1160
FoodStageType m_LastDecayStage
Определения Edible_Base.c:1132
float GetCookingTime()
Определения Edible_Base.c:1769
override bool CanBeCookedOnStick()
Определения Edible_Base.c:1246
override bool IsCorpse()
Определения Edible_Base.c:1484
void UpdateVisuals()
Определения Edible_Base.c:2218
float GetDecayTimer()
Определения Edible_Base.c:2167
FoodStageType GetLastDecayStage()
Определения Edible_Base.c:2177
string GetFoodStageName(FoodStageType food_stage_type)
Определения Edible_Base.c:1720
override float GetTemperatureThawTime()
Определения Edible_Base.c:1271
void UpdateVaporParticle()
Определения Edible_Base.c:2046
static float GetFoodDigestibility(ItemBase item, string classname="", int food_stage=0)
Определения Edible_Base.c:1595
void TransferFoodStage(notnull Edible_Base source)
Определения Edible_Base.c:1731
override void ProcessDecay(float delta, bool hasRootAsPlayer)
Определения Edible_Base.c:1856
const string SOUND_DRYING_START
Определения Edible_Base.c:1121
void SetCookingTime(float time)
Определения Edible_Base.c:1774
void SoundCookingStart(string sound_name)
Определения Edible_Base.c:1817
override bool IsMeat()
Определения Edible_Base.c:1479
const string SOUND_BAKING_START
Определения Edible_Base.c:1117
static float GetFoodTotalVolume(ItemBase item, string classname="", int food_stage=0)
Определения Edible_Base.c:1503
const string SOUND_DRYING_DONE
Определения Edible_Base.c:1122
void HandleFoodStageChangeAgents(FoodStageType stageOld, FoodStageType stageNew)
removes select agents on foodstage transitions
Определения Edible_Base.c:1749
void ResetCookingTime()
Определения Edible_Base.c:1782
override bool IsFruit()
Определения Edible_Base.c:1489
Edible_Base ItemBase ReplaceEdibleWithNewLambda(EntityAI old_item, string new_item_type, PlayerBase player)
Определения Edible_Base.c:1114
bool Consume(float amount, PlayerBase consumer)
Определения Edible_Base.c:1207
EffectSound m_SoundEffectCooking
DEPRECATED.
Определения Edible_Base.c:1127
override bool OnStoreLoad(ParamsReadContext ctx, int version)
Определения Edible_Base.c:1434
FoodStageType GetFoodStageType()
Определения Edible_Base.c:1643
override bool CanProcessDecay()
Определения Edible_Base.c:1851
ParticleSource m_HotVaporParticle
Определения Edible_Base.c:1133
void MakeSoundsOnClient(bool soundstate, CookingMethodType cookingMethod=CookingMethodType.NONE)
Определения Edible_Base.c:1327
static int GetFoodAgents(ItemBase item, string classname="", int food_stage=0)
Определения Edible_Base.c:1580
override bool IsMushroom()
Определения Edible_Base.c:1494
static float GetFoodEnergy(ItemBase item, string classname="", int food_stage=0)
Определения Edible_Base.c:1519
static float GetAgentsPerDigest(ItemBase item, string className="", int foodStage=0)
Определения Edible_Base.c:1610
void RefreshAudio()
Определения Edible_Base.c:1335
const string SOUND_BOILING_DONE
Определения Edible_Base.c:1120
int GetConsumptionPenaltyContext()
Определения Edible_Base.c:1804
const string SOUND_BOILING_START
Определения Edible_Base.c:1119
override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
Определения Edible_Base.c:2086
CookingMethodType m_CookedByMethod
Определения Edible_Base.c:1135
bool IsFoodDried()
Определения Edible_Base.c:1679
override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
Определения Edible_Base.c:1170
override void OnStoreSave(ParamsWriteContext ctx)
Определения Edible_Base.c:1420
bool IsFoodRaw()
Определения Edible_Base.c:1649
bool IsFoodBurned()
Определения Edible_Base.c:1689
override void EEInit()
Определения Edible_Base.c:1153
bool IsFoodBoiled()
Определения Edible_Base.c:1669
float m_DecayTimer
Определения Edible_Base.c:1130
override bool CanHaveTemperature()
Определения FireplaceBase.c:575
FoodStageType
Определения FoodStage.c:2
InventoryLocationType
types of Inventory Location
Определения InventoryLocation.c:4
override void RemoveAllAgentsExcept(int agent_to_keep)
Определения ItemBase.c:3979
override void InsertAgent(int agent, float count=1)
Определения ItemBase.c:3984
bool HasFoodStage()
Определения ItemBase.c:2589
bool AddQuantity(float value, bool destroy_config=true, bool destroy_forced=false)
add item quantity[related to varQuantity... config entry], destroy_config = true > if the quantity re...
Определения ItemBase.c:3389
void ParticleManager(ParticleManagerSettings settings)
Constructor (ctor)
Определения ParticleManager.c:88
ParticleAutoDestroyFlags
Flags to pass to ParticleSource.SetParticleAutoDestroyFlags.
Определения ParticleSource.c:3
static void Log(string message=LOG_DEFAULT, string plugin=LOG_DEFAULT, string author=LOG_DEFAULT, string label=LOG_DEFAULT, string entity=LOG_DEFAULT)
Prints debug message with normal prio.
Определения 3_Game/DayZ/tools/Debug.c:183
Определения 3_Game/DayZ/tools/Debug.c:2
override FoodStage GetFoodStage()
Определения Edible_Base.c:361
Определения Edible_Base.c:2
Wrapper class for managing sound through SEffectManager.
Определения EffectSound.c:5
proto native int GetType()
returns type of InventoryLocation
InventoryLocation.
Определения InventoryLocation.c:30
static proto native owned string GetSlotName(int id)
converts slot_id to string
provides access to slot configuration
Определения InventorySlots.c:6
override void EEInit()
Определения BarbedWire.c:41
Определения EnMath.c:7
float m_Digestibility
Определения NutritionalProfile.c:11
bool IsLiquid()
Определения NutritionalProfile.c:47
float m_WaterContent
Определения NutritionalProfile.c:4
string m_LiquidClassname
Определения NutritionalProfile.c:10
float m_FullnessIndex
Определения NutritionalProfile.c:6
float m_Toxicity
Определения NutritionalProfile.c:7
float m_Energy
Определения NutritionalProfile.c:3
int m_Agents
Определения NutritionalProfile.c:9
float m_AgentsPerDigest
Определения NutritionalProfile.c:12
float m_NutritionalIndex
Определения NutritionalProfile.c:5
static const int ITEM_HOT_VAPOR
Определения ParticleList.c:78
Определения ParticleList.c:12
Entity which has the particle instance as an ObjectComponent.
Определения ParticleSource.c:128
Определения PlayerBaseClient.c:2
static const float CONSUMPTION_DAMAGE_PER_BITE
Определения PlayerConstants.c:146
static const float CONSUMPTION_DAMAGE_TEMP_THRESHOLD
Определения PlayerConstants.c:147
Определения PlayerConstants.c:2
static EffectSound PlaySound(string sound_set, vector position, float play_fade_in=0, float stop_fade_out=0, bool loop=false)
Create and play an EffectSound.
Определения EffectManager.c:178
Manager class for managing Effect (EffectParticle, EffectSound)
Определения EffectManager.c:6
proto bool Write(void value_out)
proto bool Read(void value_in)
Result for an object found in CGame.IsBoxCollidingGeometryProxy.
Serializer ParamsReadContext
Определения gameplay.c:15
Serializer ParamsWriteContext
Определения gameplay.c:16
void Error(string err)
Messagebox with error message.
Определения EnDebug.c:90
const float DECAY_FOOD_BAKED_FRVG
Определения 3_Game/DayZ/constants.c:1101
const float DECAY_FOOD_CAN_OPEN
Определения 3_Game/DayZ/constants.c:1103
const float DECAY_FOOD_RAW_FRVG
Определения 3_Game/DayZ/constants.c:1097
const int DECAY_TIMER_RANDOM_PERCENTAGE
Определения 3_Game/DayZ/constants.c:1105
const int DECAY_FOOD_FRVG_DRIED_CHANCE
Определения 3_Game/DayZ/constants.c:1104
const float DECAY_FOOD_RAW_MEAT
Определения 3_Game/DayZ/constants.c:1095
const float DECAY_FOOD_BAKED_MEAT
Определения 3_Game/DayZ/constants.c:1100
const float DECAY_FOOD_BOILED_MEAT
Определения 3_Game/DayZ/constants.c:1098
const float DECAY_FOOD_BOILED_FRVG
Определения 3_Game/DayZ/constants.c:1099
const float DECAY_FOOD_DRIED_MEAT
Определения 3_Game/DayZ/constants.c:1102
const float DECAY_FOOD_RAW_CORPSE
Определения 3_Game/DayZ/constants.c:1096
const float DECAY_RATE_ON_PLAYER
Определения 3_Game/DayZ/constants.c:1106
static const float TEMPERATURE_THAW_TIME_COEF_BURNED
Определения 3_Game/DayZ/constants.c:998
static const float TEMPERATURE_FREEZE_TIME_COEF_BURNED
Определения 3_Game/DayZ/constants.c:997
static const float TEMPERATURE_THAW_TIME_COEF_DRIED
Определения 3_Game/DayZ/constants.c:999
static const float TEMPERATURE_FREEZE_TIME_COEF_DRIED
Определения 3_Game/DayZ/constants.c:996
const int STATE_HOT_LVL_TWO
Определения 3_Game/DayZ/constants.c:947
static float RandomFloat01()
Returns a random float number between and min [inclusive] and max [inclusive].
Определения EnMath.c:126
static int RandomIntInclusive(int min, int max)
Returns a random int number between and min [inclusive] and max [inclusive].
Определения EnMath.c:54
EmitorParam
Определения EnVisual.c:114
const int SAT_DEBUG_ACTION
Определения 3_Game/DayZ/constants.c:486
vector GetPosition()
Get the world position of the Effect.
Определения Effect.c:473
bool Contains(string sample)
Returns true if sample is substring of string.
Определения EnString.c:286
static proto string Format(string fmt, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
Gets n-th character from string.

Используется в RefreshAudioVisuals().